From 245064bb98ab11face7a04303fd62724820d9610 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 19 Feb 2024 06:09:43 -0500 Subject: [PATCH 001/954] Move "everyone" role and "instance actor" account magic number IDs to constants (#29260) --- app/models/account.rb | 5 +++-- app/models/concerns/account/finder_concern.rb | 4 ++-- app/models/user_role.rb | 10 ++++++---- db/migrate/20190715164535_add_instance_actor.rb | 6 ++++-- .../20220704024901_migrate_settings_to_user_roles.rb | 6 ++++-- db/seeds/02_instance_actor.rb | 2 +- lib/tasks/tests.rake | 2 +- spec/models/account_spec.rb | 4 ++-- spec/models/user_role_spec.rb | 6 +++--- 9 files changed, 26 insertions(+), 19 deletions(-) diff --git a/app/models/account.rb b/app/models/account.rb index 442d4a431d..d627fd6b64 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -64,6 +64,7 @@ class Account < ApplicationRecord ) BACKGROUND_REFRESH_INTERVAL = 1.week.freeze + INSTANCE_ACTOR_ID = -99 USERNAME_RE = /[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?/i MENTION_RE = %r{(? { 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: -99) } + scope :without_instance_actor, -> { where.not(id: INSTANCE_ACTOR_ID) } scope :recent, -> { reorder(id: :desc) } scope :bots, -> { where(actor_type: %w(Application Service)) } scope :groups, -> { where(actor_type: 'Group') } @@ -176,7 +177,7 @@ class Account < ApplicationRecord end def instance_actor? - id == -99 + id == INSTANCE_ACTOR_ID end alias bot bot? diff --git a/app/models/concerns/account/finder_concern.rb b/app/models/concerns/account/finder_concern.rb index 7faaddeb43..a7acff1cbb 100644 --- a/app/models/concerns/account/finder_concern.rb +++ b/app/models/concerns/account/finder_concern.rb @@ -13,11 +13,11 @@ module Account::FinderConcern end def representative - actor = Account.find(-99).tap(&:ensure_keys!) + actor = Account.find(Account::INSTANCE_ACTOR_ID).tap(&:ensure_keys!) actor.update!(username: 'mastodon.internal') if actor.username.include?(':') actor rescue ActiveRecord::RecordNotFound - Account.create!(id: -99, actor_type: 'Application', locked: true, username: 'mastodon.internal') + Account.create!(id: Account::INSTANCE_ACTOR_ID, actor_type: 'Application', locked: true, username: 'mastodon.internal') end def find_local(username) diff --git a/app/models/user_role.rb b/app/models/user_role.rb index 89354da542..ed64ca0538 100644 --- a/app/models/user_role.rb +++ b/app/models/user_role.rb @@ -38,6 +38,8 @@ class UserRole < ApplicationRecord delete_user_data: (1 << 19), }.freeze + EVERYONE_ROLE_ID = -99 + module Flags NONE = 0 ALL = FLAGS.values.reduce(&:|) @@ -94,7 +96,7 @@ class UserRole < ApplicationRecord before_validation :set_position - scope :assignable, -> { where.not(id: -99).order(position: :asc) } + scope :assignable, -> { where.not(id: EVERYONE_ROLE_ID).order(position: :asc) } has_many :users, inverse_of: :role, foreign_key: 'role_id', dependent: :nullify @@ -103,9 +105,9 @@ class UserRole < ApplicationRecord end def self.everyone - UserRole.find(-99) + UserRole.find(EVERYONE_ROLE_ID) rescue ActiveRecord::RecordNotFound - UserRole.create!(id: -99, permissions: Flags::DEFAULT) + UserRole.create!(id: EVERYONE_ROLE_ID, permissions: Flags::DEFAULT) end def self.that_can(*any_of_privileges) @@ -113,7 +115,7 @@ class UserRole < ApplicationRecord end def everyone? - id == -99 + id == EVERYONE_ROLE_ID end def nobody? diff --git a/db/migrate/20190715164535_add_instance_actor.rb b/db/migrate/20190715164535_add_instance_actor.rb index 3785dc2553..6871b37bdf 100644 --- a/db/migrate/20190715164535_add_instance_actor.rb +++ b/db/migrate/20190715164535_add_instance_actor.rb @@ -5,6 +5,8 @@ class AddInstanceActor < ActiveRecord::Migration[5.2] # Dummy class, to make migration possible across version changes validates :username, uniqueness: { scope: :domain, case_sensitive: false } + INSTANCE_ACTOR_ID = -99 + before_create :generate_keys def generate_keys @@ -15,10 +17,10 @@ class AddInstanceActor < ActiveRecord::Migration[5.2] end def up - Account.create!(id: -99, actor_type: 'Application', locked: true, username: Rails.configuration.x.local_domain) + Account.create!(id: Account::INSTANCE_ACTOR_ID, actor_type: 'Application', locked: true, username: Rails.configuration.x.local_domain) end def down - Account.find_by(id: -99, actor_type: 'Application').destroy! + Account.find_by(id: Account::INSTANCE_ACTOR_ID, actor_type: 'Application').destroy! end end diff --git a/db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb b/db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb index 00afee26d0..42dc37f08b 100644 --- a/db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb +++ b/db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb @@ -3,7 +3,9 @@ class MigrateSettingsToUserRoles < ActiveRecord::Migration[6.1] disable_ddl_transaction! - class UserRole < ApplicationRecord; end + class UserRole < ApplicationRecord + EVERYONE_ROLE_ID = -99 + end def up process_role_everyone @@ -17,7 +19,7 @@ class MigrateSettingsToUserRoles < ActiveRecord::Migration[6.1] private def process_role_everyone - everyone_role = UserRole.find_by(id: -99) + everyone_role = UserRole.find_by(id: UserRole::EVERYONE_ROLE_ID) return unless everyone_role everyone_role.permissions &= ~::UserRole::FLAGS[:invite_users] unless min_invite_role == 'user' diff --git a/db/seeds/02_instance_actor.rb b/db/seeds/02_instance_actor.rb index 55e83e8a08..2b6befec0d 100644 --- a/db/seeds/02_instance_actor.rb +++ b/db/seeds/02_instance_actor.rb @@ -1,3 +1,3 @@ # frozen_string_literal: true -Account.create_with(actor_type: 'Application', locked: true, username: 'mastodon.internal').find_or_create_by(id: -99) +Account.create_with(actor_type: 'Application', locked: true, username: 'mastodon.internal').find_or_create_by(id: Account::INSTANCE_ACTOR_ID) diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake index 885be79f41..935f6d24a3 100644 --- a/lib/tasks/tests.rake +++ b/lib/tasks/tests.rake @@ -50,7 +50,7 @@ namespace :tests do exit(1) end - if Account.find(-99).private_key.blank? + if Account.find(Account::INSTANCE_ACTOR_ID).private_key.blank? puts 'Instance actor does not have a private key' exit(1) end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index b1dca52dc5..f6376eb36e 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -746,13 +746,13 @@ RSpec.describe Account do end it 'is valid if we are creating an instance actor account with a period' do - account = Fabricate.build(:account, id: -99, actor_type: 'Application', locked: true, username: 'example.com') + account = Fabricate.build(:account, id: described_class::INSTANCE_ACTOR_ID, actor_type: 'Application', locked: true, username: 'example.com') expect(account.valid?).to be true end it 'is valid if we are creating a possibly-conflicting instance actor account' do _account = Fabricate(:account, username: 'examplecom') - instance_account = Fabricate.build(:account, id: -99, actor_type: 'Application', locked: true, username: 'example.com') + instance_account = Fabricate.build(:account, id: described_class::INSTANCE_ACTOR_ID, actor_type: 'Application', locked: true, username: 'example.com') expect(instance_account.valid?).to be true end diff --git a/spec/models/user_role_spec.rb b/spec/models/user_role_spec.rb index d5234ebe8d..9dd04a8172 100644 --- a/spec/models/user_role_spec.rb +++ b/spec/models/user_role_spec.rb @@ -164,12 +164,12 @@ RSpec.describe UserRole do end describe '#everyone?' do - it 'returns true when id is -99' do - subject.id = -99 + it 'returns true when id matches the everyone id' do + subject.id = described_class::EVERYONE_ROLE_ID expect(subject.everyone?).to be true end - it 'returns false when id is not -99' do + it 'returns false when id does not match the everyone id' do subject.id = 123 expect(subject.everyone?).to be false end From 63f4ea055aceff47ae47eabe6da103af05ffafd5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 19 Feb 2024 12:09:58 +0100 Subject: [PATCH 002/954] Change follow suggestions design in web UI (#29272) --- .../components/inline_follow_suggestions.jsx | 25 ++++++++++++++++--- app/javascript/mastodon/locales/en.json | 7 +++++- .../styles/mastodon/components.scss | 9 +++++-- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx b/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx index f76526e045..c39b43bade 100644 --- a/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx +++ b/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx @@ -21,6 +21,7 @@ import { DisplayName } from 'mastodon/components/display_name'; import { Icon } from 'mastodon/components/icon'; import { IconButton } from 'mastodon/components/icon_button'; import { VerifiedBadge } from 'mastodon/components/verified_badge'; +import { domain } from 'mastodon/initial_state'; const messages = defineMessages({ follow: { id: 'account.follow', defaultMessage: 'Follow' }, @@ -28,27 +29,43 @@ const messages = defineMessages({ previous: { id: 'lightbox.previous', defaultMessage: 'Previous' }, next: { id: 'lightbox.next', defaultMessage: 'Next' }, dismiss: { id: 'follow_suggestions.dismiss', defaultMessage: "Don't show again" }, + friendsOfFriendsHint: { id: 'follow_suggestions.hints.friends_of_friends', defaultMessage: 'This profile is popular among the people you follow.' }, + similarToRecentlyFollowedHint: { id: 'follow_suggestions.hints.similar_to_recently_followed', defaultMessage: 'This profile is similar to the profiles you have most recently followed.' }, + featuredHint: { id: 'follow_suggestions.hints.featured', defaultMessage: 'This profile has been hand-picked by the {domain} team.' }, + mostFollowedHint: { id: 'follow_suggestions.hints.most_followed', defaultMessage: 'This profile is one of the most followed on {domain}.'}, + mostInteractionsHint: { id: 'follow_suggestions.hints.most_interactions', defaultMessage: 'This profile has been recently getting a lot of attention on {domain}.' }, }); const Source = ({ id }) => { - let label; + const intl = useIntl(); + + let label, hint; switch (id) { case 'friends_of_friends': + hint = intl.formatMessage(messages.friendsOfFriendsHint); + label = ; + break; case 'similar_to_recently_followed': + hint = intl.formatMessage(messages.similarToRecentlyFollowedHint); label = ; break; case 'featured': - label = ; + hint = intl.formatMessage(messages.featuredHint, { domain }); + label = ; break; case 'most_followed': + hint = intl.formatMessage(messages.mostFollowedHint, { domain }); + label = ; + break; case 'most_interactions': + hint = intl.formatMessage(messages.mostInteractionsHint, { domain }); label = ; break; } return ( -
+
{label}
@@ -92,7 +109,7 @@ const Card = ({ id, sources }) => { {firstVerifiedField ? : }
- ); diff --git a/app/javascript/mastodon/components/relative_timestamp.tsx b/app/javascript/mastodon/components/relative_timestamp.tsx index ac3ab0fb4d..12530c2b17 100644 --- a/app/javascript/mastodon/components/relative_timestamp.tsx +++ b/app/javascript/mastodon/components/relative_timestamp.tsx @@ -53,7 +53,6 @@ const messages = defineMessages({ }); const dateFormatOptions = { - hour12: false, year: 'numeric', month: 'short', day: '2-digit', diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index 1171351c51..be9a1cec65 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -554,7 +554,7 @@ class Status extends ImmutablePureComponent {
- {status.get('edited_at') && *} + {status.get('edited_at') && *} diff --git a/app/javascript/mastodon/features/account/components/header.jsx b/app/javascript/mastodon/features/account/components/header.jsx index 233d208c64..07ea227c48 100644 --- a/app/javascript/mastodon/features/account/components/header.jsx +++ b/app/javascript/mastodon/features/account/components/header.jsx @@ -101,7 +101,6 @@ const dateFormatOptions = { month: 'short', day: 'numeric', year: 'numeric', - hour12: false, hour: '2-digit', minute: '2-digit', }; diff --git a/app/javascript/mastodon/features/getting_started/components/announcements.jsx b/app/javascript/mastodon/features/getting_started/components/announcements.jsx index ea36cefd7d..3c0b53b9e7 100644 --- a/app/javascript/mastodon/features/getting_started/components/announcements.jsx +++ b/app/javascript/mastodon/features/getting_started/components/announcements.jsx @@ -343,7 +343,7 @@ class Announcement extends ImmutablePureComponent { diff --git a/app/javascript/packs/public.jsx b/app/javascript/packs/public.jsx index 01b57dce39..d8a4c16034 100644 --- a/app/javascript/packs/public.jsx +++ b/app/javascript/packs/public.jsx @@ -65,7 +65,6 @@ function loaded() { const timeFormat = new Intl.DateTimeFormat(locale, { timeStyle: 'short', - hour12: false, }); const formatMessage = ({ id, defaultMessage }, values) => { From 14c65180df7d20bbbd5a9b8f80500301d3caca94 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 29 Feb 2024 05:51:11 -0500 Subject: [PATCH 094/954] Use sequence in `software_update` fabricator to allow multiple (#29438) --- spec/fabricators/software_update_fabricator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/fabricators/software_update_fabricator.rb b/spec/fabricators/software_update_fabricator.rb index 622fff66e8..f4b607da0a 100644 --- a/spec/fabricators/software_update_fabricator.rb +++ b/spec/fabricators/software_update_fabricator.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true Fabricator(:software_update) do - version '99.99.99' + version { sequence(:version) { |point| "99.99.#{point}" } } urgent false type 'patch' end From e1fcb02867a0103977062ae11b86f80c5e3fd74f Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 29 Feb 2024 06:00:58 -0500 Subject: [PATCH 095/954] Align `TagServersMeasure` to use `WITH` query style similar to others (#29435) --- .../metrics/measure/tag_servers_measure.rb | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/app/lib/admin/metrics/measure/tag_servers_measure.rb b/app/lib/admin/metrics/measure/tag_servers_measure.rb index 6eb46bca45..e0f1bf3440 100644 --- a/app/lib/admin/metrics/measure/tag_servers_measure.rb +++ b/app/lib/admin/metrics/measure/tag_servers_measure.rb @@ -28,14 +28,17 @@ class Admin::Metrics::Measure::TagServersMeasure < Admin::Metrics::Measure::Base def sql_query_string <<~SQL.squish SELECT axis.*, ( - SELECT count(distinct accounts.domain) AS value - FROM statuses - INNER JOIN statuses_tags ON statuses.id = statuses_tags.status_id - INNER JOIN accounts ON statuses.account_id = accounts.id - WHERE statuses_tags.tag_id = :tag_id - AND statuses.id BETWEEN :earliest_status_id AND :latest_status_id - AND date_trunc('day', statuses.created_at)::date = axis.period - ) + WITH tag_servers AS ( + SELECT DISTINCT accounts.domain + FROM statuses + INNER JOIN statuses_tags ON statuses.id = statuses_tags.status_id + INNER JOIN accounts ON statuses.account_id = accounts.id + WHERE statuses_tags.tag_id = :tag_id + AND statuses.id BETWEEN :earliest_status_id AND :latest_status_id + AND date_trunc('day', statuses.created_at)::date = axis.period + ) + SELECT COUNT(*) FROM tag_servers + ) AS value FROM ( SELECT generate_series(date_trunc('day', :start_at::timestamp)::date, date_trunc('day', :end_at::timestamp)::date, interval '1 day') AS period ) as axis From 6675bf574adf6fc898dde84fccdbd7abe17c3072 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 29 Feb 2024 08:47:38 -0500 Subject: [PATCH 096/954] Extract `parsed_uri_query_values` helper in ap/replies controller spec (#29410) --- .../activitypub/replies_controller_spec.rb | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/spec/controllers/activitypub/replies_controller_spec.rb b/spec/controllers/activitypub/replies_controller_spec.rb index 6b5a69d42a..db7f60d3f8 100644 --- a/spec/controllers/activitypub/replies_controller_spec.rb +++ b/spec/controllers/activitypub/replies_controller_spec.rb @@ -90,7 +90,7 @@ RSpec.describe ActivityPub::RepliesController do context 'when there are few self-replies' do it 'points next to replies from other people' do expect(page_json).to be_a Hash - expect(Addressable::URI.parse(page_json[:next]).query.split('&')).to include('only_other_accounts=true', 'page=true') + expect(parsed_uri_query_values(page_json[:next])).to include('only_other_accounts=true', 'page=true') end end @@ -101,7 +101,7 @@ RSpec.describe ActivityPub::RepliesController do it 'points next to other self-replies' do expect(page_json).to be_a Hash - expect(Addressable::URI.parse(page_json[:next]).query.split('&')).to include('only_other_accounts=false', 'page=true') + expect(parsed_uri_query_values(page_json[:next])).to include('only_other_accounts=false', 'page=true') end end end @@ -140,7 +140,7 @@ RSpec.describe ActivityPub::RepliesController do it 'points next to other replies' do expect(page_json).to be_a Hash - expect(Addressable::URI.parse(page_json[:next]).query.split('&')).to include('only_other_accounts=true', 'page=true') + expect(parsed_uri_query_values(page_json[:next])).to include('only_other_accounts=true', 'page=true') end end end @@ -196,6 +196,13 @@ RSpec.describe ActivityPub::RepliesController do private + def parsed_uri_query_values(uri) + Addressable::URI + .parse(uri) + .query + .split('&') + end + def ap_public_collection ActivityPub::TagManager::COLLECTIONS[:public] end From f24c62a5c809e9d3ec944804a9c28804d9896bbd Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 29 Feb 2024 14:54:02 +0100 Subject: [PATCH 097/954] Fix preview card player getting embedded when clicking on the external link button (#29457) --- app/javascript/mastodon/features/status/components/card.jsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/status/components/card.jsx b/app/javascript/mastodon/features/status/components/card.jsx index f37b558c4c..f47861f663 100644 --- a/app/javascript/mastodon/features/status/components/card.jsx +++ b/app/javascript/mastodon/features/status/components/card.jsx @@ -92,6 +92,10 @@ export default class Card extends PureComponent { this.setState({ embedded: true }); }; + handleExternalLinkClick = (e) => { + e.stopPropagation(); + }; + setRef = c => { this.node = c; }; @@ -201,7 +205,7 @@ export default class Card extends PureComponent {
- +
) : spoilerButton} From edd6aa70e1117818669cf0b85b7a3cde06a3c8c1 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 29 Feb 2024 14:54:06 +0100 Subject: [PATCH 098/954] Fix regression with search bar icon position (#29456) --- app/javascript/styles/mastodon/components.scss | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 29c91ef7bc..5bd11c3500 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -5210,10 +5210,6 @@ a.status-card { pointer-events: auto; opacity: 1; } - - @media screen and (min-width: $no-gap-breakpoint) { - inset-inline-start: 16px - 2px; - } } .icon-search { @@ -8265,7 +8261,7 @@ noscript { .search__input { border: 1px solid lighten($ui-base-color, 8%); padding: 10px; - padding-inline-end: 28px; + padding-inline-end: 30px; } .search__popout { From eb1b8f69de70bbf82fcf14663482c57a25161024 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 29 Feb 2024 09:21:56 -0500 Subject: [PATCH 099/954] Allow pagination `Link` headers on API accounts/statuses when pinned true (#29442) --- .../api/v1/accounts/statuses_controller.rb | 2 +- .../v1/accounts/statuses_controller_spec.rb | 48 ++++++++++++++++++- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb index fe4279302f..6a994ff541 100644 --- a/app/controllers/api/v1/accounts/statuses_controller.rb +++ b/app/controllers/api/v1/accounts/statuses_controller.rb @@ -4,7 +4,7 @@ class Api::V1::Accounts::StatusesController < Api::BaseController before_action -> { authorize_if_got_token! :read, :'read:statuses' } before_action :set_account - after_action :insert_pagination_headers, unless: -> { truthy_param?(:pinned) } + after_action :insert_pagination_headers def index cache_if_unauthenticated! diff --git a/spec/controllers/api/v1/accounts/statuses_controller_spec.rb b/spec/controllers/api/v1/accounts/statuses_controller_spec.rb index 9bf385c03d..102e3b8e91 100644 --- a/spec/controllers/api/v1/accounts/statuses_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/statuses_controller_spec.rb @@ -18,7 +18,8 @@ describe Api::V1::Accounts::StatusesController do get :index, params: { account_id: user.account.id, limit: 1 } expect(response).to have_http_status(200) - expect(response.headers['Link'].links.size).to eq(2) + expect(links_from_header.size) + .to eq(2) end context 'with only media' do @@ -55,10 +56,45 @@ describe Api::V1::Accounts::StatusesController do Fabricate(:status_pin, account: user.account, status: Fabricate(:status, account: user.account)) end - it 'returns http success' do + it 'returns http success and includes a header link' do get :index, params: { account_id: user.account.id, pinned: true } expect(response).to have_http_status(200) + expect(links_from_header.size) + .to eq(1) + expect(links_from_header) + .to contain_exactly( + have_attributes( + href: /pinned=true/, + attr_pairs: contain_exactly(['rel', 'prev']) + ) + ) + end + end + + context 'with enough pinned statuses to paginate' do + before do + stub_const 'Api::BaseController::DEFAULT_STATUSES_LIMIT', 1 + 2.times { Fabricate(:status_pin, account: user.account) } + end + + it 'returns http success and header pagination links to prev and next' do + get :index, params: { account_id: user.account.id, pinned: true } + + expect(response).to have_http_status(200) + expect(links_from_header.size) + .to eq(2) + expect(links_from_header) + .to contain_exactly( + have_attributes( + href: /pinned=true/, + attr_pairs: contain_exactly(['rel', 'next']) + ), + have_attributes( + href: /pinned=true/, + attr_pairs: contain_exactly(['rel', 'prev']) + ) + ) end end @@ -98,4 +134,12 @@ describe Api::V1::Accounts::StatusesController do end end end + + private + + def links_from_header + response + .headers['Link'] + .links + end end From 6dfe318f34d69066dc0f453a228fdfc6af84b62e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 29 Feb 2024 16:20:39 +0100 Subject: [PATCH 100/954] Update dependency express to v4.18.3 (#29458) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 67 +++++++++++++++---------------------------------------- 1 file changed, 18 insertions(+), 49 deletions(-) diff --git a/yarn.lock b/yarn.lock index dda4ed326e..b336fef88c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -42,7 +42,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.5": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5": version: 7.23.5 resolution: "@babel/code-frame@npm:7.23.5" dependencies: @@ -373,15 +373,6 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.22.15": - version: 7.23.6 - resolution: "@babel/parser@npm:7.23.6" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/6f76cd5ccae1fa9bcab3525b0865c6222e9c1d22f87abc69f28c5c7b2c8816a13361f5bd06bddbd5faf903f7320a8feba02545c981468acec45d12a03db7755e - languageName: node - linkType: hard - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" @@ -1500,18 +1491,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.3.3": - version: 7.22.15 - resolution: "@babel/template@npm:7.22.15" - dependencies: - "@babel/code-frame": "npm:^7.22.13" - "@babel/parser": "npm:^7.22.15" - "@babel/types": "npm:^7.22.15" - checksum: 10c0/9312edd37cf1311d738907003f2aa321a88a42ba223c69209abe4d7111db019d321805504f606c7fd75f21c6cf9d24d0a8223104cd21ebd207e241b6c551f454 - languageName: node - linkType: hard - -"@babel/template@npm:^7.23.9": +"@babel/template@npm:^7.22.15, @babel/template@npm:^7.23.9, @babel/template@npm:^7.3.3": version: 7.23.9 resolution: "@babel/template@npm:7.23.9" dependencies: @@ -1540,18 +1520,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.23.6 - resolution: "@babel/types@npm:7.23.6" - dependencies: - "@babel/helper-string-parser": "npm:^7.23.4" - "@babel/helper-validator-identifier": "npm:^7.22.20" - to-fast-properties: "npm:^2.0.0" - checksum: 10c0/42cefce8a68bd09bb5828b4764aa5586c53c60128ac2ac012e23858e1c179347a4aac9c66fc577994fbf57595227611c5ec8270bf0cfc94ff033bbfac0550b70 - languageName: node - linkType: hard - -"@babel/types@npm:^7.23.9": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.23.9, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.23.9 resolution: "@babel/types@npm:7.23.9" dependencies: @@ -5026,12 +4995,12 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.1": - version: 1.20.1 - resolution: "body-parser@npm:1.20.1" +"body-parser@npm:1.20.2": + version: 1.20.2 + resolution: "body-parser@npm:1.20.2" dependencies: bytes: "npm:3.1.2" - content-type: "npm:~1.0.4" + content-type: "npm:~1.0.5" debug: "npm:2.6.9" depd: "npm:2.0.0" destroy: "npm:1.2.0" @@ -5039,10 +5008,10 @@ __metadata: iconv-lite: "npm:0.4.24" on-finished: "npm:2.4.1" qs: "npm:6.11.0" - raw-body: "npm:2.5.1" + raw-body: "npm:2.5.2" type-is: "npm:~1.6.18" unpipe: "npm:1.0.0" - checksum: 10c0/a202d493e2c10a33fb7413dac7d2f713be579c4b88343cd814b6df7a38e5af1901fc31044e04de176db56b16d9772aa25a7723f64478c20f4d91b1ac223bf3b8 + checksum: 10c0/06f1438fff388a2e2354c96aa3ea8147b79bfcb1262dfcc2aae68ec13723d01d5781680657b74e9f83c808266d5baf52804032fbde2b7382b89bd8cdb273ace9 languageName: node linkType: hard @@ -5872,7 +5841,7 @@ __metadata: languageName: node linkType: hard -"content-type@npm:~1.0.4": +"content-type@npm:~1.0.4, content-type@npm:~1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af @@ -7740,12 +7709,12 @@ __metadata: linkType: hard "express@npm:^4.17.1, express@npm:^4.18.2": - version: 4.18.2 - resolution: "express@npm:4.18.2" + version: 4.18.3 + resolution: "express@npm:4.18.3" dependencies: accepts: "npm:~1.3.8" array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.1" + body-parser: "npm:1.20.2" content-disposition: "npm:0.5.4" content-type: "npm:~1.0.4" cookie: "npm:0.5.0" @@ -7774,7 +7743,7 @@ __metadata: type-is: "npm:~1.6.18" utils-merge: "npm:1.0.1" vary: "npm:~1.1.2" - checksum: 10c0/75af556306b9241bc1d7bdd40c9744b516c38ce50ae3210658efcbf96e3aed4ab83b3432f06215eae5610c123bc4136957dc06e50dfc50b7d4d775af56c4c59c + checksum: 10c0/0b9eeafbac549e3c67d92d083bf1773e358359f41ad142b92121935c6348d29079b75054555b3f62de39263fffc8ba06898b09fdd3e213e28e714c03c5d9f44c languageName: node linkType: hard @@ -13412,15 +13381,15 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:2.5.1": - version: 2.5.1 - resolution: "raw-body@npm:2.5.1" +"raw-body@npm:2.5.2": + version: 2.5.2 + resolution: "raw-body@npm:2.5.2" dependencies: bytes: "npm:3.1.2" http-errors: "npm:2.0.0" iconv-lite: "npm:0.4.24" unpipe: "npm:1.0.0" - checksum: 10c0/5dad5a3a64a023b894ad7ab4e5c7c1ce34d3497fc7138d02f8c88a3781e68d8a55aa7d4fd3a458616fa8647cc228be314a1c03fb430a07521de78b32c4dd09d2 + checksum: 10c0/b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 languageName: node linkType: hard From 958a810553aac6b6cf21d9d107a47b6f68b2a401 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Thu, 29 Feb 2024 16:21:03 +0100 Subject: [PATCH 101/954] Convert `packs/admin.jsx` to Typescript (#29425) --- app/javascript/packs/admin.jsx | 244 ---------------------- app/javascript/packs/admin.tsx | 368 +++++++++++++++++++++++++++++++++ 2 files changed, 368 insertions(+), 244 deletions(-) delete mode 100644 app/javascript/packs/admin.jsx create mode 100644 app/javascript/packs/admin.tsx diff --git a/app/javascript/packs/admin.jsx b/app/javascript/packs/admin.jsx deleted file mode 100644 index 5f24d6677e..0000000000 --- a/app/javascript/packs/admin.jsx +++ /dev/null @@ -1,244 +0,0 @@ -import './public-path'; -import React from 'react'; -import { createRoot } from 'react-dom/client'; - -import Rails from '@rails/ujs'; - -import ready from '../mastodon/ready'; - -const setAnnouncementEndsAttributes = (target) => { - const valid = target?.value && target?.validity?.valid; - const element = document.querySelector('input[type="datetime-local"]#announcement_ends_at'); - if (valid) { - element.classList.remove('optional'); - element.required = true; - element.min = target.value; - } else { - element.classList.add('optional'); - element.removeAttribute('required'); - element.removeAttribute('min'); - } -}; - -Rails.delegate(document, 'input[type="datetime-local"]#announcement_starts_at', 'change', ({ target }) => { - setAnnouncementEndsAttributes(target); -}); - -const batchCheckboxClassName = '.batch-checkbox input[type="checkbox"]'; - -const showSelectAll = () => { - const selectAllMatchingElement = document.querySelector('.batch-table__select-all'); - selectAllMatchingElement.classList.add('active'); -}; - -const hideSelectAll = () => { - const selectAllMatchingElement = document.querySelector('.batch-table__select-all'); - const hiddenField = document.querySelector('#select_all_matching'); - const selectedMsg = document.querySelector('.batch-table__select-all .selected'); - const notSelectedMsg = document.querySelector('.batch-table__select-all .not-selected'); - - selectAllMatchingElement.classList.remove('active'); - selectedMsg.classList.remove('active'); - notSelectedMsg.classList.add('active'); - hiddenField.value = '0'; -}; - -Rails.delegate(document, '#batch_checkbox_all', 'change', ({ target }) => { - const selectAllMatchingElement = document.querySelector('.batch-table__select-all'); - - document.querySelectorAll(batchCheckboxClassName).forEach((content) => { - content.checked = target.checked; - }); - - if (selectAllMatchingElement) { - if (target.checked) { - showSelectAll(); - } else { - hideSelectAll(); - } - } -}); - -Rails.delegate(document, '.batch-table__select-all button', 'click', () => { - const hiddenField = document.querySelector('#select_all_matching'); - const active = hiddenField.value === '1'; - const selectedMsg = document.querySelector('.batch-table__select-all .selected'); - const notSelectedMsg = document.querySelector('.batch-table__select-all .not-selected'); - - if (active) { - hiddenField.value = '0'; - selectedMsg.classList.remove('active'); - notSelectedMsg.classList.add('active'); - } else { - hiddenField.value = '1'; - notSelectedMsg.classList.remove('active'); - selectedMsg.classList.add('active'); - } -}); - -Rails.delegate(document, batchCheckboxClassName, 'change', () => { - const checkAllElement = document.querySelector('#batch_checkbox_all'); - const selectAllMatchingElement = document.querySelector('.batch-table__select-all'); - - if (checkAllElement) { - const allCheckboxes = Array.from( - document.querySelectorAll(batchCheckboxClassName) - ); - checkAllElement.checked = allCheckboxes.every((content) => content.checked); - checkAllElement.indeterminate = !checkAllElement.checked && allCheckboxes.some((content) => content.checked); - - if (selectAllMatchingElement) { - if (checkAllElement.checked) { - showSelectAll(); - } else { - hideSelectAll(); - } - } - } -}); - -Rails.delegate(document, '.filter-subset--with-select select', 'change', ({ target }) => { - target.form.submit(); -}); - -const onDomainBlockSeverityChange = (target) => { - const rejectMediaDiv = document.querySelector('.input.with_label.domain_block_reject_media'); - const rejectReportsDiv = document.querySelector('.input.with_label.domain_block_reject_reports'); - - if (rejectMediaDiv) { - rejectMediaDiv.style.display = (target.value === 'suspend') ? 'none' : 'block'; - } - - if (rejectReportsDiv) { - rejectReportsDiv.style.display = (target.value === 'suspend') ? 'none' : 'block'; - } -}; - -Rails.delegate(document, '#domain_block_severity', 'change', ({ target }) => onDomainBlockSeverityChange(target)); - -const onEnableBootstrapTimelineAccountsChange = (target) => { - const bootstrapTimelineAccountsField = document.querySelector('#form_admin_settings_bootstrap_timeline_accounts'); - - if (bootstrapTimelineAccountsField) { - bootstrapTimelineAccountsField.disabled = !target.checked; - if (target.checked) { - bootstrapTimelineAccountsField.parentElement.classList.remove('disabled'); - bootstrapTimelineAccountsField.parentElement.parentElement.classList.remove('disabled'); - } else { - bootstrapTimelineAccountsField.parentElement.classList.add('disabled'); - bootstrapTimelineAccountsField.parentElement.parentElement.classList.add('disabled'); - } - } -}; - -Rails.delegate(document, '#form_admin_settings_enable_bootstrap_timeline_accounts', 'change', ({ target }) => onEnableBootstrapTimelineAccountsChange(target)); - -const onChangeRegistrationMode = (target) => { - const enabled = target.value === 'approved'; - - document.querySelectorAll('.form_admin_settings_registrations_mode .warning-hint').forEach((warning_hint) => { - warning_hint.style.display = target.value === 'open' ? 'inline' : 'none'; - }); - - document.querySelectorAll('#form_admin_settings_require_invite_text').forEach((input) => { - input.disabled = !enabled; - if (enabled) { - let element = input; - do { - element.classList.remove('disabled'); - element = element.parentElement; - } while (element && !element.classList.contains('fields-group')); - } else { - let element = input; - do { - element.classList.add('disabled'); - element = element.parentElement; - } while (element && !element.classList.contains('fields-group')); - } - }); -}; - -const convertUTCDateTimeToLocal = (value) => { - const date = new Date(value + 'Z'); - const twoChars = (x) => (x.toString().padStart(2, '0')); - return `${date.getFullYear()}-${twoChars(date.getMonth()+1)}-${twoChars(date.getDate())}T${twoChars(date.getHours())}:${twoChars(date.getMinutes())}`; -}; - -const convertLocalDatetimeToUTC = (value) => { - const re = /^([0-9]{4,})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})/; - const match = re.exec(value); - const date = new Date(match[1], match[2] - 1, match[3], match[4], match[5]); - const fullISO8601 = date.toISOString(); - return fullISO8601.slice(0, fullISO8601.indexOf('T') + 6); -}; - -Rails.delegate(document, '#form_admin_settings_registrations_mode', 'change', ({ target }) => onChangeRegistrationMode(target)); - -ready(() => { - const domainBlockSeverityInput = document.getElementById('domain_block_severity'); - if (domainBlockSeverityInput) onDomainBlockSeverityChange(domainBlockSeverityInput); - - const enableBootstrapTimelineAccounts = document.getElementById('form_admin_settings_enable_bootstrap_timeline_accounts'); - if (enableBootstrapTimelineAccounts) onEnableBootstrapTimelineAccountsChange(enableBootstrapTimelineAccounts); - - const registrationMode = document.getElementById('form_admin_settings_registrations_mode'); - if (registrationMode) onChangeRegistrationMode(registrationMode); - - const checkAllElement = document.querySelector('#batch_checkbox_all'); - if (checkAllElement) { - const allCheckboxes = Array.from(document.querySelectorAll(batchCheckboxClassName)); - checkAllElement.checked = allCheckboxes.every( (content) => content.checked); - checkAllElement.indeterminate = !checkAllElement.checked && allCheckboxes.some((content) => content.checked); - } - - document.querySelector('a#add-instance-button')?.addEventListener('click', (e) => { - const domain = document.querySelector('input[type="text"]#by_domain')?.value; - - if (domain) { - const url = new URL(event.target.href); - url.searchParams.set('_domain', domain); - e.target.href = url; - } - }); - - document.querySelectorAll('input[type="datetime-local"]').forEach(element => { - if (element.value) { - element.value = convertUTCDateTimeToLocal(element.value); - } - if (element.placeholder) { - element.placeholder = convertUTCDateTimeToLocal(element.placeholder); - } - }); - - Rails.delegate(document, 'form', 'submit', ({ target }) => { - target.querySelectorAll('input[type="datetime-local"]').forEach(element => { - if (element.value && element.validity.valid) { - element.value = convertLocalDatetimeToUTC(element.value); - } - }); - }); - - const announcementStartsAt = document.querySelector('input[type="datetime-local"]#announcement_starts_at'); - if (announcementStartsAt) { - setAnnouncementEndsAttributes(announcementStartsAt); - } - - document.querySelectorAll('[data-admin-component]').forEach(element => { - const componentName = element.getAttribute('data-admin-component'); - const componentProps = JSON.parse(element.getAttribute('data-props')); - - import('../mastodon/containers/admin_component').then(({ default: AdminComponent }) => { - return import('../mastodon/components/admin/' + componentName).then(({ default: Component }) => { - const root = createRoot(element); - - root.render ( - - - , - ); - }); - }).catch(error => { - console.error(error); - }); - }); -}); diff --git a/app/javascript/packs/admin.tsx b/app/javascript/packs/admin.tsx new file mode 100644 index 0000000000..25e0889cd9 --- /dev/null +++ b/app/javascript/packs/admin.tsx @@ -0,0 +1,368 @@ +import './public-path'; +import { createRoot } from 'react-dom/client'; + +import Rails from '@rails/ujs'; + +import ready from '../mastodon/ready'; + +const setAnnouncementEndsAttributes = (target: HTMLInputElement) => { + const valid = target.value && target.validity.valid; + const element = document.querySelector( + 'input[type="datetime-local"]#announcement_ends_at', + ); + + if (!element) return; + + if (valid) { + element.classList.remove('optional'); + element.required = true; + element.min = target.value; + } else { + element.classList.add('optional'); + element.removeAttribute('required'); + element.removeAttribute('min'); + } +}; + +Rails.delegate( + document, + 'input[type="datetime-local"]#announcement_starts_at', + 'change', + ({ target }) => { + if (target instanceof HTMLInputElement) + setAnnouncementEndsAttributes(target); + }, +); + +const batchCheckboxClassName = '.batch-checkbox input[type="checkbox"]'; + +const showSelectAll = () => { + const selectAllMatchingElement = document.querySelector( + '.batch-table__select-all', + ); + selectAllMatchingElement?.classList.add('active'); +}; + +const hideSelectAll = () => { + const selectAllMatchingElement = document.querySelector( + '.batch-table__select-all', + ); + const hiddenField = document.querySelector( + 'input#select_all_matching', + ); + const selectedMsg = document.querySelector( + '.batch-table__select-all .selected', + ); + const notSelectedMsg = document.querySelector( + '.batch-table__select-all .not-selected', + ); + + selectAllMatchingElement?.classList.remove('active'); + selectedMsg?.classList.remove('active'); + notSelectedMsg?.classList.add('active'); + if (hiddenField) hiddenField.value = '0'; +}; + +Rails.delegate(document, '#batch_checkbox_all', 'change', ({ target }) => { + if (!(target instanceof HTMLInputElement)) return; + + const selectAllMatchingElement = document.querySelector( + '.batch-table__select-all', + ); + + document + .querySelectorAll(batchCheckboxClassName) + .forEach((content) => { + content.checked = target.checked; + }); + + if (selectAllMatchingElement) { + if (target.checked) { + showSelectAll(); + } else { + hideSelectAll(); + } + } +}); + +Rails.delegate(document, '.batch-table__select-all button', 'click', () => { + const hiddenField = document.querySelector( + '#select_all_matching', + ); + + if (!hiddenField) return; + + const active = hiddenField.value === '1'; + const selectedMsg = document.querySelector( + '.batch-table__select-all .selected', + ); + const notSelectedMsg = document.querySelector( + '.batch-table__select-all .not-selected', + ); + + if (!selectedMsg || !notSelectedMsg) return; + + if (active) { + hiddenField.value = '0'; + selectedMsg.classList.remove('active'); + notSelectedMsg.classList.add('active'); + } else { + hiddenField.value = '1'; + notSelectedMsg.classList.remove('active'); + selectedMsg.classList.add('active'); + } +}); + +Rails.delegate(document, batchCheckboxClassName, 'change', () => { + const checkAllElement = document.querySelector( + 'input#batch_checkbox_all', + ); + const selectAllMatchingElement = document.querySelector( + '.batch-table__select-all', + ); + + if (checkAllElement) { + const allCheckboxes = Array.from( + document.querySelectorAll(batchCheckboxClassName), + ); + checkAllElement.checked = allCheckboxes.every((content) => content.checked); + checkAllElement.indeterminate = + !checkAllElement.checked && + allCheckboxes.some((content) => content.checked); + + if (selectAllMatchingElement) { + if (checkAllElement.checked) { + showSelectAll(); + } else { + hideSelectAll(); + } + } + } +}); + +Rails.delegate( + document, + '.filter-subset--with-select select', + 'change', + ({ target }) => { + if (target instanceof HTMLSelectElement) target.form?.submit(); + }, +); + +const onDomainBlockSeverityChange = (target: HTMLInputElement) => { + const rejectMediaDiv = document.querySelector( + '.input.with_label.domain_block_reject_media', + ); + const rejectReportsDiv = document.querySelector( + '.input.with_label.domain_block_reject_reports', + ); + + if (rejectMediaDiv && rejectMediaDiv instanceof HTMLElement) { + rejectMediaDiv.style.display = + target.value === 'suspend' ? 'none' : 'block'; + } + + if (rejectReportsDiv && rejectReportsDiv instanceof HTMLElement) { + rejectReportsDiv.style.display = + target.value === 'suspend' ? 'none' : 'block'; + } +}; + +Rails.delegate(document, '#domain_block_severity', 'change', ({ target }) => { + if (target instanceof HTMLInputElement) onDomainBlockSeverityChange(target); +}); + +const onEnableBootstrapTimelineAccountsChange = (target: HTMLInputElement) => { + const bootstrapTimelineAccountsField = + document.querySelector( + '#form_admin_settings_bootstrap_timeline_accounts', + ); + + if (bootstrapTimelineAccountsField) { + bootstrapTimelineAccountsField.disabled = !target.checked; + if (target.checked) { + bootstrapTimelineAccountsField.parentElement?.classList.remove( + 'disabled', + ); + bootstrapTimelineAccountsField.parentElement?.parentElement?.classList.remove( + 'disabled', + ); + } else { + bootstrapTimelineAccountsField.parentElement?.classList.add('disabled'); + bootstrapTimelineAccountsField.parentElement?.parentElement?.classList.add( + 'disabled', + ); + } + } +}; + +Rails.delegate( + document, + '#form_admin_settings_enable_bootstrap_timeline_accounts', + 'change', + ({ target }) => { + if (target instanceof HTMLInputElement) + onEnableBootstrapTimelineAccountsChange(target); + }, +); + +const onChangeRegistrationMode = (target: HTMLInputElement) => { + const enabled = target.value === 'approved'; + + document + .querySelectorAll( + '.form_admin_settings_registrations_mode .warning-hint', + ) + .forEach((warning_hint) => { + warning_hint.style.display = target.value === 'open' ? 'inline' : 'none'; + }); + + document + .querySelectorAll( + 'input#form_admin_settings_require_invite_text', + ) + .forEach((input) => { + input.disabled = !enabled; + if (enabled) { + let element: HTMLElement | null = input; + do { + element.classList.remove('disabled'); + element = element.parentElement; + } while (element && !element.classList.contains('fields-group')); + } else { + let element: HTMLElement | null = input; + do { + element.classList.add('disabled'); + element = element.parentElement; + } while (element && !element.classList.contains('fields-group')); + } + }); +}; + +const convertUTCDateTimeToLocal = (value: string) => { + const date = new Date(value + 'Z'); + const twoChars = (x: number) => x.toString().padStart(2, '0'); + return `${date.getFullYear()}-${twoChars(date.getMonth() + 1)}-${twoChars(date.getDate())}T${twoChars(date.getHours())}:${twoChars(date.getMinutes())}`; +}; + +function convertLocalDatetimeToUTC(value: string) { + const date = new Date(value); + const fullISO8601 = date.toISOString(); + return fullISO8601.slice(0, fullISO8601.indexOf('T') + 6); +} + +Rails.delegate( + document, + '#form_admin_settings_registrations_mode', + 'change', + ({ target }) => { + if (target instanceof HTMLInputElement) onChangeRegistrationMode(target); + }, +); + +async function mountReactComponent(element: Element) { + const componentName = element.getAttribute('data-admin-component'); + const stringProps = element.getAttribute('data-props'); + + if (!stringProps) return; + + const componentProps = JSON.parse(stringProps) as object; + + const { default: AdminComponent } = await import( + '@/mastodon/containers/admin_component' + ); + + const { default: Component } = (await import( + `@/mastodon/components/admin/${componentName}` + )) as { default: React.ComponentType }; + + const root = createRoot(element); + + root.render( + + + , + ); +} + +ready(() => { + const domainBlockSeverityInput = document.querySelector( + 'input#domain_block_severity', + ); + if (domainBlockSeverityInput) + onDomainBlockSeverityChange(domainBlockSeverityInput); + + const enableBootstrapTimelineAccounts = + document.querySelector( + 'input#form_admin_settings_enable_bootstrap_timeline_accounts', + ); + if (enableBootstrapTimelineAccounts) + onEnableBootstrapTimelineAccountsChange(enableBootstrapTimelineAccounts); + + const registrationMode = document.querySelector( + 'input#form_admin_settings_registrations_mode', + ); + if (registrationMode) onChangeRegistrationMode(registrationMode); + + const checkAllElement = document.querySelector( + 'input#batch_checkbox_all', + ); + if (checkAllElement) { + const allCheckboxes = Array.from( + document.querySelectorAll(batchCheckboxClassName), + ); + checkAllElement.checked = allCheckboxes.every((content) => content.checked); + checkAllElement.indeterminate = + !checkAllElement.checked && + allCheckboxes.some((content) => content.checked); + } + + document + .querySelector('a#add-instance-button') + ?.addEventListener('click', (e) => { + const domain = document.querySelector( + 'input[type="text"]#by_domain', + )?.value; + + if (domain && e.target instanceof HTMLAnchorElement) { + const url = new URL(e.target.href); + url.searchParams.set('_domain', domain); + e.target.href = url.toString(); + } + }); + + document + .querySelectorAll('input[type="datetime-local"]') + .forEach((element) => { + if (element.value) { + element.value = convertUTCDateTimeToLocal(element.value); + } + if (element.placeholder) { + element.placeholder = convertUTCDateTimeToLocal(element.placeholder); + } + }); + + Rails.delegate(document, 'form', 'submit', ({ target }) => { + if (target instanceof HTMLFormElement) + target + .querySelectorAll('input[type="datetime-local"]') + .forEach((element) => { + if (element.value && element.validity.valid) { + element.value = convertLocalDatetimeToUTC(element.value); + } + }); + }); + + const announcementStartsAt = document.querySelector( + 'input[type="datetime-local"]#announcement_starts_at', + ); + if (announcementStartsAt) { + setAnnouncementEndsAttributes(announcementStartsAt); + } + + document.querySelectorAll('[data-admin-component]').forEach((element) => { + void mountReactComponent(element); + }); +}).catch((reason) => { + throw reason; +}); From b9940eb9778d9bf26b3bfea002424f1731c34383 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 29 Feb 2024 18:25:04 -0500 Subject: [PATCH 102/954] Disable codecov comments on PRs (#29464) --- .github/codecov.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/codecov.yml b/.github/codecov.yml index 5532c49618..9d6413a106 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -1,3 +1,4 @@ +comment: false # Do not leave PR comments coverage: status: project: @@ -8,6 +9,3 @@ coverage: default: # Github status check is not blocking informational: true -comment: - # Only write a comment in PR if there are changes - require_changes: true From ec953bf378ac6ae9b7dab5db053dca947f3c869b Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 1 Mar 2024 11:16:35 +0100 Subject: [PATCH 103/954] Fix regression in handling `select` elements in `packs/admin.tsx` (#29469) --- app/javascript/packs/admin.tsx | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/javascript/packs/admin.tsx b/app/javascript/packs/admin.tsx index 25e0889cd9..9fee560565 100644 --- a/app/javascript/packs/admin.tsx +++ b/app/javascript/packs/admin.tsx @@ -149,7 +149,7 @@ Rails.delegate( }, ); -const onDomainBlockSeverityChange = (target: HTMLInputElement) => { +const onDomainBlockSeverityChange = (target: HTMLSelectElement) => { const rejectMediaDiv = document.querySelector( '.input.with_label.domain_block_reject_media', ); @@ -169,7 +169,7 @@ const onDomainBlockSeverityChange = (target: HTMLInputElement) => { }; Rails.delegate(document, '#domain_block_severity', 'change', ({ target }) => { - if (target instanceof HTMLInputElement) onDomainBlockSeverityChange(target); + if (target instanceof HTMLSelectElement) onDomainBlockSeverityChange(target); }); const onEnableBootstrapTimelineAccountsChange = (target: HTMLInputElement) => { @@ -206,7 +206,7 @@ Rails.delegate( }, ); -const onChangeRegistrationMode = (target: HTMLInputElement) => { +const onChangeRegistrationMode = (target: HTMLSelectElement) => { const enabled = target.value === 'approved'; document @@ -256,7 +256,7 @@ Rails.delegate( '#form_admin_settings_registrations_mode', 'change', ({ target }) => { - if (target instanceof HTMLInputElement) onChangeRegistrationMode(target); + if (target instanceof HTMLSelectElement) onChangeRegistrationMode(target); }, ); @@ -286,11 +286,11 @@ async function mountReactComponent(element: Element) { } ready(() => { - const domainBlockSeverityInput = document.querySelector( - 'input#domain_block_severity', + const domainBlockSeveritySelect = document.querySelector( + 'select#domain_block_severity', ); - if (domainBlockSeverityInput) - onDomainBlockSeverityChange(domainBlockSeverityInput); + if (domainBlockSeveritySelect) + onDomainBlockSeverityChange(domainBlockSeveritySelect); const enableBootstrapTimelineAccounts = document.querySelector( @@ -299,8 +299,8 @@ ready(() => { if (enableBootstrapTimelineAccounts) onEnableBootstrapTimelineAccountsChange(enableBootstrapTimelineAccounts); - const registrationMode = document.querySelector( - 'input#form_admin_settings_registrations_mode', + const registrationMode = document.querySelector( + 'select#form_admin_settings_registrations_mode', ); if (registrationMode) onChangeRegistrationMode(registrationMode); From 3389c41b5899c1da479bfc08e84588184e09902d Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 1 Mar 2024 06:05:24 -0500 Subject: [PATCH 104/954] Move `nobody` position in `UserRole` magic number to constant (#29465) --- app/models/user_role.rb | 5 +++-- spec/models/user_role_spec.rb | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/models/user_role.rb b/app/models/user_role.rb index 9115d91c24..23cc28b9b7 100644 --- a/app/models/user_role.rb +++ b/app/models/user_role.rb @@ -39,6 +39,7 @@ class UserRole < ApplicationRecord }.freeze EVERYONE_ROLE_ID = -99 + NOBODY_POSITION = -1 module Flags NONE = 0 @@ -104,7 +105,7 @@ class UserRole < ApplicationRecord has_many :users, inverse_of: :role, foreign_key: 'role_id', dependent: :nullify def self.nobody - @nobody ||= UserRole.new(permissions: Flags::NONE, position: -1) + @nobody ||= UserRole.new(permissions: Flags::NONE, position: NOBODY_POSITION) end def self.everyone @@ -173,7 +174,7 @@ class UserRole < ApplicationRecord end def set_position - self.position = -1 if everyone? + self.position = NOBODY_POSITION if everyone? end def validate_own_role_edition diff --git a/spec/models/user_role_spec.rb b/spec/models/user_role_spec.rb index 9dd04a8172..96d12263ae 100644 --- a/spec/models/user_role_spec.rb +++ b/spec/models/user_role_spec.rb @@ -139,7 +139,7 @@ RSpec.describe UserRole do end it 'has negative position' do - expect(subject.position).to eq(-1) + expect(subject.position).to eq(described_class::NOBODY_POSITION) end end @@ -159,7 +159,7 @@ RSpec.describe UserRole do end it 'has negative position' do - expect(subject.position).to eq(-1) + expect(subject.position).to eq(described_class::NOBODY_POSITION) end end From 934cab75083a4ab79003a583881775b6d4a2b58a Mon Sep 17 00:00:00 2001 From: HTeuMeuLeu Date: Fri, 1 Mar 2024 13:16:53 +0100 Subject: [PATCH 105/954] New welcome email (#28883) Co-authored-by: Eugen Rochko --- .../{step5-off.png => apps_step-off.png} | Bin .../mailer-new/welcome/apps_step-on.png | Bin 0 -> 1291 bytes .../mailer-new/welcome/btn-app-store.png | Bin 0 -> 2054 bytes .../mailer-new/welcome/btn-google-play.png | Bin 0 -> 4512 bytes .../welcome/edit_profile_step-off.png | Bin 0 -> 2247 bytes ...{step1-on.png => edit_profile_step-on.png} | Bin .../mailer-new/welcome/feature_audience.png | Bin 0 -> 96392 bytes .../mailer-new/welcome/feature_control.png | Bin 0 -> 90297 bytes .../mailer-new/welcome/feature_creativity.png | Bin 0 -> 130496 bytes .../mailer-new/welcome/feature_moderation.png | Bin 0 -> 100525 bytes .../{step2-off.png => follow_step-off.png} | Bin .../mailer-new/welcome/follow_step-on.png | Bin 0 -> 1227 bytes .../{step3-off.png => post_step-off.png} | Bin .../mailer-new/welcome/post_step-on.png | Bin 0 -> 1552 bytes .../welcome/purple-extra-soft-spacer.png | Bin 0 -> 939 bytes .../welcome/purple-extra-soft-wave.png | Bin 0 -> 2531 bytes .../{step4-off.png => share_step-off.png} | Bin .../mailer-new/welcome/share_step-on.png | Bin 0 -> 1639 bytes app/javascript/styles/mailer.scss | 349 +++++++++++++++++- app/mailers/user_mailer.rb | 6 + app/models/user.rb | 2 +- .../application/mailer/_button.html.haml | 5 +- .../application/mailer/_checklist.html.haml | 20 +- .../application/mailer/_feature.html.haml | 32 ++ .../application/mailer/_follow.html.haml | 15 + .../application/mailer/_hashtag.html.haml | 20 + app/views/user_mailer/welcome.html.haml | 95 +++-- app/views/user_mailer/welcome.text.erb | 80 +++- config/locales/an.yml | 4 - config/locales/ar.yml | 4 - config/locales/ast.yml | 1 - config/locales/be.yml | 4 - config/locales/bg.yml | 4 - config/locales/ca.yml | 4 - config/locales/ckb.yml | 3 - config/locales/co.yml | 3 - config/locales/cs.yml | 4 - config/locales/cy.yml | 4 - config/locales/da.yml | 4 - config/locales/de.yml | 4 - config/locales/el.yml | 4 - config/locales/en-GB.yml | 4 - config/locales/en.yml | 41 +- config/locales/eo.yml | 4 - config/locales/es-AR.yml | 4 - config/locales/es-MX.yml | 4 - config/locales/es.yml | 4 - config/locales/et.yml | 4 - config/locales/eu.yml | 4 - config/locales/fa.yml | 4 - config/locales/fi.yml | 4 - config/locales/fo.yml | 4 - config/locales/fr-CA.yml | 4 - config/locales/fr.yml | 4 - config/locales/fy.yml | 4 - config/locales/gd.yml | 4 - config/locales/gl.yml | 4 - config/locales/he.yml | 4 - config/locales/hu.yml | 4 - config/locales/hy.yml | 1 - config/locales/ia.yml | 1 - config/locales/id.yml | 4 - config/locales/ie.yml | 4 - config/locales/io.yml | 4 - config/locales/is.yml | 4 - config/locales/it.yml | 4 - config/locales/ja.yml | 4 - config/locales/ka.yml | 3 - config/locales/kab.yml | 2 - config/locales/kk.yml | 3 - config/locales/ko.yml | 4 - config/locales/ku.yml | 4 - config/locales/lad.yml | 4 - config/locales/lt.yml | 4 - config/locales/lv.yml | 4 - config/locales/ms.yml | 4 - config/locales/my.yml | 4 - config/locales/nl.yml | 4 - config/locales/nn.yml | 4 - config/locales/no.yml | 4 - config/locales/oc.yml | 3 - config/locales/pl.yml | 4 - config/locales/pt-BR.yml | 4 - config/locales/pt-PT.yml | 4 - config/locales/ro.yml | 3 - config/locales/ru.yml | 4 - config/locales/sc.yml | 3 - config/locales/sco.yml | 4 - config/locales/si.yml | 3 - config/locales/sk.yml | 3 - config/locales/sl.yml | 4 - config/locales/sq.yml | 4 - config/locales/sr-Latn.yml | 4 - config/locales/sr.yml | 4 - config/locales/sv.yml | 4 - config/locales/th.yml | 4 - config/locales/tr.yml | 4 - config/locales/uk.yml | 4 - config/locales/vi.yml | 4 - config/locales/zh-CN.yml | 4 - config/locales/zh-HK.yml | 4 - config/locales/zh-TW.yml | 4 - 102 files changed, 619 insertions(+), 318 deletions(-) rename app/javascript/images/mailer-new/welcome/{step5-off.png => apps_step-off.png} (100%) create mode 100644 app/javascript/images/mailer-new/welcome/apps_step-on.png create mode 100644 app/javascript/images/mailer-new/welcome/btn-app-store.png create mode 100644 app/javascript/images/mailer-new/welcome/btn-google-play.png create mode 100644 app/javascript/images/mailer-new/welcome/edit_profile_step-off.png rename app/javascript/images/mailer-new/welcome/{step1-on.png => edit_profile_step-on.png} (100%) create mode 100644 app/javascript/images/mailer-new/welcome/feature_audience.png create mode 100644 app/javascript/images/mailer-new/welcome/feature_control.png create mode 100644 app/javascript/images/mailer-new/welcome/feature_creativity.png create mode 100644 app/javascript/images/mailer-new/welcome/feature_moderation.png rename app/javascript/images/mailer-new/welcome/{step2-off.png => follow_step-off.png} (100%) create mode 100644 app/javascript/images/mailer-new/welcome/follow_step-on.png rename app/javascript/images/mailer-new/welcome/{step3-off.png => post_step-off.png} (100%) create mode 100644 app/javascript/images/mailer-new/welcome/post_step-on.png create mode 100644 app/javascript/images/mailer-new/welcome/purple-extra-soft-spacer.png create mode 100644 app/javascript/images/mailer-new/welcome/purple-extra-soft-wave.png rename app/javascript/images/mailer-new/welcome/{step4-off.png => share_step-off.png} (100%) create mode 100644 app/javascript/images/mailer-new/welcome/share_step-on.png create mode 100644 app/views/application/mailer/_feature.html.haml create mode 100644 app/views/application/mailer/_follow.html.haml create mode 100644 app/views/application/mailer/_hashtag.html.haml diff --git a/app/javascript/images/mailer-new/welcome/step5-off.png b/app/javascript/images/mailer-new/welcome/apps_step-off.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/step5-off.png rename to app/javascript/images/mailer-new/welcome/apps_step-off.png diff --git a/app/javascript/images/mailer-new/welcome/apps_step-on.png b/app/javascript/images/mailer-new/welcome/apps_step-on.png new file mode 100644 index 0000000000000000000000000000000000000000..fd631bf97ecf75b75ab3e8b149519c067f640886 GIT binary patch literal 1291 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

Qu#*6Fj=JRFVlcVW_4vkLXPn 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 literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/welcome/feature_control.png b/app/javascript/images/mailer-new/welcome/feature_control.png new file mode 100644 index 0000000000000000000000000000000000000000..1afb6c238caa18cdb35d3ce9e500742de2e370ac GIT binary patch literal 90297 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

7Qe96H^@(Rka~TF^KYM%o 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 IM6N<$f);lkVgLXD literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/welcome/feature_creativity.png b/app/javascript/images/mailer-new/welcome/feature_creativity.png new file mode 100644 index 0000000000000000000000000000000000000000..3365856699fcaf857a94cce33edd1e70e908a53f GIT binary patch literal 130496 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

fH{(>2o6S%9)okvJ`3X~jHhY) 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 literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/welcome/feature_moderation.png b/app/javascript/images/mailer-new/welcome/feature_moderation.png new file mode 100644 index 0000000000000000000000000000000000000000..7cee9b29b86721f3ef856e4c9ef48baaa6f9a2e2 GIT binary patch literal 100525 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

uwUG1ZfKBh(|D}V&vP|oww#~w40 zZeIunwgF54yjs8z6tJRllw%B_-2xT}fCNY+M5q9|ff{oC3YT1bsTyVd&j8i+mz5if z>BoMedgxVGUBwoyGt}o)0a{C+y0lET1#st`cEPT@>}ERHuYdjP>T5g`Km!t?;5Yz) zy4WoO()2C{g~Agf};CsYKuhym&I&p&TLCPEc&jVP!PXaJ+<&Lk6QE)5Q5il!}*=kh*&zidooK z$@$xxGeQuUJyU9-&8}Uw{A~E{EF2~vB;YF&lNB>Ur1DsB=>Uixbs3g8GB>sbGYM7( zl&p*8G#qRrDPcU?aozRJ@))MUj%-VuN2EU-&j#sN=#Ige&0JDZXvG&6 zfed@Rpcsce5C^fr`WvV|dm}XzItd%9{&L41cfkJpe;VIcBcL6&-`)Zs{PLH-R6pS( zb+KF=BCr4oC!KVX`s8kB*1zYdk=8CZJBrPP4w55`q*zWL?` zPz{=kQDWF5m{++A5#VgK(A;L5txZHH4n~ZAZ^cDS#O`X9ecW-!sh;_R#zByDw<+Zo zj9XDL`_&*}V0_*m&ogd8xh`CE(M78Jxe_MUS!XI>^kK{QZ3)vMs~G#6-~1+y_{I^&DW87&=`KFD`}f{! zZ~W?4zcS++H8wLNGPQa&pXDU*NFK-~1K^R*$187Ij1LDYQFXw&s*YF=F^Y*_RSat` zaw@(xwTJrN>b#9L35B_`N&6#m-I}Knk4=FzD*035c`!I*K&_A8K!0PbeSaN=C}r-) z|5l+~{F#D<*k@{RY5M5UZHUw!0YaZwL@n;Fh;jsGlX$2qp=fxe8+-oiU;h%tJ|;0R z@>GPMeUEdk*kzYpmHQp70SbO-qU*yB`wBMQY*R2$U3U(! zm*!Fx56@5+o~0CoPdwoS71=KcL{Y<%wJOmVeKE#Ts%JakfX|r4wDyM;RY$7ifd@<% zrY~B>k<$WYsEY=+S8#Mgt~J+OOU2|1YME#+or0d;bC>D54msoywKTrfIBi|vt$~`Y?n+6TPXq+AcEBk^5 z)=)RCak>!*sp}6phi9JRuoivNq#>2Bc}U!-f(B!mM*(?REVJ~oh)i6ThDi(rg%B+g zwFF7*D95&F$N+<>kdIc{O-C9<(BpuUC~G8`x^5xBNrb6yJQRF~ zG@w%Ol?wYLQ!`T6L1}NVT@HQ9Oh3V)vi()Nfb3d+Zf#B-;b=d@x>us)`7ynX^jO_X zC>fXa(yK40Vlvkm4?z(kT42Ct{gQ+QqKMId_hzg_&=yDKYExqt1>=Ja)b`nDALtk= z-CO{f#B3%_-%7y6s&))|bdet$rWdwiV-c|pf`V2W*u$X&H>l-5oDIU^Zt%lEIwVMLIK!O*}j&pQr-jp+yo6~H(EHgvNy0jsUDhHZpKn>vI*NL-!}yuUnndj^uh z#kbZs{ck4;0L88;fkV~J&^2Gif*>OzG8R(5*42gAb^W}G{iovLM<2j{o_PY&hyY!! z#_YLW7G5Lu>k*j5f^LXl;=D`YbNhW2V>lK808;=4gyehxV(yw<7CoD4R!lmaa zSlZ3qD?@O=^srkQ&=&tr0&z@xs{$~@z{-H?#aA)_u2DdVH1n|`G#u<&E0V}Ys)oR! zhkn_DQ78as&l}+cRyCsQ!viGwDjAs7Em`sApXGogpaU^kc7Z9A*RAFkwwX|Uw;l;V z3gZz#;*im&L?oBPBp_3MMtdFz@MZ(B2n6T|fQLJ_7^8{e*H$+hlg2o=2Q5VPcW_`R z_A!(WI934MFaYku$>$#H0Bl`3cnbqW0!HJbG|tri0W<@ zc*MlW5JS|>xXS2UHQnYo7ZL`9*ziOQ2`I*zx~M?easVS#QQuyD?G;Q@5FW%J;8C%F zjB96G+3@^Yj|kc<3xWt1p6{JFX#cNa6vm_Y!UKiYUx9c3-C^)rZ+)780^_Z;~ibp-PM{KH#t)lb`9&Qd*C&iQpE^`6WHg{*AbG-Jsnmo)p4 z9OG2-D_I!k*uGzI8Gv)(b#^*A7Vo3#459MzmhCC`_>789m&II1tO2r6*?Gmph%2q@ zA~qI;2*A=yFFh5k0d_4zhXly4Dc^ zYU@S}mm(ws?P#UFx*nJ$XKo9aAT2J^#@^Eb7s#l#_+Y;`x;IfQ`jsr%scOk8p(Y&)_{{%EY} z7lKr;3vyOH7e_EUj?|2!Q4Ay>7`gziq3RM~K$#-gA%06?7v+&&g2dSp%}O{F#AP>8 zGC#+Vk268WjF|b+vvX6PAZe;WxY!Srn2p{4Ow=dB40C%1F@+;mTAS*Fw5a zM_3bBL&3K$G8RiftnqoT(S!rnlHAH4cy7@LkF+?Gd~?O8F?I{yoaJ@Np_^shPhUpn z3viGb8L172cnD?^mRK`?v`g|P_)WPEc(54_JA!kl888~)vR-oIme8aWnH*smAP8Fj zMUw98dMtswu3ck?{YI}V^>xer&i=af2=;QTLG~K!=JwQ-g|#jo&VPbuwc6Lc&iafKPhm)bK{;u+F&O=_okFy#VAuPcOrU=UDZc|P4$ zvb{LY;>VH*+UvCoz#P^(S?;tL0Yt6IIBC+PyCzSbe4qx@|5cPYZwTQn3BCjqw;sMJ zea=1rj@e@hASe*en5q7~nldS3Y%>>}?sT^OKEsm0GP*Usp)ZaBpD1z9!)nc}= z5tu(QOK4C6S_QkM$Le%TeOG?cqs^*<$?7nWVZka~(JM=A-cwiX> zhHlqc0uar{W~okd>XHMlcPZ**eIumIj|r8CsH!*^bO`Q;zi6&MS;i=qfo!hifV-dbM&ja^?PMfI&9fH&fy1Y-3gk$ysR-e~As@EMZpmbli zSGS%>t_zoJ}&CL zXwGaB4Tzr8ulu#ie_79A?Jl^`#MLx6?JaJT4S|x1pmR<*<$$xX7qTIh6wD6FzU#6#KW(~fAC5h%wUG=DAh z=$t<^U0vFKXsw7F7tTEU6ibTF5FkvV5lQ)_3sNuk>zJaTL|s_C7PyJnl{*au^+f3y z2IvXQM}nesG3L$|9fH}bC=h7^OaYFwZV!-waapP>Eyql<`ko{DV?^v5g(%V6fg~X> z)1Vnl<4X%`a=!&XNe%Bj)_S?VbSWMY>DaiwSGRqVI_|flx?*FBAtHzehLJjOH_)xI zkrD&mE{Gjo=MeX>bWe8VFx&Iw+I-=K7ls;-C@@n&nW#wr7X3S9_ghN6S6_XV3dB%A z&g6dinCBrdjpv+q-n-X(*ZSv$Mu5=$9KEz>$2zNEjWzy4Qtr4j9OTFYu*cHvc+7|x z31Y1I2H6Gpiqu*`iv*C(ES24?0bnu{@5=CkniwUVX+T6@jA*hCN1yyP$QU!if{=M8 zG3$@%_ZL_*)&QXWO+k-(05Qu86OH;X4@H7>h;@9!epE2>@gmv7p@zsl?1W zNqdp7%KBX7pLcjo+QpY#LZ;xG0&(76$`MQQw_m6nyQvf-j*o@4WL` z;&vq&KYlzka0r}$X;8w1c_u^^XTvhbL34ONYLfyNH95HiIR{|WfNud%>#e2R%_pq6TE#@uWpE~d zm|k}vPCiG*Dce0cD2EV4#nV*rG?Xj>ypkv=yBL~P)UMX!X_)breSzW&zAy!{5g|%J zr}36e5#K#An;#+G+9WLQKg&T6$~4*VQ_16AL*U|LrW+lQHK`jr6@T{f z2K7QxvPyf(uFN8GH>9Cc4w5w-aApZjr8XmDwQmVs#t$m^=3p=FaL#$#i!QpTC9$028RRVtzO`@9?C0F-ty~EYcn&lInpM`L5Is9k{>VgXFwZ(8oFUNJfxdGh=2q%a z04WGn4su_&yCnr*7F>|v)QKBXzQ)^irP7<~or=oBSqRWk53)|}f_Qe#!PiN_mkP?_ zpF1!scWiD-sqvPAvG1-c@HL`}rA0Yo_?UwP@kH+dKtwyA_ksC0glE`%B zR#=ByR2-CH2jU<(q^}dnAtMVq;=4Oi7N#;M(OinqbWQ{yCDC_>0kNGMrUGx&lKOK& z$&9$tepNqg=gJM|{YWL276oF62pgjs=F((-#t;M&lGv=0K*)`O;7QKAH$f680DQIz|7|^_7DYwC441jMHKU^8gLXb62AR`tERHV~(GeBeZ zR5Iss6z#V>6pRg%|Uo0ma?_%9tvY}!UTd`K2Foq70Q86^N6p}UAZh<=BQoGWA`ls@BwWv0uE(Kq=uBILZfM_Hvsz_Q=kazG^AQnBR z>w}ftRmniub>u*^W=JD%mOBe|z;mF$E&!17!jIWQWI&mudk%Ouk@rmoEl8z1=$1&! zhGZp(AcFZu2z1M6sqSY4*nSY4?A zcsOL>Tjqk{$rv)cW1AV3(ATEhkdUlZ&{fK3mUaU=P#VkWkeO9ou zMF&jGiA0cHc}C1eqDp|C*RZZLb+^AbL|l?EYc?$w|Gw$4D;f8c#j_TH{VQ{^^#F#p zK-lGxdE4!`E6m$!w{Fcd6am<+)iRDxIvcaib1X*fVHlyh`CR$+Qd&p}+4FW**RwQ< zbjD#Xzx?v@?|=WhWCbmqinIHQoM;&o?en^Y*d3Eo_FPG_fx~6!HHjV^e2dr9`jwI# zm5Wo(9UBO1ff8IyowzVjt)vANsTf*0Vn~eh1>jY}IWY=ix`0YPU7;q3MY1uH+0Oyb zj(&UOb2-wMxn(f>```bLuYK*S#`%8tyWhq7>u=x-Sx4eTwYjjmQxb?{cUo-UJ~K9T9zb4j|z%(m_Fqs*g?8(nx4v!)9fTxqNcLID z?8!fH9WWI`qGE_w%9+VFAGC%8R+2W2q|nMZ%g_BD*9o^HW31ek*p}^43(>QJuDErz zi>v*p6W8JyoIAEjW+m?zp9kfFtI(H#;xI&PXXn|H&}amNRGLC5`fys>L#;C~IEY6d zeHbsj{DK*IE%A;eG5-Sd+q_NI4Zt0@-+}G7-vOgWje66<=ef@B$tRyQYi}Kwx1CU6O(T_Iv&}Xe<|d>^p5k-nzyL0~ag$*~{2z`B{(QFQOAtEPYw4euQBI>zsHsPCANdB8?3Sueoh2O~p zAoJiQwAy8mjk)Q+46(e08t`N}6lt;UPyoS}f&HZEZReZxEMrOsV-|@uy4J4i7SfoO z+ZGu@k4to3SBVtR?h&A1NR}lh64wD&9I%tra=9Gv;CwP!VKsn?;wv7 zGK5|;2b{8)wf4bM(P(zB#4?D||7^EkK|(PDtXz+aSy)%fbA^2B^6w?&&pXVzwBpGa zAkke%%M3{wP$kE~cEVNG>VVs{NM_z}8vu}7Nka>=zdK3Zz|5*Tm&emZ(n_(#nCVLO z>c~VKO%+3XLVu(QACx_0LmCnoFc_N^zzV=LkU~Cu!C+JH;~)PBuT6OsKl;&+u;fxp z;`!&F$B92Z2|qgaIQ;ULzd&Ha`V1ks^{AdVQsV-U!9FLMagp>n_j4_=;?(=>*x%oe zH{N(7T~Hz7ZAP>9yZrLY@Y&CP)~&!n((eD$pDx!O;3HUi>81T8MPFY-k2WqFCrSG} z74_*x#keTF&wn8L%qL(A{f-oX5d!U6tbRC+5D;{{BEaCx0R$3#I&ORZC=iJE-zrzM z2S~9o`)45psP(%6ib$yHN?FuZB6cp4r*tF52(!vk-RAnj3opRwXPjY|MvWegUz~h0 zM1Y`kH|_N|@V)PSUpJ*s*mtw@PCMa~pZp|3qmgqLN;1U51}kJV071j!IMe#|)Z@Mk zQV1tuY&mDlfH7aH{QZ|GMG7N7{IUuJ|wiJw6>4!x@h{|mm=%&V6Y1_Jhn^knqse2YBcqp^9R@ouf zK86`t^Ub%wJoC(BBE-Azz8lLdvkb1i_FC;@Lu|9nHpK_W5*qLQ0c%T)>qCkYP@R&=~1}prW>)#F1z}5OrJg-=bn2mCQh8_0ZXd+z1zmA z*DVJ3$3OmY&67M9dXFvOmtA%#o__inyY~L~zhAlDMR4YsXX1qyU)1OL3r6eW|Dg|k z2n$YJ0FOTOFfLGFP?s-ET6Q_?yz?$tRQ_g-9n$)yGa+ibUO3c?_1n}#n=nW=i|OX{ViLT%BGs(Y4MIc2Zz5QTkjTijYX@#TWjE-~av(*jwj) zqm4EKN#%0q^HiF)@%q}=565)X2S23W$&ugq2KLzFgP1Vi1dlFLyKxAN5Cl-PP?AVk zZVM%l;<}W0(F?#~nv6$(kit4ht6P)Iy?DJdoo2mASZeO8@20zP6-Y*)?ra;AfB#8T zHUYo_2VCHCDtTCI36KsAd-6V@RW~ z#GuRc!_FD!V4t?D+^^(%;xt%?E>I?-R?Z4^ZkMcm75e)6vHYavaOtI&V1o@dz{)GH z1hRouS6u}wuDD|L#WzjQdiL4B!&+;tjmIB<97i90lyRC{ZM8K{KmBy$P`BG|djq8t zPdw3p?$e*%UyqOD*kg}1k+yC!pkS)t_cRVZ`11-hOK6|#qaV?GF2)W!?4aN^21>Z&jyrT*&)H@`V`RGs7~lHVx3KND+hV!pmQ%6vwYG8i z=}&)(XPWB>j4#~I3X>HHbDtYUpsp*``y1NY;LUpN@+ z>bO^4d1c&r`<*!dyz}wf-<*oYmv{&6xb-$1rdGOJ>l`e$*kbtYsi)bqExX(#=y#$0 zJ&S`5I!OCl7VECNu7S03@%X_Het@;tUK{71e?F9KEP4;FzWQq1dFP!rf2x{zQw+d3 zn*cZa+uj@f4pr6gUV8^xZJf;&DT-~lURR09RNV;9tDTs!T%^#K)nNwSBSGy-T{r@p!yX9*5RIV6>Qh4#CtRjR7HLU zq9QQes{)|ug;!Z+Wi`;+9!o8?6hy?hV&#ZUH%kWNJdZr`8w%(v*)HxUKRMn+vfumO zccIqX$`$U00}nh9%C(yAuN7^u{`&aixqq}imAi(LZW=CCj(BJ2rbEXw6@Xyz#TSRR zZ)4ZZg#z(5(DrqHUNW#&>4Aaq5=$(J-FM#|S6p$00{STBruI+{>})a99|Z$( z_z_>jN(#K+RzQy;*mI9P@r8rGfD13U00$rPMI3+p@itdS9C3s_&*bNy!vO~z;KoEa z_0&_LbD_`qJ>z&k@{y02WZ}2J{Vjg@!ynpxs$Zqd-0+s7n5R;TscK!46%P(hKE=dzB-*b=E zg95Xj-viw^Kt$Zf*~F_J&FIlbA2UF|@WP8+>|!8#-+lL?MDx$T0Jh$GYbfX{P;F`) z`Th6*3n!d#f{89kY8%lu5IR>1tXG=YSVi;3UA^?u%cdt*fHuHW@ww@G-~H~5O^i7> zFcX8#0lSxhXbukG_SLIS?b zB|)Nu0_9@r0)UF&S|INS>4sn!avT=ipA3v$l&y<%Ktk@Wq=bqC78OMs2)k8u6{v#> zVDzOy0+U^}uMJuX3-rLipow|a($xGc6@(Pjey>JZ$Kvy!|2)WGB?RY2QqBbU<~P5k zoayZfKIEB^0!9$!#G{Hs@8ch4&MQo zq=}YQhi+p^xxCC;y2ZJSh(9xlj!9$~AuYia#UTF7S;VK*ej$WlqWfv;*5$w^ep%qs z6*M7k$W^r=C{I}g7(ogQ;HgK%Tn`Irk;1Sx-5>)nYz`RC$=7qhJ(}xCL<>yx3<9vD z2n?9J&ymAiqT6XCECW6z7J)VM|INX>jH#zBF> zIgK=-fEIBM!t{1mU3DdX{p(Y(&N^#XBIXkm;BHpn3054m0WpwULUno5Uw<8+``m#F zXk(0XRrivi#B|nA^1`Rwoy$MLPxtuxgYE7rBk<*Ok(FfwVHNgf-&5RRG;O zV0QrB5*@J-fe35MfY=Hk$^AmKMIy1d(RCN668Su!zHX1^5~9166Yy_84ptmf*``kl zM;5$loN^H~+P8u(bCr2Qe#s55{N9>&q;Sj^Flj&XR^gt4kymvdvhbJgC+v0L7H_(k z`#qjt7>#kG9c)1$bv-I^1jeyyq#@PO9;G_oPZ;Q^dz1Rq9*^agH=wD+yG@8BoUFhA zML9y_@@~8BHU*WjcTkIBAOFDe%Po)39Pk+&uk*0Z+UsD|RaV6f zH{M|S`=6h55t8ocIkA?`j+rI6oz6Mg*<`rcNZiN>EO#GJiJhAe)ZAMc=Y>Emp)y=a!w`zwEoI~u z%miFIBpG*0X52|`3PThrI#`y7T}Ts%9?f0k4sRl;-eKDN&oF!(FXkjDt4U=zR?zv) z6s0_|aK`DDLA%TW*ZKFB4ZPY1XHSAmpAZ#8QztG>24P1}wy(rWe;8G-831?^2j_q- zUUWm0%ojJn zD(61Q+Rz{(YEX8Ng647ft{Of~TyUaV zIe!YLoN|h74)huDsZZ^1+_Q>@q0$0oAuRj>}b^?t2nY zAs5k??hXBY5YmmJDjhI~bi0d;2$Di6JrP{ecqVqvt_d<~6P!h4=(?=0+oQRWJb;Tp zst9duhFWFrOsp8vP5_S1jIas@SS5F)ykXWw3dzpf%?&I$IA_;6#G)oHdUnx(PN3_A zk@Xcllw~3C2%ZBlIAbu0%0ko=O|+}rn;BcFIN5+nxl47$8D9ml0M<~zQ89G|3{cLu zsiNCmtCuA}4Vny8m76qBQ?hoI3sxQ8ItrkcpAt?a)yjHDHBj2z^v^1uHGs^gOZzwO zS`DoX;FJu+e*EJf8{m4tj}LulZ)*pjxeIATEE~&c?Q@LYzmDn=`x^b$-UmMLe)T!t z(Lho`-CUX!EN#J8gD4fB{{(|GXPWL;$*iLdhzAEO7{_?s5ShpuHWqU$+UJw|*mVVH zZ_A%k-L$qc?pH$ zH&82*N?B}Bubcj!6Px;7|C(_NA(Q8X=U zk_K;47vWSHko{k&Ak6CZ>-da_?UCp z*00A4DX5rtXpLOifTI=13?LkLA%1Mzn9ELG(nWjReAI3!>O83qR| zbbr?&`-BV|q;11=!37tnzW!Hcy)87s-MBRd zK?(UhL%bxRDCsXrS5|2~>QRmm5s?ByV=^o>38xko1 zle8;>&d*CgAf>;(&3Zj;Er(p<%1h}ia==Z`(_FM+*wPq{^e-qid?MiYdLHc*s*NvozBdL4X2;O5B}9w@O&!Y_Uk@LZk<> zJsJT;a1she;C|{E43)_lGS>sU2Th6TY*$Rp8o*?oAyo}GjC?SuF_-sArShQLm$m14 ziYwsF^})HKoQeL|Ev4z!(AC6K{gMdfg4N=7y``2}=9&<~D6j(#cn(h!Snm^Ao6#hr z2$3d00fgl`k{GqoZZ`@UH!p;9uWcoNXrG3D?kKV2c@I+PjVLA-2oj)VbLSKZNbV-o z!TXU*5N7Gdf&xKABR25z>o4JBU-&4RjfjAdN3kjguEDIP9`z_zQl);Zpd9dNC!B&& zeWO~eT|r3BmvOu@1h*?Swv+88V<0JoA8av$ksnFc1)|Q|ErhykJF^6f50?PC8s`WA z9&^kwnLgNb!4?He&t3d%0WMqz?BJ{7XI7c}MdJrkBPdN?a+#(72Vx0-_Ss-TIlF+q zgJ-1`us&2Gb1<%X&bfdR;LZ27v3^rOOesZfbT-0|Wl_s!4h}*X5zuhM#g?LeiWUd( z5g1>OdL&t5{%&0sJokJ7a65NHsu3Zxg}Aw$;2e?zeF2-9yCn@H(}ehVy#GWO>>RLx zZ+dh}68fhi2Txnb5Q3b2_Suuy+hG0s&}b}yxt2I<+hTHb64sAk?gruRt-b02_|2a; z0U87-g1_B!mj!ScOqdA~Xo*DtMqtlasz)Pe-{{ga4)xoSDgxq=>QKdrGCt+lSh&tM zU-lxGS{Jk<6FGNlY}MXim2xqgi=!QgwU}#?2hvVO&{f8yTvqDm>f8Frj`Phw|5=*n zcQixrKnNHKVia^rk;4}?`{Ec7x==W_vQvolsr6(C047I3LeQlMx{DwVWpTV@2k{ZK zHk6j6ei3+MIi=eyHe(18XawR7wX)v-u+QMXuRV=uBIrH{eUw8b+-FTlfx=u%8&+xT zg6ZkiosD(dMvWQ~Gy&za6GVSWu~_RQckiBzjI_K_maXHWF5w zJL1}ghA_C2{Jag4F2flJl`?~pEL>QgWyxHSq?P_U<%X50QKGKX$V*qKQOj;`ZU4c# z;PtbrZF+f&#zCm@KZVTV>_q~w>|M{|wluF)s5?S)?tAbifUEyXubRj;hzuc=kH`f&irAo+;wn@Ra)G~7*&hrnnW6#t#_lx|?@u%C&h3w$#i5fJ( z#g|@JQ2vtoo~{XC64{t#3mIh&5IPG$j%W|FMbBLyD|mL!d;(F-lDiL^!q9a&GLIn? z41^}`*Jx;`{^3jv(sQo@(at^BZ$y#EG6U7I8&Z#Y6wxFr0Cwx=(CH7ua?88gQtgK_ z;O$xmJQq;+t`#l0;VOUwciCl^$tsH8PqXu!fPgh2$Sq9U?}j-D6HZcFSBjRjIe`&Q zq~D)KIq8W1&7VQ$nlOKqROZAEgx9rp`r@}Txw z+6GTb)}aSv5GjIbkt8HK;QW3+(n{VhV!H6NP4LZCBmr{@bTyTerk?yZ|8xeFU|<{Mw7S=<-W&iIyqTr&-g|Fkl7(v(z-r z8VLt$>=xeKx^5d$CW7qMoulhgARz$Kz^aR_gtJaQ1EU(Ffvh=QzeU&a+zlx`Pjdq2 z1{!FQj6vSU0Bpn#K5GMnO&m>)kY#^gbHfcQt+K*O+ciRC)BaKY%K|d47JxI}ifK2( z)Dqp!(`;1?5D|lhM88gmfWELw$nS5GX|P}c1A`ERc>6IDVwaF-$tp@y7z>70v{Hz& z=55axLYRQrPGTj0!q;A(hS#P|L6kvHGVrFx5e_VaWE815O3X46wx7am#>_YH*nb|y zU4Q=@?!5a>yf%Fbn$iSAunH0c5dgab;7kYHjU~?8wQjF22}CVKKUQ9B1)P2InHbeq zjD+O?oCB;>fjA_~2^Vs2mNfkz zUwOsPJ&*PBUfOOu?bEZo2)5FkNFImMs|h}iM> zDLf;BZ?@T{DjANZEv4!t*WI`Z@Jue-rAonPg$ecou1P) zpXY2nKwn)goC%|+w>yl<1uZK9%;ofx(*f(|8ns6aUM=#4CeBIF>`0~py z<4tdR)3}#|kWJpKH}gfk$YYRyMvSL=G$L-}nv*a*=JvN9<8gn>^+yU5;vQ(327IIA zcmDhj@Uy@4vq0-0RIe}I2O-;|vx%({jPb;y{!Bm1%CM#8QQ%Zb<= z9@N^yK{E7yG&OV&MPi3~_uZ{};M%#=9~svQc0ioGQK=-0(RMR)--z3Wy?*J%yi5J^ z<6Up}Q8RR+AADpI$b3FX7JGeb%jF>5NX9GKkaF4ME6O)km$`?NG9Ae`VrKGX7Us;w z$d}2r%5<&ybJfRHtcPP$@14i?Pg=NLGfn(R!W`yfD|crDTO-y>FP%)%W6VanrUmnO zHWHSbq-|Z;%+SOn*G0xck1r+A{{h{OTFZURa?O%Olv>Sm(d#X1qT!0IbuAWyRBcAa zgpFCbO02=lT?XrYo<(iry#Slax`e)Qt^ldnmBIG<+C@2c%X8`2d`zn6uI>lX*#I5T zj|a&W*6zXCHdnra7+;uow3BeW_Y$PEdqulcn=Vz=6(635IUA8yhH#xg>w7j_AExrO z+_iK2JT!Dh)3}kcX~x4eEs2uMBpt^!$k@K0i1^?C{olXsl~-Q*)`!UpnrM(34p#^K z)}Q_+e(D!~2Av&SWVbM>R2*`nPW(hDyntI?S6QzD@lRO4%n2imL#XR!F-GO%3nQ!N zVybg}u3Vbte%13MDqz>1QQc=j$rd(leEyWcqWyRl6rx`_o3fp*ec}gx1pfF}{s>Q8 zJzG0rt(c(0_bm$2jeQOH-sI+SKE1q5xtP`!Ow#clC*P@#TITYZ#8qPJYev2m&NN}A zrgGO@jgWiqkVJRd>X@Psx+ZMrlNL{71*wko}0O(aDub3wt9 zeULz@PBbwYi@JYRAGpcVA;aeB$9u8*lks`H&^a5=7-?m~#(OKvijwiV=|7n(6RM|q z#JyjRg<~~gTh{J!NZWosEN^G|`6pOZt9h>N%C88Fq%5KLVu_=7dyny`SZFaPg0L=p zoY#O8@=c%M{Mo~drDei`MDs=QW{UfY<)2q$l`ebgAM4druU^k$iV^9r2>3YB)$2 z3RVn4#oP(vI16%^y!>#dmsv;#`NCmEUV!y?@2&y+bIik0W&}BtZbiaO%8*?z+6crL zN!!J78~ZXo$2RJpka@X|gikvMB96FWmbUN1VarI^$QVY#l8kt3tHbtf3KzjLgkdDx z=|8M))b&f+HDfJ!ZZo77SC*usPXwH-JxVzN(*S{h9V-UxnFg$&jZOVvhnNkLenf3d z=LDQahLev`=O$=n@ri2!9wMHX3q7wxgs7>l4zWY?-?LiPu1o$5v-yi1X7c>So`z$f z2BB*Za4~oO)t})Q$Iz&6TeL#5-gloXSWdpRGgk0^PRsW-;Kg#E$PB}{J*le4Lzay* zxAf8T5o5btqz+EzbPn^kpNDf9-Gl=t;o(8u+(C;Lv}5cg{_p?(?{7a6^ta=hMPUuB z$>SF{;rIXI5Agjz@&@oG+^n?|ZIJ_fqepoCa_K1)R!=^E$=21}roQ z;@GS1n)IRL6F&4~@aMnzXL$PRDI}_x*iLJ}@>GQN8gPECUITtS2{@0c=NfTM!1bQt zWkL_ZJZ%4Kp>1vxH;>#;ECZSIc$S@gEt+9Xo4!tLT5>bzEZeGNTCkTjAG2xD-*F`7 zZ@;J(y8+wLA%6@Ma0TE%;UE9?pYf$%`{g*?aDvYB()wl9E1qDACHP)qF<~{8rgaA- zFN!6bUrqa!hx44;4LE-hM?$EudAlUbcBMGaI_q;|8=s5$VEG&(0ShRep*B7LI9K^x z&gHr4$4(X;1S6bBN_uJOk7L1xCz;4%sPx-`8#%F!nXX5Yv zD+AcA*I}2mobc{n5uqGVX%$u9EZ+PjM=kWDk{PWS-;PwSYBbJ*FX?u!`7#Z{C(8C%y^o#u3LOc@ExgIv+E(qn~XP zYyKP*u<|lGmH``k%FxnF#~m2YJoO~5aMSygE@3HTXH%YzFrN1{;EU%APKcSP_k-1@ z>Ud90&bWy8N?rfJD3o)?7iM)Hzw15kd5>Z6+H0?k^=yW^8MNWyoHfdttp|H3OLNxx zj-yl7cdiYV3&Gl}__nQB13o}hay^;NCslhUeNvYFZl2JColD~9IMlj zV`x7V;=mIv}$%q}_QtE5qS)YYo_F2<>1gs+st5`nHj*PwN^LPWI zZa3>Q=I7v8D~;mhJFv<6cnd$jjGR?D?0B2akMw;XV?m?Jgj8I+BmwV4JezZ)nPJ%d zWBI-CfgIDVM4RG0`+b2_1EY6q|`(mh}g~;GKkpB(`K4BbM#mbo}z5g!&;hW zG=~@T|NY|(d(am>ub$OPQGO%tfbsX(#U(@(-2ksh@oE$>Gd3JfvZou$iGfaK|u3Z_4gO@Sf#@9#HPxOkKqW(N^p_NUJyT zVpw8P$g?(hjawwP-8HUr0sE+LB6-w%&eeB-LZrde13FQViY!R`8t{tnL9U&<_MDro z6RGdnE-P=3!Xz#K&auVHow8tO+cRuy!Xao!i?O4R$9F{yn2mU}WtVkN_FZZ0CoU!) z+c52SMDsF-te^qQ19QmMf*TqhGTCL9UG^W39EZKf!m?WVj$S3-nt*o^)nu0q z3h65zj!`@c9M+u%>au7CkJs$GnYevDS(8@WeLu1NvD)6?5#QPl+2I=SiG(d=j_ z#}LEG@?9RlY4?KOE-bv0XR>5QaxRplXx`Y63_+-*_TpyYQLVZj_xkq3yq%qx>1)!a z4HGU$a&2(&=vnk=S@bpG7^;#-FX-=n_St8@YhNGS*NAu7<+??Z-uHdq_jy|~tM>Xn z_rd-w@Bw>zzacnxlI z>tl!&KGp=h%P#JO^?bc-H?HUB%nMplz75F>c3FRE=u&Sjk~w*X_OkN2p34(8$yCF) zYi^!4EjVsZapRns5 z^-BIw=_94Xh$xL%7OC4|ZJiUaLZCvzTV4}U=pA_XyKkTBfA-m%;7I5YNgZw1QXgO0 zMGzaGpHdO_%I{{{CYox%`!=NeD;h`seLZ~Hg>$tQ+I5LfG4mgllkd=eWru(6!8=;V z03D~Y5u(y$tg(!USpU!7S->{3Bw_fg9@~Mp%$qDT95XXBGlS@u`9u%Ibm)D|%*@Qp z%Mf1P^kK{N>EWMWlOnYqu+j6qsO8)7UIS-H;Q5qo_=aQmtT4{!^341 zK&csKu8db44nOdTTPH`c{MD4U(%J~P>82sMq(=4<_RJHEYLAf+K8q zC^m~C-$V+=hA9{mUZx4xERwESX&C{}^R#(W&;}It?HlIIGcTvRyNBu1*VEU(mweu% zW9}^G&Y4MjTPr3f2!{!*MFdI*OOz`Cb7oD?B)qDYO+P*~tY-KfFB*u>wWjAe+S`q)p=;W$!pjK7 zH|`UTR<&ebZZ#nmz3+dj`kM9c)Jn$HoUv@p0TzoBm{p%V0?Qdr? zuyY@^Prx(6=FM9;`<(N6{P8Erf)Uu!-OnYLT+J=F-^Yuaw&QD#eWgM6mP)+1c`FY- z_BfSt8P6j#LqkK{bkl8|6F!f1r=81=u6_=dD&hZ^QatrMuDR}3_Ut>*P|8^$JjWr{ zuir@N&=4EL$JWz3!2bQE=(2we4uaxvj5$2xy_BDV0BO_X1duvypfTc7(2oBFtu-I1 z>1~b$IWESEQ_%68V-o#zu|pO%q*h75>+bvbNAV2q zf8YtuI{RWSx$IgVc<^zG>&^~;KT0LAj5QpNzy?`{-X!gT)BGEp6PDxX7kAYNaNU{2 zVH6w<@~_2OJ3y1-j_gl`Rs%&wln(y!SotVCs~1e)6O5vU=qr+6o>|KJg^IJNg+J8sU+L zAE$p{Aam8SF(!Qc@8=Vr`Z!_~KNu#k0T{#bRV%~i^aUnNnt;*(BFycW!^%~wn7?Q~ zi;tsH3Iy+`Y;;6uknXjTH?{n3aS0ieX>&&wTJCnda$;_V~;$+>t6ec%uNg;P{`+4yl^3& zC#Wc>jrNvTEL}otAy30vsqlu^zlPU`3t;uig#d`ct6sTm%(hoJ9ICp$!8rkSC(OAB z*l{#^q2s@G6zd61Rzug`uDUY%N? zHFXwg_{D-Zzxj39Ut1xHnuEY{-g%c$ES^d6pJyU!Lt$IXw5gN%R2a!lpFS;f#j+}( z%7Oj+$r(Z+p2yl%%Q>Mv&(2+aSWCl*C}5E~a|D$!g~JioOx#?@XFnc56VF$VT8~mt z7Xdqt6`JCDr76*{ywrzraB%Q%lP6DJ*NlOa!2)0-ar7`KiXbS3LV>ru_9U;N@{SiO2R z6WUwp>h9&4XV)V_!;eu%Nq`&177m9EEMjC^=u2>Az34S|`HMaAQv_IP0KwrnGM^Vo z`5hy5e#`B*-#+Ud?|4Tsm&<)HPIEUKHbsD}wHQE*LE|Swe62xMK?N~n##X1Yc-3>p z?MVi~7{MxuD16knrTQ3%&Wou&LIqEtdKF^g$9`mHb{fV84u`77TWcewQt6vhrcAkJ zlui(`m~yyb436U|z_BY#x(KKIz2W%{FJHKH;i+L%`HJ!E#H6YupT9iaG4xovH2KLj*hVbLgIL|lIeL;c=iw+HMvwj}$38yQr+a_!1z z@4WNQPX2Nr# z+M!CNa%ERn*H=zC<&?93`qQ75QbacPFsN@GoN{?e7Eh1F9t!)xxc%3py7p@(SKW5iwK=ffE(!`%=cmacPZn)hCv*@PK95p zT9Dv1sXzbOVOXVoetx#EudkJk^;9S?^C?h1v`1(NARBy`@Gt0@J{O*R6VV#*V&8ar zdK$mYZEF7qlXsiEaXoBv0QXOz<*b!nv;sMDBB1T)FggQnJnUsG$%M7+{M*uw?@t)c zuPFWJ{>#hD-`De@w!VMI0dkuGGRsqddYkF>{dH{rX4+2y7y@iWk8d~ohZk5LKMZsR z{5W(5?9(wL_>#!*4$VQ>K{WgoDFtWBDog394v-_dl76bgex^JhNX#Eb{2t4i1LBwi zqPAb{sO5~~ZQ*+3`ju~Qus6~{%R#?2h{Uqkzk}O*&bE|&(aZw`lTaq`4hl$OPoZJV z{{H>&9nsq9YtEi++2L_00JGzAXmkL!i7^odP4BE2MB}fEaJKB3@g|uu>2BYdvj?i= z^eRIJ3%O1pD@WTWa(!kYrpd$57r?8(!7c?5{Xj4BFYp)i9gykm#(H?^C&cUP>pYz1 zmqSNF;&e3A@$_?iT(5Niz7idPwbKpgW5Zu$@G_>?`^du>nSoyZ@j3eis62nDu=!9i zfc8pgooSkU{pmW{#|-il*8zM5HfG&xz_SSf{oC8y`aylu^7r@m^{Z^SJ`6M(csm1b zTnqDzSAcIu`~Kj61F&QG_N3vj{3~xZ_>S_-rwB4bkf7%_f{f~RF`txA2u*>HL090p zuYXx@(=rUa3)Vw6eC#nFdngMg*^dmsjSj$^1yeTb!Fa$MvV&y8+LXwJ^*@C3@x6?U zAy4$_HNupB=b`$aU+;!BMwc7bTjF2!53C7GJ5a}jf2AJPMamVh#;yHRnV=6O-Z2nc zL(r7~JZ1p4K#sv1)dIgM?GvG#N!}>d!Ekj)i_+W9f zZ!y<{?WT0~y4KfU@8fcR_ykYQ`t^r3*d8b1`e`UWU_wsFY_zJuIX)RU<;4~88PUNvh&-fq|QWtXa9l? z1)#IgW!|EOb>C5$0XG^0o)9%yTYP>r2VmacOEf$nKM3{NS-#y|XI=-c``+u9qp+(anRwh&VGF@#;V7ASnYdo_|gW~=^Kp#}sGXMQ&K%+1j6l|pr$`0uyvNx?? z>T-SgoZHn_Za)F=i>^?2gw-aIZhLZYK=!S|48UuYE#igu5SU$)7>-xHyVkf=uXpz!9*Zy&35F_1}&G* zkl}Qtzg(s^Fy`fHVA09%qb(y|Y$KEjr0t?J$aPxuvFXE_{1&^Sf1z&h5zwe!dVhub z#c9yL+BU5-xfMyv2yr{X#_}?z!4d)I0T})j9h<54U$4QRk|^ZAiCr3i8;v2Iy0U-j zz*i=ts*S8W^Dteb+ILLLLAJild3u56dF~Z}8;wyUw;(v=gBQ_z`BiPwgH!Hr-)i|R ztH9T_xZt6JXEYf3J-)pUxN-A6!wAWyahuXQfL#rp;yf5ksmy#DQfc`sH4Hwp_#&(} z`uzMf_oeas0BYL@ZtW8NCP2qTaLM~uWveW$_mV)b2U_?89@S%dk{-Y=@H@!8cLv;O z?7pC7{^Xep+_CH=e_|Ss*V*7f!_L^v3wH_{G-JmYv$LTJnjdk-RV_aaXLht}wADp>7@89CXLNfn9 zNqgtZxcyd_dDNrPfUJQBf&h?3gB*}2e1$=-pbn8K{>f$>BVRAqPdW&1cntu)Iv*=N z)3A@qP76z{;mVSSbpUQO1hADvuklMhLMwD2TXacG3G;{C75O?x99;Ng{OdBF-&@z- zEwZc9vM(GEOjRar?*hLXevK&q1*pNYRZf0PC))sz0WH`E{Chkb9r6(EeanCHI{mKA x|7s5oNB{r;00jMi-Ht#V0{{R30000003dOv)7Mdach&#^002ovPDHLkV1mF}7WM!D literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/welcome/step2-off.png b/app/javascript/images/mailer-new/welcome/follow_step-off.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/step2-off.png rename to app/javascript/images/mailer-new/welcome/follow_step-off.png diff --git a/app/javascript/images/mailer-new/welcome/follow_step-on.png b/app/javascript/images/mailer-new/welcome/follow_step-on.png new file mode 100644 index 0000000000000000000000000000000000000000..3ac011539bb9dea99d69c66af361273770113129 GIT binary patch literal 1227 zcmV;+1T_1JP)FT(QR z2Xe4>|4X~q?fR46mntNRxXr^(AgvWxV7PFP_wR1lkP?w1X(dM8t#3bD=Zd#r!BI+B z>ub)^=H(sdVXt>e;;9JS`sY{E=`5W$nG`^b@RX1(d+>7qw|~9y^?dvVMjpva2A!ar z?QYi?Uq2Fsa~=*`l9!HPiXW{x?WdP_2GHv%TsMk9Oc*3D8+5c4x{6;%0&(ardbTYB zx{8N#B=E(h?>ayf!rmN20Vl%Ak6-wFxC%re1b2+X?|uZT@Cu;V{dlCW;*Lrg5#L0Yms?Pp|Yg z1+JBxB~y>U^tvsLYU;VNG-3!hNk~yB3u{6GH6ekT%w<2YPUfy3ST_ym2bTB~8uX8~ zR0nE8b)Y7cg*738nvg(EYMlco_503Z-!O$+hU!fsllp!7`<@Cl4B;~UzS;Sml}BLl zI!~8+>%>}y@GRGPSx^?%gam3r0yQClnsDyB72Sd|{}>_&xTnrZAWGqbko8}q1r|t-9=^0MR;%oL?JGDS8V(q z3EbP=lW)YzF%Y@np{u>!-KcsQ719sxF4>k6RMKRCj;@BT;@2nIkk_tX6Oa6jb(bCm znh47K#`yVp9DT@%Q#l;UzCCzJk$4((f^Np;A&HG}io}y7MP5u|GXW#<=DpQtlvv&; zjGfR$k~}2yQVd4pee*(x4gFtQ p&dak0Q5ZH=&WU4hQ1Ih0-T@>J_*{MRBw_#n002ovPDHLkV1klpLdyUE literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/welcome/step3-off.png b/app/javascript/images/mailer-new/welcome/post_step-off.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/step3-off.png rename to app/javascript/images/mailer-new/welcome/post_step-off.png diff --git a/app/javascript/images/mailer-new/welcome/post_step-on.png b/app/javascript/images/mailer-new/welcome/post_step-on.png new file mode 100644 index 0000000000000000000000000000000000000000..aa318e66c8573400568c4437d96d5b8baf048582 GIT binary patch literal 1552 zcmV+r2JiWaP)HD3M#0E2m;kDdjfH&Paq5nfE6UoT;J`pMWPEyqU^3gkU z9C;qjIfx=RH(Q%py0%vPeP^dfVowAvfA@u1D^6WBnG~RDQAZ*3R^`?1m*3Yr&-2a$ ziaagPA96x&R?B6h^L$GbwRu!+wY>fahWu!@R(N@BtpYncNatD+NF9cjHyCoXtXwsZ zJ%Lnp&wFnh26EM`%AUY~u6$esO(?9TiWhJ~HGcfkyVV)cghKF|ad`Ff6TYm5XP^m< zBe`-11#YXcEog?KDF4fGCZ|o%48`lZG`Y#%=+tFM43L7m=V*o{Zm1pPpoxSQ7!fTn zB3fWX445DsGhbr1{0ul-04Xgnj9-OoKY;|97=aRu+hEJP$XE$zqKT{Q%tdg(+-Kmf z3y}Me025J#9W=g1U}YeAy(}W|$0+hwAptTkkmMV#MG*HOW=7TqN-kCa`AX}AiwA-^ zTVbx@S8Y`l-A9B|ai|1czLe~@OolEs* zgG%h%=BauqnF(hls^9c_8||0FErIdpf{6XHbVBuzvrn#LmB0 z|Eqgc1`;4qfnMY_<)LcK1$(I4p+=+54g}f*qc2ErOY}%=kfb~!F@av2*Q&Nmr4w>p zxZ$c$PRfoe3ekyUxb_#=>a4e>H1k4RM~LK6f1o=c-VA`{bD zX_ZH$USOK#5vf`eK^JaF-rjB37~7^+9+9p^CAILQq^_Ox4$R%cfZ%pS%hO-42 zF?xSsL`EVI{dY~pba6=T+5t#TAamQBcwF3+AQmBJ=$eSQ)_zTv=w?bk66-|N3fvP1 z`9Wi6Kna0wJ6t>pyFStnFRG=x+1?Y#_LJU?>PMozFca=q-opARiz*Ut2UtfBh8nU^ zhTVEC4y|o%qa@KbkfM-r_m*m>297p{N3A(?c558bMlpmN?M@heW(QvH9-P`KoRQhhz6o<<7e|Xny7dG@-zPaYF9AH0CnA zI08*5uGDW>^xG4-y|FD{i|J#~1cED9+Z!8R_R>nEU+hg;ITSjj82~xDsa!RWyFSIX zzO^p?aOUT1eJfC3NZyCWr++u2kLVi8QB`)V$}1g-y^s@f(xmJC@T9V@Rh5 zJ~%AM_b%jI%gE7<8z<%7gCvY5RZ8NxUJ3bi822lkB%yLDuN&!xu^DspM_nyQR4s7 zaQvMgx0y3$XLQPzD8)i2q!SF>2%X~*M&at&C)^T*@(J`Lr;b=i< zweti8bIia5pOe@Uf4qG!0uox{6U~#oq=#qZbe-a}^}r9-^S}tj_CwIhO->MDhCm)& z#F?2};)d7ccHxF1*o3gTC0-RZ_J*KGQw$7AsRpvF0G(U)hT1d?UDqD~RaR?IZa`J5 zsx?#7O{EUDpU5+&;nW=2{cS#ev&0!=i3#Cyxs;YQiKgdJF$@FBDpb`fkEmv=n4!EH zXU97R8)rdE5=LkY3Pv=c3ucMD+N(CAWKSDs+fnhM!5k$}k>sMSU7+XvKQxN=(HR@z z>w5o5ocXH+!x7HtA`STRrpHC9#O$RQF`D|6UhF10oKZ%z8BKtyNeZ~{p@77N=VSx% zJkyOchT;Ibwk2{BiIC8A8n$kCWZh6ZJwN&vDpKX#_T1o8)jU+Cjc8HauKQ;~*CDVqme`zjnQIaRC+PUcLOX z*FTQA=u@t4N4Tf+mvPIrJAVFo^84qPb~*m=@$%+tpIi!M;l;bsugTr7--_qsIs^Mn H_vy<&)hi%y literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/welcome/purple-extra-soft-wave.png b/app/javascript/images/mailer-new/welcome/purple-extra-soft-wave.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8f6dd3d989dc0dd74fe25cc20233375ecc87c8 GIT binary patch literal 2531 zcmaJ@dpuO@8eT;xKf0)t>uT(_h*@J?#*7h@L8H)di5=0HS=E%8HD;z}+)E0v4QE%B zP{-NPCUuG=mnb16QXSbC_YycqJiMVve5m*2Q!3S9!Ta2viJ_cklZ81KU zt~gh&1AK_JBa8=ohPin$!j3SAOpM(&kSrph0&G}72Sw~)4xc2l#eC5vq48oG!hl~O zf+Mz=KTY|%?gkwY9t;w(W~K}r&I}}=k%blBnn)xN2qqvNhc}0CRuJCO6mL$lB#_K3 zz^@kut;k~@AbC)ozScumwwOZ#0ha_pLZJ{VG{+*mgOC}KNQ7{B2#+^K5vKf5j({#Q z-dd$P`3qdU3hK3R>#M*8kq z8rgq12L;t?NeqdV60iOUo9@3`nHazDdupdlQOCUovSZ~rl2gv7lK)7~@>9@NB-%s0 z;kMH@;;7tDR{y z$s)#Z0*x!DBXQ|Ha}jGPmHvf$#^R-9z0^y~`BUZQp_(PdCEdp?%C{oMZiltH?i`rZ zunxA^x6IT3VwZSbb*M?kh{>IY@cWmEn-In@D4C1H<<4Zfv|TCx)$dK&esyg*vDtiH z@t($DhP%N@qm%A$#HFXJIqS#FNU91tyUH}B#r8yg(Gyv$h+HLK)uyi&J)T&>`w9E3 ztYqK1>b%t-ACsM5dUFGsDy|uhRrI@B&$$>rT>kom8s@Wc{jf78Et$7b6ptiMG;Ond zSEKFIb~Q=s#12{Kwx?_FRcO_K;|xlG+HV(zOoH3TYIL9Fk}csB1RRqbOI_(!p)_?{ z&3hm!O}~9<@6D{ymR9duhqJrZRo4r(*At&M#py^V4N?>Tb!oDpxA2BfbS=Awv7u?O z&!nzYV|zyE1peTf*IMtoM;pY6T;Y7eNw=*90na@|suNhnnSTA?m;PRl*l#7cq#>go z{|JS7wJD2SQL1xm8eEiCFtv( zTWf$!^{(U_4K1P+pR=BOu_oEp=_(ohM#c|@LvNfKce#?NXFC9kG|w3s4uv~aEE!~^ zM?cNaJ^C)TJ5s6CT0doY*n2Of4-!)i8qO&;ZudI(jP0GalTo6`1W4= zy%aFgz*+9z;Ju_}zM%n#(FX23;wty2mFP+*Kcx3*bQk=);M86hu{EFjy8Rx|lV-$(OPWxLl0WcS&je-3UA6k}$mb zqt4LI_LiS(63LjTch3Rfwe8ahkeg!|t!`Pbk8g4&_{=N}Vmjlk(eLZ($TH)d20Mjf zqxurZ+1Bxe=Bs7W#0TYx+Kqmj)Pd%^7KfuY_RdZ4og3@)q&9J3$&&#|d99f8axDV@ z2(m1psFvlz*Fwo>>-4ZZuj0?Soy^nPx&aJB{j)7qKB)|acL zjqTL1h&AVD@B>fUuFvt0v?pKY1sk%?mTkFT`zdN&b}6kd8~_BZ?|oF0=b$P;^VO7Z U#)Uf}i@#koM>lHW_Wd#c0U#_+bpQYW literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/welcome/step4-off.png b/app/javascript/images/mailer-new/welcome/share_step-off.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/step4-off.png rename to app/javascript/images/mailer-new/welcome/share_step-off.png diff --git a/app/javascript/images/mailer-new/welcome/share_step-on.png b/app/javascript/images/mailer-new/welcome/share_step-on.png new file mode 100644 index 0000000000000000000000000000000000000000..98782d931739c220410da17bb5a5ddba3ab8e2d1 GIT binary patch literal 1639 zcmV-t2AKJYP)xd-Z*i~ zDHRgwiS$6F3Xv#C1qzMx&-Tu~&KrBzPO^!2{ckq${4VuOcP-`TH#2YEY#fAyl*?uD z)5jadv5G8g=R9w(TJ?%v9^n+Q=hvuMDENNe_wyxHz4LT(Pyf6@l6yM}xLLmGRi-}~ z->Lq0=ClY)f*+{e^UvR{ES1atan~Iw#6;ZmMk!GFaTsBQtZlD6o2$3IqH7> z;H?XSL;*$|BALH%zB)F2?RNE#rKLj>4@KbY_h06!rLl84R1zE!b&{%3*?qP0)erUd ze$n3G$aC`IVJGb7X1VOO_eY|5&f{V01+6A_km-)gfx zLj*T;d&0D}WCF3M0Olm9HL!?vfkfiLK6wHk>eBCmtXDVp4Pn#~hhk2Pyx;7))VNpO z1&df6!aV1-4_QR~#tUj?kL4YJBTZ6$fv<@=^}XgjEMirl4zMtqv^@AuQmy0Sz}M*Y zAuEAo`dviJxd7d;4jzWtIiZy{U2%>pU56dTM7J~q_Jc-Lu z2j`5IuqIFs-zdO`?J~YVQ&%PMS~!eIDs{FKk2=C=Q1DdN&wdc)l<)*{le-T zhytU$PY=m26y`hTbmkhwd(nF!EPzF<3N(pxD++li>q3EdKQ6E1A+C2F-|{uBUR+L+ zd=C=*=*O=o!6J=ff;do2piKnv1Vl5v3GgaGpi5lXHc#Rjf^x+K7N8LBHj4_4gjkCr zpj$dRZ#CLnRcJpv#APk-o^5$dCh|ZQ;bHx*DHISKv!ZHoTyTJz^~ej!R7Kj%X9$mo zxJ7QK*U z={PgQs=(vUfe)egZ2Ef0nnWuCo4b!rXTXQyhsj1gjY)J491E`7-uK2abb(3Ffs@egpLmR@qo&zVP zDeqpZ2M1dAI#pY_gYtNuMWlhIKBq=toIHM-3kJ-o5NJytbK(Wsl*bHFVEfYp{dtnW zwmfEdX-t%}#it%=Y3yo}$m0)-+FtjUp>E~+S`09inTD9-BCp>c+(9yVsFZ{>Vg^~o zIk5tnER?t0nMjW~fjuIGU&~mL{N&*23W=!GgaSub_#l-ySMqD%=nBfox~Rw{oVQxkx+=J7G8N@|f7Ck6k40Cob|rVv7kJiNE}Q_HVbaG!~58+C`i^ zrsMPP9F5O&7fZP3pMepLl9juID=_!kJwA18Qkqp03FlMgChp1-*9w0!p< l3*(~7gxs$0ru=glZvd^Ls7@-yC .email-desktop-column { + direction: ltr; + + [dir='rtl'] & { + direction: rtl; + } + } +} + +.email-desktop-column { + display: inline-block; + width: 100%; + max-width: none; + text-align: start; + vertical-align: top; + font-size: 16px; +} + // Header .email-header-td { padding: 16px 32px; @@ -312,6 +348,66 @@ table + p { } } +.email-header-card-table { + width: 100%; + border-collapse: separate; + overflow: hidden; + border-radius: 12px; + background-color: #fff; + border: 2px solid #fff; + box-shadow: 0 4px 16px 0 rgba(23, 6, 59, 8%); +} + +.email-header-card { + position: relative; + max-height: 100px; +} + +.email-header-card-banner-td { + border-radius: 12px 12px 0 0; + height: 80px; + background-color: #f3f2f5 !important; + background-position: center !important; + background-size: cover !important; +} + +.email-header-card-body-td { + padding: 12px; + + .email-btn-table { + width: 100%; + max-width: 212px; + } +} + +.email-header-card-instance { + margin-bottom: 4px; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + color: #17063b; + font-size: 14px; + line-height: 20px; + font-weight: 600; + + &:only-of-type { + margin-bottom: 12px; + } +} + +.email-header-card-description { + margin-bottom: 12px; + color: #746a89; + font-size: 12px; + line-height: 16px; + max-height: 32px; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} + // To make the design work with images off // we create an empty div that overlaps with // the rest of the content with a dark background. @@ -336,6 +432,16 @@ table + p { mso-padding-alt: 32px; } +.email-body-columns-td { + border-top: 1px solid #dfdee3; + padding: 32px 24px 8px; +} + +.email-body-huge-padding-td { + padding: 110px 32px 32px; + mso-padding-alt: 32px; +} + .email-body-padding-td { & > p { font-size: 14px; @@ -353,6 +459,30 @@ table + p { } } +// Texts +.email-h2 { + margin-bottom: 4px; + color: #17063b; + font-size: 18px; + font-weight: 600; + line-height: 28px; +} + +.email-h-sub { + margin-bottom: 16px; + color: #746a89; + font-size: 14px; + line-height: 16px; +} + +.email-p { + margin-bottom: 16px; + color: #746a89; + font-size: 14px; + font-weight: 400; + line-height: 20px; +} + // Footer .email-footer-td { padding: 28px 32px 32px; @@ -539,8 +669,13 @@ table + p { background-color: #fff; } +.email-checklist-checked { + border-color: #c4e6d7; + background-color: #eaf6f1; +} + .email-checklist-td { - padding: 16px; + padding: 16px 16px 6px; } .email-checklist-icons-td { @@ -576,10 +711,15 @@ table + p { font-size: 14px; font-weight: 600; line-height: 16.8px; + + .email-checklist-checked & { + color: #746a89; + text-decoration: line-through; + } } p { - margin: 0 0 2px; + margin: 0 0 12px; color: #746a89; font-size: 14px; line-height: 16.8px; @@ -597,6 +737,194 @@ table + p { padding-left: 10px; padding-right: 10px; } + + div + div { + margin-inline-start: auto; + margin-bottom: 12px; + } +} + +// Welcome email +.email-welcome-apps-btns { + font-size: 12px; + line-height: 44px; +} + +.email-column-td { + padding: 0 8px; + vertical-align: top; +} + +.email-link-with-arrow { + color: #6364ff; + font-size: 14px; + font-weight: 600; + line-height: 16.8px; + + &:hover { + color: #563acc !important; + } + + span { + font-size: 12px; + font-weight: 400; + } +} + +.email-column-action-td { + padding: 24px 0; + color: #6364ff; + font-size: 14px; + font-weight: 600; + line-height: 16.8px; + text-align: center; +} + +// Follow and hashtags +.email-mini-wrapper-td { + padding: 4px 0; + + table { + table-layout: fixed; + } +} + +.email-mini-td { + border-radius: 12px; + border: 1px solid #e8e6eb; + background-color: #fff; + padding: 15px 16px; +} + +.email-mini-follow-img-td { + width: 40px; + vertical-align: top; + + img { + border-radius: 8px; + } +} + +.email-mini-follow-text-td { + padding-left: 8px; + padding-right: 16px; + vertical-align: top; + + h3 { + color: #17063b; + font-size: 14px; + font-weight: 600; + line-height: 20px; + } + + p { + color: #746a89; + font-size: 12px; + font-weight: 400; + line-height: 16px; + } +} + +.email-mini-follow-btn-td { + width: 68px; + vertical-align: top; + + .email-btn-table { + width: 100%; + } + + .email-btn-td { + mso-padding-alt: 10px; + } + + .email-btn-a { + padding-left: 10px; + padding-right: 10px; + } +} + +.email-mini-hashtag-td { + height: 40px; + + td { + vertical-align: middle; + } + + h3 { + color: #17063b; + font-size: 14px; + font-weight: 600; + line-height: 20px; + } + + p { + color: #746a89; + font-size: 12px; + font-weight: 400; + line-height: 16px; + word-break: break-all; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} + +.email-mini-hashtag-img-td { + width: 40px; + height: 20px; + white-space: nowrap; + text-indent: -2px; + font-size: 0; + + & + td { + padding-left: 8px; + } +} + +.email-mini-hashtag-img-span { + display: inline-block; + max-width: 12px; + font-size: 12px; + + img { + width: 16px; + height: 16px; + border-radius: 50%; + max-width: none; + border: 2px solid #fff; + vertical-align: middle; + } +} + +// Extra content on light purple background +.email-extra-wave { + height: 42px; + background-image: url('../images/mailer-new/welcome/purple-extra-soft-wave.png'); + background-position: bottom center; + background-repeat: no-repeat; +} + +.email-extra-td { + padding: 32px 32px 24px; + background-color: #f0f0ff; + background-image: url('../images/mailer-new/welcome/purple-extra-soft-spacer.png'); // Using an image to maintain the color even in forced dark modes + + .email-column-td { + padding-top: 8px; + padding-bottom: 8px; + } +} + +// Feature card +.email-feature-wrapper-td { + padding: 8px 0; +} + +.email-feature-td { + padding: 24px; + background-color: #fff; + border: 1px solid #e8e6eb; + border-radius: 12px; } // Responsive @@ -617,4 +945,21 @@ table + p { .email-desktop-flex { display: flex; } + + .email-header-left { + padding-right: 32px; + } + + .email-header-right { + width: 240px; + margin-inline-start: auto; + } + + .email-desktop-column { + max-width: 346px !important; + } + + .email-desktop-text-right { + text-align: right; + } } diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 3b1a085cb8..96fcd51efa 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -135,6 +135,12 @@ class UserMailer < Devise::Mailer return unless @resource.active_for_authentication? + @suggestions = AccountSuggestions.new(@resource.account).get(5) + @tags = Trends.tags.query.allowed.limit(5) + @has_account_fields = @resource.account.display_name.present? || @resource.account.note.present? || @resource.account.avatar.present? + @has_active_relationships = @resource.account.active_relationships.exists? + @has_statuses = @resource.account.statuses.exists? + I18n.with_locale(locale) do mail subject: default_i18n_subject end diff --git a/app/models/user.rb b/app/models/user.rb index f706c91eff..14c2bb6e0c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -490,7 +490,7 @@ class User < ApplicationRecord BootstrapTimelineWorker.perform_async(account_id) ActivityTracker.increment('activity:accounts:local') ActivityTracker.record('activity:logins', id) - UserMailer.welcome(self).deliver_later + UserMailer.welcome(self).deliver_later(wait: 1.hour) TriggerWebhookWorker.perform_async('account.approved', 'Account', account_id) end diff --git a/app/views/application/mailer/_button.html.haml b/app/views/application/mailer/_button.html.haml index 61430732eb..0bf80b505a 100644 --- a/app/views/application/mailer/_button.html.haml +++ b/app/views/application/mailer/_button.html.haml @@ -1,4 +1,7 @@ %table.email-btn-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-btn-td - = link_to "#{text} ➜", url, class: 'email-btn-a email-btn-hover' + - if defined?(has_arrow) && !has_arrow + = link_to text, url, class: 'email-btn-a email-btn-hover' + - else + = link_to "#{text} ➜", url, class: 'email-btn-a email-btn-hover' diff --git a/app/views/application/mailer/_checklist.html.haml b/app/views/application/mailer/_checklist.html.haml index 83072bd36b..31cd5bf35d 100644 --- a/app/views/application/mailer/_checklist.html.haml +++ b/app/views/application/mailer/_checklist.html.haml @@ -1,7 +1,7 @@ %table.email-w-full.email-checklist-wrapper-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-checklist-wrapper-td - %table.email-w-full.email-checklist-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %table.email-w-full.email-checklist-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation', class: ('email-checklist-checked' if defined?(checked) && checked) } %tr %td.email-checklist-td %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } @@ -15,15 +15,25 @@ - else = image_tag frontend_asset_url('images/mailer-new/welcome/checkbox-off.png'), alt: '', width: 20, height: 20 %td.email-checklist-icons-step-td - - if defined?(step_image_url) - = image_tag step_image_url, alt: '', width: 40, height: 40 + - if defined?(key) + = image_tag frontend_asset_url("images/mailer-new/welcome/#{key}-#{checked ? 'on' : 'off'}.png"), alt: '', width: 40, height: 40 %td.email-checklist-text-td .email-desktop-flex + /[if mso] +
%div - if defined?(title) %h3= title - if defined?(text) %p= text + /[if mso] + %div - - if defined?(button_text) && defined?(button_url) && defined?(checked) && !checked - = render 'application/mailer/button', text: button_text, url: button_url + - if defined?(show_apps_buttons) && show_apps_buttons + .email-welcome-apps-btns + = link_to image_tag(frontend_asset_url('images/mailer-new/welcome/btn-app-store.png'), alt: t('user_mailer.welcome.apps_ios_action'), width: 120, height: 40), 'https://apps.apple.com/app/mastodon-for-iphone-and-ipad/id1571998974' + = link_to image_tag(frontend_asset_url('images/mailer-new/welcome/btn-google-play.png'), alt: t('user_mailer.welcome.apps_android_action'), width: 120, height: 40), 'https://play.google.com/store/apps/details?id=org.joinmastodon.android' + - elsif defined?(button_text) && defined?(button_url) && defined?(checked) && !checked + = render 'application/mailer/button', text: button_text, url: button_url, has_arrow: false + /[if mso] +
diff --git a/app/views/application/mailer/_feature.html.haml b/app/views/application/mailer/_feature.html.haml new file mode 100644 index 0000000000..d051338a9c --- /dev/null +++ b/app/views/application/mailer/_feature.html.haml @@ -0,0 +1,32 @@ +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-feature-wrapper-td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-feature-td + .email-desktop-flex{ class: ('email-dir-rtl' if defined?(text_first_on_desktop) && !text_first_on_desktop) } + /[if mso] +
+ .email-desktop-column + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-column-td + - if defined?(feature_title) + %h2.email-h2= feature_title + - if defined?(feature_text) + %p.email-p= feature_text + - if defined?(feature_btn_url) + = link_to '', href: feature_btn_url, class: 'email-link-with-arrow' do + #{t('user_mailer.welcome.feature_action')}  + %span= '❯' + /[if mso] + + .email-desktop-column + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-column-td + - if defined?(key) + %p{ class: ('email-desktop-text-right' if defined?(text_first_on_desktop) && text_first_on_desktop) } + = image_tag frontend_asset_url("images/mailer-new/welcome/#{key}.png"), alt: '', width: 240, height: 230 + /[if mso] +
diff --git a/app/views/application/mailer/_follow.html.haml b/app/views/application/mailer/_follow.html.haml new file mode 100644 index 0000000000..382151a234 --- /dev/null +++ b/app/views/application/mailer/_follow.html.haml @@ -0,0 +1,15 @@ +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-mini-wrapper-td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-mini-td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-mini-follow-img-td + = image_tag full_asset_url(follow.account.avatar.url), alt: '', width: 40, height: 40 + %td.email-mini-follow-text-td + %h3= follow.account.display_name.presence || follow.account.username + %p @#{follow.account.pretty_acct} + %td.email-mini-follow-btn-td + = render 'application/mailer/button', text: t('user_mailer.welcome.follow_action'), url: web_url("@#{follow.account.acct}"), has_arrow: false diff --git a/app/views/application/mailer/_hashtag.html.haml b/app/views/application/mailer/_hashtag.html.haml new file mode 100644 index 0000000000..524fd7e274 --- /dev/null +++ b/app/views/application/mailer/_hashtag.html.haml @@ -0,0 +1,20 @@ +- accounts = hashtag.statuses.with_public_visibility.joins(:account).merge(Account.without_suspended.without_silenced).includes(:account).limit(3).map(&:account) + +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-mini-wrapper-td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-mini-td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-mini-hashtag-td{ height: 40 } + %h3 ##{hashtag.display_name} + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-mini-hashtag-img-td + - accounts.each do |account| + %span.email-mini-hashtag-img-span + = image_tag full_asset_url(account.avatar.url), alt: '', width: 16, height: 16 + %td + %p= t('user_mailer.welcome.hashtags_recent_count', people: number_with_delimiter(hashtag.history.aggregate(2.days.ago.to_date..Time.zone.today).accounts), days: 2) diff --git a/app/views/user_mailer/welcome.html.haml b/app/views/user_mailer/welcome.html.haml index b77d40fb05..e7f9c47e3b 100644 --- a/app/views/user_mailer/welcome.html.haml +++ b/app/views/user_mailer/welcome.html.haml @@ -1,25 +1,76 @@ +- instance_presenter = InstancePresenter.new + = content_for :heading do - = render 'application/mailer/heading', heading_title: t('user_mailer.welcome.title', name: @resource.account.username), heading_subtitle: t('user_mailer.welcome.explanation') + .email-desktop-flex + .email-header-left + = render 'application/mailer/heading', heading_title: t('user_mailer.welcome.title', name: @resource.account.username), heading_subtitle: t('user_mailer.welcome.explanation') + .email-header-right + .email-header-card + %table.email-header-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-header-card-banner-td{ height: 140, background: full_asset_url(instance_presenter.thumbnail&.file&.url(:'@1x') || frontend_asset_path('images/preview.png')) } + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-header-card-body-td + %p.email-header-card-instance= @instance + - if instance_presenter.description.present? + %p.email-header-card-description= instance_presenter.description + = render 'application/mailer/button', text: t('user_mailer.welcome.sign_in_action'), url: new_user_session_url, has_arrow: false + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.email-body-padding-td - %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } - %tr - %td.email-inner-card-td-without-padding - %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } - %tr - %td.email-prose.email-padding-24 - %p - %b= t 'user_mailer.welcome.full_handle' - = render 'application/mailer/frame', text: "#{@resource.account.username}@#{@instance}" - %p= t 'user_mailer.welcome.full_handle_hint', instance: @instance - %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } - %tr - %td.email-border-top.email-prose.email-padding-24 - %p= t 'user_mailer.welcome.edit_profile_step' - = render 'application/mailer/button', text: t('user_mailer.welcome.edit_profile_action'), url: settings_profile_url - %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } - %tr - %td.email-border-top.email-prose.email-padding-24 - %p= t 'user_mailer.welcome.edit_profile_step' - = render 'application/mailer/button', text: t('user_mailer.welcome.final_action'), url: web_url + %td.email-body-huge-padding-td + %h2.email-h2= t('user_mailer.welcome.checklist_title') + %p.email-h-sub= t('user_mailer.welcome.checklist_subtitle') + = render 'application/mailer/checklist', key: 'edit_profile_step', title: t('user_mailer.welcome.edit_profile_title'), text: t('user_mailer.welcome.edit_profile_step'), checked: @has_account_fields, button_text: t('user_mailer.welcome.edit_profile_action'), button_url: web_url('start/profile') + = render 'application/mailer/checklist', key: 'follow_step', title: t('user_mailer.welcome.follow_title'), text: t('user_mailer.welcome.follow_step'), checked: @has_active_relationships, button_text: t('user_mailer.welcome.follow_action'), button_url: web_url('start/follows') + = render 'application/mailer/checklist', key: 'post_step', title: t('user_mailer.welcome.post_title'), text: t('user_mailer.welcome.post_step'), checked: @has_statuses, button_text: t('user_mailer.welcome.post_action'), button_url: web_url + = render 'application/mailer/checklist', key: 'share_step', title: t('user_mailer.welcome.share_title'), text: t('user_mailer.welcome.share_step'), checked: false, button_text: t('user_mailer.welcome.share_action'), button_url: web_url('start/share') + = render 'application/mailer/checklist', key: 'apps_step', title: t('user_mailer.welcome.apps_title'), text: t('user_mailer.welcome.apps_step'), checked: false, show_apps_buttons: true +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-columns-td + .email-desktop-flex + /[if mso] +
+ .email-desktop-column + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-column-td + %h2.email-h2= t('user_mailer.welcome.follows_title') + %p.email-h-sub= t('user_mailer.welcome.follows_subtitle') + = render partial: 'application/mailer/follow', collection: @suggestions + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-column-action-td + = link_to '', href: web_url('explore/suggestions'), class: 'email-link-with-arrow' do + = t('user_mailer.welcome.follows_view_more') + %span= '❯' + /[if mso] + + .email-desktop-column + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-column-td + %h2.email-h2= t('user_mailer.welcome.hashtags_title') + %p.email-h-sub= t('user_mailer.welcome.hashtags_subtitle') + = render partial: 'application/mailer/hashtag', collection: @tags + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-column-action-td + = link_to '', href: web_url('explore/tags'), class: 'email-link-with-arrow' do + = t('user_mailer.welcome.hashtags_view_more') + %span= '❯' + /[if mso] +
+.email-extra-wave +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-extra-td + = render 'application/mailer/feature', key: 'feature_control', feature_title: t('user_mailer.welcome.feature_control_title'), feature_text: t('user_mailer.welcome.feature_control'), text_first_on_desktop: true + = render 'application/mailer/feature', key: 'feature_audience', feature_title: t('user_mailer.welcome.feature_audience_title'), feature_text: t('user_mailer.welcome.feature_audience'), text_first_on_desktop: false + = render 'application/mailer/feature', key: 'feature_moderation', feature_title: t('user_mailer.welcome.feature_moderation_title'), feature_text: t('user_mailer.welcome.feature_moderation'), text_first_on_desktop: true + = render 'application/mailer/feature', key: 'feature_creativity', feature_title: t('user_mailer.welcome.feature_creativity_title'), feature_text: t('user_mailer.welcome.feature_creativity'), text_first_on_desktop: false diff --git a/app/views/user_mailer/welcome.text.erb b/app/views/user_mailer/welcome.text.erb index d78cdb938a..150944605f 100644 --- a/app/views/user_mailer/welcome.text.erb +++ b/app/views/user_mailer/welcome.text.erb @@ -1,16 +1,78 @@ <%= t 'user_mailer.welcome.title', name: @resource.account.username %> <%= t 'user_mailer.welcome.explanation' %> -=== - -<%= t 'user_mailer.welcome.full_handle' %> (<%= "@#{@resource.account.local_username_and_domain}" %>) -<%= t 'user_mailer.welcome.full_handle_hint', instance: @instance %> - --- -<%= t 'user_mailer.welcome.edit_profile_step' %> +<%= t('user_mailer.welcome.sign_in_action') %> +=== +<%= new_user_session_url %> -=> <%= settings_profile_url %> +--- -<%= t 'user_mailer.welcome.final_step' %> +<%= t('user_mailer.welcome.checklist_title') %> +=== +<%= t('user_mailer.welcome.checklist_subtitle') %> -=> <%= web_url %> +1. <%= t('user_mailer.welcome.edit_profile_title') %> + <%= t('user_mailer.welcome.edit_profile_step') %> + * <%= web_url('start/profile') %> + +2. <%= t('user_mailer.welcome.follow_title') %> + <%= t('user_mailer.welcome.follow_step') %> + * <%= web_url('start/follows') %> + +3. <%= t('user_mailer.welcome.post_title') %> + <%= t('user_mailer.welcome.post_step') %> + * <%= web_url %> + +4. <%= t('user_mailer.welcome.share_title') %> + <%= t('user_mailer.welcome.share_step') %> + * <%= web_url('start/share') %> + +5. <%= t('user_mailer.welcome.apps_title') %> + <%= t('user_mailer.welcome.apps_step') %> + * iOS: https://apps.apple.com/app/mastodon-for-iphone-and-ipad/id1571998974 + * Android: https://play.google.com/store/apps/details?id=org.joinmastodon.android + +--- + +<%= t('user_mailer.welcome.follows_title') %> +=== +<%= t('user_mailer.welcome.follows_subtitle') %> + +<%- @suggestions.each do |suggestion| %> +* <%= suggestion.account.display_name.presence || suggestion.account.username %> · @<%= suggestion.account.pretty_acct %> + <%= web_url("@#{suggestion.account.acct}") %> +<%- end %> + +<%= web_url('explore/suggestions') %> + +--- + +<%= t('user_mailer.welcome.hashtags_title') %> +=== +<%= t('user_mailer.welcome.hashtags_subtitle') %> + +<%- @tags.each do |tag| %> +* #<%= tag.display_name %> · <%= t('user_mailer.welcome.hashtags_recent_count', people: number_with_delimiter(tag.history.aggregate(2.days.ago.to_date..Time.zone.today).accounts), days: 2) %> + <%= tag_url(tag) %> +<%- end %> + +<%= web_url('explore/tags') %> + +--- + +<%= t('user_mailer.welcome.feature_control_title') %> +=== +<%= word_wrap t('user_mailer.welcome.feature_control') %> + +<%= t('user_mailer.welcome.feature_audience_title') %> +=== +<%= word_wrap t('user_mailer.welcome.feature_audience') %> + +<%= t('user_mailer.welcome.feature_moderation_title') %> +=== +<%= word_wrap t('user_mailer.welcome.feature_moderation') %> + +<%= t('user_mailer.welcome.feature_creativity_title') %> +=== +<%= word_wrap t('user_mailer.welcome.feature_creativity') %> diff --git a/config/locales/an.yml b/config/locales/an.yml index 17077041da..edfdb44b35 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -1600,10 +1600,6 @@ an: edit_profile_action: Configurar lo perfil edit_profile_step: Puetz personalizar lo tuyo perfil puyando una foto de perfil, cambiando lo tuyo nombre d'usuario y muito mas. Puetz optar per revisar a los nuevos seguidores antes que puedan seguir-te. explanation: Aquí i hai qualques consellos pa empecipiar - final_action: Empecipiar a publicar - final_step: 'Empecipia a publicar! Mesmo sin seguidores, las tuyas publicacions publicas pueden estar vistas per atros, per eixemplo en a linia de tiempo local u en etiquetas. Tal vegada quieras presentar-te con a etiqueta de #presentacions.' - full_handle: Lo suyo sobrenombre completo - full_handle_hint: Esto ye lo que le dirías a los tuyos amigos pa que ells puedan ninviar-te mensaches u seguir-te dende unatra instancia. subject: Bienveniu a Mastodon title: Te damos la bienvenida a bordo, %{name}! users: diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 0927fba0af..2b2052172e 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -1969,10 +1969,6 @@ ar: edit_profile_action: تهيئة الملف التعريفي edit_profile_step: يمكنك تخصيص ملفك الشخصي عن طريق رفع صورة ملفك الشخصي, تغيير اسم العرض الخاص بك والمزيد. يمكنك اختيار مراجعة المتابعين الجدد قبل السماح لهم بمتابعتك. explanation: ها هي بعض النصائح قبل بداية الاستخدام - final_action: اشرَع في النشر - final_step: 'ابدأ في النشر! حتى بدون متابعين، منشوراتك العامة قد يشاهدها آخرون، على سبيل المثال في التوقيت المحلي أو في الوسوم. قد ترغب في تقديم نفسك على وسم #introductions.' - full_handle: عنوانك الكامل - full_handle_hint: هذا هو ما يجب تقديمه لأصدقائك قصد أن يكون بإمكانهم متابَعتك أو مُراسَلتك حتى و إن كانت حساباتهم على خوادم أخرى. subject: أهلًا بك على ماستدون title: أهلاً بك، %{name}! users: diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 7e5a4c8876..da7e99c2fa 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -903,7 +903,6 @@ ast: edit_profile_action: Configurar el perfil edit_profile_step: Pues personalizar el perfil pente la xuba d'una semeya, el cambéu del nome visible ya muncho más. Tamién, si lo prefieres, pues revisar los perfiles nuevos enantes de que puedan siguite. explanation: Equí tienes dalgunos conseyos pa que comiences - final_action: Comenzar a espublizar subject: Afáyate en Mastodon title: "¡Afáyate, %{name}!" users: diff --git a/config/locales/be.yml b/config/locales/be.yml index 13cbcd8ffc..34e0722ba9 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1910,10 +1910,6 @@ be: edit_profile_action: Наладзіць профіль edit_profile_step: Вы можаце наладзіць свой профіль, запампаваўшы выяву профілю, змяніўшы адлюстраванае імя і іншае. Вы можаце праглядаць новых падпісчыкаў, перш чым ім будзе дазволена падпісацца на вас. explanation: Вось некаторыя парады каб пачаць - final_action: Пачаць пісаць - final_step: 'Пачынайце пісаць! Нават, калі ў вас няма падпісчыкаў, іншыя людзі змогуць пабачыць вашыя допісы, напрыклад, у лакальнай стужцы, або праз хэштэгі. Калі хочаце, вы можаце прадставіцца праз хэштэг #introductions.' - full_handle: Ваш поўны маркер - full_handle_hint: Гэта тое, што вы дасце сваім сябрам, каб яны маглі адпраўляць паведамленні або падпісацца на вас з іншага сервера. subject: Вітаем у Mastodon title: Рады вітаць вас, %{name}! users: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index b1229ac906..15c671d539 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1841,10 +1841,6 @@ bg: edit_profile_action: Настройване на профила edit_profile_step: Може да настроите профила си, качвайки снимката на профила, променяйки показваното си име и други неща. Може да се включите за преглед на нови последователи преди да бъдат позволени да ви последват. explanation: Ето няколко стъпки за начало - final_action: Начало на публикуване - final_step: 'Публикувайте! Дори без да имате последователи, вашите публични публикации ще бъдат видени от други, например в местната хронология или под хаштагове. Не забравяйте да се представите с хаштаг #introductions.' - full_handle: Пълното ви име - full_handle_hint: Ето какво бихте казали на приятелите си, за да могат да ви изпращат съобщения или да ви последват от друг сървър. subject: Добре дошли в Mastodon title: Добре дошли на борда, %{name}! users: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 4b5ec815ca..d80fb598e3 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1846,10 +1846,6 @@ ca: edit_profile_action: Configura el perfil edit_profile_step: Pots personalitzar el teu perfil pujant-hi un avatar, canviant el teu nom de visualització i molt més. Si ho prefereixes, pots revisar els seguidors nous abans que et puguin seguir. explanation: Aquests són alguns consells per a començar - final_action: Comença a publicar - final_step: 'Comença a publicar! Fins i tot sense seguidors, els altres poden veure els teus missatges públics, per exemple, a la línia de temps local i a les etiquetes. És possible que vulguis presentar-te amb l''etiqueta #introductions.' - full_handle: El teu nom d'usuari sencer - full_handle_hint: Això és el que has de dir als teus amics perquè puguin enviar-te missatges o seguir-te des d'un altre servidor. subject: Et donem la benvinguda a Mastodon title: Benvingut a bord, %{name}! users: diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index 72a3c08d4d..fec8f73323 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -1035,9 +1035,6 @@ ckb: welcome: edit_profile_action: پرۆفایلی جێگیرکردن explanation: ئەمە چەند ئامۆژگارییەکن بۆ دەست پێکردنت - final_action: دەست بکە بە بڵاوکردنەوە - full_handle: ناوی بەکارهێنەری تەواوی ئێوە - full_handle_hint: ئەمە ئەو شتەیە کە بە هاوڕێکانت دەلێی بۆ ئەوەی پەیام یان لە ڕاژەیەکی دیکەی ترەوە بەدوات بکەون. subject: بەخێربیت بۆ ماستۆدۆن title: بەخێربێیت، بەکارهێنەر %{name}! users: diff --git a/config/locales/co.yml b/config/locales/co.yml index f5b6b46d92..c3c185c2f5 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -1050,9 +1050,6 @@ co: welcome: edit_profile_action: Cunfigurazione di u prufile explanation: Eccu alcune idee per principià - final_action: Principià à pustà - full_handle: U vostru identificatore cumplettu - full_handle_hint: Quessu ghjè cio chì direte à i vostri amichi per circavi, abbunassi à u vostru contu da altrò, o mandà missaghji. subject: Benvenutu·a nant’à Mastodon title: Benvenutu·a, %{name}! users: diff --git a/config/locales/cs.yml b/config/locales/cs.yml index e43f671590..69640a261f 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1910,10 +1910,6 @@ cs: edit_profile_action: Nastavit profil edit_profile_step: Váš profil si můžete přizpůsobit nahráním profilového obrázku, změnou zobrazovaného jména a dalším. Můžete se přihlásit k přezkoumání nových následovatelů, než vás budou moci následovat. explanation: Zde je pár tipů do začátku - final_action: Začít psát - final_step: 'Začněte psát příspěvky! I bez sledujících mohou vaše veřejné příspěvky vidět ostatní, například na místní časové ose nebo v hashtagu. Možná se budete chtít představit na hashtagu #představení.' - full_handle: Vaše celá adresa profilu - full_handle_hint: Tohle je, co byste řekli svým přátelům, aby vám mohli posílat zprávy nebo vás sledovat z jiného serveru. subject: Vítejte na Mastodonu title: Vítejte na palubě, %{name}! users: diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 1fbcbb2255..19343146f3 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1974,10 +1974,6 @@ cy: edit_profile_action: Sefydlu proffil edit_profile_step: Gallwch addasu'ch proffil trwy lwytho llun proffil, newid eich enw dangos a mwy. Gallwch ddewis i adolygu dilynwyr newydd cyn iddyn nhw gael caniatâd i'ch dilyn. explanation: Dyma ambell nodyn i'ch helpu i ddechrau - final_action: Dechrau postio - final_step: 'Dechreuwch bostio! Hyd yn oed heb ddilynwyr, efallai y bydd eraill yn gweld eich postiadau cyhoeddus, er enghraifft ar y ffrwd leol neu mewn hashnodau. Efallai y byddwch am gyflwyno eich hun ar yr hashnod #cyflwyniadau neu/a #introductions.' - full_handle: Eich enw llawn - full_handle_hint: Dyma beth fyddech chi'n ei ddweud wrth eich ffrindiau fel y gallant anfon neges neu eich dilyn o weinydd arall. subject: Croeso i Mastodon title: Croeso, %{name}! users: diff --git a/config/locales/da.yml b/config/locales/da.yml index 5ceaad9705..62e28cef16 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1846,10 +1846,6 @@ da: edit_profile_action: Opsæt profil edit_profile_step: Man kan tilpasse sin profil ved at uploade profilfoto, overskrift, ændre visningsnavn mv. Ønskes nye følgere vurderet, før de må følge dig, kan kontoen låses. explanation: Her er nogle råd for at få dig i gang - final_action: Begynd at poste - final_step: 'Begynd at poste! Selv uden følgere vil offentlige indlæg kunne ses af andre f.eks. på den lokale tidslinje og i hashtags. Man kan introducere sig selv via hastagget #introductions.' - full_handle: Dit fulde brugernavn - full_handle_hint: Dette er, hvad du oplyser til dine venner, så de kan sende dig beskeder eller følge dig fra andre servere. subject: Velkommen til Mastodon title: Velkommen ombord, %{name}! users: diff --git a/config/locales/de.yml b/config/locales/de.yml index ae1af7b308..123942672e 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1846,10 +1846,6 @@ de: edit_profile_action: Profil einrichten edit_profile_step: Du kannst dein Profil anpassen, indem du ein Profilbild hochlädst, deinen Anzeigenamen änderst und vieles mehr. Du kannst dich dafür entscheiden, neue Follower zu überprüfen, bevor sie dir folgen dürfen. explanation: Hier sind ein paar Tipps, um loszulegen - final_action: Mit erstem Beitrag starten - final_step: 'Fang jetzt an zu posten! Selbst ohne Follower werden deine öffentlichen Beiträge von anderen gesehen, zum Beispiel in der lokalen Timeline oder über die Hashtags. Möglicherweise möchtest du dich allen mit dem Hashtag #neuhier vorstellen.' - full_handle: Dein vollständiger Profilname - full_handle_hint: Deinen vollständigen Profilnamen kannst du deinen Freund*innen mitteilen, damit sie dich anschreiben oder dir von einem anderen Server folgen können. subject: Willkommen bei Mastodon! title: Willkommen an Bord, %{name}! users: diff --git a/config/locales/el.yml b/config/locales/el.yml index 16c042f185..c641d4dca9 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -1707,10 +1707,6 @@ el: edit_profile_action: Στήσιμο προφίλ edit_profile_step: Μπορείς να προσαρμόσεις το προφίλ σου ανεβάζοντας μια εικόνα προφίλ, αλλάζοντας το εμφνιζόμενο όνομα και άλλα. Μπορείς να επιλέξεις να αξιολογείς νέους ακόλουθους πριν τους επιτραπεί να σε ακολουθήσουν. explanation: Μερικές συμβουλές για να ξεκινήσεις - final_action: Ξεκίνα να αναρτάς - final_step: 'Ξεκίνα να δημοσιεύεις! Ακόμα και χωρίς ακόλουθους τις δημόσιες δημοσιεύσεις σου μπορεί να τις δουν άλλοι, για παράδειγμα στην τοπική ροή ή στις ετικέτες. Ίσως να θέλεις να μας γνωρίσεις τον εαυτό σου με την ετικέτα #introductions.' - full_handle: Το πλήρες όνομά σου - full_handle_hint: Αυτό θα εδώ θα πεις στους φίλους σου για να σου μιλήσουν ή να σε ακολουθήσουν από άλλο διακομιστή. subject: Καλώς ήρθες στο Mastodon title: Καλώς όρισες, %{name}! users: diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index d4840c84e9..6b2554fe15 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -1841,10 +1841,6 @@ en-GB: edit_profile_action: Setup profile edit_profile_step: You can customise your profile by uploading a profile picture, changing your display name and more. You can opt-in to review new followers before they’re allowed to follow you. explanation: Here are some tips to get you started - final_action: Start posting - final_step: 'Start posting! Even without followers, your public posts may be seen by others, for example on the local timeline or in hashtags. You may want to introduce yourself on the #introductions hashtag.' - full_handle: Your full handle - full_handle_hint: This is what you would tell your friends so they can message or follow you from another server. subject: Welcome to Mastodon title: Welcome aboard, %{name}! users: diff --git a/config/locales/en.yml b/config/locales/en.yml index efd603740a..cff244a4b9 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1844,13 +1844,42 @@ en: silence: Account limited suspend: Account suspended welcome: - edit_profile_action: Setup profile - edit_profile_step: You can customize your profile by uploading a profile picture, changing your display name and more. You can opt-in to review new followers before they’re allowed to follow you. + apps_android_action: Get it on Google Play + apps_ios_action: Download on the App Store + apps_step: Download our official apps. + apps_title: Mastodon apps + checklist_subtitle: 'Let''s get you started on this new social frontier:' + checklist_title: Welcome Checklist + edit_profile_action: Personalize + edit_profile_step: Boost your interactions by having a comprehensive profile. + edit_profile_title: Personalize your profile explanation: Here are some tips to get you started - final_action: Start posting - final_step: 'Start posting! Even without followers, your public posts may be seen by others, for example on the local timeline or in hashtags. You may want to introduce yourself on the #introductions hashtag.' - full_handle: Your full handle - full_handle_hint: This is what you would tell your friends so they can message or follow you from another server. + feature_action: Learn more + feature_audience: Mastodon provides you with a unique possibility of managing your audience without middlemen. Mastodon deployed on your own infrastructure allows you to follow and be followed from any other Mastodon server online and is under no one's control but yours. + feature_audience_title: Build your audience in confidence + feature_control: You know best what you want to see on your home feed. No algorithms or ads to waste your time. Follow anyone across any Mastodon server from a single account and receive their posts in chronological order, and make your corner of the internet a little more like you. + feature_control_title: Stay in control of your own timeline + feature_creativity: Mastodon supports audio, video and picture posts, accessibility descriptions, polls, content warnings, animated avatars, custom emojis, thumbnail crop control, and more, to help you express yourself online. Whether you're publishing your art, your music, or your podcast, Mastodon is there for you. + feature_creativity_title: Unparalleled creativity + feature_moderation: Mastodon puts decision making back in your hands. Each server creates their own rules and regulations, which are enforced locally and not top-down like corporate social media, making it the most flexible in responding to the needs of different groups of people. Join a server with the rules you agree with, or host your own. + feature_moderation_title: Moderating the way it should be + follow_action: Follow + follow_step: Following interesting people is what Mastodon is all about. + follow_title: Personalize your home feed + follows_subtitle: Follow well-known accounts + follows_title: Who to follow + follows_view_more: View more people to follow + hashtags_recent_count: "%{people} people in the past %{days} days" + hashtags_subtitle: Explore what’s trending since past 2 days + hashtags_title: Trending hashtags + hashtags_view_more: View more trending hashtags + post_action: Compose + post_step: Say hello to the world with text, photos, videos, or polls. + post_title: Make your first post + share_action: Share + share_step: Let your friends know how to find you on Mastodon. + share_title: Share your Mastodon profile + sign_in_action: Sign in subject: Welcome to Mastodon title: Welcome aboard, %{name}! users: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index beb6aa6d9f..bc694578b7 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1763,10 +1763,6 @@ eo: edit_profile_action: Agordi profilon edit_profile_step: Vi povas personecigi vian profilon per alŝuti profilbildon, ŝangi vian montronomo kaj pli. explanation: Jen kelkaj konsiloj por helpi vin komenci - final_action: Ekmesaĝi - final_step: 'Ekmesaĝu! Eĉ sen sekvantoj, viaj publikaj mesaĝoj povas esti vidataj de aliaj, ekzemple en la loka templinio aŭ per kradvortoj. Eble vi ŝatus prezenti vin per la kradvorto #introductions / #konigo.' - full_handle: Via kompleta uzantnomo - full_handle_hint: Jen kion vi dirus al viaj amikoj, por ke ili mesaĝu aŭ sekvu vin de alia servilo. subject: Bonvenon en Mastodon title: Bonvenon, %{name}! users: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 1db8e6ecf8..37fcc11d78 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1846,10 +1846,6 @@ es-AR: edit_profile_action: Configurar perfil edit_profile_step: Podés personalizar tu perfil subiendo un avatar (imagen de perfil), cambiando tu nombre a mostrar y más. Podés optar por revisar a los nuevos seguidores antes de que puedan seguirte. explanation: Aquí hay algunos consejos para empezar - final_action: Empezá a enviar mensajes - final_step: "¡Empezá a enviar mensajes! Incluso sin seguidores, tus mensajes públicos pueden ser vistos por otros, por ejemplo en la linea temporal local o al usar etiquetas. Capaz que quieras presentarte al mundo con la etiqueta «#presentación»." - full_handle: Tu nombre de usuario completo - full_handle_hint: Esto es lo que le dirás a tus contactos para que ellos puedan enviarte mensajes o seguirte desde otro servidor. subject: Bienvenido a Mastodon title: "¡Bienvenido a bordo, %{name}!" users: diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index db5c05322b..26dbc2dfb8 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -1846,10 +1846,6 @@ es-MX: edit_profile_action: Configurar el perfil edit_profile_step: Puedes personalizar tu perfil subiendo una foto de perfil, cambiando tu nombre de usuario y mucho más. Puedes optar por revisar a los nuevos seguidores antes de que puedan seguirte. explanation: Aquí hay algunos consejos para empezar - final_action: Empezar a publicar - final_step: "¡Empieza a publicar! Incluso sin seguidores, tus publicaciones públicas pueden ser vistas por otros, por ejemplo en la línea de tiempo local o en etiquetas. Tal vez quieras presentarte con la etiqueta de #introducciones." - full_handle: Su sobrenombre completo - full_handle_hint: Esto es lo que le dirías a tus amigos para que ellos puedan enviarte mensajes o seguirte desde otra instancia. subject: Bienvenido a Mastodon title: Te damos la bienvenida a bordo, %{name}! users: diff --git a/config/locales/es.yml b/config/locales/es.yml index e5ccee5ee3..7956580138 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1846,10 +1846,6 @@ es: edit_profile_action: Configurar el perfil edit_profile_step: Puedes personalizar tu perfil subiendo una foto de perfil, cambiando tu nombre de usuario y mucho más. Puedes optar por revisar a los nuevos seguidores antes de que puedan seguirte. explanation: Aquí hay algunos consejos para empezar - final_action: Empezar a publicar - final_step: "¡Empieza a publicar! Incluso sin seguidores, tus publicaciones públicas pueden ser vistas por otros, por ejemplo en la línea de tiempo local o en etiquetas. Tal vez quieras presentarte con la etiqueta de #presentación." - full_handle: Su sobrenombre completo - full_handle_hint: Esto es lo que le dirías a tus amigos para que ellos puedan enviarte mensajes o seguirte desde otra instancia. subject: Bienvenido a Mastodon title: Te damos la bienvenida a bordo, %{name}! users: diff --git a/config/locales/et.yml b/config/locales/et.yml index c21ea0b971..ed25488ce4 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -1846,10 +1846,6 @@ et: Kui mõni asi arusaamatuks jääb, siis võib vaadata juhendvideot: https://youtu.be/J4ItbTOAw7Q explanation: Siin on mõned nõuanded, mis aitavad alustada - final_action: Alusta postitamist - final_step: 'Nüüd tee oma esimene postitus. Hea tava on uues kohas ennast tutvustada ning kindlasti kasuta selles postituses ka silti #tutvustus. Isegi kui sul ei ole veel jälgijaid, siis su postitusi näevad kohalikul ajajoonel ka kõik teised serveri kasutajad.' - full_handle: Kasutajanimi Mastodon võrgustikus - full_handle_hint: Kui jagad kasutajanime väljaspool serverit, siis kasuta kindlasti pikka nime. Erinevates serverites võib olla sama kasutajanimega liikmeid. subject: Tere tulemast Mastodoni title: Tere tulemast, %{name}! users: diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 6c625d08bd..fb3013e008 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -1847,10 +1847,6 @@ eu: edit_profile_action: Ezarri profila edit_profile_step: Pertsonalizatu profila abatar bat igoz, zure pantaila-izena aldatuz eta gehiago. Jarraitzaile berriak onartu aurretik berrikusi nahi badituzu, kontuari giltzarrapoa jarri diezaiokezu. explanation: Hona hasteko aholku batzuk - final_action: Hasi bidalketak argitaratzen - final_step: 'Hasi argitaratzen! Jarraitzailerik ez baduzu ere zure bidalketa publikoak besteek ikusi ditzakete, esaterako denbora-lerro lokalean eta traoletan. Zure burua aurkeztu nahi baduzu #aurkezpenak traola erabili zenezake.' - full_handle: Helbide osoa - full_handle_hint: Hau da lagunei esango zeniekeena beste zerbitzari batetik zu jarraitzeko edo zuri mezuak bidaltzeko. subject: Ongi etorri Mastodon-era title: Ongi etorri, %{name}! users: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index f6ff379745..4339e06c34 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -1579,10 +1579,6 @@ fa: edit_profile_action: تنظیم نمایه edit_profile_step: می‌توانید نمایه‌تان را با بارگذاری تصویر نمایه، تغییر نام نمایشی و بیش از این‌‌ها سفارشی کنید. می‌توانید تعیین کنید که پی‌گیران جدید را پیش‌از این که بتوانند دنبالتان کنند بازبینی کنید. explanation: نکته‌هایی که برای آغاز کار به شما کمک می‌کنند - final_action: چیزی منتشر کنید - final_step: 'چیزی بنویسید! حتا بدون پی‌گیر ممکن است فرسته‌های عمومیتان دیده شود. برای مثال روی خط زمانی محلی یا در برچسب‌ها. شاید بخواهید با برچسب #معرفی خودتان را معرّفی کنید.' - full_handle: نام کاربری کامل شما - full_handle_hint: این چیزی است که باید به دوستانتان بگویید تا بتوانند از کارسازی دیگر به شما پیام داده یا پی‌گیرتان شوند. subject: به ماستودون خوش آمدید title: خوش آمدید، کاربر %{name}! users: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index ad6d6e9c07..dc303991bc 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1846,10 +1846,6 @@ fi: edit_profile_action: Määritä profiili edit_profile_step: Voit mukauttaa profiiliasi muun muassa profiilikuvalla ja uudella näyttönimellä. Voit myös valita, haluatko tarkastaa ja hyväksyä uudet seuraajat itse. explanation: Näillä vinkeillä pääset alkuun - final_action: Ala julkaista - final_step: 'Ala julkaista! Vaikkei sinulla olisi seuraajia, voivat muut nähdä julkisia julkaisujasi esimerkiksi paikallisella aikajanalla tai aihetunnisteissa. Kannattaa myös esitellä itsensä aihetunnisteella #esittely.' - full_handle: Koko käyttäjätunnuksesi - full_handle_hint: Kerro tämä kavereillesi, niin he voivat lähettää sinulle viestejä tai seurata sinua toiselta palvelimelta. subject: Tervetuloa Mastodoniin title: Tervetuloa mukaan, %{name}! users: diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 555b82a79d..6a8dd9b2ee 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1846,10 +1846,6 @@ fo: edit_profile_action: Set upp vanga edit_profile_step: Tú kanst tillaga vanga tín við at leggja eina vangamynd inn, broyta vísta navnið hjá tær og meira. Tú kanst velja at eftirkanna nýggjar fylgjarar, áðrenn teir sleppa at fylgja tær. explanation: Her eru nøkur ráð so tú kann koma gott ígongd - final_action: Byrja at posta - final_step: 'Byrja at posta! Sjálvt uttan fylgjarar, so kunnu tínir almennu postar vera sæddir av øðrum, til dømis á lokalu tíðarlinjuni ella í frámerkjum. Kanska vilt tú greiða frá um teg sjálva/n við frámerkinum #introductions.' - full_handle: Fulla brúkaranavn títt - full_handle_hint: Hetta er tað, sum tú fortelur vinum tínum, soleiðis at tey kunnu senda tær boð ella fylgja tær frá einum øðrum ambætara. subject: Vælkomin til Mastodon title: Vælkomin umborð, %{name}! users: diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 3676d0b7b5..97cb08c918 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -1841,10 +1841,6 @@ fr-CA: edit_profile_action: Configuration du profil edit_profile_step: Vous pouvez personnaliser votre profil en téléchargeant une photo de profil, en changant votre nom d'utilisateur, etc. Vous pouvez opter pour le passage en revue de chaque nouvelle demande d'abonnement à chaque fois qu'un utilisateur essaie de s'abonner à votre compte. explanation: Voici quelques conseils pour vous aider à démarrer - final_action: Commencez à publier - final_step: 'Commencez à publier ! Même si vous n''avez pas encore d''abonnés, vos publications sont publiques et sont accessibles par les autres, par exemple grâce à la zone horaire locale ou par les hashtags. Vous pouvez vous présenter sur le hashtag #introductions.' - full_handle: Votre identifiant complet - full_handle_hint: C’est ce que vous diriez à vos ami·e·s pour leur permettre de vous envoyer un message ou vous suivre à partir d’un autre serveur. subject: Bienvenue sur Mastodon title: Bienvenue à bord, %{name} ! users: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index a3aaf7a26e..b085937c76 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1841,10 +1841,6 @@ fr: edit_profile_action: Configuration du profil edit_profile_step: Vous pouvez personnaliser votre profil en téléchargeant une photo de profil, en changant votre nom d'utilisateur, etc. Vous pouvez opter pour le passage en revue de chaque nouvelle demande d'abonnement à chaque fois qu'un utilisateur essaie de s'abonner à votre compte. explanation: Voici quelques conseils pour vous aider à démarrer - final_action: Commencez à publier - final_step: 'Commencez à publier ! Même si vous n''avez pas encore d''abonnés, vos publications sont publiques et sont accessibles par les autres, par exemple grâce à la zone horaire locale ou par les hashtags. Vous pouvez vous présenter sur le hashtag #introductions.' - full_handle: Votre identifiant complet - full_handle_hint: C’est ce que vous diriez à vos ami·e·s pour leur permettre de vous envoyer un message ou vous suivre à partir d’un autre serveur. subject: Bienvenue sur Mastodon title: Bienvenue à bord, %{name} ! users: diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 2cbb69010d..caa88dcfe4 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -1841,10 +1841,6 @@ fy: edit_profile_action: Profyl ynstelle edit_profile_step: Jo kinne jo profyl oanpasse troch in profylfoto op te laden, jo werjeftenamme oan te passen en mear. Jo kinne it hânmjittich goedkarren fan folgers ynstelle. explanation: Hjir binne inkelde tips om jo op wei te helpen - final_action: Begjin mei berjochten te pleatsen - final_step: 'Begjin berjochten te pleatsen! Sels sûnder folgers kinne jo iepenbiere berjochten troch oaren besjoen wurde, bygelyks op de lokale tiidline en ûnder hashtags. Jo kinne josels foarstelle mei it gebrûk fan de hashtag #introductions.' - full_handle: Jo folsleine Mastodon-adres - full_handle_hint: Dit jouwe jo oan jo freonen, sadat se jo berjochten stjoere kinne of (fan in oare Mastodon-server ôf) folgje kinne. subject: Wolkom op Mastodon title: Wolkom oan board %{name}! users: diff --git a/config/locales/gd.yml b/config/locales/gd.yml index d3dab8273d..e2a43564c0 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -1880,10 +1880,6 @@ gd: edit_profile_action: Suidhich a’ phròifil agad edit_profile_step: "’S urrainn dhut a’ phròifil agad a ghnàthachadh is tu a’ luchdadh suas dealbh pròifil, ag atharrachadh d’ ainm-taisbeanaidh is a bharrachd. ’S urrainn dhut lèirmheas a dhèanamh air daoine mus fhaod iad ’gad leantainn ma thogras tu." explanation: Seo gliocas no dhà gus tòiseachadh - final_action: Tòisich air postadh - final_step: 'Tòisich air postadh! Fiù ’s mur eil duine sam bith ’gad leantainn, chì cuid mhath na postaichean poblach agad, can air an loidhne-ama ionadail no le tagaichean hais. Saoil an innis thu beagan mu d’ dhèidhinn air an taga hais #fàilte?' - full_handle: D’ ainm-cleachdaiche slàn - full_handle_hint: Seo na bheir thu dha na caraidean agad ach an urrainn dhaibh teachdaireachd a chur thugad no ’gad leantainn o fhrithealaiche eile. subject: Fàilte gu Mastodon title: Fàilte air bòrd, %{name}! users: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 705f0ef4e9..8520b90ead 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1846,10 +1846,6 @@ gl: edit_profile_action: Configurar perfil edit_profile_step: Podes personalizar o teu perfil subindo unha imaxe de perfil, cambiar o nome público e moito máis. Podes elexir revisar as solicitudes de seguimento recibidas antes de permitirlles que te sigan. explanation: Aquí tes algunhas endereitas para ir aprendendo - final_action: Comeza a publicar - final_step: 'Publica! Incluso sen seguidoras, as túas mensaxes públicas serán vistas por outras persoas, por exemplo na cronoloxía local e nos cancelos. Poderías presentarte ao #fediverso utilizando o cancelo #introductions.' - full_handle: O teu alcume completo - full_handle_hint: Compárteo coas túas amizades para que poidan seguirte ou enviarche mensaxes desde outros servidores. subject: Benvida a Mastodon title: Benvida, %{name}! users: diff --git a/config/locales/he.yml b/config/locales/he.yml index b5a98dd24d..55ab576142 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1910,10 +1910,6 @@ he: edit_profile_action: הגדרת פרופיל edit_profile_step: תוכל.י להתאים אישית את הפרופיל באמצעות העלאת יצגן (אוואטר), כותרת, שינוי כינוי ועוד. אם תרצה.י לסקור את עוקביך/ייך החדשים לפני שתרשה.י להם לעקוב אחריך/ייך. explanation: הנה כמה טיפים לעזור לך להתחיל - final_action: התחל/ילי לחצרץ - final_step: 'התחל/ילי לחצצר! אפילו ללא עוקבים ייתכן שהחצרוצים הפומביים שלך יראו ע"י אחרים, למשל בציר הזמן המקומי או בתגיות הקבצה (האשתגים). כדאי להציג את עצמך תחת התגית #introductions או #היכרות' - full_handle: שם המשתמש המלא שלך - full_handle_hint: זה מה שתאמר.י לחברייך כדי שיוכלו לשלוח לך הודעה או לעקוב אחרייך ממופע אחר. subject: ברוכים הבאים למסטודון title: ברוך/ה הבא/ה, %{name} ! users: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 456636d4c5..733d883da0 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1846,10 +1846,6 @@ hu: edit_profile_action: Készítsd el profilod edit_profile_step: Testreszabhatod a profilod egy profilkép feltöltésével, a megjelenített neved megváltoztatásával és így tovább. Bekapcsolhatod az új követőid jóváhagyását, mielőtt követhetnek. explanation: Néhány tipp a kezdeti lépésekhez - final_action: Kezdj bejegyzéseket írni - final_step: 'Kezdj tülkölni! A nyilvános bejegyzéseid még követők híján is megjelennek másoknak, például a helyi idővonalon vagy a hashtageknél. Kezdd azzal, hogy bemutatkozol a #bemutatkozas vagy az #introductions hashtag használatával.' - full_handle: Teljes felhasználóneved - full_handle_hint: Ez az, amit megadhatsz másoknak, hogy üzenhessenek neked vagy követhessenek téged más szerverekről. subject: Üdvözöl a Mastodon title: Üdv a fedélzeten, %{name}! users: diff --git a/config/locales/hy.yml b/config/locales/hy.yml index f3a6392ff0..b0d8f00864 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -875,7 +875,6 @@ hy: suspend: Հաշիւը արգելափակուած է welcome: edit_profile_action: Կարգաւորել հաշիւը - final_action: Սկսել գրել subject: Բարի գալուստ Մաստոդոն title: Բարի գալուստ նաւամատոյց, %{name} users: diff --git a/config/locales/ia.yml b/config/locales/ia.yml index a85af012f3..52cf861b48 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -256,7 +256,6 @@ ia: disable: Disactivar 2FA user_mailer: welcome: - final_step: 'Comencia a publicar! Mesmo sin sequitores, tu messages public poterea esser reguardate per alteres, per exemplo in le chronologia local o in hashtags. Tu poterea voler introducer te con le hashtag #introductiones.' subject: Benvenite in Mastodon webauthn_credentials: delete: Deler diff --git a/config/locales/id.yml b/config/locales/id.yml index ec8cf9e031..e7f42e115b 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -1560,10 +1560,6 @@ id: edit_profile_action: Siapkan profil edit_profile_step: Anda dapat mengubah profil Anda dengan mengunggah sebuah foto profil, mengubah nama tampilan Anda dan lain-lain. Anda dapat memilih untuk meninjau pengikut baru sebelum mereka diperbolehkan untuk mengikuti Anda. explanation: Beberapa tips sebelum Anda memulai - final_action: Mulai mengirim - final_step: 'Mulai mengirim! Bahkan tanpa pengikut, kiriman publik Anda dapat dilihat oleh orang lain, misalkan di linimasa lokal atau dalam tagar. Anda dapat memperkenalkan diri Anda dalam tagar #introductions.' - full_handle: Penanganan penuh Anda - full_handle_hint: Ini yang dapat Anda sampaikan kepada teman agar mereka dapat mengirim pesan atau mengikuti Anda dari server lain. subject: Selamat datang di Mastodon title: Selamat datang, %{name}! users: diff --git a/config/locales/ie.yml b/config/locales/ie.yml index 4b84d53bd5..eec8569bb2 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -1846,10 +1846,6 @@ ie: edit_profile_action: Configuration de profil edit_profile_step: Tu posse personalisar tui profil por cargar un profil-image, changear tui monstrat nómine e plu. Tu posse optar tractar nov sequitores ante que ili es permisset sequer te. explanation: Vi quelc suggestiones por que tu mey comensar - final_action: Comensar postar - final_step: 'Comensa a postar! Mem sin sequitores, tui public postas posse esser videt de altres, per exemple in li local témpor-linea o in hashtags. Tu fórsan vole introducter te per li hashtag #introductions.' - full_handle: Tui plen usator-nómine - full_handle_hint: Ti-ci es ti quel tu vell dir a tui amics por que ili mey inviar missages a te o sequer te de un altri servitor. subject: Benevenit a Mastodon title: Benevenit, %{name}! users: diff --git a/config/locales/io.yml b/config/locales/io.yml index 341477852f..189f616a4e 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -1799,10 +1799,6 @@ io: edit_profile_action: Facez profilo edit_profile_step: Vu povas kustumizar vua profilo per adchargar profilimajo, chanjesar vua montronomo e plue. Vu povas selektas kontrolar nova sequanti ante oli permisesas sequar vu. explanation: Subo esas guidilo por helpar vu komencar - final_action: Komencez postigar - final_step: 'Jus postigez! Mem sen sequanti, vua publika posti povas videsar da altra personi, exemplo es en lokala tempolineo e en hashtagi. Vu povas anke introduktar su en #introductions hashtagi.' - full_handle: Vua kompleta profilnomo - full_handle_hint: Co esas quon vu dicos a amiki por ke oli povas mesajigar o sequar vu de altra servilo. subject: Bonveno a Mastodon title: Bonveno, %{name}! users: diff --git a/config/locales/is.yml b/config/locales/is.yml index 56d71bd9ad..da6eee9e20 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -1850,10 +1850,6 @@ is: edit_profile_action: Setja upp notandasnið edit_profile_step: Þú getur sérsniðið notandasniðið þitt með því að setja inn auðkennismynd þína, breyta birtingarnafninu þínu og ýmislegt fleira. Þú getur valið að yfirfara nýja fylgjendur áður en þú leyfir þeim að fylgjast með þér. explanation: Hér eru nokkrar ábendingar til að koma þér í gang - final_action: Byrjaðu að skrifa - final_step: 'Byrjaðu að tjá þig! Jafnvel án fylgjenda geta aðrir séð opinberar færslur frá þér, til dæmis á staðværu tímalínunni eða í myllumerkjum. Þú gætir jafnvel viljað kynna þig á myllumerkinu #introductions.' - full_handle: Fullt auðkenni þitt - full_handle_hint: Þetta er það sem þú myndir gefa upp við vini þína svo þeir geti sent þér skilaboð eða fylgst með þér af öðrum netþjóni. subject: Velkomin í Mastodon title: Velkomin/n um borð, %{name}! users: diff --git a/config/locales/it.yml b/config/locales/it.yml index a0f1ab7697..3adb4f6c65 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1848,10 +1848,6 @@ it: edit_profile_action: Configura profilo edit_profile_step: Puoi personalizzare il tuo profilo caricando un'immagine del profilo, cambiare il tuo nome e altro ancora. Puoi scegliere di esaminare i nuovi seguaci prima che loro siano autorizzati a seguirti. explanation: Ecco alcuni suggerimenti per iniziare - final_action: Inizia a pubblicare - final_step: 'Inizia a pubblicare! Anche senza seguaci, i tuoi post pubblici possono essere visti da altri, ad esempio sulla timeline locale o negli hashtag. Potresti presentarti con l''hashtag #presentazione.' - full_handle: Il tuo nome utente completo - full_handle_hint: Questo è ciò che diresti ai tuoi amici in modo che possano seguirti o contattarti da un altro server. subject: Benvenuto/a su Mastodon title: Benvenuto a bordo, %{name}! users: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 1bbda050bb..460f02d0a5 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1816,10 +1816,6 @@ ja: プロフィール画像をアップロードしたり、表示名を変更したりして、プロフィールをカスタマイズできます。 新しいフォロワーからフォローリクエストを承認する前に、オプトインで確認できます。 explanation: 始めるにあたってのアドバイスです - final_action: 始めましょう - final_step: 'さあ、始めましょう! たとえフォロワーがまだいなくても、あなたの公開した投稿はローカルタイムラインやハッシュタグなどを通じて誰かの目にとまるはずです。自己紹介をしたいときには #introductions ハッシュタグが便利かもしれません。' - full_handle: あなたの正式なユーザーID - full_handle_hint: 別のサーバーの友達とフォローやメッセージをやり取りする際には、これを伝えることになります。 subject: Mastodonへようこそ title: ようこそ、%{name}さん! users: diff --git a/config/locales/ka.yml b/config/locales/ka.yml index 926922154f..1b3d48810e 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -472,9 +472,6 @@ ka: welcome: edit_profile_action: პროფილის მოწყობა explanation: აქ რამდენიმე რჩევაა დასაწყისისთვის - final_action: დაიწყე პოსტვა - full_handle: თქვენი სრული სახელური - full_handle_hint: ეს არის ის რასაც ეტყვით თქვენს მეგობრებს, რათა მოგწერონ ან გამოგყვნენ სხვა ინსტანციიდან. subject: კეთილი იყოს თქვენი მობრძანება მასტოდონში title: კეთილი იყოს თქვენი მობრძანება, %{name}! users: diff --git a/config/locales/kab.yml b/config/locales/kab.yml index a24d8994fd..d424810926 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -794,8 +794,6 @@ kab: silence: Amiḍan yesɛa talast suspend: Amiḍan yettwaḥbas welcome: - final_action: Bdu asuffeɣ - full_handle: Tansa umiḍan-ik takemmalit subject: Ansuf ɣer Maṣṭudun title: Ansuf yessek·em, %{name}! users: diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 27c76b4378..2cd894befb 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -721,9 +721,6 @@ kk: welcome: edit_profile_action: Профиль өңдеу explanation: Мына кеңестерді шолып өтіңіз - final_action: Жазба жазу - full_handle: Желі тұтқасы - full_handle_hint: This is what you would tell your friends so they can message or follow you frоm another server. subject: Mastodon Желісіне қош келдіңіз title: Ортаға қош келдің, %{name}! users: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 851c3c74b8..45a95139f0 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1816,10 +1816,6 @@ ko: edit_profile_action: 프로필 설정 edit_profile_step: 프로필 사진을 업로드하거나 사람들에게 표시할 이름을 바꾸는 것 등으로 자신의 프로필을 커스텀 할 수 있습니다. 새로운 팔로워를 검토 후에 허용하도록 할 수도 있습니다. explanation: 시작하기 전에 몇가지 팁들을 준비했습니다 - final_action: 포스팅 시작하기 - final_step: '게시물을 올리세요! 팔로워가 없더라도, 공개 게시물들은 다른 사람에게 보여질 수 있습니다, 예를 들자면 로컬이나 연합 타임라인 등이 있습니다. 사람들에게 자신을 소개하고 싶다면 #툿친소 해시태그를 이용해보세요.' - full_handle: 당신의 풀 핸들은 다음과 같습니다 - full_handle_hint: 이것을 당신의 친구들에게 알려주면 다른 서버에서 팔로우 하거나 메시지를 보낼 수 있습니다. subject: 마스토돈에 오신 것을 환영합니다 title: 환영합니다 %{name} 님! users: diff --git a/config/locales/ku.yml b/config/locales/ku.yml index e78e7ecfbb..d744aaa903 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -1594,10 +1594,6 @@ ku: edit_profile_action: Profîlê saz bike edit_profile_step: Tu dikarî bi barkirina wêneyek profîlê, guhertina navê xwe ya xuyangê û bêtir profîla xwe kesane bikî. Berî ku mafê bidî ku te şopînerên nû te bişopînin, tu dikarî binirxînî. explanation: Li vir çend serişte hene ku tu dest pê bike - final_action: Dest bi weşandinê bike - final_step: 'Dest bi weşandinê bike! Bêyî şopîneran jî dibe ku şandiyên te yên gelemperî ji hêla kesên din ve werin dîtin, mînakî li ser demjimêra herêmî û di hashtagan de. Dibe ku tu bixwazî xwe li ser hashtagê #nasname bidî nasandin.' - full_handle: Hemî destikê te - full_handle_hint: Ji hevalên xwe re, ji bona ji rajekarekê din peyam bişîne an jî ji bona ku te bikaribe bişopîne tişta ku tu bibêjî ev e. subject: Tu bi xêr hatî Mastodon title: Bi xêr hatî, %{name}! users: diff --git a/config/locales/lad.yml b/config/locales/lad.yml index d75d0d44c9..13e29f927e 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -1846,10 +1846,6 @@ lad: edit_profile_action: Konfigurasyon de profil edit_profile_step: Puedes personalizar tu profil kargando una foto de profil, trokando tu nombre de utilizador i muncho mas. Puedes optar por revizar a los muevos suivantes antes de ke puedan segirte. explanation: Aki ay algunos konsejos para ampesar - final_action: Ampesa a publikar - final_step: 'Ampesa a publikar! Inkluzo sin suivantes, tus publikasyones publikas pueden ser vistas por otros, por enshemplo en la linya de tiempo lokal o en etiketas. Tal vez keras aprezentarte kon la etiketa de #introduksiones.' - full_handle: Tu sovrenombre kompleto - full_handle_hint: Esto es lo ke le dirias a tus haverim para ke eyos puedan embiarte mesajes o segirte dizde otra instansya. subject: Bienvenido a Mastodon title: Bienvenido, %{name}! users: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 6ca6f3b62f..7ffce1a516 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -608,10 +608,6 @@ lt: welcome: edit_profile_action: Nustatyti profilį explanation: Štai keletas patarimų, kaip pradėti - final_action: Pradėti kelti įrašus - final_step: 'Pradėk skelbti! Net jei ir neturi sekėjų, tavo viešus įrašus gali matyti kiti, pavyzdžiui, vietinėje laiko skalėje arba saitažodžiuose. Galbūt norėsi prisistatyti saitažodyje #introductions.' - full_handle: Tavo pilnas slapyvardis - full_handle_hint: Štai ką pasakytum savo draugams, kad jie galėtų parašyti arba sekti tave iš kito serverio. subject: Sveiki atvykę į Mastodon title: Sveiki atvykę, %{name}! users: diff --git a/config/locales/lv.yml b/config/locales/lv.yml index fcf478cf93..89bdf5f05f 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -1855,10 +1855,6 @@ lv: edit_profile_action: Iestatīt profilu edit_profile_step: Tu vari pielāgot savu profilu, augšupielādējot profila attēlu, mainot parādāmo vārdu un citas lietas. Vari izvēlēties pārskatīt jaunus sekotājus, pirms atļauj viņiem tev sekot. explanation: Šeit ir daži padomi, kā sākt darbu - final_action: Sāc publicēt - final_step: 'Sāc publicēt! Pat bez sekotājiem tavas publiskās ziņas var redzēt citi, piemēram, vietējā ziņu lentā vai atsaucēs. Iespējams, tu vēlēsies iepazīstināt ar sevi, izmantojot tēmturi #introductions.' - full_handle: Tavs pilnais lietotājvārds - full_handle_hint: Šis ir tas, ko tu pasaki saviem draugiem, lai viņi varētu tev ziņot vai sekot tev no cita servera. subject: Laipni lūgts Mastodon title: Laipni lūgts uz borta, %{name}! users: diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 6625a13b3b..81f1851b1e 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -1772,10 +1772,6 @@ ms: edit_profile_action: Sediakan profil edit_profile_step: Anda boleh menyesuaikan profil anda dengan memuat naik gambar profil, menukar nama paparan anda dan banyak lagi. Anda boleh ikut serta untuk menyemak pengikut baharu sebelum mereka dibenarkan mengikuti anda. explanation: Berikut ialah beberapa petua untuk anda bermula - final_action: Mula menyiarkan - final_step: 'Mula menyiarkan! Walaupun tanpa pengikut, pos awam anda mungkin dilihat oleh orang lain, contohnya pada garis masa tempatan atau dalam hashtag. Anda mungkin ingin memperkenalkan diri anda pada hashtag #introductions.' - full_handle: Pemegang penuh anda - full_handle_hint: Inilah yang anda akan beritahu rakan anda supaya mereka boleh menghantar mesej atau mengikuti anda dari server lain. subject: Selamat datang kepada Mastodon title: Selamat datang, %{name}! users: diff --git a/config/locales/my.yml b/config/locales/my.yml index 094f581eb9..18f5c6a2d0 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -1771,10 +1771,6 @@ my: edit_profile_action: ပရိုဖိုင်ထည့်သွင်းရန် edit_profile_step: ပရိုဖိုင်ဓာတ်ပုံတစ်ပုံ တင်ခြင်း၊ ဖော်ပြမည့်အမည် ပြောင်းလဲခြင်းနှင့် အခြားအရာများပြုလုပ်ခြင်းတို့ဖြင့် သင့်ပရိုဖိုင်ကို စိတ်ကြိုက်ပြင်ဆင်နိုင်ပါသည်။ စောင့်ကြည့်သူအသစ်များ သင့်ကိုစောင့်ကြည့်ခွင့်မပြုမီ ပြန်လည်သုံးသပ်ရန်အတွက် ဆုံးဖြတ်နိုင်ပါသည်။ explanation: ဤသည်မှာ သင် စတင်အသုံးပြုနိုင်ရန်အတွက် အကြံပြုချက်အချို့ဖြစ်ပါသည် - final_action: ပို့စ် တင်ရန် - final_step: 'ပို့စ်စပြီး တင်နိုင်ပါပြီ။ စောင့်ကြည့်သူများမရှိသေးသော်လည်း သင့်အများမြင်ပို့စ်များကို ဒေသတွင်းစာမျက်နှာ သို့မဟုတ် ဟက်ရှ်တက်စာမျက်နှာတို့တွင် အခြားသူများက မြင်နိုင်ပါသည်။ #introductions ဟက်ရှ်တက်ဖြင့် သင့်ကိုယ်သင် မိတ်ဆက်နိုင်ပါသည်။' - full_handle: ကိုယ်တိုင်ထိန်းချုပ်နိုင်သည် - full_handle_hint: ဤသည်မှာ သင့်သူငယ်ချင်းများကို အခြားဆာဗာတစ်ခုမှ မက်ဆေ့ချ်ပို့နိုင်ကြောင်း သို့မဟုတ် စောင့်ကြည့်နိုင်ကြောင်း အသိပေးပါမည်။ subject: Mastodon မှ လှိုက်လှဲစွာကြိုဆိုပါသည်။ title: "%{name} က ကြိုဆိုပါတယ်။" users: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 4392c2366e..c935e9f4aa 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1846,10 +1846,6 @@ nl: edit_profile_action: Profiel instellen edit_profile_step: Je kunt jouw profiel aanpassen door een profielfoto te uploaden, jouw weergavenaam aan te passen en meer. Je kunt het handmatig goedkeuren van volgers instellen. explanation: Hier zijn enkele tips om je op weg te helpen - final_action: Begin berichten te plaatsen - final_step: 'Begin berichten te plaatsen! Zelfs zonder volgers kunnen jouw openbare berichten door anderen bekeken worden, bijvoorbeeld op de lokale tijdlijn en onder hashtags. Je kunt jezelf voorstellen met het gebruik van de hashtag #introductions.' - full_handle: Jouw volledige Mastodon-adres - full_handle_hint: Dit geef je aan jouw vrienden, zodat ze jou berichten kunnen sturen of (vanaf een andere Mastodonserver) kunnen volgen. subject: Welkom op Mastodon title: Welkom aan boord %{name}! users: diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 1524b6f7c1..aecd148e28 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -1846,10 +1846,6 @@ nn: edit_profile_action: Lag til profil edit_profile_step: Du kan tilpasse profilen din ved å laste opp et profilbilde, endre visningsnavnet ditt og mer. Du kan velge at nye følgere må godkjennes av deg før de får lov til å følge deg. explanation: Her er nokre tips for å koma i gang - final_action: Kom i gang med å leggja ut - final_step: 'Skriv innlegg! Selv uten følgere kan dine offentlige innlegg bli sett av andre, for eksempel på den lokale tidslinjen og i emneknagger. Du kan introdusere deg selv ved å bruke emneknaggen #introduksjon.' - full_handle: Det fulle brukarnamnet ditt - full_handle_hint: Dette er det du fortel venene dine for at dei skal kunna senda deg meldingar eller fylgja deg frå ein annan tenar. subject: Velkomen til Mastodon title: Velkomen om bord, %{name}! users: diff --git a/config/locales/no.yml b/config/locales/no.yml index d26b20379e..481e28e863 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -1841,10 +1841,6 @@ edit_profile_action: Sett opp profil edit_profile_step: Du kan tilpasse profilen din ved å laste opp et profilbilde, endre visningsnavnet ditt og mer. Du kan velge at nye følgere må godkjennes av deg før de får lov til å følge deg. explanation: Her er noen tips for å komme i gang - final_action: Start postingen - final_step: 'Skriv innlegg! Selv uten følgere kan dine offentlige innlegg bli sett av andre, for eksempel på den lokale tidslinjen og i emneknagger. Du kan introdusere deg selv ved å bruke emneknaggen #introduksjon.' - full_handle: Ditt fullstendige brukernavn - full_handle_hint: Dette er hva du forteller venner slik at de kan sende melding eller følge deg fra en annen instanse. subject: Velkommen til Mastodon title: Velkommen ombord, %{name}! users: diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 2887fc98b3..b8330992c9 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -968,9 +968,6 @@ oc: welcome: edit_profile_action: Configuracion del perfil explanation: Vaquí qualques astúcias per vos preparar - final_action: Començar de publicar - full_handle: Vòstre escais-nom complèt - full_handle_hint: Es aquò que vos cal donar a vòstres amics per que pòscan vos escriure o sègre a partir d’un autre servidor. subject: Benvengut a Mastodon title: Vos desirem la benvenguda a bòrd %{name} ! users: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index f0e6a1f60b..f7c5d60f65 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1910,10 +1910,6 @@ pl: edit_profile_action: Skonfiguruj profil edit_profile_step: Możesz dostosować profil wysyłając awatar, zmieniając wyświetlaną nazwę i o wiele więcej. Jeżeli chcesz, możesz również włączyć przeglądanie i ręczne akceptowanie nowych próśb o możliwość obserwacji Twojego profilu. explanation: Kilka wskazówek, które pomogą Ci rozpocząć - final_action: Zacznij pisać - final_step: 'Zacznij tworzyć! Nawet jeżeli nikt Cię nie obserwuje, Twoje publiczne wiadomości będą widziane przez innych, na przykład na lokalnej osi czasu i w hashtagach. Możesz też utworzyć wpis wprowadzający używając hashtagu #introductions.' - full_handle: Twój pełny adres - full_handle_hint: Ten adres możesz podać znajomym, aby mogli skontaktować się z Tobą lub zacząć obserwować z innego serwera. subject: Witaj w Mastodonie title: Witaj na pokładzie, %{name}! users: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index ea91fd7dfe..86972f9ef1 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -1841,10 +1841,6 @@ pt-BR: edit_profile_action: Configurar perfil edit_profile_step: Você pode personalizar seu perfil enviando uma foto de perfil, mudando seu nome de exibição e mais. Você pode optar por revisar novos seguidores antes que eles possam te seguir. explanation: Aqui estão algumas dicas para você começar - final_action: Comece a publicar - final_step: 'Comece a postar! Mesmo sem seguidores, suas postagens públicas podem ser vistas pelos outros, por exemplo, na linha do tempo local ou nas hashtags. Você pode querer fazer uma introdução usando a hashtag #introduções.' - full_handle: Seu nome de usuário completo - full_handle_hint: Isso é o que você compartilha com seus amigos para que eles possam te mandar mensagens ou te seguir a partir de outro servidor. subject: Boas-vindas ao Mastodon title: Boas vindas, %{name}! users: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 3007fd2df1..0786ba2ed4 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -1846,10 +1846,6 @@ pt-PT: edit_profile_action: Configurar o perfil edit_profile_step: Pode personalizar o seu perfil carregando uma imagem de perfil, alterando o nome a exibir, entre outras opções. Pode optar por rever os novos seguidores antes de estes o poderem seguir. explanation: Aqui estão algumas dicas para começar - final_action: Começar a publicar - final_step: 'Comece a publicar! Mesmo sem seguidores, as suas mensagens públicas podem ser vistas por outros, como por exemplo na cronologia local e em etiquetas. Pense em apresentar-se usando a etiqueta #apresentações.' - full_handle: O seu nome completo - full_handle_hint: Isto é o que tem de facultar aos seus amigos para que eles lhe possam enviar mensagens ou segui-lo a partir de outra instância. subject: Bem-vindo ao Mastodon title: Bem-vindo a bordo, %{name}! users: diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 1bdc4e8ca5..8e4f9e7913 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -709,9 +709,6 @@ ro: welcome: edit_profile_action: Configurare profil explanation: Iată câteva sfaturi pentru a începe - final_action: Începe să postezi - full_handle: Numele tău complet - full_handle_hint: Asta este ceea ce vei putea spune prietenilor pentru a te putea contacta sau pentru a te urmării de pe un alt server. subject: Bine ai venit title: Bine ai venit la bord, %{name}! users: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 04e49e0427..3f15b064f0 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1905,10 +1905,6 @@ ru: edit_profile_action: Настроить профиль edit_profile_step: Вы можете настроить свой профиль добавляя аватарку, изменяя отображаемое имя и так далее. Вы можете вручную подтверждать подписчиков, перед тем как им будет разрешено подписаться на вас. explanation: Вот несколько советов для новичков - final_action: Начать постить - final_step: 'Начинайте постить! Даже без подписчиков, ваши публичные посты могут быть увиденными другими, например в локальной ленте или в хештегах. Вы можете представиться с хэштегом #introductions.' - full_handle: Ваше обращение - full_handle_hint: То, что Вы хотите сообщить своим друзьям, чтобы они могли написать Вам или подписаться с другого узла. subject: Добро пожаловать в Mastodon title: Добро пожаловать на борт, %{name}! users: diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 273ef9d2d9..533764606b 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -1094,9 +1094,6 @@ sc: welcome: edit_profile_action: Cunfigura su profilu explanation: Inoghe ddoe at una paja de impòsitos pro cumintzare - final_action: Cumintza a publicare - full_handle: Su nòmine utente intreu tuo - full_handle_hint: Custu est su chi dias nàrrere a is amistades tuas pro chi ti potzant imbiare messàgios o sighire dae un'àteru serbidore. subject: Ti donamus su benebènnidu a Mastodon title: Ti donamus su benebènnidu, %{name}! users: diff --git a/config/locales/sco.yml b/config/locales/sco.yml index a1071197f1..dc273d2d83 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -1584,10 +1584,6 @@ sco: edit_profile_action: Setup profile edit_profile_step: Ye kin customize yer profile bi uploadin a profile picture, chyngin yer display nemm an mair. Ye kin opt-in fir tae luik ower new follaers afore they’re allooed tae follae ye. explanation: Here some tips fir tae get ye stertit - final_action: Stert postin - final_step: 'Stert postin! Even athout follaers, yer public posts kin stull be seen bi ithers, fir example on the local timeline or in hashtags. Ye mibbie want tae introduce yersel on the #introductions hashtag.' - full_handle: Yer ful haunnle - full_handle_hint: This is whit ye wad tell yer pals sae thit they kin message or follae ye fae anither server. subject: Welcome tae Mastodon, 'mon in title: Welcome aboord, %{name}! users: diff --git a/config/locales/si.yml b/config/locales/si.yml index 660fd3ba31..ac292d6cf8 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -1436,9 +1436,6 @@ si: welcome: edit_profile_action: පැතිකඩ පිහිටුවන්න explanation: ඔබ ආරම්භ කිරීමට උපදෙස් කිහිපයක් මෙන්න - final_action: ලිපි පළ කරන්න - full_handle: ඔබේ සම්පූර්ණ හසුරුව - full_handle_hint: මෙය ඔබ ඔබේ මිතුරන්ට පවසනු ඇත, එවිට ඔවුන්ට වෙනත් සේවාදායකයකින් ඔබට පණිවිඩ යැවීමට හෝ අනුගමනය කිරීමට හැකිය. subject: මාස්ටඩන් වෙත පිළිගනිමු title: නැවට සාදරයෙන් පිළිගනිමු, %{name}! users: diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 66022b10ae..d97cfac0ea 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -1290,9 +1290,6 @@ sk: welcome: edit_profile_action: Nastav profil explanation: Tu nájdeš nejaké tipy do začiatku - final_action: Začni prispievať - full_handle: Adresa tvojho profilu v celom formáte - full_handle_hint: Toto je čo musíš dať vedieť svojím priateľom aby ti mohli posielať správy, alebo ťa následovať z iného serveru. subject: Vitaj na Mastodone title: Vitaj na palube, %{name}! users: diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 915970f805..c9b2343b69 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1910,10 +1910,6 @@ sl: edit_profile_action: Nastavitve profila edit_profile_step: Profil lahko prilagodite tako, da naložite sliko profila, spremenite pojavno ime in drugo. Lahko izberete, da želite pregledati nove sledilce, preden jim dovolite sledenje. explanation: Tu je nekaj nasvetov za začetek - final_action: Začnite objavljati - final_step: 'Začnite objavljati! Tudi brez sledilcev bodo vaše javne objave videli drugi, npr. na krajevni časovnici ali v ključnikih. Morda se želite predstaviti s ključnikom #introductions.' - full_handle: Vaša polna ročica - full_handle_hint: To bi povedali svojim prijateljem, da vam lahko pošljejo sporočila ali vam sledijo iz drugega strežnika. subject: Dobrodošli na Mastodon title: Dobrodošli, %{name}! users: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 3ad76e2429..4293271bb2 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1842,10 +1842,6 @@ sq: edit_profile_action: Ujdisje profili edit_profile_step: Profilin tuaj mund ta përshtatni duke ngarkuar një figurë, duke ndryshuar emrin tuaj në ekran, etj. Mund të zgjidhni të shqyrtoni ndjekës të rinj, para se të jenë lejuar t’ju ndjekin. explanation: Ja disa ndihmëza, sa për t’ia filluar - final_action: Filloni të postoni - final_step: 'Filloni të postoni! Edhe pa ndjekës, postimet tuaja publike mund të shihen nga të tjerët, për shembull, në rrjedhën kohore vendore, ose në hashtag-ë. Mund të doni të prezantoni veten përmes hashtag-ut #introductions.' - full_handle: Identifikuesi juaj i plotë - full_handle_hint: Kjo është ajo çka do të duhej t’u tregonit shokëve tuaj, që të mund t’ju dërgojnë mesazhe ose t’ju ndjekin nga një shërbyes tjetër. subject: Mirë se vini te Mastodon-i title: Mirë se vini, %{name}! users: diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index b55b6e0d19..a1f6df067f 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -1873,10 +1873,6 @@ sr-Latn: edit_profile_action: Podesi nalog edit_profile_step: Možete prilagoditi svoj profil tako što ćete postaviti profilnu sliku, promeniti ime za prikaz i tako dalje. Možete dati saglasnost da pregledate nove pratioce pre nego što im dozvolite da Vas zaprate. explanation: Evo nekoliko saveta za početak - final_action: Počnite objavljivati - final_step: 'Počnite da objavljujete! Čak i bez pratilaca, Vaše javne objave su vidljive drugim ljudima, na primer na lokalnoj vremenskoj liniji ili u heš oznakama. Možda želite da se predstavite sa heš oznakom #introductions ili #predstavljanja.' - full_handle: Vaš pun nadimak - full_handle_hint: Ovo biste rekli svojim prijateljima kako bi vam oni poslali poruku, ili zapratili sa druge instance. subject: Dobro došli na Mastodon title: Dobro došli, %{name}! users: diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 9e67e9692d..494b41a754 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -1873,10 +1873,6 @@ sr: edit_profile_action: Подеси налог edit_profile_step: Можете прилагодити свој профил тако што ћете поставити профилну слику, променити име за приказ и тако даље. Можете дати сагласност да прегледате нове пратиоце пре него што им дозволите да Вас запрате. explanation: Ево неколико савета за почетак - final_action: Почните објављивати - final_step: 'Почните да објављујете! Чак и без пратилаца, Ваше јавне објаве су видљиве другим људима, на пример на локалној временској линији или у хеш ознакама. Можда желите да се представите са хеш ознаком #introductions или #представљања.' - full_handle: Ваш пун надимак - full_handle_hint: Ово бисте рекли својим пријатељима како би вам они послали поруку, или запратили са друге инстанце. subject: Добро дошли на Mastodon title: Добро дошли, %{name}! users: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index deac7cc638..d0f3994b4e 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -1837,10 +1837,6 @@ sv: edit_profile_action: Profilinställning edit_profile_step: Du kan anpassa din profil genom att ladda upp en profilbild, ändra ditt visningsnamn med mera. Du kan välja att granska nya följare innan de får följa dig. explanation: Här är några tips för att komma igång - final_action: Börja göra inlägg - final_step: 'Börja skriv inlägg! Även utan följare kan dina offentliga inlägg ses av andra, exempelvis på den lokala tidslinjen eller i hashtaggar. Du kanske vill introducera dig själv under hashtaggen #introduktion eller #introductions.' - full_handle: Ditt fullständiga användarnamn/mastodonadress - full_handle_hint: Det här är vad du skulle berätta för dina vänner så att de kan meddela eller följa dig från en annan instans. subject: Välkommen till Mastodon title: Välkommen ombord, %{name}! users: diff --git a/config/locales/th.yml b/config/locales/th.yml index e117c29b4a..5253dd6b78 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1814,10 +1814,6 @@ th: edit_profile_action: ตั้งค่าโปรไฟล์ edit_profile_step: คุณสามารถปรับแต่งโปรไฟล์ของคุณได้โดยอัปโหลดรูปภาพโปรไฟล์ เปลี่ยนชื่อที่แสดงของคุณ และอื่น ๆ คุณสามารถเลือกรับการตรวจทานผู้ติดตามใหม่ก่อนที่จะอนุญาตให้เขาติดตามคุณ explanation: นี่คือเคล็ดลับบางส่วนที่จะช่วยให้คุณเริ่มต้นใช้งาน - final_action: เริ่มโพสต์ - final_step: 'เริ่มโพสต์! แม้ว่าไม่มีผู้ติดตาม โพสต์สาธารณะของคุณอาจเห็นโดยผู้อื่น ตัวอย่างเช่น ในเส้นเวลาในเซิร์ฟเวอร์หรือในแฮชแท็ก คุณอาจต้องการแนะนำตัวเองในแฮชแท็ก #introductions' - full_handle: นามเต็มของคุณ - full_handle_hint: นี่คือสิ่งที่คุณจะบอกเพื่อน ๆ ของคุณเพื่อให้เขาสามารถส่งข้อความหรือติดตามคุณจากเซิร์ฟเวอร์อื่น subject: ยินดีต้อนรับสู่ Mastodon title: ยินดีต้อนรับ %{name}! users: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 4ba9d42758..7dbec9abbd 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1846,10 +1846,6 @@ tr: edit_profile_action: Profil kurulumu edit_profile_step: Bir profil resmi yükleyerek, ekran adınızı değiştirerek ve daha fazlasını yaparak profilinizi kişiselleştirebilirsiniz. Sizi takip etmelerine izin verilmeden önce yeni takipçileri incelemeyi tercih edebilirsiniz. explanation: İşte sana başlangıç için birkaç ipucu - final_action: Gönderi yazmaya başlayın - final_step: 'Gönderi yazmaya başlayın! Takipçiler olmadan bile, herkese açık gönderileriniz başkaları tarafından görülebilir, örneğin yerel zaman tünelinde veya etiketlerde. Kendinizi #introductions etiketinde tanıtmak isteyebilirsiniz.' - full_handle: Tanıtıcınız - full_handle_hint: Arkadaşlarınıza, size başka bir sunucudan mesaj atabilmeleri veya sizi takip edebilmeleri için söyleyeceğiniz şey budur. subject: Mastodon'a hoş geldiniz title: Gemiye hoşgeldin, %{name}! users: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 4d4097d658..7273a0ff2b 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1910,10 +1910,6 @@ uk: edit_profile_action: Налаштувати профіль edit_profile_step: Ви можете налаштувати свій профіль, завантаживши зображення профілю, змінивши відображуване ім'я та інше. Ви можете включити для перегляду нових підписників до того, як вони матимуть змогу підписатися на вас. explanation: Ось кілька порад для початку - final_action: Почати писати - final_step: 'Почніть дописувати! Навіть не підписавшись на вас, інші зможуть побачити ваші дописи, наприклад, у локальній стрічці та у хештеґах. Якщо ви хочете представитися, можете скористатися хештеґом #introductions.' - full_handle: Ваше звернення - full_handle_hint: Те, що ви хочете сказати друзям, щоб вони могли написати вам або підписатися з інших сайтів. subject: Ласкаво просимо до Mastodon title: Ласкаво просимо, %{name}! users: diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 99434c3544..e362c97a41 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1812,10 +1812,6 @@ vi: edit_profile_action: Cài đặt trang hồ sơ edit_profile_step: Bạn có thể chỉnh sửa trang hồ sơ của mình bằng cách tải lên ảnh đại diện, ảnh bìa, đổi biệt danh và hơn thế nữa. Bạn cũng có thể tự phê duyệt những người theo dõi mới. explanation: Dưới đây là một số mẹo để giúp bạn bắt đầu - final_action: Soạn tút mới - final_step: 'Viết tút mới! Ngay cả khi chưa có người theo dõi, người khác vẫn có thể xem tút công khai của bạn trên bảng tin máy chủ và qua hashtag. Hãy giới thiệu bản thân với hashtag #introductions.' - full_handle: Tên đầy đủ của bạn - full_handle_hint: Đây cũng là địa chỉ được dùng để giao tiếp với tất cả mọi người. subject: Chào mừng đến với Mastodon title: Xin chào %{name}! users: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index cf56a2d227..46a0e40152 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1814,10 +1814,6 @@ zh-CN: edit_profile_action: 设置个人资料 edit_profile_step: 您可以通过上传个人资料图片、更改您的昵称等来自定义您的个人资料。 您可以选择在新关注者关注您之前对其进行审核。 explanation: 下面是几个小贴士,希望它们能帮到你 - final_action: 开始嘟嘟 - final_step: '开始发布嘟文! 即使没有关注者,您的公开嘟文也可能会被其他人看到,例如在本地时间轴或话题标签中。 您可能想在 #introductions 话题标签上介绍自己。' - full_handle: 你的完整用户地址 - full_handle_hint: 你需要把这个告诉你的朋友们,这样他们就能从另一台服务器向你发送信息或者关注你。 subject: 欢迎来到 Mastodon title: "%{name},欢迎你的加入!" users: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index b010a75c04..e666e4965d 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1809,10 +1809,6 @@ zh-HK: edit_profile_action: 設定個人資料 edit_profile_step: 你可以透過上傳頭像、更改顯示名稱等來自訂個人檔案。你可以選擇讓新使用者追蹤你之前先審查他們。 explanation: 下面是幾個小貼士,希望它們能幫到你 - final_action: 開始發文 - final_step: '開始發文吧!即使你沒有追蹤者,其他人仍然能在本站時間軸或標籤等地方,看到你的公開帖文。試着用 #introductions 標籤來介紹自己吧。' - full_handle: 你的完整 Mastodon 地址 - full_handle_hint: 這訊息將顯示給你朋友們,讓他們能從另一個服務站發信息給你,或者關注你的。 subject: 歡迎來到 Mastodon (萬象) title: 歡迎 %{name} 加入! users: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index bc8454884c..3cd3583830 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1816,10 +1816,6 @@ zh-TW: edit_profile_action: 設定個人檔案 edit_profile_step: 您可以設定您的個人檔案,包括上傳大頭貼、變更顯示名稱等等。您也可以選擇於新的跟隨者跟隨前,先對他們進行審核。 explanation: 以下是幾個小技巧,希望它們能幫到您 - final_action: 開始嘟嘟 - final_step: '開始嘟嘟吧!即使您現在沒有跟隨者,其他人仍然能於本站時間軸、主題標籤等地方,看到您的公開嘟文。試著用 #introductions 這個主題標籤介紹一下自己吧。' - full_handle: 您的完整帳號名稱 - full_handle_hint: 您需要將這告訴您的朋友們,這樣他們就能從另一個伺服器向您發送訊息或跟隨您。 subject: 歡迎來到 Mastodon title: "%{name} 誠摯歡迎您的加入!" users: From 1d721b21e1ac89fa1e9c8a845294939d33e55ae9 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 1 Mar 2024 15:51:01 +0100 Subject: [PATCH 106/954] Add attribution to Tabler.io icons used in the new mailer designs (#29470) --- .../images/mailer-new/heading/LICENSE | 21 ++++++++++++++++++ .../images/mailer-new/heading/README.md | 1 + .../btn-app-store.png | Bin .../btn-google-play.png | Bin .../images/mailer-new/welcome-icons/LICENSE | 21 ++++++++++++++++++ .../images/mailer-new/welcome-icons/README.md | 1 + .../apps_step-off.png | Bin .../apps_step-on.png | Bin .../edit_profile_step-off.png | Bin .../edit_profile_step-on.png | Bin .../follow_step-off.png | Bin .../follow_step-on.png | Bin .../post_step-off.png | Bin .../post_step-on.png | Bin .../share_step-off.png | Bin .../share_step-on.png | Bin .../application/mailer/_checklist.html.haml | 6 ++--- 17 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 app/javascript/images/mailer-new/heading/LICENSE create mode 100644 app/javascript/images/mailer-new/heading/README.md rename app/javascript/images/mailer-new/{welcome => store-icons}/btn-app-store.png (100%) rename app/javascript/images/mailer-new/{welcome => store-icons}/btn-google-play.png (100%) create mode 100644 app/javascript/images/mailer-new/welcome-icons/LICENSE create mode 100644 app/javascript/images/mailer-new/welcome-icons/README.md rename app/javascript/images/mailer-new/{welcome => welcome-icons}/apps_step-off.png (100%) rename app/javascript/images/mailer-new/{welcome => welcome-icons}/apps_step-on.png (100%) rename app/javascript/images/mailer-new/{welcome => welcome-icons}/edit_profile_step-off.png (100%) rename app/javascript/images/mailer-new/{welcome => welcome-icons}/edit_profile_step-on.png (100%) rename app/javascript/images/mailer-new/{welcome => welcome-icons}/follow_step-off.png (100%) rename app/javascript/images/mailer-new/{welcome => welcome-icons}/follow_step-on.png (100%) rename app/javascript/images/mailer-new/{welcome => welcome-icons}/post_step-off.png (100%) rename app/javascript/images/mailer-new/{welcome => welcome-icons}/post_step-on.png (100%) rename app/javascript/images/mailer-new/{welcome => welcome-icons}/share_step-off.png (100%) rename app/javascript/images/mailer-new/{welcome => welcome-icons}/share_step-on.png (100%) diff --git a/app/javascript/images/mailer-new/heading/LICENSE b/app/javascript/images/mailer-new/heading/LICENSE new file mode 100644 index 0000000000..974db1ac4b --- /dev/null +++ b/app/javascript/images/mailer-new/heading/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020-2024 Paweł Kuna + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/app/javascript/images/mailer-new/heading/README.md b/app/javascript/images/mailer-new/heading/README.md new file mode 100644 index 0000000000..ecd4b949e7 --- /dev/null +++ b/app/javascript/images/mailer-new/heading/README.md @@ -0,0 +1 @@ +Images in this folder are based on [Tabler.io icons](https://tabler.io/icons). diff --git a/app/javascript/images/mailer-new/welcome/btn-app-store.png b/app/javascript/images/mailer-new/store-icons/btn-app-store.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/btn-app-store.png rename to app/javascript/images/mailer-new/store-icons/btn-app-store.png diff --git a/app/javascript/images/mailer-new/welcome/btn-google-play.png b/app/javascript/images/mailer-new/store-icons/btn-google-play.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/btn-google-play.png rename to app/javascript/images/mailer-new/store-icons/btn-google-play.png diff --git a/app/javascript/images/mailer-new/welcome-icons/LICENSE b/app/javascript/images/mailer-new/welcome-icons/LICENSE new file mode 100644 index 0000000000..974db1ac4b --- /dev/null +++ b/app/javascript/images/mailer-new/welcome-icons/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020-2024 Paweł Kuna + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/app/javascript/images/mailer-new/welcome-icons/README.md b/app/javascript/images/mailer-new/welcome-icons/README.md new file mode 100644 index 0000000000..ecd4b949e7 --- /dev/null +++ b/app/javascript/images/mailer-new/welcome-icons/README.md @@ -0,0 +1 @@ +Images in this folder are based on [Tabler.io icons](https://tabler.io/icons). diff --git a/app/javascript/images/mailer-new/welcome/apps_step-off.png b/app/javascript/images/mailer-new/welcome-icons/apps_step-off.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/apps_step-off.png rename to app/javascript/images/mailer-new/welcome-icons/apps_step-off.png diff --git a/app/javascript/images/mailer-new/welcome/apps_step-on.png b/app/javascript/images/mailer-new/welcome-icons/apps_step-on.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/apps_step-on.png rename to app/javascript/images/mailer-new/welcome-icons/apps_step-on.png diff --git a/app/javascript/images/mailer-new/welcome/edit_profile_step-off.png b/app/javascript/images/mailer-new/welcome-icons/edit_profile_step-off.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/edit_profile_step-off.png rename to app/javascript/images/mailer-new/welcome-icons/edit_profile_step-off.png diff --git a/app/javascript/images/mailer-new/welcome/edit_profile_step-on.png b/app/javascript/images/mailer-new/welcome-icons/edit_profile_step-on.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/edit_profile_step-on.png rename to app/javascript/images/mailer-new/welcome-icons/edit_profile_step-on.png diff --git a/app/javascript/images/mailer-new/welcome/follow_step-off.png b/app/javascript/images/mailer-new/welcome-icons/follow_step-off.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/follow_step-off.png rename to app/javascript/images/mailer-new/welcome-icons/follow_step-off.png diff --git a/app/javascript/images/mailer-new/welcome/follow_step-on.png b/app/javascript/images/mailer-new/welcome-icons/follow_step-on.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/follow_step-on.png rename to app/javascript/images/mailer-new/welcome-icons/follow_step-on.png diff --git a/app/javascript/images/mailer-new/welcome/post_step-off.png b/app/javascript/images/mailer-new/welcome-icons/post_step-off.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/post_step-off.png rename to app/javascript/images/mailer-new/welcome-icons/post_step-off.png diff --git a/app/javascript/images/mailer-new/welcome/post_step-on.png b/app/javascript/images/mailer-new/welcome-icons/post_step-on.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/post_step-on.png rename to app/javascript/images/mailer-new/welcome-icons/post_step-on.png diff --git a/app/javascript/images/mailer-new/welcome/share_step-off.png b/app/javascript/images/mailer-new/welcome-icons/share_step-off.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/share_step-off.png rename to app/javascript/images/mailer-new/welcome-icons/share_step-off.png diff --git a/app/javascript/images/mailer-new/welcome/share_step-on.png b/app/javascript/images/mailer-new/welcome-icons/share_step-on.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/share_step-on.png rename to app/javascript/images/mailer-new/welcome-icons/share_step-on.png diff --git a/app/views/application/mailer/_checklist.html.haml b/app/views/application/mailer/_checklist.html.haml index 31cd5bf35d..324fd7e6f8 100644 --- a/app/views/application/mailer/_checklist.html.haml +++ b/app/views/application/mailer/_checklist.html.haml @@ -16,7 +16,7 @@ = image_tag frontend_asset_url('images/mailer-new/welcome/checkbox-off.png'), alt: '', width: 20, height: 20 %td.email-checklist-icons-step-td - if defined?(key) - = image_tag frontend_asset_url("images/mailer-new/welcome/#{key}-#{checked ? 'on' : 'off'}.png"), alt: '', width: 40, height: 40 + = image_tag frontend_asset_url("images/mailer-new/welcome-icons/#{key}-#{checked ? 'on' : 'off'}.png"), alt: '', width: 40, height: 40 %td.email-checklist-text-td .email-desktop-flex /[if mso] @@ -31,8 +31,8 @@ %div - if defined?(show_apps_buttons) && show_apps_buttons .email-welcome-apps-btns - = link_to image_tag(frontend_asset_url('images/mailer-new/welcome/btn-app-store.png'), alt: t('user_mailer.welcome.apps_ios_action'), width: 120, height: 40), 'https://apps.apple.com/app/mastodon-for-iphone-and-ipad/id1571998974' - = link_to image_tag(frontend_asset_url('images/mailer-new/welcome/btn-google-play.png'), alt: t('user_mailer.welcome.apps_android_action'), width: 120, height: 40), 'https://play.google.com/store/apps/details?id=org.joinmastodon.android' + = link_to image_tag(frontend_asset_url('images/mailer-new/store-icons/btn-app-store.png'), alt: t('user_mailer.welcome.apps_ios_action'), width: 120, height: 40), 'https://apps.apple.com/app/mastodon-for-iphone-and-ipad/id1571998974' + = link_to image_tag(frontend_asset_url('images/mailer-new/store-icons/btn-google-play.png'), alt: t('user_mailer.welcome.apps_android_action'), width: 120, height: 40), 'https://play.google.com/store/apps/details?id=org.joinmastodon.android' - elsif defined?(button_text) && defined?(button_url) && defined?(checked) && !checked = render 'application/mailer/button', text: button_text, url: button_url, has_arrow: false /[if mso] From a25014de8fae061f191c95608aabe3d6d02ac45d Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Fri, 1 Mar 2024 13:17:40 -0300 Subject: [PATCH 107/954] Improve `IpBlock` model test coverage (#29460) --- spec/models/ip_block_spec.rb | 53 +++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/spec/models/ip_block_spec.rb b/spec/models/ip_block_spec.rb index ed58826672..290b99b288 100644 --- a/spec/models/ip_block_spec.rb +++ b/spec/models/ip_block_spec.rb @@ -3,7 +3,32 @@ require 'rails_helper' describe IpBlock do - describe 'to_log_human_identifier' do + describe 'validations' do + it 'validates ip presence', :aggregate_failures do + ip_block = described_class.new(ip: nil, severity: :no_access) + + expect(ip_block).to_not be_valid + expect(ip_block).to model_have_error_on_field(:ip) + end + + it 'validates severity presence', :aggregate_failures do + ip_block = described_class.new(ip: '127.0.0.1', severity: nil) + + expect(ip_block).to_not be_valid + expect(ip_block).to model_have_error_on_field(:severity) + end + + it 'validates ip uniqueness', :aggregate_failures do + described_class.create!(ip: '127.0.0.1', severity: :no_access) + + ip_block = described_class.new(ip: '127.0.0.1', severity: :no_access) + + expect(ip_block).to_not be_valid + expect(ip_block).to model_have_error_on_field(:ip) + end + end + + describe '#to_log_human_identifier' do let(:ip_block) { described_class.new(ip: '192.168.0.1') } it 'combines the IP and prefix into a string' do @@ -12,4 +37,30 @@ describe IpBlock do expect(result).to eq('192.168.0.1/32') end end + + describe '.blocked?' do + context 'when the IP is blocked' do + it 'returns true' do + described_class.create!(ip: '127.0.0.1', severity: :no_access) + + expect(described_class.blocked?('127.0.0.1')).to be true + end + end + + context 'when the IP is not blocked' do + it 'returns false' do + expect(described_class.blocked?('127.0.0.1')).to be false + end + end + end + + describe 'after_commit' do + it 'resets the cache' do + allow(Rails.cache).to receive(:delete) + + described_class.create!(ip: '127.0.0.1', severity: :no_access) + + expect(Rails.cache).to have_received(:delete).with(described_class::CACHE_KEY) + end + end end From 18945f62e07617ac44b7a25a61799b0959fe67f7 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 1 Mar 2024 11:24:45 -0500 Subject: [PATCH 108/954] Convert more API specs from controller->request style (#29004) --- .../api/v1/accounts/statuses_spec.rb} | 48 ++++++++++--------- .../api/v1/admin/trends/statuses_spec.rb} | 21 ++++---- .../api/v1/admin/trends/tags_spec.rb} | 21 ++++---- .../api/v1/announcements/reactions_spec.rb} | 24 +++++----- .../api/v1/announcements_spec.rb} | 27 +++++------ .../api/v1/conversations_spec.rb} | 39 +++++++-------- .../api/v1/filters_spec.rb} | 34 ++++++------- .../api/v1/polls/votes_spec.rb} | 18 +++---- .../api/v1/push/subscriptions_spec.rb} | 41 ++++++++-------- .../api/v1/streaming_spec.rb} | 42 ++++++++++------ 10 files changed, 159 insertions(+), 156 deletions(-) rename spec/{controllers/api/v1/accounts/statuses_controller_spec.rb => requests/api/v1/accounts/statuses_spec.rb} (71%) rename spec/{controllers/api/v1/admin/trends/statuses_controller_spec.rb => requests/api/v1/admin/trends/statuses_spec.rb} (63%) rename spec/{controllers/api/v1/admin/trends/tags_controller_spec.rb => requests/api/v1/admin/trends/tags_spec.rb} (64%) rename spec/{controllers/api/v1/announcements/reactions_controller_spec.rb => requests/api/v1/announcements/reactions_spec.rb} (64%) rename spec/{controllers/api/v1/announcements_controller_spec.rb => requests/api/v1/announcements_spec.rb} (59%) rename spec/{controllers/api/v1/conversations_controller_spec.rb => requests/api/v1/conversations_spec.rb} (50%) rename spec/{controllers/api/v1/filters_controller_spec.rb => requests/api/v1/filters_spec.rb} (75%) rename spec/{controllers/api/v1/polls/votes_controller_spec.rb => requests/api/v1/polls/votes_spec.rb} (61%) rename spec/{controllers/api/v1/push/subscriptions_controller_spec.rb => requests/api/v1/push/subscriptions_spec.rb} (67%) rename spec/{controllers/api/v1/streaming_controller_spec.rb => requests/api/v1/streaming_spec.rb} (51%) diff --git a/spec/controllers/api/v1/accounts/statuses_controller_spec.rb b/spec/requests/api/v1/accounts/statuses_spec.rb similarity index 71% rename from spec/controllers/api/v1/accounts/statuses_controller_spec.rb rename to spec/requests/api/v1/accounts/statuses_spec.rb index 102e3b8e91..371867b215 100644 --- a/spec/controllers/api/v1/accounts/statuses_controller_spec.rb +++ b/spec/requests/api/v1/accounts/statuses_spec.rb @@ -2,20 +2,16 @@ require 'rails_helper' -describe Api::V1::Accounts::StatusesController do - render_views +describe 'API V1 Accounts Statuses' do + let(:user) { Fabricate(:user) } + let(:scopes) { 'read:statuses' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - let(:user) { Fabricate(:user) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:statuses') } - - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index' do + describe 'GET /api/v1/accounts/:account_id/statuses' do it 'returns expected headers', :aggregate_failures do Fabricate(:status, account: user.account) - get :index, params: { account_id: user.account.id, limit: 1 } + get "/api/v1/accounts/#{user.account.id}/statuses", params: { limit: 1 }, headers: headers expect(response).to have_http_status(200) expect(links_from_header.size) @@ -24,7 +20,7 @@ describe Api::V1::Accounts::StatusesController do context 'with only media' do it 'returns http success' do - get :index, params: { account_id: user.account.id, only_media: true } + get "/api/v1/accounts/#{user.account.id}/statuses", params: { only_media: true }, headers: headers expect(response).to have_http_status(200) end @@ -36,7 +32,7 @@ describe Api::V1::Accounts::StatusesController do before do Fabricate(:status, account: user.account, thread: Fabricate(:status)) # Reply to another user - get :index, params: { account_id: user.account.id, exclude_replies: true } + get "/api/v1/accounts/#{user.account.id}/statuses", params: { exclude_replies: true }, headers: headers end it 'returns posts along with self replies', :aggregate_failures do @@ -57,7 +53,7 @@ describe Api::V1::Accounts::StatusesController do end it 'returns http success and includes a header link' do - get :index, params: { account_id: user.account.id, pinned: true } + get "/api/v1/accounts/#{user.account.id}/statuses", params: { pinned: true }, headers: headers expect(response).to have_http_status(200) expect(links_from_header.size) @@ -79,7 +75,7 @@ describe Api::V1::Accounts::StatusesController do end it 'returns http success and header pagination links to prev and next' do - get :index, params: { account_id: user.account.id, pinned: true } + get "/api/v1/accounts/#{user.account.id}/statuses", params: { pinned: true }, headers: headers expect(response).to have_http_status(200) expect(links_from_header.size) @@ -109,15 +105,19 @@ describe Api::V1::Accounts::StatusesController do end it 'returns http success' do - get :index, params: { account_id: account.id, pinned: true } + get "/api/v1/accounts/#{account.id}/statuses", params: { pinned: true }, headers: headers + expect(response).to have_http_status(200) end context 'when user does not follow account' do it 'lists the public status only' do - get :index, params: { account_id: account.id, pinned: true } - json = body_as_json - expect(json.map { |item| item[:id].to_i }).to eq [status.id] + get "/api/v1/accounts/#{account.id}/statuses", params: { pinned: true }, headers: headers + + expect(body_as_json) + .to contain_exactly( + a_hash_including(id: status.id.to_s) + ) end end @@ -127,9 +127,13 @@ describe Api::V1::Accounts::StatusesController do end it 'lists both the public and the private statuses' do - get :index, params: { account_id: account.id, pinned: true } - json = body_as_json - expect(json.map { |item| item[:id].to_i }).to contain_exactly(status.id, private_status.id) + get "/api/v1/accounts/#{account.id}/statuses", params: { pinned: true }, headers: headers + + expect(body_as_json) + .to contain_exactly( + a_hash_including(id: status.id.to_s), + a_hash_including(id: private_status.id.to_s) + ) end end end diff --git a/spec/controllers/api/v1/admin/trends/statuses_controller_spec.rb b/spec/requests/api/v1/admin/trends/statuses_spec.rb similarity index 63% rename from spec/controllers/api/v1/admin/trends/statuses_controller_spec.rb rename to spec/requests/api/v1/admin/trends/statuses_spec.rb index 4d80055ac0..04aa0465f2 100644 --- a/spec/controllers/api/v1/admin/trends/statuses_controller_spec.rb +++ b/spec/requests/api/v1/admin/trends/statuses_spec.rb @@ -2,31 +2,26 @@ require 'rails_helper' -describe Api::V1::Admin::Trends::StatusesController do - render_views - +describe 'API V1 Admin Trends Statuses' do let(:role) { UserRole.find_by(name: 'Admin') } let(:user) { Fabricate(:user, role: role) } let(:scopes) { 'admin:read admin:write' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:account) { Fabricate(:account) } let(:status) { Fabricate(:status) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index' do + describe 'GET /api/v1/admin/trends/statuses' do it 'returns http success' do - get :index, params: { account_id: account.id, limit: 2 } + get '/api/v1/admin/trends/statuses', params: { account_id: account.id, limit: 2 }, headers: headers expect(response).to have_http_status(200) end end - describe 'POST #approve' do + describe 'POST /api/v1/admin/trends/statuses/:id/approve' do before do - post :approve, params: { id: status.id } + post "/api/v1/admin/trends/statuses/#{status.id}/approve", headers: headers end it_behaves_like 'forbidden for wrong scope', 'write:statuses' @@ -37,9 +32,9 @@ describe Api::V1::Admin::Trends::StatusesController do end end - describe 'POST #reject' do + describe 'POST /api/v1/admin/trends/statuses/:id/unapprove' do before do - post :reject, params: { id: status.id } + post "/api/v1/admin/trends/statuses/#{status.id}/reject", headers: headers end it_behaves_like 'forbidden for wrong scope', 'write:statuses' diff --git a/spec/controllers/api/v1/admin/trends/tags_controller_spec.rb b/spec/requests/api/v1/admin/trends/tags_spec.rb similarity index 64% rename from spec/controllers/api/v1/admin/trends/tags_controller_spec.rb rename to spec/requests/api/v1/admin/trends/tags_spec.rb index 0b8eb8c3b8..b1437dad8d 100644 --- a/spec/controllers/api/v1/admin/trends/tags_controller_spec.rb +++ b/spec/requests/api/v1/admin/trends/tags_spec.rb @@ -2,31 +2,26 @@ require 'rails_helper' -describe Api::V1::Admin::Trends::TagsController do - render_views - +describe 'API V1 Admin Trends Tags' do let(:role) { UserRole.find_by(name: 'Admin') } let(:user) { Fabricate(:user, role: role) } let(:scopes) { 'admin:read admin:write' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:account) { Fabricate(:account) } let(:tag) { Fabricate(:tag) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index' do + describe 'GET /api/v1/admin/trends/tags' do it 'returns http success' do - get :index, params: { account_id: account.id, limit: 2 } + get '/api/v1/admin/trends/tags', params: { account_id: account.id, limit: 2 }, headers: headers expect(response).to have_http_status(200) end end - describe 'POST #approve' do + describe 'POST /api/v1/admin/trends/tags/:id/approve' do before do - post :approve, params: { id: tag.id } + post "/api/v1/admin/trends/tags/#{tag.id}/approve", headers: headers end it_behaves_like 'forbidden for wrong scope', 'write:statuses' @@ -37,9 +32,9 @@ describe Api::V1::Admin::Trends::TagsController do end end - describe 'POST #reject' do + describe 'POST /api/v1/admin/trends/tags/:id/reject' do before do - post :reject, params: { id: tag.id } + post "/api/v1/admin/trends/tags/#{tag.id}/reject", headers: headers end it_behaves_like 'forbidden for wrong scope', 'write:statuses' diff --git a/spec/controllers/api/v1/announcements/reactions_controller_spec.rb b/spec/requests/api/v1/announcements/reactions_spec.rb similarity index 64% rename from spec/controllers/api/v1/announcements/reactions_controller_spec.rb rename to spec/requests/api/v1/announcements/reactions_spec.rb index c1debc33fe..ffacb2b0af 100644 --- a/spec/controllers/api/v1/announcements/reactions_controller_spec.rb +++ b/spec/requests/api/v1/announcements/reactions_spec.rb @@ -2,27 +2,26 @@ require 'rails_helper' -RSpec.describe Api::V1::Announcements::ReactionsController do - render_views - +RSpec.describe 'API V1 Announcements Reactions' do let(:user) { Fabricate(:user) } let(:scopes) { 'write:favourites' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } let!(:announcement) { Fabricate(:announcement) } - describe 'PUT #update' do + describe 'PUT /api/v1/announcements/:announcement_id/reactions/:id' do context 'without token' do it 'returns http unauthorized' do - put :update, params: { announcement_id: announcement.id, id: '😂' } + put "/api/v1/announcements/#{announcement.id}/reactions/#{escaped_emoji}" + expect(response).to have_http_status 401 end end context 'with token' do before do - allow(controller).to receive(:doorkeeper_token) { token } - put :update, params: { announcement_id: announcement.id, id: '😂' } + put "/api/v1/announcements/#{announcement.id}/reactions/#{escaped_emoji}", headers: headers end it 'creates reaction', :aggregate_failures do @@ -32,22 +31,21 @@ RSpec.describe Api::V1::Announcements::ReactionsController do end end - describe 'DELETE #destroy' do + describe 'DELETE /api/v1/announcements/:announcement_id/reactions/:id' do before do announcement.announcement_reactions.create!(account: user.account, name: '😂') end context 'without token' do it 'returns http unauthorized' do - delete :destroy, params: { announcement_id: announcement.id, id: '😂' } + delete "/api/v1/announcements/#{announcement.id}/reactions/#{escaped_emoji}" expect(response).to have_http_status 401 end end context 'with token' do before do - allow(controller).to receive(:doorkeeper_token) { token } - delete :destroy, params: { announcement_id: announcement.id, id: '😂' } + delete "/api/v1/announcements/#{announcement.id}/reactions/#{escaped_emoji}", headers: headers end it 'creates reaction', :aggregate_failures do @@ -56,4 +54,8 @@ RSpec.describe Api::V1::Announcements::ReactionsController do end end end + + def escaped_emoji + CGI.escape('😂') + end end diff --git a/spec/controllers/api/v1/announcements_controller_spec.rb b/spec/requests/api/v1/announcements_spec.rb similarity index 59% rename from spec/controllers/api/v1/announcements_controller_spec.rb rename to spec/requests/api/v1/announcements_spec.rb index 95ce8fd9fc..1624b76012 100644 --- a/spec/controllers/api/v1/announcements_controller_spec.rb +++ b/spec/requests/api/v1/announcements_spec.rb @@ -2,27 +2,26 @@ require 'rails_helper' -RSpec.describe Api::V1::AnnouncementsController do - render_views - - let(:user) { Fabricate(:user) } - let(:scopes) { 'read' } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } +RSpec.describe 'API V1 Announcements' do + let(:user) { Fabricate(:user) } + let(:scopes) { 'read' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } let!(:announcement) { Fabricate(:announcement) } - describe 'GET #index' do + describe 'GET /api/v1/announcements' do context 'without token' do it 'returns http unprocessable entity' do - get :index + get '/api/v1/announcements' + expect(response).to have_http_status 422 end end context 'with token' do before do - allow(controller).to receive(:doorkeeper_token) { token } - get :index + get '/api/v1/announcements', headers: headers end it 'returns http success' do @@ -31,10 +30,11 @@ RSpec.describe Api::V1::AnnouncementsController do end end - describe 'POST #dismiss' do + describe 'POST /api/v1/announcements/:id/dismiss' do context 'without token' do it 'returns http unauthorized' do - post :dismiss, params: { id: announcement.id } + post "/api/v1/announcements/#{announcement.id}/dismiss" + expect(response).to have_http_status 401 end end @@ -43,8 +43,7 @@ RSpec.describe Api::V1::AnnouncementsController do let(:scopes) { 'write:accounts' } before do - allow(controller).to receive(:doorkeeper_token) { token } - post :dismiss, params: { id: announcement.id } + post "/api/v1/announcements/#{announcement.id}/dismiss", headers: headers end it 'dismisses announcement', :aggregate_failures do diff --git a/spec/controllers/api/v1/conversations_controller_spec.rb b/spec/requests/api/v1/conversations_spec.rb similarity index 50% rename from spec/controllers/api/v1/conversations_controller_spec.rb rename to spec/requests/api/v1/conversations_spec.rb index 2734e4a07b..e2327d9a93 100644 --- a/spec/controllers/api/v1/conversations_controller_spec.rb +++ b/spec/requests/api/v1/conversations_spec.rb @@ -2,53 +2,48 @@ require 'rails_helper' -RSpec.describe Api::V1::ConversationsController do - render_views - +RSpec.describe 'API V1 Conversations' do let!(:user) { Fabricate(:user, account_attributes: { username: 'alice' }) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'read:statuses' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + let(:other) { Fabricate(:user) } - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index', :sidekiq_inline do - let(:scopes) { 'read:statuses' } - + describe 'GET /api/v1/conversations', :sidekiq_inline do before do PostStatusService.new.call(other.account, text: 'Hey @alice', visibility: 'direct') PostStatusService.new.call(user.account, text: 'Hey, nobody here', visibility: 'direct') end it 'returns pagination headers', :aggregate_failures do - get :index, params: { limit: 1 } + get '/api/v1/conversations', params: { limit: 1 }, headers: headers expect(response).to have_http_status(200) expect(response.headers['Link'].links.size).to eq(2) end it 'returns conversations', :aggregate_failures do - get :index - json = body_as_json - expect(json.size).to eq 2 - expect(json[0][:accounts].size).to eq 1 + get '/api/v1/conversations', headers: headers + + expect(body_as_json.size).to eq 2 + expect(body_as_json[0][:accounts].size).to eq 1 end context 'with since_id' do context 'when requesting old posts' do it 'returns conversations' do - get :index, params: { since_id: Mastodon::Snowflake.id_at(1.hour.ago, with_random: false) } - json = body_as_json - expect(json.size).to eq 2 + get '/api/v1/conversations', params: { since_id: Mastodon::Snowflake.id_at(1.hour.ago, with_random: false) }, headers: headers + + expect(body_as_json.size).to eq 2 end end context 'when requesting posts in the future' do it 'returns no conversation' do - get :index, params: { since_id: Mastodon::Snowflake.id_at(1.hour.from_now, with_random: false) } - json = body_as_json - expect(json.size).to eq 0 + get '/api/v1/conversations', params: { since_id: Mastodon::Snowflake.id_at(1.hour.from_now, with_random: false) }, headers: headers + + expect(body_as_json.size).to eq 0 end end end diff --git a/spec/controllers/api/v1/filters_controller_spec.rb b/spec/requests/api/v1/filters_spec.rb similarity index 75% rename from spec/controllers/api/v1/filters_controller_spec.rb rename to spec/requests/api/v1/filters_spec.rb index b0f64ccf41..deb6e74217 100644 --- a/spec/controllers/api/v1/filters_controller_spec.rb +++ b/spec/requests/api/v1/filters_spec.rb @@ -2,23 +2,18 @@ require 'rails_helper' -RSpec.describe Api::V1::FiltersController do - render_views +RSpec.describe 'API V1 Filters' do + let(:user) { Fabricate(:user) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - let(:user) { Fabricate(:user) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index' do + describe 'GET /api/v1/filters' do let(:scopes) { 'read:filters' } let!(:filter) { Fabricate(:custom_filter, account: user.account) } let!(:custom_filter_keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } it 'returns http success' do - get :index + get '/api/v1/filters', headers: headers expect(response).to have_http_status(200) expect(body_as_json) .to contain_exactly( @@ -27,13 +22,13 @@ RSpec.describe Api::V1::FiltersController do end end - describe 'POST #create' do + describe 'POST /api/v1/filters' do let(:scopes) { 'write:filters' } let(:irreversible) { true } let(:whole_word) { false } before do - post :create, params: { phrase: 'magic', context: %w(home), irreversible: irreversible, whole_word: whole_word } + post '/api/v1/filters', params: { phrase: 'magic', context: %w(home), irreversible: irreversible, whole_word: whole_word }, headers: headers end it 'creates a filter', :aggregate_failures do @@ -64,24 +59,25 @@ RSpec.describe Api::V1::FiltersController do end end - describe 'GET #show' do + describe 'GET /api/v1/filters/:id' do let(:scopes) { 'read:filters' } let(:filter) { Fabricate(:custom_filter, account: user.account) } let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } it 'returns http success' do - get :show, params: { id: keyword.id } + get "/api/v1/filters/#{keyword.id}", headers: headers + expect(response).to have_http_status(200) end end - describe 'PUT #update' do + describe 'PUT /api/v1/filters/:id' do let(:scopes) { 'write:filters' } let(:filter) { Fabricate(:custom_filter, account: user.account) } let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } before do - put :update, params: { id: keyword.id, phrase: 'updated' } + put "/api/v1/filters/#{keyword.id}", headers: headers, params: { phrase: 'updated' } end it 'updates the filter', :aggregate_failures do @@ -90,13 +86,13 @@ RSpec.describe Api::V1::FiltersController do end end - describe 'DELETE #destroy' do + describe 'DELETE /api/v1/filters/:id' do let(:scopes) { 'write:filters' } let(:filter) { Fabricate(:custom_filter, account: user.account) } let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } before do - delete :destroy, params: { id: keyword.id } + delete "/api/v1/filters/#{keyword.id}", headers: headers end it 'removes the filter', :aggregate_failures do diff --git a/spec/controllers/api/v1/polls/votes_controller_spec.rb b/spec/requests/api/v1/polls/votes_spec.rb similarity index 61% rename from spec/controllers/api/v1/polls/votes_controller_spec.rb rename to spec/requests/api/v1/polls/votes_spec.rb index 5de225a487..e2b22708be 100644 --- a/spec/controllers/api/v1/polls/votes_controller_spec.rb +++ b/spec/requests/api/v1/polls/votes_spec.rb @@ -2,30 +2,32 @@ require 'rails_helper' -RSpec.describe Api::V1::Polls::VotesController do - render_views - +RSpec.describe 'API V1 Polls Votes' do let(:user) { Fabricate(:user) } let(:scopes) { 'write:statuses' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - before { allow(controller).to receive(:doorkeeper_token) { token } } - - describe 'POST #create' do + describe 'POST /api/v1/polls/:poll_id/votes' do let(:poll) { Fabricate(:poll) } before do - post :create, params: { poll_id: poll.id, choices: %w(1) } + post "/api/v1/polls/#{poll.id}/votes", params: { choices: %w(1) }, headers: headers end it 'creates a vote', :aggregate_failures do expect(response).to have_http_status(200) - vote = poll.votes.where(account: user.account).first expect(vote).to_not be_nil expect(vote.choice).to eq 1 expect(poll.reload.cached_tallies).to eq [0, 1] end + + private + + def vote + poll.votes.where(account: user.account).first + end end end diff --git a/spec/controllers/api/v1/push/subscriptions_controller_spec.rb b/spec/requests/api/v1/push/subscriptions_spec.rb similarity index 67% rename from spec/controllers/api/v1/push/subscriptions_controller_spec.rb rename to spec/requests/api/v1/push/subscriptions_spec.rb index 1681914680..d699fd1e08 100644 --- a/spec/controllers/api/v1/push/subscriptions_controller_spec.rb +++ b/spec/requests/api/v1/push/subscriptions_spec.rb @@ -2,9 +2,7 @@ require 'rails_helper' -describe Api::V1::Push::SubscriptionsController do - render_views - +describe 'API V1 Push Subscriptions' do let(:user) { Fabricate(:user) } let(:create_payload) do { @@ -34,15 +32,13 @@ describe Api::V1::Push::SubscriptionsController do }, }.with_indifferent_access end - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'push') } + let(:scopes) { 'push' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'POST #create' do + describe 'POST /api/v1/push/subscription' do before do - post :create, params: create_payload + post '/api/v1/push/subscription', params: create_payload, headers: headers end it 'saves push subscriptions' do @@ -56,19 +52,23 @@ describe Api::V1::Push::SubscriptionsController do end it 'replaces old subscription on repeat calls' do - post :create, params: create_payload + post '/api/v1/push/subscription', params: create_payload, headers: headers + expect(Web::PushSubscription.where(endpoint: create_payload[:subscription][:endpoint]).count).to eq 1 end it 'returns the expected JSON' do - expect(body_as_json.with_indifferent_access).to include({ endpoint: create_payload[:subscription][:endpoint], alerts: {}, policy: 'all' }) + expect(body_as_json.with_indifferent_access) + .to include( + { endpoint: create_payload[:subscription][:endpoint], alerts: {}, policy: 'all' } + ) end end - describe 'PUT #update' do + describe 'PUT /api/v1/push/subscription' do before do - post :create, params: create_payload - put :update, params: alerts_payload + post '/api/v1/push/subscription', params: create_payload, headers: headers + put '/api/v1/push/subscription', params: alerts_payload, headers: headers end it 'changes alert settings' do @@ -82,14 +82,17 @@ describe Api::V1::Push::SubscriptionsController do end it 'returns the expected JSON' do - expect(body_as_json.with_indifferent_access).to include({ endpoint: create_payload[:subscription][:endpoint], alerts: alerts_payload[:data][:alerts], policy: alerts_payload[:data][:policy] }) + expect(body_as_json.with_indifferent_access) + .to include( + { endpoint: create_payload[:subscription][:endpoint], alerts: alerts_payload[:data][:alerts], policy: alerts_payload[:data][:policy] } + ) end end - describe 'DELETE #destroy' do + describe 'DELETE /api/v1/push/subscription' do before do - post :create, params: create_payload - delete :destroy + post '/api/v1/push/subscription', params: create_payload, headers: headers + delete '/api/v1/push/subscription', headers: headers end it 'removes the subscription' do diff --git a/spec/controllers/api/v1/streaming_controller_spec.rb b/spec/requests/api/v1/streaming_spec.rb similarity index 51% rename from spec/controllers/api/v1/streaming_controller_spec.rb rename to spec/requests/api/v1/streaming_spec.rb index 099f68a74e..6b550dfa60 100644 --- a/spec/controllers/api/v1/streaming_controller_spec.rb +++ b/spec/requests/api/v1/streaming_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe Api::V1::StreamingController do +describe 'API V1 Streaming' do around do |example| before = Rails.configuration.x.streaming_api_base_url Rails.configuration.x.streaming_api_base_url = "wss://#{Rails.configuration.x.web_domain}" @@ -10,14 +10,13 @@ describe Api::V1::StreamingController do Rails.configuration.x.streaming_api_base_url = before end - before do - request.headers.merge! Host: Rails.configuration.x.web_domain - end + let(:headers) { { 'Host' => Rails.configuration.x.web_domain } } context 'with streaming api on same host' do - describe 'GET #index' do + describe 'GET /api/v1/streaming' do it 'raises ActiveRecord::RecordNotFound' do - get :index + get '/api/v1/streaming', headers: headers + expect(response).to have_http_status(404) end end @@ -28,20 +27,33 @@ describe Api::V1::StreamingController do Rails.configuration.x.streaming_api_base_url = "wss://streaming-#{Rails.configuration.x.web_domain}" end - describe 'GET #index' do + describe 'GET /api/v1/streaming' do it 'redirects to streaming host' do - get :index, params: { access_token: 'deadbeef', stream: 'public' } - expect(response).to have_http_status(301) - request_uri = URI.parse(request.url) - redirect_to_uri = URI.parse(response.location) - [:scheme, :path, :query, :fragment].each do |part| - expect(redirect_to_uri.send(part)).to eq(request_uri.send(part)), "redirect target #{part}" - end - expect(redirect_to_uri.host).to eq(streaming_host), 'redirect target host' + get '/api/v1/streaming', headers: headers, params: { access_token: 'deadbeef', stream: 'public' } + + expect(response) + .to have_http_status(301) + + expect(redirect_to_uri) + .to have_attributes( + fragment: request_uri.fragment, + host: eq(streaming_host), + path: request_uri.path, + query: request_uri.query, + scheme: request_uri.scheme + ) end private + def request_uri + URI.parse(request.url) + end + + def redirect_to_uri + URI.parse(response.location) + end + def streaming_host URI.parse(Rails.configuration.x.streaming_api_base_url).host end From b4af3639e831c974cba3c4bb6d7253883e79c1ce Mon Sep 17 00:00:00 2001 From: Krzysztof Piwowar Date: Fri, 1 Mar 2024 18:35:35 +0100 Subject: [PATCH 109/954] Add Kashubian to languages dropdown (#26024) --- app/helpers/languages_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb index 87f0f288d3..798f027167 100644 --- a/app/helpers/languages_helper.rb +++ b/app/helpers/languages_helper.rb @@ -191,6 +191,7 @@ module LanguagesHelper chr: ['Cherokee', 'ᏣᎳᎩ ᎦᏬᏂᎯᏍᏗ'].freeze, ckb: ['Sorani (Kurdish)', 'سۆرانی'].freeze, cnr: ['Montenegrin', 'crnogorski'].freeze, + csb: ['Kashubian', 'Kaszëbsczi'].freeze, jbo: ['Lojban', 'la .lojban.'].freeze, kab: ['Kabyle', 'Taqbaylit'].freeze, ldn: ['Láadan', 'Láadan'].freeze, From 8d22599318a3eec7b69df632eab463a85899cf10 Mon Sep 17 00:00:00 2001 From: Helge Date: Fri, 1 Mar 2024 18:36:00 +0100 Subject: [PATCH 110/954] Add Pennsylvania Dutch to languages dropdown (#26634) --- app/helpers/languages_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb index 798f027167..5fc2d96d74 100644 --- a/app/helpers/languages_helper.rb +++ b/app/helpers/languages_helper.rb @@ -196,6 +196,7 @@ module LanguagesHelper kab: ['Kabyle', 'Taqbaylit'].freeze, ldn: ['Láadan', 'Láadan'].freeze, lfn: ['Lingua Franca Nova', 'lingua franca nova'].freeze, + pdc: ['Pennsylvania Dutch', 'Pennsilfaani-Deitsch'].freeze, sco: ['Scots', 'Scots'].freeze, sma: ['Southern Sami', 'Åarjelsaemien Gïele'].freeze, smj: ['Lule Sami', 'Julevsámegiella'].freeze, From 5ab944af95ddf496cde18a6bdae6a1bd87e7a713 Mon Sep 17 00:00:00 2001 From: gunchleoc Date: Fri, 1 Mar 2024 17:40:48 +0000 Subject: [PATCH 111/954] Rename Panjabi to Punjabi (#27117) --- app/helpers/languages_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb index 5fc2d96d74..bea122cad6 100644 --- a/app/helpers/languages_helper.rb +++ b/app/helpers/languages_helper.rb @@ -127,7 +127,7 @@ module LanguagesHelper om: ['Oromo', 'Afaan Oromoo'].freeze, or: ['Oriya', 'ଓଡ଼ିଆ'].freeze, os: ['Ossetian', 'ирон æвзаг'].freeze, - pa: ['Panjabi', 'ਪੰਜਾਬੀ'].freeze, + pa: ['Punjabi', 'ਪੰਜਾਬੀ'].freeze, pi: ['Pāli', 'पाऴि'].freeze, pl: ['Polish', 'Polski'].freeze, ps: ['Pashto', 'پښتو'].freeze, From 1d5de8b26acb448f58e2ce310c1fe35e0750267b Mon Sep 17 00:00:00 2001 From: gunchleoc Date: Fri, 1 Mar 2024 17:41:49 +0000 Subject: [PATCH 112/954] Add Vai to posting languages (#27136) --- app/helpers/languages_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb index bea122cad6..65ade9fd2a 100644 --- a/app/helpers/languages_helper.rb +++ b/app/helpers/languages_helper.rb @@ -202,6 +202,7 @@ module LanguagesHelper smj: ['Lule Sami', 'Julevsámegiella'].freeze, szl: ['Silesian', 'ślůnsko godka'].freeze, tok: ['Toki Pona', 'toki pona'].freeze, + vai: ['Vai', 'ꕙꔤ'].freeze, xal: ['Kalmyk', 'Хальмг келн'].freeze, zba: ['Balaibalan', 'باليبلن'].freeze, zgh: ['Standard Moroccan Tamazight', 'ⵜⴰⵎⴰⵣⵉⵖⵜ'].freeze, From b6b94c971fa7747aeb7d7588319429d6a5d856c9 Mon Sep 17 00:00:00 2001 From: Dave MacLeod <56599343+Dhghomon@users.noreply.github.com> Date: Sat, 2 Mar 2024 02:51:22 +0900 Subject: [PATCH 113/954] Add Interlingue to available_locales (#28630) --- config/initializers/i18n.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/config/initializers/i18n.rb b/config/initializers/i18n.rb index 1c1cea1b94..8643060fa6 100644 --- a/config/initializers/i18n.rb +++ b/config/initializers/i18n.rb @@ -42,6 +42,7 @@ Rails.application.configure do :hu, :hy, :id, + :ie, :ig, :io, :is, From 64b8ba36bb1ac97b7c6dc0b259682a9a4f02524f Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Sat, 2 Mar 2024 13:31:43 -0500 Subject: [PATCH 114/954] Add `bin/dev` script to launch foreman (#28242) --- README.md | 18 +++++++----------- Vagrantfile | 2 +- bin/dev | 20 ++++++++++++++++++++ 3 files changed, 28 insertions(+), 12 deletions(-) create mode 100755 bin/dev diff --git a/README.md b/README.md index 6cf722b355..7f9b115c4f 100644 --- a/README.md +++ b/README.md @@ -83,23 +83,19 @@ A **Vagrant** configuration is included for development purposes. To use it, com - Install Vagrant and Virtualbox - Install the `vagrant-hostsupdater` plugin: `vagrant plugin install vagrant-hostsupdater` - Run `vagrant up` -- Run `vagrant ssh -c "cd /vagrant && foreman start"` +- Run `vagrant ssh -c "cd /vagrant && bin/dev"` - Open `http://mastodon.local` in your browser ### MacOS To set up **MacOS** for native development, complete the following steps: -- Install the latest stable Ruby version (use a Ruby version manager for easy installation and management of Ruby versions) -- Run `brew install postgresql@14` -- Run `brew install redis` -- Run `brew install imagemagick` -- Run `brew install libidn` -- Install Foreman or a similar tool (such as [overmind](https://github.com/DarthSim/overmind)) to handle multiple process launching. -- Navigate to Mastodon's root directory and run `brew install nvm` then `nvm use` to use the version from .nvmrc +- Use a Ruby version manager to install the specified version from `.ruby-version` +- Run `brew install postgresql@14 redis imagemagick libidn` to install required dependencies +- Navigate to Mastodon's root directory and run `brew install nvm` then `nvm use` to use the version from `.nvmrc` - Run `corepack enable && corepack prepare` - Run `bundle exec rails db:setup` (optionally prepend `RAILS_ENV=development` to target the dev environment) -- Finally, run `overmind start -f Procfile.dev` +- Finally, run `bin/dev` which will launch the local services via `overmind` (if installed) or `foreman` ### Docker @@ -108,7 +104,7 @@ For development with **Docker**, complete the following steps: - Install Docker Desktop - Run `docker compose -f .devcontainer/docker-compose.yml up -d` - Run `docker compose -f .devcontainer/docker-compose.yml exec app .devcontainer/post-create.sh` -- Finally, run `docker compose -f .devcontainer/docker-compose.yml exec app foreman start -f Procfile.dev` +- Finally, run `docker compose -f .devcontainer/docker-compose.yml exec app bin/dev` If you are using an IDE with [support for the Development Container specification](https://containers.dev/supporting), it will run the above `docker compose` commands automatically. For **Visual Studio Code** this requires the [Dev Container extension](https://containers.dev/supporting#dev-containers). @@ -119,7 +115,7 @@ To get you coding in just a few minutes, GitHub Codespaces provides a web-based - Click this button to create a new codespace:
[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=52281283&devcontainer_path=.devcontainer%2Fcodespaces%2Fdevcontainer.json) - Wait for the environment to build. This will take a few minutes. -- When the editor is ready, run `foreman start -f Procfile.dev` in the terminal. +- When the editor is ready, run `bin/dev` in the terminal. - After a few seconds, a popup will appear with a button labeled _Open in Browser_. This will open Mastodon. - On the _Ports_ tab, right click on the “stream” row and select _Port visibility_ → _Public_. diff --git a/Vagrantfile b/Vagrantfile index 6f0f511095..12bd1ba67a 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -188,7 +188,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.post_up_message = < /dev/null +then + overmind start -f Procfile.dev "$@" + exit $? +fi + +if gem list --no-installed --exact --silent foreman; then + echo "Installing foreman..." + gem install foreman +fi + +foreman start -f Procfile.dev "$@" From 68600893d2ae41c001cf8449e3dd4ffa75f7f8c9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 2 Mar 2024 19:33:33 +0100 Subject: [PATCH 115/954] Update babel monorepo to v7.24.0 (#29434) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 118 +++++++++++++++++++++++++++--------------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/yarn.lock b/yarn.lock index b336fef88c..a600844022 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,7 +52,7 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.23.5": +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.5": version: 7.23.5 resolution: "@babel/compat-data@npm:7.23.5" checksum: 10c0/081278ed46131a890ad566a59c61600a5f9557bd8ee5e535890c8548192532ea92590742fd74bd9db83d74c669ef8a04a7e1c85cdea27f960233e3b83c3a957c @@ -60,25 +60,25 @@ __metadata: linkType: hard "@babel/core@npm:^7.10.4, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.1": - version: 7.23.9 - resolution: "@babel/core@npm:7.23.9" + version: 7.24.0 + resolution: "@babel/core@npm:7.24.0" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.23.5" "@babel/generator": "npm:^7.23.6" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.23.9" - "@babel/parser": "npm:^7.23.9" - "@babel/template": "npm:^7.23.9" - "@babel/traverse": "npm:^7.23.9" - "@babel/types": "npm:^7.23.9" + "@babel/helpers": "npm:^7.24.0" + "@babel/parser": "npm:^7.24.0" + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/03883300bf1252ab4c9ba5b52f161232dd52873dbe5cde9289bb2bb26e935c42682493acbac9194a59a3b6cbd17f4c4c84030db8d6d482588afe64531532ff9b + checksum: 10c0/bb37cbf0bdfd676b246af0a3d9a7932d10573f2d45114fdda02a71889e35530ce13d8930177e78b065d6734b8d45a4fbf7c77f223b1d44b4a28cfe5fefee93ed languageName: node linkType: hard @@ -250,10 +250,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.22.5 - resolution: "@babel/helper-plugin-utils@npm:7.22.5" - checksum: 10c0/d2c4bfe2fa91058bcdee4f4e57a3f4933aed7af843acfd169cd6179fab8d13c1d636474ecabb2af107dc77462c7e893199aa26632bac1c6d7e025a17cbb9d20d +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.0, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": + version: 7.24.0 + resolution: "@babel/helper-plugin-utils@npm:7.24.0" + checksum: 10c0/90f41bd1b4dfe7226b1d33a4bb745844c5c63e400f9e4e8bf9103a7ceddd7d425d65333b564d9daba3cebd105985764d51b4bd4c95822b97c2e3ac1201a8a5da languageName: node linkType: hard @@ -342,14 +342,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/helpers@npm:7.23.9" +"@babel/helpers@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/helpers@npm:7.24.0" dependencies: - "@babel/template": "npm:^7.23.9" - "@babel/traverse": "npm:^7.23.9" - "@babel/types": "npm:^7.23.9" - checksum: 10c0/f69fd0aca96a6fb8bd6dd044cd8a5c0f1851072d4ce23355345b9493c4032e76d1217f86b70df795e127553cf7f3fcd1587ede9d1b03b95e8b62681ca2165b87 + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" + checksum: 10c0/dd27c9f11c1c5244ef312fae37636f2fcc69c541c46508017b846c4cf680af059f1922ce84e3f778f123a70d027ded75c96070ee8e906f3bc52dc26dc43df608 languageName: node linkType: hard @@ -364,12 +364,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/parser@npm:7.23.9" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/parser@npm:7.24.0" bin: parser: ./bin/babel-parser.js - checksum: 10c0/7df97386431366d4810538db4b9ec538f4377096f720c0591c7587a16f6810e62747e9fbbfa1ff99257fd4330035e4fb1b5b77c7bd3b97ce0d2e3780a6618975 + checksum: 10c0/77593d0b9de9906823c4d653bb6cda1c7593837598516330f655f70cba6224a37def7dbe5b4dad0038482d407d8d209eb8be5f48ca9a13357d769f829c5adb8e languageName: node linkType: hard @@ -1004,18 +1004,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.23.4" +"@babel/plugin-transform-object-rest-spread@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.0" dependencies: - "@babel/compat-data": "npm:^7.23.3" - "@babel/helper-compilation-targets": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/compat-data": "npm:^7.23.5" + "@babel/helper-compilation-targets": "npm:^7.23.6" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" "@babel/plugin-transform-parameters": "npm:^7.23.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/b56017992ffe7fcd1dd9a9da67c39995a141820316266bcf7d77dc912980d228ccbd3f36191d234f5cc389b09157b5d2a955e33e8fb368319534affd1c72b262 + checksum: 10c0/02fe8b99ee6329e68b97b1b1b5410e50c6c20470e73dcd1d287c6ddb5623c654dce82327b2a3f6710ee3b512fe4950e43ab81d0bbc33d771f0cad3bc3cef87c6 languageName: node linkType: hard @@ -1200,18 +1200,18 @@ __metadata: linkType: hard "@babel/plugin-transform-runtime@npm:^7.22.4": - version: 7.23.9 - resolution: "@babel/plugin-transform-runtime@npm:7.23.9" + version: 7.24.0 + resolution: "@babel/plugin-transform-runtime@npm:7.24.0" dependencies: "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" babel-plugin-polyfill-corejs2: "npm:^0.4.8" babel-plugin-polyfill-corejs3: "npm:^0.9.0" babel-plugin-polyfill-regenerator: "npm:^0.5.5" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3b959c2b88ea0009c288fa190d9f69b0d26cb336b8a7cab54a5e54b844f33cce1996725c15305a40049c8f23ca30082ee27e1f6853ff35fad723543e3d2dba47 + checksum: 10c0/a632e0c6f4b1be21955646ba4f6e4af323daaa6ab68ce39f92f5186d444402e920b33cabd40759c36f72d8c36f256a35ea03060e407ca69bcf373fdcb450aa42 languageName: node linkType: hard @@ -1333,12 +1333,12 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.22.4": - version: 7.23.9 - resolution: "@babel/preset-env@npm:7.23.9" + version: 7.24.0 + resolution: "@babel/preset-env@npm:7.24.0" dependencies: "@babel/compat-data": "npm:^7.23.5" "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-validator-option": "npm:^7.23.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.23.3" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.23.3" @@ -1391,7 +1391,7 @@ __metadata: "@babel/plugin-transform-new-target": "npm:^7.23.3" "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.23.4" "@babel/plugin-transform-numeric-separator": "npm:^7.23.4" - "@babel/plugin-transform-object-rest-spread": "npm:^7.23.4" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.0" "@babel/plugin-transform-object-super": "npm:^7.23.3" "@babel/plugin-transform-optional-catch-binding": "npm:^7.23.4" "@babel/plugin-transform-optional-chaining": "npm:^7.23.4" @@ -1418,7 +1418,7 @@ __metadata: semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/2837a42089180e51bfd6864b6d197e01fc0abec1920422e71c0513c2fc8fb5f3bfe694ed778cc4e45856c546964945bc53bf8105e4b26f3580ce3685fa50cc0f + checksum: 10c0/cb5098bb860aede8418f204d7a693108d7c318edbb227f9842ac6aa71f2154ea1737846994af9bcd0c0b716cd73904f69f09bef635a9679465ec3558144beb4f languageName: node linkType: hard @@ -1483,28 +1483,28 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": - version: 7.23.9 - resolution: "@babel/runtime@npm:7.23.9" + version: 7.24.0 + resolution: "@babel/runtime@npm:7.24.0" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/e71205fdd7082b2656512cc98e647d9ea7e222e4fe5c36e9e5adc026446fcc3ba7b3cdff8b0b694a0b78bb85db83e7b1e3d4c56ef90726682b74f13249cf952d + checksum: 10c0/3495eed727bf4a4f84c35bb51ab53317ae38f4bbc3b1d0a8303751f9dfa0ce6f5fb2afced72b76c3dd0d8bb2ccb84787559a4dee9886291a36b26f02f0f759b4 languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.23.9, @babel/template@npm:^7.3.3": - version: 7.23.9 - resolution: "@babel/template@npm:7.23.9" +"@babel/template@npm:^7.22.15, @babel/template@npm:^7.24.0, @babel/template@npm:^7.3.3": + version: 7.24.0 + resolution: "@babel/template@npm:7.24.0" dependencies: "@babel/code-frame": "npm:^7.23.5" - "@babel/parser": "npm:^7.23.9" - "@babel/types": "npm:^7.23.9" - checksum: 10c0/0e8b60119433787742bc08ae762bbd8d6755611c4cabbcb7627b292ec901a55af65d93d1c88572326069efb64136ef151ec91ffb74b2df7689bbab237030833a + "@babel/parser": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" + checksum: 10c0/9d3dd8d22fe1c36bc3bdef6118af1f4b030aaf6d7d2619f5da203efa818a2185d717523486c111de8d99a8649ddf4bbf6b2a7a64962d8411cf6a8fa89f010e54 languageName: node linkType: hard -"@babel/traverse@npm:7, @babel/traverse@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/traverse@npm:7.23.9" +"@babel/traverse@npm:7, @babel/traverse@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/traverse@npm:7.24.0" dependencies: "@babel/code-frame": "npm:^7.23.5" "@babel/generator": "npm:^7.23.6" @@ -1512,22 +1512,22 @@ __metadata: "@babel/helper-function-name": "npm:^7.23.0" "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.23.9" - "@babel/types": "npm:^7.23.9" + "@babel/parser": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/d1615d1d02f04d47111a7ea4446a1a6275668ca39082f31d51f08380de9502e19862be434eaa34b022ce9a17dbb8f9e2b73a746c654d9575f3a680a7ffdf5630 + checksum: 10c0/55ffd2b0ce0fbd0a09051edc4def4fb1e96f35e0b100c0dc2a7429df569971ae312c290e980e423471f350961705698a257c7eea8c8304918024cc26f02468ba languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.23.9, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.23.9 - resolution: "@babel/types@npm:7.23.9" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.24.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.24.0 + resolution: "@babel/types@npm:7.24.0" dependencies: "@babel/helper-string-parser": "npm:^7.23.4" "@babel/helper-validator-identifier": "npm:^7.22.20" to-fast-properties: "npm:^2.0.0" - checksum: 10c0/edc7bb180ce7e4d2aea10c6972fb10474341ac39ba8fdc4a27ffb328368dfdfbf40fca18e441bbe7c483774500d5c05e222cec276c242e952853dcaf4eb884f7 + checksum: 10c0/777a0bb5dbe038ca4c905fdafb1cdb6bdd10fe9d63ce13eca0bd91909363cbad554a53dc1f902004b78c1dcbc742056f877f2c99eeedff647333b1fadf51235d languageName: node linkType: hard From ee8d0b94473df357677cd1f82581251ce0423c01 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 4 Mar 2024 07:35:20 +0100 Subject: [PATCH 116/954] Fix follow suggestions potentially including silenced or blocked accounts (#29306) --- .../friends_of_friends_source.rb | 34 ++------ .../similar_profiles_source.rb | 3 +- app/models/account_suggestions/source.rb | 2 + .../friends_of_friends_source_spec.rb | 82 +++++++++++++++++++ .../models/account_suggestions/source_spec.rb | 20 +++-- 5 files changed, 107 insertions(+), 34 deletions(-) create mode 100644 spec/models/account_suggestions/friends_of_friends_source_spec.rb diff --git a/app/models/account_suggestions/friends_of_friends_source.rb b/app/models/account_suggestions/friends_of_friends_source.rb index 93fb10f3b0..0c95d21a3e 100644 --- a/app/models/account_suggestions/friends_of_friends_source.rb +++ b/app/models/account_suggestions/friends_of_friends_source.rb @@ -2,31 +2,15 @@ class AccountSuggestions::FriendsOfFriendsSource < AccountSuggestions::Source def get(account, limit: DEFAULT_LIMIT) - Account.find_by_sql([<<~SQL.squish, { id: account.id, limit: limit }]).map { |row| [row.id, key] } - WITH first_degree AS ( - SELECT target_account_id - FROM follows - JOIN accounts AS target_accounts ON follows.target_account_id = target_accounts.id - WHERE account_id = :id - AND NOT target_accounts.hide_collections - ) - SELECT accounts.id, COUNT(*) AS frequency - FROM accounts - JOIN follows ON follows.target_account_id = accounts.id - JOIN account_stats ON account_stats.account_id = accounts.id - LEFT OUTER JOIN follow_recommendation_mutes ON follow_recommendation_mutes.target_account_id = accounts.id AND follow_recommendation_mutes.account_id = :id - WHERE follows.account_id IN (SELECT * FROM first_degree) - AND NOT EXISTS (SELECT 1 FROM follows f WHERE f.target_account_id = follows.target_account_id AND f.account_id = :id) - AND follows.target_account_id <> :id - AND accounts.discoverable - AND accounts.suspended_at IS NULL - AND accounts.silenced_at IS NULL - AND accounts.moved_to_account_id IS NULL - AND follow_recommendation_mutes.target_account_id IS NULL - GROUP BY accounts.id, account_stats.id - ORDER BY frequency DESC, account_stats.followers_count ASC - LIMIT :limit - SQL + first_degree = account.following.where.not(hide_collections: true).select(:id).reorder(nil) + base_account_scope(account) + .joins(:account_stat) + .where(id: Follow.where(account_id: first_degree).select(:target_account_id)) + .group('accounts.id, account_stats.id') + .reorder('frequency DESC, followers_count DESC') + .limit(limit) + .pluck(Arel.sql('accounts.id, COUNT(*) AS frequency')) + .map { |id, _frequency| [id, key] } end private diff --git a/app/models/account_suggestions/similar_profiles_source.rb b/app/models/account_suggestions/similar_profiles_source.rb index 3ece20aa51..7ecdd607e5 100644 --- a/app/models/account_suggestions/similar_profiles_source.rb +++ b/app/models/account_suggestions/similar_profiles_source.rb @@ -51,7 +51,8 @@ class AccountSuggestions::SimilarProfilesSource < AccountSuggestions::Source recently_followed_account_ids = account.active_relationships.recent.limit(5).pluck(:target_account_id) if Chewy.enabled? && !recently_followed_account_ids.empty? - QueryBuilder.new(recently_followed_account_ids, account).build.limit(limit).hits.pluck('_id').map(&:to_i).zip([key].cycle) + ids_from_es = QueryBuilder.new(recently_followed_account_ids, account).build.limit(limit).hits.pluck('_id').map(&:to_i) + base_account_scope(account).where(id: ids_from_es).pluck(:id).zip([key].cycle) else [] end diff --git a/app/models/account_suggestions/source.rb b/app/models/account_suggestions/source.rb index b2c3c7a3a2..7afc4c80ed 100644 --- a/app/models/account_suggestions/source.rb +++ b/app/models/account_suggestions/source.rb @@ -12,6 +12,8 @@ class AccountSuggestions::Source def base_account_scope(account) Account .searchable + .where(discoverable: true) + .without_silenced .where.not(follows_sql, id: account.id) .where.not(follow_requests_sql, id: account.id) .not_excluded_by_account(account) diff --git a/spec/models/account_suggestions/friends_of_friends_source_spec.rb b/spec/models/account_suggestions/friends_of_friends_source_spec.rb new file mode 100644 index 0000000000..56a974add5 --- /dev/null +++ b/spec/models/account_suggestions/friends_of_friends_source_spec.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe AccountSuggestions::FriendsOfFriendsSource do + describe '#get' do + subject { described_class.new } + + let!(:bob) { Fabricate(:account, discoverable: true, hide_collections: false) } + let!(:alice) { Fabricate(:account, discoverable: true, hide_collections: true) } + let!(:eve) { Fabricate(:account, discoverable: true, hide_collections: false) } + let!(:mallory) { Fabricate(:account, discoverable: false, hide_collections: false) } + let!(:eugen) { Fabricate(:account, discoverable: true, hide_collections: false) } + let!(:john) { Fabricate(:account, discoverable: true, hide_collections: false) } + let!(:jerk) { Fabricate(:account, discoverable: true, hide_collections: false) } + let!(:neil) { Fabricate(:account, discoverable: true, hide_collections: false) } + let!(:larry) { Fabricate(:account, discoverable: true, hide_collections: false) } + + context 'with follows and blocks' do + before do + bob.block!(jerk) + FollowRecommendationMute.create!(account: bob, target_account: neil) + + # bob follows eugen, alice and larry + [eugen, alice, larry].each { |account| bob.follow!(account) } + + # alice follows eve and mallory + [john, mallory].each { |account| alice.follow!(account) } + + # eugen follows eve, john, jerk, larry and neil + [eve, mallory, jerk, larry, neil].each { |account| eugen.follow!(account) } + end + + it 'returns eligible accounts', :aggregate_failures do + results = subject.get(bob) + + # eve is returned through eugen + expect(results).to include([eve.id, :friends_of_friends]) + + # john is not reachable because alice hides who she follows + expect(results).to_not include([john.id, :friends_of_friends]) + + # mallory is not discoverable + expect(results).to_not include([mallory.id, :friends_of_friends]) + + # larry is not included because he's followed already + expect(results).to_not include([larry.id, :friends_of_friends]) + + # jerk is blocked + expect(results).to_not include([jerk.id, :friends_of_friends]) + + # the suggestion for neil has already been rejected + expect(results).to_not include([neil.id, :friends_of_friends]) + end + end + + context 'with deterministic order' do + before do + # bob follows eve and mallory + [eve, mallory].each { |account| bob.follow!(account) } + + # eve follows eugen, john, and jerk + [jerk, eugen, john].each { |account| eve.follow!(account) } + + # mallory follows eugen, john, and neil + [neil, eugen, john].each { |account| mallory.follow!(account) } + + john.follow!(eugen) + john.follow!(neil) + end + + it 'returns eligible accounts in the expected order' do + expect(subject.get(bob)).to eq [ + [eugen.id, :friends_of_friends], # followed by 2 friends, 3 followers total + [john.id, :friends_of_friends], # followed by 2 friends, 2 followers total + [neil.id, :friends_of_friends], # followed by 1 friend, 2 followers total + [jerk.id, :friends_of_friends], # followed by 1 friend, 1 follower total + ] + end + end + end +end diff --git a/spec/models/account_suggestions/source_spec.rb b/spec/models/account_suggestions/source_spec.rb index d8227e01bc..1666094082 100644 --- a/spec/models/account_suggestions/source_spec.rb +++ b/spec/models/account_suggestions/source_spec.rb @@ -11,14 +11,16 @@ RSpec.describe AccountSuggestions::Source do end context 'with follows and follow requests' do - let!(:account_domain_blocked_account) { Fabricate(:account, domain: 'blocked.host') } - let!(:account) { Fabricate(:account) } - let!(:blocked_account) { Fabricate(:account) } - let!(:eligible_account) { Fabricate(:account) } - let!(:follow_recommendation_muted_account) { Fabricate(:account) } - let!(:follow_requested_account) { Fabricate(:account) } - let!(:following_account) { Fabricate(:account) } - let!(:moved_account) { Fabricate(:account, moved_to_account: Fabricate(:account)) } + let!(:account_domain_blocked_account) { Fabricate(:account, domain: 'blocked.host', discoverable: true) } + let!(:account) { Fabricate(:account, discoverable: true) } + let!(:blocked_account) { Fabricate(:account, discoverable: true) } + let!(:eligible_account) { Fabricate(:account, discoverable: true) } + let!(:follow_recommendation_muted_account) { Fabricate(:account, discoverable: true) } + let!(:follow_requested_account) { Fabricate(:account, discoverable: true) } + let!(:following_account) { Fabricate(:account, discoverable: true) } + let!(:moved_account) { Fabricate(:account, moved_to_account: Fabricate(:account), discoverable: true) } + let!(:silenced_account) { Fabricate(:account, silenced: true, discoverable: true) } + let!(:undiscoverable_account) { Fabricate(:account, discoverable: false) } before do Fabricate :account_domain_block, account: account, domain: account_domain_blocked_account.domain @@ -40,6 +42,8 @@ RSpec.describe AccountSuggestions::Source do .and not_include(follow_requested_account) .and not_include(following_account) .and not_include(moved_account) + .and not_include(silenced_account) + .and not_include(undiscoverable_account) end end end From 0f7f2571396b3327559c31716af538fb9b34eff6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 10:39:12 +0100 Subject: [PATCH 117/954] Update Yarn to v4.1.1 (#29508) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- streaming/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4f17b427ee..9f20a981ae 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/mastodon", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.1.0", + "packageManager": "yarn@4.1.1", "engines": { "node": ">=18" }, diff --git a/streaming/package.json b/streaming/package.json index efb692578c..6e183a181c 100644 --- a/streaming/package.json +++ b/streaming/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/streaming", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.1.0", + "packageManager": "yarn@4.1.1", "engines": { "node": ">=18" }, From cb0f3ecc28f508af25013834905bb9a11ac87314 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 10:41:31 +0100 Subject: [PATCH 118/954] Update eslint (non-major) (#29505) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 731 +++++++++++++++++++++++++++++------------------------- 1 file changed, 396 insertions(+), 335 deletions(-) diff --git a/yarn.lock b/yarn.lock index a600844022..c5ec6e5f8c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1743,10 +1743,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.56.0": - version: 8.56.0 - resolution: "@eslint/js@npm:8.56.0" - checksum: 10c0/60b3a1cf240e2479cec9742424224465dc50e46d781da1b7f5ef240501b2d1202c225bd456207faac4b34a64f4765833345bc4ddffd00395e1db40fa8c426f5a +"@eslint/js@npm:8.57.0": + version: 8.57.0 + resolution: "@eslint/js@npm:8.57.0" + checksum: 10c0/9a518bb8625ba3350613903a6d8c622352ab0c6557a59fe6ff6178bf882bf57123f9d92aa826ee8ac3ee74b9c6203fe630e9ee00efb03d753962dcf65ee4bd94 languageName: node linkType: hard @@ -1935,14 +1935,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.13": - version: 0.11.13 - resolution: "@humanwhocodes/config-array@npm:0.11.13" +"@humanwhocodes/config-array@npm:^0.11.14": + version: 0.11.14 + resolution: "@humanwhocodes/config-array@npm:0.11.14" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.1" - debug: "npm:^4.1.1" + "@humanwhocodes/object-schema": "npm:^2.0.2" + debug: "npm:^4.3.1" minimatch: "npm:^3.0.5" - checksum: 10c0/d76ca802d853366094d0e98ff0d0994117fc8eff96649cd357b15e469e428228f597cd2e929d54ab089051684949955f16ee905bb19f7b2f0446fb377157be7a + checksum: 10c0/66f725b4ee5fdd8322c737cb5013e19fac72d4d69c8bf4b7feb192fcb83442b035b92186f8e9497c220e58b2d51a080f28a73f7899bc1ab288c3be172c467541 languageName: node linkType: hard @@ -1953,10 +1953,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.1": - version: 2.0.1 - resolution: "@humanwhocodes/object-schema@npm:2.0.1" - checksum: 10c0/9dba24e59fdb4041829d92b693aacb778add3b6f612aaa9c0774f3b650c11a378cc64f042a59da85c11dae33df456580a3c36837b953541aed6ff94294f97fac +"@humanwhocodes/object-schema@npm:^2.0.2": + version: 2.0.2 + resolution: "@humanwhocodes/object-schema@npm:2.0.2" + checksum: 10c0/6fd83dc320231d71c4541d0244051df61f301817e9f9da9fd4cb7e44ec8aacbde5958c1665b0c419401ab935114fdf532a6ad5d4e7294b1af2f347dd91a6983f languageName: node linkType: hard @@ -3643,14 +3643,14 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^7.0.0": - version: 7.0.2 - resolution: "@typescript-eslint/eslint-plugin@npm:7.0.2" + version: 7.1.1 + resolution: "@typescript-eslint/eslint-plugin@npm:7.1.1" dependencies: "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:7.0.2" - "@typescript-eslint/type-utils": "npm:7.0.2" - "@typescript-eslint/utils": "npm:7.0.2" - "@typescript-eslint/visitor-keys": "npm:7.0.2" + "@typescript-eslint/scope-manager": "npm:7.1.1" + "@typescript-eslint/type-utils": "npm:7.1.1" + "@typescript-eslint/utils": "npm:7.1.1" + "@typescript-eslint/visitor-keys": "npm:7.1.1" debug: "npm:^4.3.4" graphemer: "npm:^1.4.0" ignore: "npm:^5.2.4" @@ -3663,25 +3663,25 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/76727ad48f01c1bb4ef37690e7ed12754930ce3a4bbe5dcd52f24d42f4625fc0b151db8189947f3956b4a09a562eb2da683ff65b57a13a15426eee3b680f80a5 + checksum: 10c0/041799604176bbee01f6ff029c5e2fcf1196db2737ba219a20b095f095dc0064ea425d15dd6dc22eaef294daa838209601ec7bc19317258dfa89a13afb8126ba languageName: node linkType: hard "@typescript-eslint/parser@npm:^7.0.0": - version: 7.0.2 - resolution: "@typescript-eslint/parser@npm:7.0.2" + version: 7.1.1 + resolution: "@typescript-eslint/parser@npm:7.1.1" dependencies: - "@typescript-eslint/scope-manager": "npm:7.0.2" - "@typescript-eslint/types": "npm:7.0.2" - "@typescript-eslint/typescript-estree": "npm:7.0.2" - "@typescript-eslint/visitor-keys": "npm:7.0.2" + "@typescript-eslint/scope-manager": "npm:7.1.1" + "@typescript-eslint/types": "npm:7.1.1" + "@typescript-eslint/typescript-estree": "npm:7.1.1" + "@typescript-eslint/visitor-keys": "npm:7.1.1" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/acffdbea0bba24398ba8bd1ccf5b59438bc093e41d7a325019383094f39d676b5cf2f5963bfa5e332e54728e5b9e14be3984752ee91da6f0e1a3e0b613422d0e + checksum: 10c0/84eb44f3767aaa1d7b26176348c89bd6732bc711f7f24186b1354eba95bf9e9c65b5675838772b831391210e525ff1f3bd4b51a3130ec35413aa362920effc57 languageName: node linkType: hard @@ -3695,22 +3695,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/scope-manager@npm:7.0.2" +"@typescript-eslint/scope-manager@npm:7.1.1": + version: 7.1.1 + resolution: "@typescript-eslint/scope-manager@npm:7.1.1" dependencies: - "@typescript-eslint/types": "npm:7.0.2" - "@typescript-eslint/visitor-keys": "npm:7.0.2" - checksum: 10c0/60241a0dbed7605133b6242d7fc172e8ee649e1033b8a179cebe3e21c60e0c08c12679fd37644cfef57c95a5d75a3927afc9d6365a5f9684c1d043285db23c66 + "@typescript-eslint/types": "npm:7.1.1" + "@typescript-eslint/visitor-keys": "npm:7.1.1" + checksum: 10c0/a955c8529f24945d448b95982d06b5f15a74fc5df97307f5821d55e9861d6c26d61cbd118c1ca41634164ed1d4f6c74fcb8388761341c49e6902a6fb72036afc languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/type-utils@npm:7.0.2" +"@typescript-eslint/type-utils@npm:7.1.1": + version: 7.1.1 + resolution: "@typescript-eslint/type-utils@npm:7.1.1" dependencies: - "@typescript-eslint/typescript-estree": "npm:7.0.2" - "@typescript-eslint/utils": "npm:7.0.2" + "@typescript-eslint/typescript-estree": "npm:7.1.1" + "@typescript-eslint/utils": "npm:7.1.1" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.0.1" peerDependencies: @@ -3718,7 +3718,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/fa7957aa65cb0d7366c7c9be94e45cc2f1ebe9981cbf393054b505c6d555a01b2a2fe7cd1254d668f30183a275032f909186ce0b9f213f64b776bd7872144a6e + checksum: 10c0/6f19dc383718cce42ed7262d134f5f0221bcbf225fea28975cd714c90e57d861608d5187c7ad731f6281813f94b00f22282a99a8a852167366064abc6e256341 languageName: node linkType: hard @@ -3729,10 +3729,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/types@npm:7.0.2" - checksum: 10c0/5f95266cc2cd0e6cf1239dcd36b53c7d98b01ba12c61947316f0d879df87b912b4d23f0796324e2ab0fb8780503a338da41a4695fa91d90392b6c6aca5239fa7 +"@typescript-eslint/types@npm:7.1.1": + version: 7.1.1 + resolution: "@typescript-eslint/types@npm:7.1.1" + checksum: 10c0/2bef95ec0c60e67fada336db3e82fac2be16c21a9e54fc45c7aeda3291abcceefa12aa970025db88bc2b3e113b1e70abd7f89c2a651c16b816dff1a0c46e7907 languageName: node linkType: hard @@ -3755,12 +3755,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/typescript-estree@npm:7.0.2" +"@typescript-eslint/typescript-estree@npm:7.1.1": + version: 7.1.1 + resolution: "@typescript-eslint/typescript-estree@npm:7.1.1" dependencies: - "@typescript-eslint/types": "npm:7.0.2" - "@typescript-eslint/visitor-keys": "npm:7.0.2" + "@typescript-eslint/types": "npm:7.1.1" + "@typescript-eslint/visitor-keys": "npm:7.1.1" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -3770,24 +3770,24 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/2f6795b05fced9f2e0887f6735aa1a0b20516952792e4be13cd94c5e56db8ad013ba27aeb56f89fedff8b7af587f854482f00aac75b418611c74e42169c29aeb + checksum: 10c0/2cec9d21cfe46e523a6d29aff554e5450edf1ee30ce9cf644ee8f1f5e1cfd44b94afb3632db97a949c86c4a392ae80f264d56d8747b2b0fdbe5c54139433366a languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/utils@npm:7.0.2" +"@typescript-eslint/utils@npm:7.1.1": + version: 7.1.1 + resolution: "@typescript-eslint/utils@npm:7.1.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" "@types/json-schema": "npm:^7.0.12" "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:7.0.2" - "@typescript-eslint/types": "npm:7.0.2" - "@typescript-eslint/typescript-estree": "npm:7.0.2" + "@typescript-eslint/scope-manager": "npm:7.1.1" + "@typescript-eslint/types": "npm:7.1.1" + "@typescript-eslint/typescript-estree": "npm:7.1.1" semver: "npm:^7.5.4" peerDependencies: eslint: ^8.56.0 - checksum: 10c0/b4ae9a36393c92b332e99d70219d1ee056271261f7433924db804e5f06d97ca60408b9c7a655afce8a851982e7153243a625d6cc76fea764f767f96c8f3e16da + checksum: 10c0/3e70834c5b49e4643ec8da63fa2acaab54283a566af2cedcd4c2f4210833a59bf71c459dde69e738115633c7de9f1339130552ff246e8e1bb4db26910685408b languageName: node linkType: hard @@ -3818,13 +3818,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/visitor-keys@npm:7.0.2" +"@typescript-eslint/visitor-keys@npm:7.1.1": + version: 7.1.1 + resolution: "@typescript-eslint/visitor-keys@npm:7.1.1" dependencies: - "@typescript-eslint/types": "npm:7.0.2" + "@typescript-eslint/types": "npm:7.1.1" eslint-visitor-keys: "npm:^3.4.1" - checksum: 10c0/4146d1ad6ce9374e6b5a75677fc709816bdc5fe324b1a857405f21dad23bb28c79cfd0555bc2a01c4af1d9e9ee81ff5e29ec41cc9d05b0b1101cc4264e7f21d1 + checksum: 10c0/1ab19ec966ff0b86317eddcbfcda645856ec01c3b76a451298031f35e4da0a363e4888ce5ae9e2526e874799a502c49922d83d57d21cb6fef7f3912f51e4a271 languageName: node linkType: hard @@ -4353,13 +4353,13 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "array-buffer-byte-length@npm:1.0.0" +"array-buffer-byte-length@npm:^1.0.0, array-buffer-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "array-buffer-byte-length@npm:1.0.1" dependencies: - call-bind: "npm:^1.0.2" - is-array-buffer: "npm:^3.0.1" - checksum: 10c0/12f84f6418b57a954caa41654e5e63e019142a4bbb2c6829ba86d1ba65d31ccfaf1461d1743556fd32b091fac34ff44d9dfbdb001402361c45c373b2c86f5c20 + call-bind: "npm:^1.0.5" + is-array-buffer: "npm:^3.0.4" + checksum: 10c0/f5cdf54527cd18a3d2852ddf73df79efec03829e7373a8322ef5df2b4ef546fb365c19c71d6b42d641cb6bfe0f1a2f19bc0ece5b533295f86d7c3d522f228917 languageName: node linkType: hard @@ -4420,6 +4420,19 @@ __metadata: languageName: node linkType: hard +"array.prototype.findlast@npm:^1.2.4": + version: 1.2.4 + resolution: "array.prototype.findlast@npm:1.2.4" + dependencies: + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.3.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/4b5145a68ebaa00ef3d61de07c6694cad73d60763079f1e7662b948e5a167b5121b0c1e6feae8df1e42ead07c21699e25242b95cd5c48e094fd530b192aa4150 + languageName: node + linkType: hard + "array.prototype.findlastindex@npm:^1.2.3": version: 1.2.3 resolution: "array.prototype.findlastindex@npm:1.2.3" @@ -4445,7 +4458,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.3.1, array.prototype.flatmap@npm:^1.3.2": +"array.prototype.flatmap@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flatmap@npm:1.3.2" dependencies: @@ -4470,31 +4483,44 @@ __metadata: languageName: node linkType: hard -"array.prototype.tosorted@npm:^1.1.1": - version: 1.1.1 - resolution: "array.prototype.tosorted@npm:1.1.1" +"array.prototype.toreversed@npm:^1.1.2": + version: 1.1.2 + resolution: "array.prototype.toreversed@npm:1.1.2" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.20.4" - es-shim-unscopables: "npm:^1.0.0" - get-intrinsic: "npm:^1.1.3" - checksum: 10c0/fd5f57aca3c7ddcd1bb83965457b625f3a67d8f334f5cbdb8ac8ef33d5b0d38281524114db2936f8c08048115d5158af216c94e6ae1eb966241b9b6f4ab8a7e8 - languageName: node - linkType: hard - -"arraybuffer.prototype.slice@npm:^1.0.2": - version: 1.0.2 - resolution: "arraybuffer.prototype.slice@npm:1.0.2" - dependencies: - array-buffer-byte-length: "npm:^1.0.0" call-bind: "npm:^1.0.2" define-properties: "npm:^1.2.0" es-abstract: "npm:^1.22.1" - get-intrinsic: "npm:^1.2.1" - is-array-buffer: "npm:^3.0.2" + es-shim-unscopables: "npm:^1.0.0" + checksum: 10c0/2b7627ea85eae1e80ecce665a500cc0f3355ac83ee4a1a727562c7c2a1d5f1c0b4dd7b65c468ec6867207e452ba01256910a2c0b41486bfdd11acf875a7a3435 + languageName: node + linkType: hard + +"array.prototype.tosorted@npm:^1.1.3": + version: 1.1.3 + resolution: "array.prototype.tosorted@npm:1.1.3" + dependencies: + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.1.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/a27e1ca51168ecacf6042901f5ef021e43c8fa04b6c6b6f2a30bac3645cd2b519cecbe0bc45db1b85b843f64dc3207f0268f700b4b9fbdec076d12d432cf0865 + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.3": + version: 1.0.3 + resolution: "arraybuffer.prototype.slice@npm:1.0.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.2.1" + get-intrinsic: "npm:^1.2.3" + is-array-buffer: "npm:^3.0.4" is-shared-array-buffer: "npm:^1.0.2" - checksum: 10c0/96b6e40e439678ffb7fa266398510074d33c3980fbb475490b69980cca60adec3b0777047ef377068a29862157f83edef42efc64ce48ce38977d04d68de5b7fb + checksum: 10c0/d32754045bcb2294ade881d45140a5e52bda2321b9e98fa514797b7f0d252c4c5ab0d1edb34112652c62fa6a9398def568da63a4d7544672229afea283358c36 languageName: node linkType: hard @@ -4644,10 +4670,12 @@ __metadata: languageName: node linkType: hard -"available-typed-arrays@npm:^1.0.5": - version: 1.0.5 - resolution: "available-typed-arrays@npm:1.0.5" - checksum: 10c0/c4df567ca72d2754a6cbad20088f5f98b1065b3360178169fa9b44ea101af62c0f423fc3854fa820fd6895b6b9171b8386e71558203103ff8fc2ad503fdcc660 +"available-typed-arrays@npm:^1.0.6, available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 languageName: node linkType: hard @@ -5335,14 +5363,16 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": - version: 1.0.5 - resolution: "call-bind@npm:1.0.5" +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.1" - set-function-length: "npm:^1.1.1" - checksum: 10c0/a6172c168fd6dacf744fcde745099218056bd755c50415b592655dcd6562157ed29f130f56c3f6db2250f67e4bd62e5c218cdc56d7bfd76e0bda50770fce2d10 + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.1" + checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d languageName: node linkType: hard @@ -6493,14 +6523,14 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": - version: 1.1.1 - resolution: "define-data-property@npm:1.1.1" +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.2": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" dependencies: - get-intrinsic: "npm:^1.2.1" + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - checksum: 10c0/77ef6e0bceb515e05b5913ab635a84d537cee84f8a7c37c77fdcb31fc5b80f6dbe81b33375e4b67d96aa04e6a0d8d4ea099e431d83f089af8d93adfb584bcb94 + checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 languageName: node linkType: hard @@ -7051,50 +7081,52 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.2, es-abstract@npm:^1.20.4, es-abstract@npm:^1.21.2, es-abstract@npm:^1.22.1": - version: 1.22.3 - resolution: "es-abstract@npm:1.22.3" +"es-abstract@npm:^1.17.2, es-abstract@npm:^1.20.4, es-abstract@npm:^1.21.2, es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.22.4": + version: 1.22.5 + resolution: "es-abstract@npm:1.22.5" dependencies: - array-buffer-byte-length: "npm:^1.0.0" - arraybuffer.prototype.slice: "npm:^1.0.2" - available-typed-arrays: "npm:^1.0.5" - call-bind: "npm:^1.0.5" - es-set-tostringtag: "npm:^2.0.1" + array-buffer-byte-length: "npm:^1.0.1" + arraybuffer.prototype.slice: "npm:^1.0.3" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + es-set-tostringtag: "npm:^2.0.3" es-to-primitive: "npm:^1.2.1" function.prototype.name: "npm:^1.1.6" - get-intrinsic: "npm:^1.2.2" - get-symbol-description: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + get-symbol-description: "npm:^1.0.2" globalthis: "npm:^1.0.3" gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - has-proto: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.0.3" has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - internal-slot: "npm:^1.0.5" - is-array-buffer: "npm:^3.0.2" + hasown: "npm:^2.0.1" + internal-slot: "npm:^1.0.7" + is-array-buffer: "npm:^3.0.4" is-callable: "npm:^1.2.7" - is-negative-zero: "npm:^2.0.2" + is-negative-zero: "npm:^2.0.3" is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.2" + is-shared-array-buffer: "npm:^1.0.3" is-string: "npm:^1.0.7" - is-typed-array: "npm:^1.1.12" + is-typed-array: "npm:^1.1.13" is-weakref: "npm:^1.0.2" object-inspect: "npm:^1.13.1" object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.4" - regexp.prototype.flags: "npm:^1.5.1" - safe-array-concat: "npm:^1.0.1" - safe-regex-test: "npm:^1.0.0" + object.assign: "npm:^4.1.5" + regexp.prototype.flags: "npm:^1.5.2" + safe-array-concat: "npm:^1.1.0" + safe-regex-test: "npm:^1.0.3" string.prototype.trim: "npm:^1.2.8" string.prototype.trimend: "npm:^1.0.7" string.prototype.trimstart: "npm:^1.0.7" - typed-array-buffer: "npm:^1.0.0" - typed-array-byte-length: "npm:^1.0.0" - typed-array-byte-offset: "npm:^1.0.0" - typed-array-length: "npm:^1.0.4" + typed-array-buffer: "npm:^1.0.2" + typed-array-byte-length: "npm:^1.0.1" + typed-array-byte-offset: "npm:^1.0.2" + typed-array-length: "npm:^1.0.5" unbox-primitive: "npm:^1.0.2" - which-typed-array: "npm:^1.1.13" - checksum: 10c0/da31ec43b1c8eb47ba8a17693cac143682a1078b6c3cd883ce0e2062f135f532e93d873694ef439670e1f6ca03195118f43567ba6f33fb0d6c7daae750090236 + which-typed-array: "npm:^1.1.14" + checksum: 10c0/4bca5a60f0dff6c0a5690d8e51374cfcb8760d5dbbb1069174b4d41461cf4e0c3e0c1993bccbc5aa0799ff078199f1bcde2122b8709e0d17c2beffafff01010a languageName: node linkType: hard @@ -7105,6 +7137,22 @@ __metadata: languageName: node linkType: hard +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: "npm:^1.2.4" + checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 + languageName: node + linkType: hard + +"es-errors@npm:^1.1.0, es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + "es-get-iterator@npm:^1.1.3": version: 1.1.3 resolution: "es-get-iterator@npm:1.1.3" @@ -7122,45 +7170,46 @@ __metadata: languageName: node linkType: hard -"es-iterator-helpers@npm:^1.0.12, es-iterator-helpers@npm:^1.0.15": - version: 1.0.15 - resolution: "es-iterator-helpers@npm:1.0.15" +"es-iterator-helpers@npm:^1.0.15, es-iterator-helpers@npm:^1.0.17": + version: 1.0.17 + resolution: "es-iterator-helpers@npm:1.0.17" dependencies: asynciterator.prototype: "npm:^1.0.0" - call-bind: "npm:^1.0.2" + call-bind: "npm:^1.0.7" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.22.1" - es-set-tostringtag: "npm:^2.0.1" - function-bind: "npm:^1.1.1" - get-intrinsic: "npm:^1.2.1" + es-abstract: "npm:^1.22.4" + es-errors: "npm:^1.3.0" + es-set-tostringtag: "npm:^2.0.2" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" globalthis: "npm:^1.0.3" - has-property-descriptors: "npm:^1.0.0" + has-property-descriptors: "npm:^1.0.2" has-proto: "npm:^1.0.1" has-symbols: "npm:^1.0.3" - internal-slot: "npm:^1.0.5" + internal-slot: "npm:^1.0.7" iterator.prototype: "npm:^1.1.2" - safe-array-concat: "npm:^1.0.1" - checksum: 10c0/b4c83f94bfe624260d5238092de3173989f76f1416b1d02c388aea3b2024174e5f5f0e864057311ac99790b57e836ca3545b6e77256b26066dac944519f5e6d6 + safe-array-concat: "npm:^1.1.0" + checksum: 10c0/d0f281257e7165f068fd4fc3beb63d07ae4f18fbef02a2bbe4a39272b764164c1ce3311ae7c5429ac30003aef290fcdf569050e4a9ba3560e044440f68e9a47c languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.1": - version: 2.0.1 - resolution: "es-set-tostringtag@npm:2.0.1" +"es-set-tostringtag@npm:^2.0.2, es-set-tostringtag@npm:^2.0.3": + version: 2.0.3 + resolution: "es-set-tostringtag@npm:2.0.3" dependencies: - get-intrinsic: "npm:^1.1.3" - has: "npm:^1.0.3" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/9af096365e3861bb29755cc5f76f15f66a7eab0e83befca396129090c1d9737e54090278b8e5357e97b5f0a5b0459fca07c40c6740884c2659cbf90ef8e508cc + get-intrinsic: "npm:^1.2.4" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.1" + checksum: 10c0/f22aff1585eb33569c326323f0b0d175844a1f11618b86e193b386f8be0ea9474cfbe46df39c45d959f7aa8f6c06985dc51dd6bce5401645ec5a74c4ceaa836a languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0": - version: 1.0.0 - resolution: "es-shim-unscopables@npm:1.0.0" +"es-shim-unscopables@npm:^1.0.0, es-shim-unscopables@npm:^1.0.2": + version: 1.0.2 + resolution: "es-shim-unscopables@npm:1.0.2" dependencies: - has: "npm:^1.0.3" - checksum: 10c0/d54a66239fbd19535b3e50333913260394f14d2d7adb136a95396a13ca584bab400cf9cb2ffd9232f3fe2f0362540bd3a708240c493e46e13fe0b90cfcfedc3d + hasown: "npm:^2.0.0" + checksum: 10c0/f495af7b4b7601a4c0cfb893581c352636e5c08654d129590386a33a0432cf13a7bdc7b6493801cadd990d838e2839b9013d1de3b880440cb537825e834fe783 languageName: node linkType: hard @@ -7325,8 +7374,8 @@ __metadata: linkType: hard "eslint-plugin-jsdoc@npm:^48.0.0": - version: 48.1.0 - resolution: "eslint-plugin-jsdoc@npm:48.1.0" + version: 48.2.0 + resolution: "eslint-plugin-jsdoc@npm:48.2.0" dependencies: "@es-joy/jsdoccomment": "npm:~0.42.0" are-docs-informative: "npm:^0.0.2" @@ -7339,7 +7388,7 @@ __metadata: spdx-expression-parse: "npm:^4.0.0" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/e0fb3fb4479b6ee539b8c1b626de625ff5d24408f695fcbf648e214854fea9ea3e29b77f56b177bf38655e30a6c9a6eaaff93ef990f69c454c74e180747e39e5 + checksum: 10c0/778f979ca40594269d531767ab29fb2a6c448425f8f732708ac5d3b9c61bbeb8504f1490a1057c7740f3e8f8a75d57ff50c766bc40fb1474f195e6f1aed30814 languageName: node linkType: hard @@ -7388,28 +7437,30 @@ __metadata: linkType: hard "eslint-plugin-react@npm:^7.33.2": - version: 7.33.2 - resolution: "eslint-plugin-react@npm:7.33.2" + version: 7.34.0 + resolution: "eslint-plugin-react@npm:7.34.0" dependencies: - array-includes: "npm:^3.1.6" - array.prototype.flatmap: "npm:^1.3.1" - array.prototype.tosorted: "npm:^1.1.1" + array-includes: "npm:^3.1.7" + array.prototype.findlast: "npm:^1.2.4" + array.prototype.flatmap: "npm:^1.3.2" + array.prototype.toreversed: "npm:^1.1.2" + array.prototype.tosorted: "npm:^1.1.3" doctrine: "npm:^2.1.0" - es-iterator-helpers: "npm:^1.0.12" + es-iterator-helpers: "npm:^1.0.17" estraverse: "npm:^5.3.0" jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" minimatch: "npm:^3.1.2" - object.entries: "npm:^1.1.6" - object.fromentries: "npm:^2.0.6" - object.hasown: "npm:^1.1.2" - object.values: "npm:^1.1.6" + object.entries: "npm:^1.1.7" + object.fromentries: "npm:^2.0.7" + object.hasown: "npm:^1.1.3" + object.values: "npm:^1.1.7" prop-types: "npm:^15.8.1" - resolve: "npm:^2.0.0-next.4" + resolve: "npm:^2.0.0-next.5" semver: "npm:^6.3.1" - string.prototype.matchall: "npm:^4.0.8" + string.prototype.matchall: "npm:^4.0.10" peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 10c0/f9b247861024bafc396c4bd3c9ac946604b3b23077251c98f23602aa22027a0c33a69157fd49564e4ff7f17b3678e5dc366a46c7ec42a09454d7cbce786d5001 + checksum: 10c0/9bf0b959373ace66e799adbbfb493a7ceae54751e8f90fcce1da1a2a67b277ee23ba845571eaa4d4f05d96dba4e4977bf938b350f18bad26201fa616ee6aa4b8 languageName: node linkType: hard @@ -7441,14 +7492,14 @@ __metadata: linkType: hard "eslint@npm:^8.41.0": - version: 8.56.0 - resolution: "eslint@npm:8.56.0" + version: 8.57.0 + resolution: "eslint@npm:8.57.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.6.1" "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.56.0" - "@humanwhocodes/config-array": "npm:^0.11.13" + "@eslint/js": "npm:8.57.0" + "@humanwhocodes/config-array": "npm:^0.11.14" "@humanwhocodes/module-importer": "npm:^1.0.1" "@nodelib/fs.walk": "npm:^1.2.8" "@ungap/structured-clone": "npm:^1.2.0" @@ -7484,7 +7535,7 @@ __metadata: text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: 10c0/2be598f7da1339d045ad933ffd3d4742bee610515cd2b0d9a2b8b729395a01d4e913552fff555b559fccaefd89d7b37632825789d1b06470608737ae69ab43fb + checksum: 10c0/00bb96fd2471039a312435a6776fe1fd557c056755eaa2b96093ef3a8508c92c8775d5f754768be6b1dddd09fdd3379ddb231eeb9b6c579ee17ea7d68000a529 languageName: node linkType: hard @@ -8218,7 +8269,7 @@ __metadata: languageName: node linkType: hard -"function-bind@npm:^1.1.1, function-bind@npm:^1.1.2": +"function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 @@ -8272,15 +8323,16 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": - version: 1.2.2 - resolution: "get-intrinsic@npm:1.2.2" +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" dependencies: + es-errors: "npm:^1.3.0" function-bind: "npm:^1.1.2" has-proto: "npm:^1.0.1" has-symbols: "npm:^1.0.3" hasown: "npm:^2.0.0" - checksum: 10c0/4e7fb8adc6172bae7c4fe579569b4d5238b3667c07931cd46b4eee74bbe6ff6b91329bec311a638d8e60f5b51f44fe5445693c6be89ae88d4b5c49f7ff12db0b + checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 languageName: node linkType: hard @@ -8321,13 +8373,14 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.0": - version: 1.0.0 - resolution: "get-symbol-description@npm:1.0.0" +"get-symbol-description@npm:^1.0.2": + version: 1.0.2 + resolution: "get-symbol-description@npm:1.0.2" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.1.1" - checksum: 10c0/23bc3b44c221cdf7669a88230c62f4b9e30393b61eb21ba4400cb3e346801bd8f95fe4330ee78dbae37aecd874646d53e3e76a17a654d0c84c77f6690526d6bb + call-bind: "npm:^1.0.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + checksum: 10c0/867be6d63f5e0eb026cb3b0ef695ec9ecf9310febb041072d2e142f260bd91ced9eeb426b3af98791d1064e324e653424afa6fd1af17dee373bea48ae03162bc languageName: node linkType: hard @@ -8567,19 +8620,19 @@ __metadata: languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.1, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" dependencies: - get-intrinsic: "npm:^1.1.1" - checksum: 10c0/d4ca882b6960d6257bd28baa3ddfa21f068d260411004a093b30ca357c740e11e985771c85216a6d1eef4161e862657f48c4758ec8ab515223b3895200ad164b + es-define-property: "npm:^1.0.0" + checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 languageName: node linkType: hard -"has-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "has-proto@npm:1.0.1" - checksum: 10c0/c8a8fe411f810b23a564bd5546a8f3f0fff6f1b692740eb7a2fdc9df716ef870040806891e2f23ff4653f1083e3895bf12088703dd1a0eac3d9202d3a4768cd0 +"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 languageName: node linkType: hard @@ -8590,12 +8643,12 @@ __metadata: languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-tostringtag@npm:1.0.0" +"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.1, has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" dependencies: - has-symbols: "npm:^1.0.2" - checksum: 10c0/1cdba76b7d13f65198a92b8ca1560ba40edfa09e85d182bf436d928f3588a9ebd260451d569f0ed1b849c4bf54f49c862aa0d0a77f9552b1855bb6deb526c011 + has-symbols: "npm:^1.0.3" + checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c languageName: node linkType: hard @@ -8638,13 +8691,6 @@ __metadata: languageName: node linkType: hard -"has@npm:^1.0.3": - version: 1.0.4 - resolution: "has@npm:1.0.4" - checksum: 10c0/82c1220573dc1f0a014a5d6189ae52a1f820f99dfdc00323c3a725b5002dcb7f04e44f460fea7af068474b2dd7c88cbe1846925c84017be9e31e1708936d305b - languageName: node - linkType: hard - "hash-base@npm:^3.0.0": version: 3.1.0 resolution: "hash-base@npm:3.1.0" @@ -8666,12 +8712,12 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0": - version: 2.0.0 - resolution: "hasown@npm:2.0.0" +"hasown@npm:^2.0.0, hasown@npm:^2.0.1": + version: 2.0.1 + resolution: "hasown@npm:2.0.1" dependencies: function-bind: "npm:^1.1.2" - checksum: 10c0/5d415b114f410661208c95e7ab4879f1cc2765b8daceff4dc8718317d1cb7b9ffa7c5d1eafd9a4389c9aab7445d6ea88e05f3096cb1e529618b55304956b87fc + checksum: 10c0/9e27e70e8e4204f4124c8f99950d1ba2b1f5174864fd39ff26da190f9ea6488c1b3927dcc64981c26d1f637a971783c9489d62c829d393ea509e6f1ba20370bb languageName: node linkType: hard @@ -9116,14 +9162,14 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.3, internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.5": - version: 1.0.5 - resolution: "internal-slot@npm:1.0.5" +"internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.5, internal-slot@npm:^1.0.7": + version: 1.0.7 + resolution: "internal-slot@npm:1.0.7" dependencies: - get-intrinsic: "npm:^1.2.0" - has: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + hasown: "npm:^2.0.0" side-channel: "npm:^1.0.4" - checksum: 10c0/66d8a66b4b5310c042e8ad00ce895dc55cb25165a3a7da0d7862ca18d69d3b1ba86511b4bf3baf4273d744d3f6e9154574af45189ef11135a444945309e39e4a + checksum: 10c0/f8b294a4e6ea3855fc59551bbf35f2b832cf01fd5e6e2a97f5c201a071cc09b49048f856e484b67a6c721da5e55736c5b6ddafaf19e2dbeb4a3ff1821680de6c languageName: node linkType: hard @@ -9242,14 +9288,13 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": - version: 3.0.2 - resolution: "is-array-buffer@npm:3.0.2" +"is-array-buffer@npm:^3.0.2, is-array-buffer@npm:^3.0.4": + version: 3.0.4 + resolution: "is-array-buffer@npm:3.0.4" dependencies: call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.0" - is-typed-array: "npm:^1.1.10" - checksum: 10c0/40ed13a5f5746ac3ae2f2e463687d9b5a3f5fd0086f970fb4898f0253c2a5ec2e3caea2d664dd8f54761b1c1948609702416921a22faebe160c7640a9217c80e + get-intrinsic: "npm:^1.2.1" + checksum: 10c0/42a49d006cc6130bc5424eae113e948c146f31f9d24460fc0958f855d9d810e6fd2e4519bf19aab75179af9c298ea6092459d8cafdec523cd19e529b26eab860 languageName: node linkType: hard @@ -9322,7 +9367,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.9.0": +"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" dependencies: @@ -9504,10 +9549,10 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.2": - version: 2.0.2 - resolution: "is-negative-zero@npm:2.0.2" - checksum: 10c0/eda024c158f70f2017f3415e471b818d314da5ef5be68f801b16314d4a4b6304a74cbed778acf9e2f955bb9c1c5f2935c1be0c7c99e1ad12286f45366217b6a3 +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e languageName: node linkType: hard @@ -9622,12 +9667,12 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "is-shared-array-buffer@npm:1.0.2" +"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "is-shared-array-buffer@npm:1.0.3" dependencies: - call-bind: "npm:^1.0.2" - checksum: 10c0/cfeee6f171f1b13e6cbc6f3b6cc44e192b93df39f3fcb31aa66ffb1d2df3b91e05664311659f9701baba62f5e98c83b0673c628e7adc30f55071c4874fcdccec + call-bind: "npm:^1.0.7" + checksum: 10c0/adc11ab0acbc934a7b9e5e9d6c588d4ec6682f6fea8cda5180721704fa32927582ede5b123349e32517fdadd07958973d24716c80e7ab198970c47acc09e59c7 languageName: node linkType: hard @@ -9670,12 +9715,12 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.9": - version: 1.1.12 - resolution: "is-typed-array@npm:1.1.12" +"is-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "is-typed-array@npm:1.1.13" dependencies: - which-typed-array: "npm:^1.1.11" - checksum: 10c0/9863e9cc7223c6fc1c462a2c3898a7beff6b41b1ee0fabb03b7d278ae7de670b5bcbc8627db56bb66ed60902fa37d53fe5cce0fd2f7d73ac64fe5da6f409b6ae + which-typed-array: "npm:^1.1.14" + checksum: 10c0/fa5cb97d4a80e52c2cc8ed3778e39f175a1a2ae4ddf3adae3187d69586a1fd57cfa0b095db31f66aa90331e9e3da79184cea9c6abdcd1abc722dc3c3edd51cca languageName: node linkType: hard @@ -11830,19 +11875,19 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.4": - version: 4.1.4 - resolution: "object.assign@npm:4.1.4" +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.5": + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" has-symbols: "npm:^1.0.3" object-keys: "npm:^1.1.1" - checksum: 10c0/2f286118c023e557757620e647b02e7c88d3d417e0c568fca0820de8ec9cca68928304854d5b03e99763eddad6e78a6716e2930f7e6372e4b9b843f3fd3056f3 + checksum: 10c0/60108e1fa2706f22554a4648299b0955236c62b3685c52abf4988d14fffb0e7731e00aa8c6448397e3eb63d087dcc124a9f21e1980f36d0b2667f3c18bacd469 languageName: node linkType: hard -"object.entries@npm:^1.1.6, object.entries@npm:^1.1.7": +"object.entries@npm:^1.1.7": version: 1.1.7 resolution: "object.entries@npm:1.1.7" dependencies: @@ -11853,7 +11898,7 @@ __metadata: languageName: node linkType: hard -"object.fromentries@npm:^2.0.6, object.fromentries@npm:^2.0.7": +"object.fromentries@npm:^2.0.7": version: 2.0.7 resolution: "object.fromentries@npm:2.0.7" dependencies: @@ -11889,13 +11934,13 @@ __metadata: languageName: node linkType: hard -"object.hasown@npm:^1.1.2": - version: 1.1.2 - resolution: "object.hasown@npm:1.1.2" +"object.hasown@npm:^1.1.3": + version: 1.1.3 + resolution: "object.hasown@npm:1.1.3" dependencies: - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.20.4" - checksum: 10c0/419fc1c74a2aea7ebb4d49b79d5b1599a010b26c18eae35bd061ccdd013ccb749c499d8dd6ee21a91e6d7264ccc592573d0f13562970f76e25fc844d8c1b02ce + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 10c0/8a41ba4fb1208a85c2275e9b5098071beacc24345b9a71ab98ef0a1c61b34dc74c6b460ff1e1884c33843d8f2553df64a10eec2b74b3ed009e3b2710c826bd2c languageName: node linkType: hard @@ -12605,6 +12650,13 @@ __metadata: languageName: node linkType: hard +"possible-typed-array-names@npm:^1.0.0": + version: 1.0.0 + resolution: "possible-typed-array-names@npm:1.0.0" + checksum: 10c0/d9aa22d31f4f7680e20269db76791b41c3a32c01a373e25f8a4813b4d45f7456bfc2b6d68f752dc4aab0e0bb0721cb3d76fb678c9101cb7a16316664bc2c73fd + languageName: node + linkType: hard + "postcss-calc@npm:^9.0.1": version: 9.0.1 resolution: "postcss-calc@npm:9.0.1" @@ -14011,14 +14063,15 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.2.0, regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.1": - version: 1.5.1 - resolution: "regexp.prototype.flags@npm:1.5.1" +"regexp.prototype.flags@npm:^1.2.0, regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.2": + version: 1.5.2 + resolution: "regexp.prototype.flags@npm:1.5.2" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - set-function-name: "npm:^2.0.0" - checksum: 10c0/1de7d214c0a726c7c874a7023e47b0e27b9f7fdb64175bfe1861189de1704aaeca05c3d26c35aa375432289b99946f3cf86651a92a8f7601b90d8c226a23bcd8 + call-bind: "npm:^1.0.6" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + set-function-name: "npm:^2.0.1" + checksum: 10c0/0f3fc4f580d9c349f8b560b012725eb9c002f36daa0041b3fbf6f4238cb05932191a4d7d5db3b5e2caa336d5150ad0402ed2be81f711f9308fe7e1a9bf9bd552 languageName: node linkType: hard @@ -14207,16 +14260,16 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^2.0.0-next.4": - version: 2.0.0-next.4 - resolution: "resolve@npm:2.0.0-next.4" +"resolve@npm:^2.0.0-next.5": + version: 2.0.0-next.5 + resolution: "resolve@npm:2.0.0-next.5" dependencies: - is-core-module: "npm:^2.9.0" + is-core-module: "npm:^2.13.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/1de92669e7c46cfe125294c66d5405e13288bb87b97e9bdab71693ceebbcc0255c789bde30e2834265257d330d8ff57414d7d88e3097d8f69951f3ce978bf045 + checksum: 10c0/a6c33555e3482ea2ec4c6e3d3bf0d78128abf69dca99ae468e64f1e30acaa318fd267fb66c8836b04d558d3e2d6ed875fe388067e7d8e0de647d3c21af21c43a languageName: node linkType: hard @@ -14233,16 +14286,16 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^2.0.0-next.4#optional!builtin": - version: 2.0.0-next.4 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#optional!builtin::version=2.0.0-next.4&hash=c3c19d" +"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin": + version: 2.0.0-next.5 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" dependencies: - is-core-module: "npm:^2.9.0" + is-core-module: "npm:^2.13.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/ed2bb51d616b9cd30fe85cf49f7a2240094d9fa01a221d361918462be81f683d1855b7f192391d2ab5325245b42464ca59690db5bd5dad0a326fc0de5974dd10 + checksum: 10c0/78ad6edb8309a2bfb720c2c1898f7907a37f858866ce11a5974643af1203a6a6e05b2fa9c53d8064a673a447b83d42569260c306d43628bff5bb101969708355 languageName: node linkType: hard @@ -14371,15 +14424,15 @@ __metadata: languageName: node linkType: hard -"safe-array-concat@npm:^1.0.0, safe-array-concat@npm:^1.0.1": - version: 1.0.1 - resolution: "safe-array-concat@npm:1.0.1" +"safe-array-concat@npm:^1.0.0, safe-array-concat@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-array-concat@npm:1.1.0" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.1" + call-bind: "npm:^1.0.5" + get-intrinsic: "npm:^1.2.2" has-symbols: "npm:^1.0.3" isarray: "npm:^2.0.5" - checksum: 10c0/4b15ce5fce5ce4d7e744a63592cded88d2f27806ed229eadb2e42629cbcd40e770f7478608e75f455e7fe341acd8c0a01bdcd7146b10645ea7411c5e3c1d1dd8 + checksum: 10c0/833d3d950fc7507a60075f9bfaf41ec6dac7c50c7a9d62b1e6b071ecc162185881f92e594ff95c1a18301c881352dd6fd236d56999d5819559db7b92da9c28af languageName: node linkType: hard @@ -14397,14 +14450,14 @@ __metadata: languageName: node linkType: hard -"safe-regex-test@npm:^1.0.0": - version: 1.0.0 - resolution: "safe-regex-test@npm:1.0.0" +"safe-regex-test@npm:^1.0.3": + version: 1.0.3 + resolution: "safe-regex-test@npm:1.0.3" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.1.3" + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" is-regex: "npm:^1.1.4" - checksum: 10c0/14a81a7e683f97b2d6e9c8be61fddcf8ed7a02f4e64a825515f96bb1738eb007145359313741d2704d28b55b703a0f6300c749dde7c1dbc13952a2b85048ede2 + checksum: 10c0/900bf7c98dc58f08d8523b7012b468e4eb757afa624f198902c0643d7008ba777b0bdc35810ba0b758671ce887617295fb742b3f3968991b178ceca54cb07603 languageName: node linkType: hard @@ -14662,15 +14715,17 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.1.1": - version: 1.1.1 - resolution: "set-function-length@npm:1.1.1" +"set-function-length@npm:^1.2.1": + version: 1.2.1 + resolution: "set-function-length@npm:1.2.1" dependencies: - define-data-property: "npm:^1.1.1" - get-intrinsic: "npm:^1.2.1" + define-data-property: "npm:^1.1.2" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.3" gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - checksum: 10c0/a29e255c116c29e3323b851c4f46c58c91be9bb8b065f191e2ea1807cb2c839df56e3175732a498e0c6d54626ba6b6fef896bf699feb7ab70c42dc47eb247c95 + has-property-descriptors: "npm:^1.0.1" + checksum: 10c0/1927e296599f2c04d210c1911f1600430a5e49e04a6d8bb03dca5487b95a574da9968813a2ced9a774bd3e188d4a6208352c8f64b8d4674cdb021dca21e190ca languageName: node linkType: hard @@ -15323,19 +15378,20 @@ __metadata: languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.6, string.prototype.matchall@npm:^4.0.8": - version: 4.0.8 - resolution: "string.prototype.matchall@npm:4.0.8" +"string.prototype.matchall@npm:^4.0.10, string.prototype.matchall@npm:^4.0.6": + version: 4.0.10 + resolution: "string.prototype.matchall@npm:4.0.10" dependencies: call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.20.4" - get-intrinsic: "npm:^1.1.3" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + get-intrinsic: "npm:^1.2.1" has-symbols: "npm:^1.0.3" - internal-slot: "npm:^1.0.3" - regexp.prototype.flags: "npm:^1.4.3" + internal-slot: "npm:^1.0.5" + regexp.prototype.flags: "npm:^1.5.0" + set-function-name: "npm:^2.0.0" side-channel: "npm:^1.0.4" - checksum: 10c0/644523d05c1ee93bab7474e999a5734ee5f6ad2d7ad24ed6ea8706c270dc92b352bde0f2a5420bfbeed54e28cb6a770c3800e1988a5267a70fd5e677c7750abc + checksum: 10c0/cd7495fb0de16d43efeee3887b98701941f3817bd5f09351ad1825b023d307720c86394d56d56380563d97767ab25bf5448db239fcecbb85c28e2180f23e324a languageName: node linkType: hard @@ -16183,50 +16239,55 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-buffer@npm:1.0.0" +"typed-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-buffer@npm:1.0.2" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.1" - is-typed-array: "npm:^1.1.10" - checksum: 10c0/ebad66cdf00c96b1395dffc7873169cf09801fca5954507a484f41f253feb1388d815db297b0b3bb8ce7421eac6f7ff45e2ec68450a3d68408aa4ae02fcf3a6c + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.13" + checksum: 10c0/9e043eb38e1b4df4ddf9dde1aa64919ae8bb909571c1cc4490ba777d55d23a0c74c7d73afcdd29ec98616d91bb3ae0f705fad4421ea147e1daf9528200b562da languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-byte-length@npm:1.0.0" +"typed-array-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "typed-array-byte-length@npm:1.0.1" dependencies: - call-bind: "npm:^1.0.2" + call-bind: "npm:^1.0.7" for-each: "npm:^0.3.3" - has-proto: "npm:^1.0.1" - is-typed-array: "npm:^1.1.10" - checksum: 10c0/6696435d53ce0e704ff6760c57ccc35138aec5f87859e03eb2a3246336d546feae367952dbc918116f3f0dffbe669734e3cbd8960283c2fa79aac925db50d888 + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.3" + is-typed-array: "npm:^1.1.13" + checksum: 10c0/fcebeffb2436c9f355e91bd19e2368273b88c11d1acc0948a2a306792f1ab672bce4cfe524ab9f51a0505c9d7cd1c98eff4235c4f6bfef6a198f6cfc4ff3d4f3 languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-byte-offset@npm:1.0.0" +"typed-array-byte-offset@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-byte-offset@npm:1.0.2" dependencies: - available-typed-arrays: "npm:^1.0.5" - call-bind: "npm:^1.0.2" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" for-each: "npm:^0.3.3" - has-proto: "npm:^1.0.1" - is-typed-array: "npm:^1.1.10" - checksum: 10c0/4036ce007ae9752931bed3dd61e0d6de2a3e5f6a5a85a05f3adb35388d2c0728f9b1a1e638d75579f168e49c289bfb5417f00e96d4ab081f38b647fc854ff7a5 + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.3" + is-typed-array: "npm:^1.1.13" + checksum: 10c0/d2628bc739732072e39269389a758025f75339de2ed40c4f91357023c5512d237f255b633e3106c461ced41907c1bf9a533c7e8578066b0163690ca8bc61b22f languageName: node linkType: hard -"typed-array-length@npm:^1.0.4": - version: 1.0.4 - resolution: "typed-array-length@npm:1.0.4" +"typed-array-length@npm:^1.0.5": + version: 1.0.5 + resolution: "typed-array-length@npm:1.0.5" dependencies: - call-bind: "npm:^1.0.2" + call-bind: "npm:^1.0.7" for-each: "npm:^0.3.3" - is-typed-array: "npm:^1.1.9" - checksum: 10c0/c5163c0103d07fefc8a2ad0fc151f9ca9a1f6422098c00f695d55f9896e4d63614cd62cf8d8a031c6cee5f418e8980a533796597174da4edff075b3d275a7e23 + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.3" + is-typed-array: "npm:^1.1.13" + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/5cc0f79196e70a92f8f40846cfa62b3de6be51e83f73655e137116cf65e3c29a288502b18cc8faf33c943c2470a4569009e1d6da338441649a2db2f135761ad5 languageName: node linkType: hard @@ -17087,16 +17148,16 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.9": - version: 1.1.13 - resolution: "which-typed-array@npm:1.1.13" +"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.9": + version: 1.1.14 + resolution: "which-typed-array@npm:1.1.14" dependencies: - available-typed-arrays: "npm:^1.0.5" - call-bind: "npm:^1.0.4" + available-typed-arrays: "npm:^1.0.6" + call-bind: "npm:^1.0.5" for-each: "npm:^0.3.3" gopd: "npm:^1.0.1" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/9f5f1c42918df3d5b91c4315ed0051d5d874370998bf095c9ae0df374f0881f85094e3c384b8fb08ab7b4d4f54ba81c0aff75da6226e7c0589b83dfbec1cd4c9 + has-tostringtag: "npm:^1.0.1" + checksum: 10c0/0960f1e77807058819451b98c51d4cd72031593e8de990b24bd3fc22e176f5eee22921d68d852297c786aec117689f0423ed20aa4fde7ce2704d680677891f56 languageName: node linkType: hard From 4c138ee4eb62505b3a8af53501b5a02872532003 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 10:42:26 +0100 Subject: [PATCH 119/954] Update DefinitelyTyped types (non-major) (#29502) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index c5ec6e5f8c..75a725c4ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3266,13 +3266,13 @@ __metadata: linkType: hard "@types/pg@npm:^8.6.6": - version: 8.11.1 - resolution: "@types/pg@npm:8.11.1" + version: 8.11.2 + resolution: "@types/pg@npm:8.11.2" dependencies: "@types/node": "npm:*" pg-protocol: "npm:*" pg-types: "npm:^4.0.1" - checksum: 10c0/7563075e037c8f7579cfb55e60e0891b742537ac50dc1d802051185513f850725fb05a635418ff26602c7cb6f176f6677a0099d586d51b72c651bb741b05b6e7 + checksum: 10c0/6d873af7f71785d5d4db49311c5c73628918b2b1ece83f17073c4470b2fce6bd24a37de23a42ea0221df4e1c7dc43ea035bb9d0b6274f86ec692b21503a9a55c languageName: node linkType: hard @@ -3456,13 +3456,13 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7": - version: 18.2.58 - resolution: "@types/react@npm:18.2.58" + version: 18.2.63 + resolution: "@types/react@npm:18.2.63" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/80145b707b780d682092b51d520f58a0171c4067ff36cf488d3346d92b715b27fd334acd0fabb8eb21a4eb6c4061f1535e8bfa6642a7f4025e63ebec868fb6d1 + checksum: 10c0/53d86727b966a3ba097553b5ef75a1f2bea78bd8c54ebcf6d00bd338000112b208ab30536c8c0a9f5fc61055cc3fbabbc7a23910c55092341602845de4c13714 languageName: node linkType: hard From 7265d47342c82721e5f2a8570b69de3b4171a803 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 09:42:49 +0000 Subject: [PATCH 120/954] Update peter-evans/create-pull-request action to v6.0.1 (#29503) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/crowdin-download.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/crowdin-download.yml b/.github/workflows/crowdin-download.yml index a676ff12fc..45580bd06f 100644 --- a/.github/workflows/crowdin-download.yml +++ b/.github/workflows/crowdin-download.yml @@ -52,7 +52,7 @@ jobs: # Create or update the pull request - name: Create Pull Request - uses: peter-evans/create-pull-request@v6.0.0 + uses: peter-evans/create-pull-request@v6.0.1 with: commit-message: 'New Crowdin translations' title: 'New Crowdin Translations (automated)' From f89512fbedb547f66a72eefdff047768fb505eb6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 15:09:52 +0100 Subject: [PATCH 121/954] Update dependency rack-cors to v2.0.2 [SECURITY] (#29507) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 076cf915d0..6ee799eab2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -535,7 +535,7 @@ GEM rack (2.2.8.1) rack-attack (6.7.0) rack (>= 1.0, < 4) - rack-cors (2.0.1) + rack-cors (2.0.2) rack (>= 2.0.0) rack-oauth2 (1.21.3) activesupport From b8bd94ca8edb5a675ef70aac9c941ed340efc127 Mon Sep 17 00:00:00 2001 From: Mashiro Date: Wed, 6 Mar 2024 20:53:54 +0800 Subject: [PATCH 122/954] Fix unhandled nullable attachments limitation counter (#29183) --- .../containers/upload_button_container.js | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/app/javascript/mastodon/features/compose/containers/upload_button_container.js b/app/javascript/mastodon/features/compose/containers/upload_button_container.js index 7c4757b6c3..066e185346 100644 --- a/app/javascript/mastodon/features/compose/containers/upload_button_container.js +++ b/app/javascript/mastodon/features/compose/containers/upload_button_container.js @@ -3,14 +3,24 @@ import { connect } from 'react-redux'; import { uploadCompose } from '../../../actions/compose'; import UploadButton from '../components/upload_button'; -const mapStateToProps = state => ({ - disabled: state.getIn(['compose', 'poll']) !== null || state.getIn(['compose', 'is_uploading']) || (state.getIn(['compose', 'media_attachments']).size + state.getIn(['compose', 'pending_media_attachments']) > 3 || state.getIn(['compose', 'media_attachments']).some(m => ['video', 'audio'].includes(m.get('type')))), - resetFileKey: state.getIn(['compose', 'resetFileKey']), -}); +const mapStateToProps = state => { + const isPoll = state.getIn(['compose', 'poll']) !== null; + const isUploading = state.getIn(['compose', 'is_uploading']); + const readyAttachmentsSize = state.getIn(['compose', 'media_attachments']).size ?? 0; + const pendingAttachmentsSize = state.getIn(['compose', 'pending_media_attachments']).size ?? 0; + const attachmentsSize = readyAttachmentsSize + pendingAttachmentsSize; + const isOverLimit = attachmentsSize > 3; + const hasVideoOrAudio = state.getIn(['compose', 'media_attachments']).some(m => ['video', 'audio'].includes(m.get('type'))); + + return { + disabled: isPoll || isUploading || isOverLimit || hasVideoOrAudio, + resetFileKey: state.getIn(['compose', 'resetFileKey']), + }; +}; const mapDispatchToProps = dispatch => ({ - onSelectFile (files) { + onSelectFile(files) { dispatch(uploadCompose(files)); }, From 995e15c24ab24bf153463299ded92db89116fa13 Mon Sep 17 00:00:00 2001 From: gunchleoc Date: Thu, 7 Mar 2024 11:03:41 +0000 Subject: [PATCH 123/954] Add Jawi Malay to posting languages (#29098) --- app/helpers/languages_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb index 65ade9fd2a..539020ece9 100644 --- a/app/helpers/languages_helper.rb +++ b/app/helpers/languages_helper.rb @@ -109,6 +109,7 @@ module LanguagesHelper mn: ['Mongolian', 'Монгол хэл'].freeze, mr: ['Marathi', 'मराठी'].freeze, ms: ['Malay', 'Bahasa Melayu'].freeze, + 'ms-Arab': ['Jawi Malay', 'بهاس ملايو'].freeze, mt: ['Maltese', 'Malti'].freeze, my: ['Burmese', 'ဗမာစာ'].freeze, na: ['Nauru', 'Ekakairũ Naoero'].freeze, From c01f4cebed27a1c11085e8aebe7719b3cee7ae7f Mon Sep 17 00:00:00 2001 From: gunchleoc Date: Thu, 7 Mar 2024 11:04:31 +0000 Subject: [PATCH 124/954] Add Mohawk to posting languages (#27115) --- app/helpers/languages_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb index 539020ece9..79d8cf794c 100644 --- a/app/helpers/languages_helper.rb +++ b/app/helpers/languages_helper.rb @@ -197,6 +197,7 @@ module LanguagesHelper kab: ['Kabyle', 'Taqbaylit'].freeze, ldn: ['Láadan', 'Láadan'].freeze, lfn: ['Lingua Franca Nova', 'lingua franca nova'].freeze, + moh: ['Mohawk', 'Kanienʼkéha'].freeze, pdc: ['Pennsylvania Dutch', 'Pennsilfaani-Deitsch'].freeze, sco: ['Scots', 'Scots'].freeze, sma: ['Southern Sami', 'Åarjelsaemien Gïele'].freeze, From 653ce43abe0a928d944a15c433d2c8324f9b5e2a Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Thu, 7 Mar 2024 12:11:14 +0100 Subject: [PATCH 125/954] Update `json-jwt` gem to fix CVE-2023-51774 (#29520) --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6ee799eab2..59b24e1035 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -357,7 +357,7 @@ GEM jmespath (1.6.2) json (2.7.1) json-canonicalization (1.0.0) - json-jwt (1.15.3) + json-jwt (1.15.3.1) activesupport (>= 4.2) aes_key_wrap bindata From 50b17f7e10fe2576f0526768a9269f3013932d8a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 7 Mar 2024 15:53:37 +0100 Subject: [PATCH 126/954] Add notification policies and notification requests (#29366) --- .../v1/notifications/policies_controller.rb | 37 +++ .../v1/notifications/requests_controller.rb | 75 +++++ .../api/v1/notifications_controller.rb | 7 +- app/models/concerns/account/associations.rb | 7 +- app/models/notification.rb | 11 +- app/models/notification_permission.rb | 16 ++ app/models/notification_policy.rb | 36 +++ app/models/notification_request.rb | 53 ++++ .../rest/notification_policy_serializer.rb | 16 ++ .../rest/notification_request_serializer.rb | 16 ++ .../accept_notification_request_service.rb | 8 + app/services/notify_service.rb | 267 +++++++++++------- .../preferences/notifications/show.html.haml | 8 - app/workers/unfilter_notifications_worker.rb | 37 +++ config/locales/an.yml | 1 - config/locales/ar.yml | 1 - config/locales/ast.yml | 1 - config/locales/be.yml | 1 - config/locales/bg.yml | 1 - config/locales/ca.yml | 1 - config/locales/ckb.yml | 1 - config/locales/co.yml | 1 - config/locales/cs.yml | 1 - config/locales/cy.yml | 1 - config/locales/da.yml | 1 - config/locales/de.yml | 1 - config/locales/el.yml | 1 - config/locales/en-GB.yml | 1 - config/locales/en.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/et.yml | 1 - config/locales/eu.yml | 1 - config/locales/fa.yml | 1 - config/locales/fi.yml | 1 - config/locales/fo.yml | 1 - config/locales/fr-CA.yml | 1 - config/locales/fr.yml | 1 - config/locales/fy.yml | 1 - config/locales/gd.yml | 1 - config/locales/gl.yml | 1 - config/locales/he.yml | 1 - config/locales/hu.yml | 1 - config/locales/hy.yml | 1 - config/locales/id.yml | 1 - config/locales/ie.yml | 1 - config/locales/io.yml | 1 - config/locales/is.yml | 1 - config/locales/it.yml | 1 - config/locales/ja.yml | 1 - config/locales/kab.yml | 2 - config/locales/kk.yml | 1 - config/locales/ko.yml | 1 - config/locales/ku.yml | 1 - config/locales/lad.yml | 1 - config/locales/lv.yml | 1 - config/locales/ms.yml | 1 - config/locales/my.yml | 1 - config/locales/nl.yml | 1 - config/locales/nn.yml | 1 - config/locales/no.yml | 1 - config/locales/oc.yml | 1 - config/locales/pl.yml | 1 - config/locales/pt-BR.yml | 1 - config/locales/pt-PT.yml | 1 - config/locales/ru.yml | 1 - config/locales/sc.yml | 1 - config/locales/sco.yml | 1 - config/locales/si.yml | 1 - config/locales/sk.yml | 1 - config/locales/sl.yml | 1 - config/locales/sq.yml | 1 - config/locales/sr-Latn.yml | 1 - config/locales/sr.yml | 1 - config/locales/sv.yml | 1 - config/locales/ta.yml | 1 - config/locales/th.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-HK.yml | 1 - config/locales/zh-TW.yml | 1 - config/routes/api.rb | 11 + ...221195424_add_filtered_to_notifications.rb | 7 + ...0221195828_create_notification_requests.rb | 18 ++ ...tification_request_ids_to_timestamp_ids.rb | 15 + ...2193403_create_notification_permissions.rb | 12 + ...0222203722_create_notification_policies.rb | 15 + ...620_add_filtered_index_on_notifications.rb | 9 + ..._migrate_interaction_settings_to_policy.rb | 46 +++ db/schema.rb | 44 ++- .../notifications_controller_spec.rb | 4 +- .../notification_permission_fabricator.rb | 6 + .../notification_policy_fabricator.rb | 9 + .../notification_request_fabricator.rb | 8 + spec/models/notification_policy_spec.rb | 25 ++ spec/models/notification_request_spec.rb | 44 +++ spec/requests/api/v1/conversations_spec.rb | 1 + .../api/v1/notifications/policies_spec.rb | 48 ++++ .../api/v1/notifications/requests_spec.rb | 107 +++++++ spec/services/notify_service_spec.rb | 248 ++++++++++++---- 104 files changed, 1096 insertions(+), 247 deletions(-) create mode 100644 app/controllers/api/v1/notifications/policies_controller.rb create mode 100644 app/controllers/api/v1/notifications/requests_controller.rb create mode 100644 app/models/notification_permission.rb create mode 100644 app/models/notification_policy.rb create mode 100644 app/models/notification_request.rb create mode 100644 app/serializers/rest/notification_policy_serializer.rb create mode 100644 app/serializers/rest/notification_request_serializer.rb create mode 100644 app/services/accept_notification_request_service.rb create mode 100644 app/workers/unfilter_notifications_worker.rb create mode 100644 db/migrate/20240221195424_add_filtered_to_notifications.rb create mode 100644 db/migrate/20240221195828_create_notification_requests.rb create mode 100644 db/migrate/20240221211359_notification_request_ids_to_timestamp_ids.rb create mode 100644 db/migrate/20240222193403_create_notification_permissions.rb create mode 100644 db/migrate/20240222203722_create_notification_policies.rb create mode 100644 db/migrate/20240227191620_add_filtered_index_on_notifications.rb create mode 100644 db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb create mode 100644 spec/fabricators/notification_permission_fabricator.rb create mode 100644 spec/fabricators/notification_policy_fabricator.rb create mode 100644 spec/fabricators/notification_request_fabricator.rb create mode 100644 spec/models/notification_policy_spec.rb create mode 100644 spec/models/notification_request_spec.rb create mode 100644 spec/requests/api/v1/notifications/policies_spec.rb create mode 100644 spec/requests/api/v1/notifications/requests_spec.rb diff --git a/app/controllers/api/v1/notifications/policies_controller.rb b/app/controllers/api/v1/notifications/policies_controller.rb new file mode 100644 index 0000000000..1ec336f9a5 --- /dev/null +++ b/app/controllers/api/v1/notifications/policies_controller.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +class Api::V1::Notifications::PoliciesController < Api::BaseController + before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, only: :show + before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, only: :update + + before_action :require_user! + before_action :set_policy + + def show + render json: @policy, serializer: REST::NotificationPolicySerializer + end + + def update + @policy.update!(resource_params) + render json: @policy, serializer: REST::NotificationPolicySerializer + end + + private + + def set_policy + @policy = NotificationPolicy.find_or_initialize_by(account: current_account) + + with_read_replica do + @policy.summarize! + end + end + + def resource_params + params.permit( + :filter_not_following, + :filter_not_followers, + :filter_new_accounts, + :filter_private_mentions + ) + end +end diff --git a/app/controllers/api/v1/notifications/requests_controller.rb b/app/controllers/api/v1/notifications/requests_controller.rb new file mode 100644 index 0000000000..dbb9871530 --- /dev/null +++ b/app/controllers/api/v1/notifications/requests_controller.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +class Api::V1::Notifications::RequestsController < Api::BaseController + before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, only: :index + before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, except: :index + + before_action :require_user! + before_action :set_request, except: :index + + after_action :insert_pagination_headers, only: :index + + def index + with_read_replica do + @requests = load_requests + @relationships = relationships + end + + render json: @requests, each_serializer: REST::NotificationRequestSerializer, relationships: @relationships + end + + def accept + AcceptNotificationRequestService.new.call(@request) + render_empty + end + + def dismiss + @request.update!(dismissed: true) + render_empty + end + + private + + def load_requests + requests = NotificationRequest.where(account: current_account).where(dismissed: truthy_param?(:dismissed)).includes(:last_status, from_account: [:account_stat, :user]).to_a_paginated_by_id( + limit_param(DEFAULT_ACCOUNTS_LIMIT), + params_slice(:max_id, :since_id, :min_id) + ) + + NotificationRequest.preload_cache_collection(requests) do |statuses| + cache_collection(statuses, Status) + end + end + + def relationships + StatusRelationshipsPresenter.new(@requests.map(&:last_status), current_user&.account_id) + end + + def set_request + @request = NotificationRequest.where(account: current_account).find(params[:id]) + end + + def insert_pagination_headers + set_pagination_headers(next_path, prev_path) + end + + def next_path + api_v1_notifications_requests_url pagination_params(max_id: pagination_max_id) unless @requests.empty? + end + + def prev_path + api_v1_notifications_requests_url pagination_params(min_id: pagination_since_id) unless @requests.empty? + end + + def pagination_max_id + @requests.last.id + end + + def pagination_since_id + @requests.first.id + end + + def pagination_params(core_params) + params.slice(:dismissed).permit(:dismissed).merge(core_params) + end +end diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb index 406ab97538..52280ef607 100644 --- a/app/controllers/api/v1/notifications_controller.rb +++ b/app/controllers/api/v1/notifications_controller.rb @@ -49,7 +49,8 @@ class Api::V1::NotificationsController < Api::BaseController current_account.notifications.without_suspended.browserable( types: Array(browserable_params[:types]), exclude_types: Array(browserable_params[:exclude_types]), - from_account_id: browserable_params[:account_id] + from_account_id: browserable_params[:account_id], + include_filtered: truthy_param?(:include_filtered) ) end @@ -78,10 +79,10 @@ class Api::V1::NotificationsController < Api::BaseController end def browserable_params - params.permit(:account_id, types: [], exclude_types: []) + params.permit(:account_id, :include_filtered, types: [], exclude_types: []) end def pagination_params(core_params) - params.slice(:limit, :account_id, :types, :exclude_types).permit(:limit, :account_id, types: [], exclude_types: []).merge(core_params) + params.slice(:limit, :account_id, :types, :exclude_types, :include_filtered).permit(:limit, :account_id, :include_filtered, types: [], exclude_types: []).merge(core_params) end end diff --git a/app/models/concerns/account/associations.rb b/app/models/concerns/account/associations.rb index 2bb6fed5ad..b2e9d255fd 100644 --- a/app/models/concerns/account/associations.rb +++ b/app/models/concerns/account/associations.rb @@ -15,10 +15,15 @@ module Account::Associations has_many :favourites, inverse_of: :account, dependent: :destroy has_many :bookmarks, inverse_of: :account, dependent: :destroy has_many :mentions, inverse_of: :account, dependent: :destroy - has_many :notifications, inverse_of: :account, dependent: :destroy has_many :conversations, class_name: 'AccountConversation', dependent: :destroy, inverse_of: :account has_many :scheduled_statuses, inverse_of: :account, dependent: :destroy + # Notifications + has_many :notifications, inverse_of: :account, dependent: :destroy + has_one :notification_policy, inverse_of: :account, dependent: :destroy + has_many :notification_permissions, inverse_of: :account, dependent: :destroy + has_many :notification_requests, inverse_of: :account, dependent: :destroy + # Pinned statuses has_many :status_pins, inverse_of: :account, dependent: :destroy has_many :pinned_statuses, -> { reorder('status_pins.created_at DESC') }, through: :status_pins, class_name: 'Status', source: :status diff --git a/app/models/notification.rb b/app/models/notification.rb index 54212d675f..e322daea4a 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -12,6 +12,7 @@ # account_id :bigint(8) not null # from_account_id :bigint(8) not null # type :string +# filtered :boolean default(FALSE), not null # class Notification < ApplicationRecord @@ -89,7 +90,7 @@ class Notification < ApplicationRecord end class << self - def browserable(types: [], exclude_types: [], from_account_id: nil) + def browserable(types: [], exclude_types: [], from_account_id: nil, include_filtered: false) requested_types = if types.empty? TYPES else @@ -99,6 +100,7 @@ class Notification < ApplicationRecord requested_types -= exclude_types.map(&:to_sym) all.tap do |scope| + scope.merge!(where(filtered: false)) unless include_filtered || from_account_id.present? scope.merge!(where(from_account_id: from_account_id)) if from_account_id.present? scope.merge!(where(type: requested_types)) unless requested_types.size == TYPES.size end @@ -144,6 +146,8 @@ class Notification < ApplicationRecord after_initialize :set_from_account before_validation :set_from_account + after_destroy :remove_from_notification_request + private def set_from_account @@ -158,4 +162,9 @@ class Notification < ApplicationRecord self.from_account_id = activity&.id end end + + def remove_from_notification_request + notification_request = NotificationRequest.find_by(account_id: account_id, from_account_id: from_account_id) + notification_request&.reconsider_existence! + end end diff --git a/app/models/notification_permission.rb b/app/models/notification_permission.rb new file mode 100644 index 0000000000..e0001473f8 --- /dev/null +++ b/app/models/notification_permission.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: notification_permissions +# +# id :bigint(8) not null, primary key +# account_id :bigint(8) not null +# from_account_id :bigint(8) not null +# created_at :datetime not null +# updated_at :datetime not null +# +class NotificationPermission < ApplicationRecord + belongs_to :account + belongs_to :from_account, class_name: 'Account' +end diff --git a/app/models/notification_policy.rb b/app/models/notification_policy.rb new file mode 100644 index 0000000000..f10b0c2a81 --- /dev/null +++ b/app/models/notification_policy.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: notification_policies +# +# id :bigint(8) not null, primary key +# account_id :bigint(8) not null +# filter_not_following :boolean default(FALSE), not null +# filter_not_followers :boolean default(FALSE), not null +# filter_new_accounts :boolean default(FALSE), not null +# filter_private_mentions :boolean default(TRUE), not null +# created_at :datetime not null +# updated_at :datetime not null +# + +class NotificationPolicy < ApplicationRecord + belongs_to :account + + has_many :notification_requests, primary_key: :account_id, foreign_key: :account_id, dependent: nil, inverse_of: false + + attr_reader :pending_requests_count, :pending_notifications_count + + MAX_MEANINGFUL_COUNT = 100 + + def summarize! + @pending_requests_count = pending_notification_requests.first + @pending_notifications_count = pending_notification_requests.last + end + + private + + def pending_notification_requests + @pending_notification_requests ||= notification_requests.where(dismissed: false).limit(MAX_MEANINGFUL_COUNT).pick(Arel.sql('count(*), coalesce(sum(notifications_count), 0)::bigint')) + end +end diff --git a/app/models/notification_request.rb b/app/models/notification_request.rb new file mode 100644 index 0000000000..7ae7e46d1b --- /dev/null +++ b/app/models/notification_request.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: notification_requests +# +# id :bigint(8) not null, primary key +# account_id :bigint(8) not null +# from_account_id :bigint(8) not null +# last_status_id :bigint(8) not null +# notifications_count :bigint(8) default(0), not null +# dismissed :boolean default(FALSE), not null +# created_at :datetime not null +# updated_at :datetime not null +# + +class NotificationRequest < ApplicationRecord + include Paginable + + MAX_MEANINGFUL_COUNT = 100 + + belongs_to :account + belongs_to :from_account, class_name: 'Account' + belongs_to :last_status, class_name: 'Status' + + before_save :prepare_notifications_count + + def self.preload_cache_collection(requests) + cached_statuses_by_id = yield(requests.filter_map(&:last_status)).index_by(&:id) # Call cache_collection in block + + requests.each do |request| + request.last_status = cached_statuses_by_id[request.last_status_id] unless request.last_status_id.nil? + end + end + + def reconsider_existence! + return if dismissed? + + prepare_notifications_count + + if notifications_count.positive? + save + else + destroy + end + end + + private + + def prepare_notifications_count + self.notifications_count = Notification.where(account: account, from_account: from_account).limit(MAX_MEANINGFUL_COUNT).count + end +end diff --git a/app/serializers/rest/notification_policy_serializer.rb b/app/serializers/rest/notification_policy_serializer.rb new file mode 100644 index 0000000000..4967c3e320 --- /dev/null +++ b/app/serializers/rest/notification_policy_serializer.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class REST::NotificationPolicySerializer < ActiveModel::Serializer + attributes :filter_not_following, + :filter_not_followers, + :filter_new_accounts, + :filter_private_mentions, + :summary + + def summary + { + pending_requests_count: object.pending_requests_count.to_s, + pending_notifications_count: object.pending_notifications_count.to_s, + } + end +end diff --git a/app/serializers/rest/notification_request_serializer.rb b/app/serializers/rest/notification_request_serializer.rb new file mode 100644 index 0000000000..581959d827 --- /dev/null +++ b/app/serializers/rest/notification_request_serializer.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class REST::NotificationRequestSerializer < ActiveModel::Serializer + attributes :id, :created_at, :updated_at, :notifications_count + + belongs_to :from_account, key: :account, serializer: REST::AccountSerializer + belongs_to :last_status, serializer: REST::StatusSerializer + + def id + object.id.to_s + end + + def notifications_count + object.notifications_count.to_s + end +end diff --git a/app/services/accept_notification_request_service.rb b/app/services/accept_notification_request_service.rb new file mode 100644 index 0000000000..e49eae6fd3 --- /dev/null +++ b/app/services/accept_notification_request_service.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class AcceptNotificationRequestService < BaseService + def call(request) + NotificationPermission.create!(account: request.account, from_account: request.from_account) + UnfilterNotificationsWorker.perform_async(request.id) + end +end diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index 13eb20986e..428fdb4d47 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -11,126 +11,195 @@ class NotifyService < BaseService status ).freeze + class DismissCondition + def initialize(notification) + @recipient = notification.account + @sender = notification.from_account + @notification = notification + end + + def dismiss? + blocked = @recipient.unavailable? + blocked ||= from_self? && @notification.type != :poll + + return blocked if message? && from_staff? + + blocked ||= domain_blocking? + blocked ||= @recipient.blocking?(@sender) + blocked ||= @recipient.muting_notifications?(@sender) + blocked ||= conversation_muted? + blocked ||= blocked_mention? if message? + blocked + end + + private + + def blocked_mention? + FeedManager.instance.filter?(:mentions, @notification.target_status, @recipient) + end + + def message? + @notification.type == :mention + end + + def from_staff? + @sender.local? && @sender.user.present? && @sender.user_role&.overrides?(@recipient.user_role) + end + + def from_self? + @recipient.id == @sender.id + end + + def domain_blocking? + @recipient.domain_blocking?(@sender.domain) && !following_sender? + end + + def conversation_muted? + @notification.target_status && @recipient.muting_conversation?(@notification.target_status.conversation) + end + + def following_sender? + @recipient.following?(@sender) + end + end + + class FilterCondition + NEW_ACCOUNT_THRESHOLD = 30.days.freeze + + NEW_FOLLOWER_THRESHOLD = 3.days.freeze + + def initialize(notification) + @notification = notification + @recipient = notification.account + @sender = notification.from_account + @policy = NotificationPolicy.find_or_initialize_by(account: @recipient) + end + + def filter? + return false if override_for_sender? + + from_limited? || + filtered_by_not_following_policy? || + filtered_by_not_followers_policy? || + filtered_by_new_accounts_policy? || + filtered_by_private_mentions_policy? + end + + private + + def filtered_by_not_following_policy? + @policy.filter_not_following? && not_following? + end + + def filtered_by_not_followers_policy? + @policy.filter_not_followers? && not_follower? + end + + def filtered_by_new_accounts_policy? + @policy.filter_new_accounts? && new_account? + end + + def filtered_by_private_mentions_policy? + @policy.filter_private_mentions? && not_following? && private_mention_not_in_response? + end + + def not_following? + !@recipient.following?(@sender) + end + + def not_follower? + follow = Follow.find_by(account: @sender, target_account: @recipient) + follow.nil? || follow.created_at > NEW_FOLLOWER_THRESHOLD.ago + end + + def new_account? + @sender.created_at > NEW_ACCOUNT_THRESHOLD.ago + end + + def override_for_sender? + NotificationPermission.exists?(account: @recipient, from_account: @sender) + end + + def from_limited? + @sender.silenced? && not_following? + end + + def private_mention_not_in_response? + @notification.type == :mention && @notification.target_status.direct_visibility? && !response_to_recipient? + end + + def response_to_recipient? + return false if @notification.target_status.in_reply_to_id.nil? + + statuses_that_mention_sender.positive? + end + + def statuses_that_mention_sender + Status.count_by_sql([<<-SQL.squish, id: @notification.target_status.in_reply_to_id, recipient_id: @recipient.id, sender_id: @sender.id, depth_limit: 100]) + WITH RECURSIVE ancestors(id, in_reply_to_id, mention_id, path, depth) AS ( + SELECT s.id, s.in_reply_to_id, m.id, ARRAY[s.id], 0 + FROM statuses s + LEFT JOIN mentions m ON m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id + WHERE s.id = :id + UNION ALL + SELECT s.id, s.in_reply_to_id, m.id, st.path || s.id, st.depth + 1 + FROM ancestors st + JOIN statuses s ON s.id = st.in_reply_to_id + LEFT JOIN mentions m ON m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id + WHERE st.mention_id IS NULL AND NOT s.id = ANY(path) AND st.depth < :depth_limit + ) + SELECT COUNT(*) + FROM ancestors st + JOIN statuses s ON s.id = st.id + WHERE st.mention_id IS NOT NULL AND s.visibility = 3 + SQL + end + end + def call(recipient, type, activity) + return if recipient.user.nil? + @recipient = recipient @activity = activity @notification = Notification.new(account: @recipient, type: type, activity: @activity) - return if recipient.user.nil? || blocked? + # For certain conditions we don't need to create a notification at all + return if dismiss? + @notification.filtered = filter? @notification.save! # It's possible the underlying activity has been deleted # between the save call and now return if @notification.activity.nil? - push_notification! - push_to_conversation! if direct_message? - send_email! if email_needed? + if @notification.filtered? + update_notification_request! + else + push_notification! + push_to_conversation! if direct_message? + send_email! if email_needed? + end rescue ActiveRecord::RecordInvalid nil end private - def blocked_mention? - FeedManager.instance.filter?(:mentions, @notification.mention.status, @recipient) + def dismiss? + DismissCondition.new(@notification).dismiss? end - def following_sender? - return @following_sender if defined?(@following_sender) - - @following_sender = @recipient.following?(@notification.from_account) || @recipient.requested?(@notification.from_account) + def filter? + FilterCondition.new(@notification).filter? end - def optional_non_follower? - @recipient.user.settings['interactions.must_be_follower'] && !@notification.from_account.following?(@recipient) - end + def update_notification_request! + return unless @notification.type == :mention - def optional_non_following? - @recipient.user.settings['interactions.must_be_following'] && !following_sender? - end - - def message? - @notification.type == :mention - end - - def direct_message? - message? && @notification.target_status.direct_visibility? - end - - # Returns true if the sender has been mentioned by the recipient up the thread - def response_to_recipient? - return false if @notification.target_status.in_reply_to_id.nil? - - # Using an SQL CTE to avoid unneeded back-and-forth with SQL server in case of long threads - !Status.count_by_sql([<<-SQL.squish, id: @notification.target_status.in_reply_to_id, recipient_id: @recipient.id, sender_id: @notification.from_account.id, depth_limit: 100]).zero? - WITH RECURSIVE ancestors(id, in_reply_to_id, mention_id, path, depth) AS ( - SELECT s.id, s.in_reply_to_id, m.id, ARRAY[s.id], 0 - FROM statuses s - LEFT JOIN mentions m ON m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id - WHERE s.id = :id - UNION ALL - SELECT s.id, s.in_reply_to_id, m.id, st.path || s.id, st.depth + 1 - FROM ancestors st - JOIN statuses s ON s.id = st.in_reply_to_id - LEFT JOIN mentions m ON m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id - WHERE st.mention_id IS NULL AND NOT s.id = ANY(path) AND st.depth < :depth_limit - ) - SELECT COUNT(*) - FROM ancestors st - JOIN statuses s ON s.id = st.id - WHERE st.mention_id IS NOT NULL AND s.visibility = 3 - SQL - end - - def from_staff? - @notification.from_account.local? && @notification.from_account.user.present? && @notification.from_account.user_role&.overrides?(@recipient.user_role) - end - - def optional_non_following_and_direct? - direct_message? && - @recipient.user.settings['interactions.must_be_following_dm'] && - !following_sender? && - !response_to_recipient? - end - - def hellbanned? - @notification.from_account.silenced? && !following_sender? - end - - def from_self? - @recipient.id == @notification.from_account.id - end - - def domain_blocking? - @recipient.domain_blocking?(@notification.from_account.domain) && !following_sender? - end - - def blocked? - blocked = @recipient.unavailable? - blocked ||= from_self? && @notification.type != :poll - - return blocked if message? && from_staff? - - blocked ||= domain_blocking? - blocked ||= @recipient.blocking?(@notification.from_account) - blocked ||= @recipient.muting_notifications?(@notification.from_account) - blocked ||= hellbanned? - blocked ||= optional_non_follower? - blocked ||= optional_non_following? - blocked ||= optional_non_following_and_direct? - blocked ||= conversation_muted? - blocked ||= blocked_mention? if @notification.type == :mention - blocked - end - - def conversation_muted? - if @notification.target_status - @recipient.muting_conversation?(@notification.target_status.conversation) - else - false - end + notification_request = NotificationRequest.find_or_initialize_by(account_id: @recipient.id, from_account_id: @notification.from_account_id) + notification_request.last_status_id = @notification.target_status.id + notification_request.save end def push_notification! @@ -150,6 +219,10 @@ class NotifyService < BaseService AccountConversation.add_status(@recipient, @notification.target_status) end + def direct_message? + @notification.type == :mention && @notification.target_status.direct_visibility? + end + def push_to_web_push_subscriptions! ::Web::PushNotificationWorker.push_bulk(web_push_subscriptions.select { |subscription| subscription.pushable?(@notification) }) { |subscription| [subscription.id, @notification.id] } end diff --git a/app/views/settings/preferences/notifications/show.html.haml b/app/views/settings/preferences/notifications/show.html.haml index d9d496c7fa..de318dda54 100644 --- a/app/views/settings/preferences/notifications/show.html.haml +++ b/app/views/settings/preferences/notifications/show.html.haml @@ -40,11 +40,3 @@ label_method: ->(setting) { I18n.t("simple_form.labels.notification_emails.software_updates.#{setting}") }, label: I18n.t('simple_form.labels.notification_emails.software_updates.label'), wrapper: :with_label - - %h4= t 'notifications.other_settings' - - .fields-group - = f.simple_fields_for :settings, current_user.settings do |ff| - = ff.input :'interactions.must_be_follower', wrapper: :with_label, label: I18n.t('simple_form.labels.interactions.must_be_follower') - = ff.input :'interactions.must_be_following', wrapper: :with_label, label: I18n.t('simple_form.labels.interactions.must_be_following') - = ff.input :'interactions.must_be_following_dm', wrapper: :with_label, label: I18n.t('simple_form.labels.interactions.must_be_following_dm') diff --git a/app/workers/unfilter_notifications_worker.rb b/app/workers/unfilter_notifications_worker.rb new file mode 100644 index 0000000000..223654aa16 --- /dev/null +++ b/app/workers/unfilter_notifications_worker.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +class UnfilterNotificationsWorker + include Sidekiq::Worker + + def perform(notification_request_id) + @notification_request = NotificationRequest.find(notification_request_id) + + push_to_conversations! + unfilter_notifications! + remove_request! + rescue ActiveRecord::RecordNotFound + true + end + + private + + def push_to_conversations! + notifications_with_private_mentions.find_each { |notification| AccountConversation.add_status(@notification_request.account, notification.target_status) } + end + + def unfilter_notifications! + filtered_notifications.in_batches.update_all(filtered: false) + end + + def remove_request! + @notification_request.destroy! + end + + def filtered_notifications + Notification.where(account: @notification_request.account, from_account: @notification_request.from_account, filtered: true) + end + + def notifications_with_private_mentions + filtered_notifications.joins(mention: :status).merge(Status.where(visibility: :direct)).includes(mention: :status) + end +end diff --git a/config/locales/an.yml b/config/locales/an.yml index edfdb44b35..7ad1986b24 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -1288,7 +1288,6 @@ an: notifications: email_events: Eventos pa notificacions per correu electronico email_events_hint: 'Tría los eventos pa los quals deseyas recibir notificacions:' - other_settings: Atros achustes de notificacions number: human: decimal_units: diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 2b2052172e..8e9338d80a 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -1594,7 +1594,6 @@ ar: administration_emails: إشعارات البريد الإلكتروني الإدارية email_events: الأحداث للإشعارات عبر البريد الإلكتروني email_events_hint: 'اختر الأحداث التي تريد أن تصِلَك اشعارات عنها:' - other_settings: إعدادات أخرى للإشعارات number: human: decimal_units: diff --git a/config/locales/ast.yml b/config/locales/ast.yml index da7e99c2fa..ee9105b05f 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -695,7 +695,6 @@ ast: notifications: email_events: Unviu d'avisos per corréu electrónicu email_events_hint: 'Seleiciona los eventos de los que quies recibir avisos:' - other_settings: Configuración d'otros avisos number: human: decimal_units: diff --git a/config/locales/be.yml b/config/locales/be.yml index 34e0722ba9..bd75870a18 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1547,7 +1547,6 @@ be: administration_emails: Апавяшчэнні эл. пошты для адміністратара email_events: Падзеі для апавяшчэнняў эл. пошты email_events_hint: 'Выберыце падзеі, аб якіх вы хочаце атрымліваць апавяшчэнні:' - other_settings: Іншыя налады апавяшчэнняў number: human: decimal_units: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 15c671d539..3d1b6d291f 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1490,7 +1490,6 @@ bg: administration_emails: Администраторски известия по имейла email_events: Събития за известия по имейл email_events_hint: 'Изберете събития, за които искате да получавате известия:' - other_settings: Настройки за други известия number: human: decimal_units: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index d80fb598e3..d4213a258e 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1495,7 +1495,6 @@ ca: administration_emails: Notificacions per correu-e de l'Admin email_events: Esdeveniments per a notificacions de correu electrònic email_events_hint: 'Selecciona els esdeveniments per als quals vols rebre notificacions:' - other_settings: Altres opcions de notificació number: human: decimal_units: diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index fec8f73323..7f1c28defc 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -840,7 +840,6 @@ ckb: notifications: email_events: رووداوەکان بۆ ئاگاداری ئیمەیلی email_events_hint: 'ئەو ڕووداوانە دیاریبکە کە دەتەوێت ئاگانامەکان وەربگری بۆ:' - other_settings: ڕێکبەندەکانی ئاگانامەکانی تر otp_authentication: code_hint: کۆدێک داخڵ بکە کە دروست کراوە لەلایەن ئەپی ڕەسەنایەتیەوە بۆ دڵنیابوون description_html: ئەگەر تۆ هاتنەژوورەوەی دوو قۆناغی بە یارمەتی ئەپێکی پەسەندکردن چالاک بکەن، پێویستە بۆ چوونەژوورەوە ، بە تەلەفۆنەکەتان کە کۆدیکتان بۆ دروستدەکات دەستپێگەیشتنتان هەبێت. diff --git a/config/locales/co.yml b/config/locales/co.yml index c3c185c2f5..ecf8606455 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -809,7 +809,6 @@ co: notifications: email_events: Avvenimenti da nutificà cù l'e-mail email_events_hint: 'Selezziunate l''avvenimenti per quelli vulete riceve nutificazione:' - other_settings: Altri parametri di nutificazione number: human: decimal_units: diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 69640a261f..fd24ac05c6 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1547,7 +1547,6 @@ cs: administration_emails: E-mailová oznámení administrátora email_events: Události pro e-mailová oznámení email_events_hint: 'Vyberte události, pro které chcete dostávat oznámení:' - other_settings: Další nastavení oznámení number: human: decimal_units: diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 19343146f3..241d599464 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1599,7 +1599,6 @@ cy: administration_emails: Hysbysiadau e-bost gweinyddol email_events: Digwyddiadau ar gyfer hysbysiadau e-bost email_events_hint: 'Dewiswch ddigwyddiadau yr ydych am dderbyn hysbysiadau ar eu cyfer:' - other_settings: Gosodiadau hysbysiadau arall number: human: decimal_units: diff --git a/config/locales/da.yml b/config/locales/da.yml index 62e28cef16..6bc0d96797 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1495,7 +1495,6 @@ da: administration_emails: Admin e-mailnotifikationer email_events: Begivenheder for e-mailnotifikationer email_events_hint: 'Vælg begivenheder, for hvilke notifikationer skal modtages:' - other_settings: Andre notifikationsindstillinger number: human: decimal_units: diff --git a/config/locales/de.yml b/config/locales/de.yml index 123942672e..0636122373 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1495,7 +1495,6 @@ de: administration_emails: Admin-E-Mail-Benachrichtigungen email_events: Benachrichtigungen per E-Mail email_events_hint: 'Bitte die Ereignisse auswählen, für die du Benachrichtigungen per E-Mail erhalten möchtest:' - other_settings: Weitere Benachrichtigungseinstellungen number: human: decimal_units: diff --git a/config/locales/el.yml b/config/locales/el.yml index c641d4dca9..12d70df976 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -1383,7 +1383,6 @@ el: notifications: email_events: Συμβάντα για ειδοποιήσεις μέσω email email_events_hint: 'Επέλεξε συμβάντα για τα οποία θέλεις να λαμβάνεις ειδοποιήσεις μέσω email:' - other_settings: Άλλες ρυθμίσεις ειδοποιήσεων number: human: decimal_units: diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 6b2554fe15..ac7e508276 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -1490,7 +1490,6 @@ en-GB: administration_emails: Admin e-mail notifications email_events: Events for e-mail notifications email_events_hint: 'Select events that you want to receive notifications for:' - other_settings: Other notifications settings number: human: decimal_units: diff --git a/config/locales/en.yml b/config/locales/en.yml index cff244a4b9..8199fa52c7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1495,7 +1495,6 @@ en: administration_emails: Admin e-mail notifications email_events: Events for e-mail notifications email_events_hint: 'Select events that you want to receive notifications for:' - other_settings: Other notifications settings number: human: decimal_units: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index bc694578b7..4e518cd194 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1425,7 +1425,6 @@ eo: administration_emails: Admin retpoŝtaj sciigoj email_events: Eventoj por retpoŝtaj sciigoj email_events_hint: 'Elekti la eventojn pri kioj vi volas ricevi sciigojn:' - other_settings: Aliaj agordoj de sciigoj number: human: decimal_units: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 37fcc11d78..06bacc79d1 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1495,7 +1495,6 @@ es-AR: administration_emails: Notificaciones de administración por correo electrónico email_events: Eventos para notificaciones por correo electrónico email_events_hint: 'Seleccioná los eventos para los que querés recibir notificaciones:' - other_settings: Configuración de otras notificaciones number: human: decimal_units: diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 26dbc2dfb8..4d2e8ff257 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -1495,7 +1495,6 @@ es-MX: administration_emails: Notificaciones de administración por correo electrónico email_events: Eventos para notificaciones por correo electrónico email_events_hint: 'Selecciona los eventos para los que deseas recibir notificaciones:' - other_settings: Otros ajustes de notificaciones number: human: decimal_units: diff --git a/config/locales/es.yml b/config/locales/es.yml index 7956580138..5204b116e3 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1495,7 +1495,6 @@ es: administration_emails: Notificaciones de administración por correo electrónico email_events: Eventos para notificaciones por correo electrónico email_events_hint: 'Selecciona los eventos para los que deseas recibir notificaciones:' - other_settings: Otros ajustes de notificaciones number: human: decimal_units: diff --git a/config/locales/et.yml b/config/locales/et.yml index ed25488ce4..6bdb54a50e 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -1490,7 +1490,6 @@ et: administration_emails: Admini e-postiteavitused email_events: E-posti teadete sündmused email_events_hint: 'Vali sündmused, mille kohta soovid teavitusi:' - other_settings: Muud teadete sätted number: human: decimal_units: diff --git a/config/locales/eu.yml b/config/locales/eu.yml index fb3013e008..f49456afb2 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -1496,7 +1496,6 @@ eu: administration_emails: Administratzailearen posta elektroniko bidezko jakinarazpenak email_events: E-mail jakinarazpenentzako gertaerak email_events_hint: 'Hautatu jaso nahi dituzun gertaeren jakinarazpenak:' - other_settings: Bezte jakinarazpen konfigurazioak number: human: decimal_units: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 4339e06c34..7fab495af8 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -1271,7 +1271,6 @@ fa: notifications: email_events: رویدادها برای آگاهی‌های رایانامه‌ای email_events_hint: 'گزینش رویدادهایی که می‌خواهید برایشان آگاهی دریافت کنید:' - other_settings: سایر تنظیمات آگاهی‌ها number: human: decimal_units: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index dc303991bc..4cd255c2f4 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1495,7 +1495,6 @@ fi: administration_emails: Ylläpitäjän sähköposti-ilmoitukset email_events: Sähköposti-ilmoitusten tapahtumat email_events_hint: 'Valitse tapahtumat, joista haluat saada ilmoituksia:' - other_settings: Muut ilmoitusasetukset number: human: decimal_units: diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 6a8dd9b2ee..c7dca591f6 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1495,7 +1495,6 @@ fo: administration_emails: Fráboðanir um teldupost til umsitarar email_events: Hendingar fyri teldupostfráboðanir email_events_hint: 'Vel hendingar, sum tú vil hava fráboðanir um:' - other_settings: Aðrar fráboðanarstillingar number: human: decimal_units: diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 97cb08c918..381a8f582a 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -1490,7 +1490,6 @@ fr-CA: administration_emails: Notifications par e-mail de l’admin email_events: Événements pour les notifications par courriel email_events_hint: 'Sélectionnez les événements pour lesquels vous souhaitez recevoir des notifications :' - other_settings: Autres paramètres de notifications number: human: decimal_units: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index b085937c76..0d706accf1 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1490,7 +1490,6 @@ fr: administration_emails: Notifications par e-mail de l’admin email_events: Événements pour les notifications par courriel email_events_hint: 'Sélectionnez les événements pour lesquels vous souhaitez recevoir des notifications :' - other_settings: Autres paramètres de notifications number: human: decimal_units: diff --git a/config/locales/fy.yml b/config/locales/fy.yml index caa88dcfe4..2fb9f3e4d2 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -1490,7 +1490,6 @@ fy: administration_emails: E-mailmeldingen behearder email_events: E-mailmeldingen foar eveneminten email_events_hint: 'Selektearje eveneminten wêrfoar’t jo meldingen ûntfange wolle:' - other_settings: Oare meldingsynstellingen number: human: decimal_units: diff --git a/config/locales/gd.yml b/config/locales/gd.yml index e2a43564c0..ede38df0d9 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -1532,7 +1532,6 @@ gd: administration_emails: Brathan puist-d na rianachd email_events: Tachartasan nam brathan puist-d email_events_hint: 'Tagh na tachartasan dhan a bheil thu airson brathan fhaighinn:' - other_settings: Roghainnean eile nam brathan number: human: decimal_units: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 8520b90ead..c3d0f1d99a 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1495,7 +1495,6 @@ gl: administration_emails: Notificacións de Admin por correo electrónico email_events: Eventos para os correos de notificación email_events_hint: 'Escolle os eventos sobre os que queres recibir notificacións:' - other_settings: Outros axustes das notificacións number: human: decimal_units: diff --git a/config/locales/he.yml b/config/locales/he.yml index 55ab576142..766a653773 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1547,7 +1547,6 @@ he: administration_emails: התראות לדוא"ל חשבון מנהל email_events: ארועים להתראות דוא"ל email_events_hint: 'בחר/י ארועים עבורים תרצה/י לקבל התראות:' - other_settings: הגדרות התראות אחרות number: human: decimal_units: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 733d883da0..00566514c9 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1495,7 +1495,6 @@ hu: administration_emails: Adminisztrátori e-mail-értesítések email_events: Események email értesítésekhez email_events_hint: 'Válaszd ki azokat az eseményeket, melyekről értesítést szeretnél:' - other_settings: Értesítések egyéb beállításai number: human: decimal_units: diff --git a/config/locales/hy.yml b/config/locales/hy.yml index b0d8f00864..d870f5073c 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -672,7 +672,6 @@ hy: subject: "%{name}-ը փոխել է գրառումը" notifications: email_events_hint: Ընտրիր իրադարձութիւնները, որոնց վերաբերեալ ցանկանում ես ստանալ ծանուցումներ․ - other_settings: Ծանուցումների այլ կարգաւորումներ number: human: decimal_units: diff --git a/config/locales/id.yml b/config/locales/id.yml index e7f42e115b..a32ee8407a 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -1257,7 +1257,6 @@ id: notifications: email_events: Event untuk notifikasi email email_events_hint: 'Pilih event yang ingin Anda terima notifikasinya:' - other_settings: Pengaturan notifikasi lain number: human: decimal_units: diff --git a/config/locales/ie.yml b/config/locales/ie.yml index eec8569bb2..55aba94d18 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -1495,7 +1495,6 @@ ie: administration_emails: Email-notificationes pri administration email_events: Evenimentes por email-notificationes email_events_hint: 'Selecte li evenimentes pri queles tu vole reciver notificationes:' - other_settings: Parametres pri altri notificationes number: human: decimal_units: diff --git a/config/locales/io.yml b/config/locales/io.yml index 189f616a4e..e85641b923 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -1472,7 +1472,6 @@ io: administration_emails: Jerala retpostonotifiki email_events: Eventi por retpostoavizi email_events_hint: 'Selektez eventi quon vu volas ganar avizi:' - other_settings: Altra avizopcioni number: human: decimal_units: diff --git a/config/locales/is.yml b/config/locales/is.yml index da6eee9e20..771ed2fbf1 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -1499,7 +1499,6 @@ is: administration_emails: Kerfisstjórnunartilkynningar í tölvupósti email_events: Atburðir fyrir tilkynningar í tölvupósti email_events_hint: 'Veldu þá atburði sem þú vilt fá tilkynningar í tölvupósti þegar þeir koma upp:' - other_settings: Aðrar stillingar varðandi tilkynningar number: human: decimal_units: diff --git a/config/locales/it.yml b/config/locales/it.yml index 3adb4f6c65..d85f0359d1 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1497,7 +1497,6 @@ it: administration_emails: Notifiche email amministratore email_events: Eventi per notifiche via email email_events_hint: 'Seleziona gli eventi per i quali vuoi ricevere le notifiche:' - other_settings: Altre impostazioni delle notifiche number: human: decimal_units: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 460f02d0a5..15e66631f5 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1469,7 +1469,6 @@ ja: administration_emails: 管理にかかわるメール通知 email_events: メールによる通知 email_events_hint: '受信する通知を選択:' - other_settings: その他の通知設定 number: human: decimal_units: diff --git a/config/locales/kab.yml b/config/locales/kab.yml index d424810926..d278c15c93 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -626,8 +626,6 @@ kab: subject: Yuder-ik·ikem-id %{name} reblog: subject: "%{name} yesselha addad-ik·im" - notifications: - other_settings: Iɣewwaṛen nniḍen n yilɣa number: human: decimal_units: diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 2cd894befb..9528c0950f 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -539,7 +539,6 @@ kk: notifications: email_events: E-mail ескертпелеріне шаралар email_events_hint: 'Ескертпе болып келетін шараларды таңда:' - other_settings: Ескертпелердің басқа баптаулары number: human: decimal_units: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 45a95139f0..1e53006cbb 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1471,7 +1471,6 @@ ko: administration_emails: 관리자 이메일 알림 email_events: 이메일 알림에 대한 이벤트 email_events_hint: '알림 받을 이벤트를 선택해주세요:' - other_settings: 기타 알림 설정 number: human: decimal_units: diff --git a/config/locales/ku.yml b/config/locales/ku.yml index d744aaa903..91ab75ceb0 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -1285,7 +1285,6 @@ ku: notifications: email_events: Bûyer bo agahdariyên e-nameyê email_events_hint: 'Bûyera ku tu dixwazî agahdariyan jê wergerî hilbijêre:' - other_settings: Sazkariya agahdariyên din number: human: decimal_units: diff --git a/config/locales/lad.yml b/config/locales/lad.yml index 13e29f927e..bed6b44d39 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -1495,7 +1495,6 @@ lad: administration_emails: Avizos de administrasyon por posta email_events: Evenimyentos para avizos por posta email_events_hint: 'Eskoje los evenimientos para los kualos keres risivir avizos:' - other_settings: Otras preferensyas de avizos number: human: decimal_units: diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 89bdf5f05f..dc4c39083c 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -1513,7 +1513,6 @@ lv: administration_emails: Administrators e-pasta paziņojumi email_events: E-pasta paziņojumu notikumi email_events_hint: 'Atlasi notikumus, par kuriem vēlies saņemt paziņojumus:' - other_settings: Citu paziņojumu iestatījumi number: human: decimal_units: diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 81f1851b1e..e20dfd09e0 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -1442,7 +1442,6 @@ ms: administration_emails: Notifikasi e-mel pentadbir email_events: Acara untuk pemberitahuan e-mel email_events_hint: 'Pilih acara yang ingin anda terima pemberitahuan:' - other_settings: Tetapan notifikasi lain number: human: decimal_units: diff --git a/config/locales/my.yml b/config/locales/my.yml index 18f5c6a2d0..f2c115c17c 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -1445,7 +1445,6 @@ my: administration_emails: စီမံခန့်ခွဲသူ အီးမေးလ် အသိပေးချက်များ email_events: အီးမေးလ်သတိပေးချက်များအတွက်အကြောင်းအရာများ email_events_hint: အသိပေးချက်များရယူမည့် အစီအစဉ်များကို ရွေးပါ - - other_settings: အခြားအသိပေးချက်များ၏ သတ်မှတ်ချက်များ number: human: decimal_units: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index c935e9f4aa..ac49efddf1 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1495,7 +1495,6 @@ nl: administration_emails: E-mailmeldingen beheerder email_events: E-mailmeldingen voor gebeurtenissen email_events_hint: 'Selecteer gebeurtenissen waarvoor je meldingen wilt ontvangen:' - other_settings: Andere meldingsinstellingen number: human: decimal_units: diff --git a/config/locales/nn.yml b/config/locales/nn.yml index aecd148e28..52ed45a675 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -1495,7 +1495,6 @@ nn: administration_emails: Administrator sine epost-varsler email_events: E-postvarslinger for hendelser email_events_hint: 'Velg hendelser som du vil motta varslinger for:' - other_settings: Andre varslingsinnstillinger number: human: decimal_units: diff --git a/config/locales/no.yml b/config/locales/no.yml index 481e28e863..db56a065fa 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -1490,7 +1490,6 @@ administration_emails: Administrators e-postvarslinger email_events: E-postvarslinger for hendelser email_events_hint: 'Velg hendelser som du vil motta varslinger for:' - other_settings: Andre varslingsinnstillinger number: human: decimal_units: diff --git a/config/locales/oc.yml b/config/locales/oc.yml index b8330992c9..32b7da6272 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -724,7 +724,6 @@ oc: notifications: email_events: Eveniments per las notificacions per corrièl email_events_hint: 'Seleccionatz los eveniments que volètz recebre :' - other_settings: Autres paramètres de notificacion number: human: decimal_units: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index f7c5d60f65..9253f2d020 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1547,7 +1547,6 @@ pl: administration_emails: Administracyjne powiadomienia e-mail email_events: 'Powiadamiaj e-mailem o:' email_events_hint: 'Wybierz wydarzenia, o których chcesz otrzymywać powiadomienia:' - other_settings: Inne ustawienia powiadomień number: human: decimal_units: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 86972f9ef1..58e734d9eb 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -1491,7 +1491,6 @@ pt-BR: administration_emails: Notificações por e-mail sobre administração email_events: Eventos para notificações por e-mail email_events_hint: 'Selecione os eventos que deseja receber notificações:' - other_settings: Outras opções para notificações number: human: decimal_units: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 0786ba2ed4..ebc7f84f4f 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -1495,7 +1495,6 @@ pt-PT: administration_emails: Notificções administrativas por e-mail email_events: Eventos para notificações por e-mail email_events_hint: 'Selecione os casos para os quais deseja receber notificações:' - other_settings: Outras opções de notificações number: human: decimal_units: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 3f15b064f0..1c718c95b2 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1542,7 +1542,6 @@ ru: administration_emails: Уведомления администратора по электронной почте email_events: События для e-mail уведомлений email_events_hint: 'Выберите события, для которых вы хотели бы получать уведомления:' - other_settings: Остальные настройки уведомлений number: human: decimal_units: diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 533764606b..33ca7ab1d2 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -865,7 +865,6 @@ sc: notifications: email_events: Eventos pro notìficas cun posta eletrònica email_events_hint: 'Seletziona eventos pro is chi boles retzire notìficas:' - other_settings: Àteras configuratziones de notìficas number: human: decimal_units: diff --git a/config/locales/sco.yml b/config/locales/sco.yml index dc273d2d83..d5628c01bc 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -1275,7 +1275,6 @@ sco: notifications: email_events: Events fir email notes email_events_hint: 'Pick events thit ye''r wantin tae get notes fir:' - other_settings: Ither notes settins number: human: decimal_units: diff --git a/config/locales/si.yml b/config/locales/si.yml index ac292d6cf8..28488197c5 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -1144,7 +1144,6 @@ si: notifications: email_events: ඊමේල් දැනුම්දීම් සඳහා සිදුවීම් email_events_hint: 'ඔබට දැනුම්දීම් ලැබීමට අවශ්‍ය සිදුවීම් තෝරන්න:' - other_settings: වෙනත් දැනුම්දීම් සැකසුම් number: human: decimal_units: diff --git a/config/locales/sk.yml b/config/locales/sk.yml index d97cfac0ea..e93cec19f6 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -1085,7 +1085,6 @@ sk: notifications: email_events: Udalosti oznamované emailom email_events_hint: 'Vyber si udalosti, pre ktoré chceš dostávať oboznámenia:' - other_settings: Ostatné oboznamovacie nastavenia otp_authentication: enable: Povoľ pagination: diff --git a/config/locales/sl.yml b/config/locales/sl.yml index c9b2343b69..863b3d7249 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1547,7 +1547,6 @@ sl: administration_emails: E-poštna obvestila skrbnika email_events: Dogodki za e-obvestila email_events_hint: 'Izberite dogodke, za katere želite prejmati obvestila:' - other_settings: Druge nastavitve obvestil number: human: decimal_units: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 4293271bb2..d3d5a262fd 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1491,7 +1491,6 @@ sq: administration_emails: Njoftime email për përgjegjësin email_events: Akte për njoftim me email email_events_hint: 'Përzgjidhni akte për të cilët doni të merrni njoftime:' - other_settings: Rregullimet të tjera njoftimesh number: human: decimal_units: diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index a1f6df067f..7c7fb390fe 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -1516,7 +1516,6 @@ sr-Latn: administration_emails: Obaveštenja e-poštom od administratora email_events: Događaji za obaveštenja e-poštom email_events_hint: 'Izaberite dešavanja za koja želite da primate obaveštenja:' - other_settings: Ostala podešavanja obaveštenja number: human: decimal_units: diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 494b41a754..c5b42e6b9e 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -1516,7 +1516,6 @@ sr: administration_emails: Обавештења е-поштом од администратора email_events: Догађаји за обавештења е-поштом email_events_hint: 'Изаберите дешавања за која желите да примате обавештења:' - other_settings: Остала подешавања обавештења number: human: decimal_units: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index d0f3994b4e..108c17fc9f 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -1489,7 +1489,6 @@ sv: administration_emails: Admin e-postaviseringar email_events: Händelser för e-postnotiser email_events_hint: 'Välj händelser som du vill ta emot aviseringar för:' - other_settings: Andra aviseringsinställningar number: human: decimal_units: diff --git a/config/locales/ta.yml b/config/locales/ta.yml index b035a602c2..3a22b572b1 100644 --- a/config/locales/ta.yml +++ b/config/locales/ta.yml @@ -212,7 +212,6 @@ ta: notifications: email_events: மின்னஞ்சல் அறிவிப்புகளுக்கான நிகழ்வுகள் email_events_hint: 'எந்த நிகழ்வுகளுக்கு அறிவிப்புகளைப் பெற வேண்டும் என்று தேர்வு செய்க:' - other_settings: அறிவிப்புகள் குறித்த பிற அமைப்புகள் polls: errors: invalid_choice: நீங்கள் தேர்வு செய்த விருப்பம் கிடைக்கவில்லை diff --git a/config/locales/th.yml b/config/locales/th.yml index 5253dd6b78..b212300220 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1469,7 +1469,6 @@ th: administration_emails: การแจ้งเตือนอีเมลผู้ดูแล email_events: เหตุการณ์สำหรับการแจ้งเตือนอีเมล email_events_hint: 'เลือกเหตุการณ์ที่คุณต้องการรับการแจ้งเตือน:' - other_settings: การตั้งค่าการแจ้งเตือนอื่น ๆ number: human: decimal_units: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 7dbec9abbd..3732e53ab9 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1495,7 +1495,6 @@ tr: administration_emails: Yönetici e-posta bildirimleri email_events: E-posta bildirimi gönderilecek etkinlikler email_events_hint: 'Bildirim almak istediğiniz olayları seçin:' - other_settings: Diğer bildirim ayarları number: human: decimal_units: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 7273a0ff2b..231f0028fd 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1547,7 +1547,6 @@ uk: administration_emails: Сповіщення е-пошти адміністратора email_events: Події, про які сповіщати електронною поштою email_events_hint: 'Оберіть події, про які ви хочете отримувати сповіщення:' - other_settings: Інші налаштування сповіщень number: human: decimal_units: diff --git a/config/locales/vi.yml b/config/locales/vi.yml index e362c97a41..2afb6aa4c1 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1467,7 +1467,6 @@ vi: administration_emails: Email thông báo admin email_events: Email email_events_hint: 'Chọn những hoạt động sẽ gửi thông báo qua email:' - other_settings: Chặn thông báo từ number: human: decimal_units: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 46a0e40152..93c741915d 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1469,7 +1469,6 @@ zh-CN: administration_emails: 管理员电子邮件通知 email_events: 电子邮件通知事件 email_events_hint: 选择你想要收到通知的事件: - other_settings: 其它通知设置 number: human: decimal_units: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index e666e4965d..62649864c7 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1464,7 +1464,6 @@ zh-HK: administration_emails: 管理員電郵通知 email_events: 電郵通知活動 email_events_hint: 選擇你想接收通知的活動: - other_settings: 其他通知設定 number: human: decimal_units: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 3cd3583830..f50f685bb4 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1471,7 +1471,6 @@ zh-TW: administration_emails: 管理員電子郵件通知 email_events: 電子郵件通知設定 email_events_hint: 選取您想接收通知的事件: - other_settings: 其他通知設定 number: human: decimal_units: diff --git a/config/routes/api.rb b/config/routes/api.rb index 853a44e0e1..18a247e9fd 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -150,6 +150,17 @@ namespace :api, format: false do end end + namespace :notifications do + resources :requests, only: :index do + member do + post :accept + post :dismiss + end + end + + resource :policy, only: [:show, :update] + end + resources :notifications, only: [:index, :show] do collection do post :clear diff --git a/db/migrate/20240221195424_add_filtered_to_notifications.rb b/db/migrate/20240221195424_add_filtered_to_notifications.rb new file mode 100644 index 0000000000..99e98a58b8 --- /dev/null +++ b/db/migrate/20240221195424_add_filtered_to_notifications.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddFilteredToNotifications < ActiveRecord::Migration[7.1] + def change + add_column :notifications, :filtered, :boolean, default: false, null: false + end +end diff --git a/db/migrate/20240221195828_create_notification_requests.rb b/db/migrate/20240221195828_create_notification_requests.rb new file mode 100644 index 0000000000..98aa630408 --- /dev/null +++ b/db/migrate/20240221195828_create_notification_requests.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class CreateNotificationRequests < ActiveRecord::Migration[7.1] + def change + create_table :notification_requests do |t| + t.references :account, null: false, foreign_key: { on_delete: :cascade }, index: false + t.references :from_account, null: false, foreign_key: { to_table: :accounts, on_delete: :cascade } + t.references :last_status, null: false, foreign_key: { to_table: :statuses, on_delete: :nullify } + t.bigint :notifications_count, null: false, default: 0 + t.boolean :dismissed, null: false, default: false + + t.timestamps + end + + add_index :notification_requests, [:account_id, :from_account_id], unique: true + add_index :notification_requests, [:account_id, :id], where: 'dismissed = false', order: { id: :desc } + end +end diff --git a/db/migrate/20240221211359_notification_request_ids_to_timestamp_ids.rb b/db/migrate/20240221211359_notification_request_ids_to_timestamp_ids.rb new file mode 100644 index 0000000000..8503f452fe --- /dev/null +++ b/db/migrate/20240221211359_notification_request_ids_to_timestamp_ids.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class NotificationRequestIdsToTimestampIds < ActiveRecord::Migration[7.1] + def up + safety_assured do + execute("ALTER TABLE notification_requests ALTER COLUMN id SET DEFAULT timestamp_id('notification_requests')") + end + end + + def down + execute('LOCK notification_requests') + execute("SELECT setval('notification_requests_id_seq', (SELECT MAX(id) FROM notification_requests))") + execute("ALTER TABLE notification_requests ALTER COLUMN id SET DEFAULT nextval('notification_requests_id_seq')") + end +end diff --git a/db/migrate/20240222193403_create_notification_permissions.rb b/db/migrate/20240222193403_create_notification_permissions.rb new file mode 100644 index 0000000000..6e2b6196c2 --- /dev/null +++ b/db/migrate/20240222193403_create_notification_permissions.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class CreateNotificationPermissions < ActiveRecord::Migration[7.1] + def change + create_table :notification_permissions do |t| + t.references :account, null: false, foreign_key: true + t.references :from_account, null: false, foreign_key: { to_table: :accounts } + + t.timestamps + end + end +end diff --git a/db/migrate/20240222203722_create_notification_policies.rb b/db/migrate/20240222203722_create_notification_policies.rb new file mode 100644 index 0000000000..e9d35510a8 --- /dev/null +++ b/db/migrate/20240222203722_create_notification_policies.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class CreateNotificationPolicies < ActiveRecord::Migration[7.1] + def change + create_table :notification_policies do |t| + t.references :account, null: false, foreign_key: true, index: { unique: true } + t.boolean :filter_not_following, null: false, default: false + t.boolean :filter_not_followers, null: false, default: false + t.boolean :filter_new_accounts, null: false, default: false + t.boolean :filter_private_mentions, null: false, default: true + + t.timestamps + end + end +end diff --git a/db/migrate/20240227191620_add_filtered_index_on_notifications.rb b/db/migrate/20240227191620_add_filtered_index_on_notifications.rb new file mode 100644 index 0000000000..ca34452472 --- /dev/null +++ b/db/migrate/20240227191620_add_filtered_index_on_notifications.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddFilteredIndexOnNotifications < ActiveRecord::Migration[7.1] + disable_ddl_transaction! + + def change + add_index :notifications, [:account_id, :id, :type], where: 'filtered = false', order: { id: :desc }, name: 'index_notifications_on_filtered', algorithm: :concurrently + end +end diff --git a/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb b/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb new file mode 100644 index 0000000000..a167baadcc --- /dev/null +++ b/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +class MigrateInteractionSettingsToPolicy < ActiveRecord::Migration[7.1] + disable_ddl_transaction! + + # Dummy classes, to make migration possible across version changes + class Account < ApplicationRecord + has_one :user, inverse_of: :account + has_one :notification_policy, inverse_of: :account + end + + class User < ApplicationRecord + belongs_to :account + end + + class NotificationPolicy < ApplicationRecord + belongs_to :account + end + + def up + User.includes(account: :notification_policy).find_each do |user| + deserialized_settings = Oj.load(user.attributes_before_type_cast['settings']) + policy = user.account.notification_policy || user.account.build_notification_policy + requires_new_policy = false + + if deserialized_settings['interactions.must_be_follower'] + policy.filter_not_followers = true + requires_new_policy = true + end + + if deserialized_settings['interactions.must_be_following'] + policy.filter_not_following = true + requires_new_policy = true + end + + if deserialized_settings['interactions.must_be_following_dm'] + policy.filter_private_mentions = true + requires_new_policy = true + end + + policy.save if requires_new_policy && policy.changed? + end + end + + def down; end +end diff --git a/db/schema.rb b/db/schema.rb index 50f4e7189d..97917d0456 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_01_11_033014) do +ActiveRecord::Schema[7.1].define(version: 2024_03_04_090449) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -666,6 +666,40 @@ ActiveRecord::Schema[7.1].define(version: 2024_01_11_033014) do t.index ["target_account_id"], name: "index_mutes_on_target_account_id" end + create_table "notification_permissions", force: :cascade do |t| + t.bigint "account_id", null: false + t.bigint "from_account_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["account_id"], name: "index_notification_permissions_on_account_id" + t.index ["from_account_id"], name: "index_notification_permissions_on_from_account_id" + end + + create_table "notification_policies", force: :cascade do |t| + t.bigint "account_id", null: false + t.boolean "filter_not_following", default: false, null: false + t.boolean "filter_not_followers", default: false, null: false + t.boolean "filter_new_accounts", default: false, null: false + t.boolean "filter_private_mentions", default: true, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["account_id"], name: "index_notification_policies_on_account_id", unique: true + end + + create_table "notification_requests", id: :bigint, default: -> { "timestamp_id('notification_requests'::text)" }, force: :cascade do |t| + t.bigint "account_id", null: false + t.bigint "from_account_id", null: false + t.bigint "last_status_id", null: false + t.bigint "notifications_count", default: 0, null: false + t.boolean "dismissed", default: false, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["account_id", "from_account_id"], name: "index_notification_requests_on_account_id_and_from_account_id", unique: true + t.index ["account_id", "id"], name: "index_notification_requests_on_account_id_and_id", order: { id: :desc }, where: "(dismissed = false)" + t.index ["from_account_id"], name: "index_notification_requests_on_from_account_id" + t.index ["last_status_id"], name: "index_notification_requests_on_last_status_id" + end + create_table "notifications", force: :cascade do |t| t.bigint "activity_id", null: false t.string "activity_type", null: false @@ -674,7 +708,9 @@ ActiveRecord::Schema[7.1].define(version: 2024_01_11_033014) do t.bigint "account_id", null: false t.bigint "from_account_id", null: false t.string "type" + t.boolean "filtered", default: false, null: false t.index ["account_id", "id", "type"], name: "index_notifications_on_account_id_and_id_and_type", order: { id: :desc } + t.index ["account_id", "id", "type"], name: "index_notifications_on_filtered", order: { id: :desc }, where: "(filtered = false)" t.index ["activity_id", "activity_type"], name: "index_notifications_on_activity_id_and_activity_type" t.index ["from_account_id"], name: "index_notifications_on_from_account_id" end @@ -1255,6 +1291,12 @@ ActiveRecord::Schema[7.1].define(version: 2024_01_11_033014) 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_policies", "accounts" + add_foreign_key "notification_requests", "accounts", column: "from_account_id", on_delete: :cascade + add_foreign_key "notification_requests", "accounts", on_delete: :cascade + add_foreign_key "notification_requests", "statuses", column: "last_status_id", on_delete: :nullify add_foreign_key "notifications", "accounts", column: "from_account_id", name: "fk_fbd6b0bf9e", on_delete: :cascade add_foreign_key "notifications", "accounts", name: "fk_c141c8ee55", on_delete: :cascade add_foreign_key "oauth_access_grants", "oauth_applications", column: "application_id", name: "fk_34d54b0a33", on_delete: :cascade diff --git a/spec/controllers/settings/preferences/notifications_controller_spec.rb b/spec/controllers/settings/preferences/notifications_controller_spec.rb index b61d7461ce..e0f0bc55a7 100644 --- a/spec/controllers/settings/preferences/notifications_controller_spec.rb +++ b/spec/controllers/settings/preferences/notifications_controller_spec.rb @@ -24,14 +24,13 @@ describe Settings::Preferences::NotificationsController do describe 'PUT #update' do it 'updates notifications settings' do - user.settings.update('notification_emails.follow': false, 'interactions.must_be_follower': true) + user.settings.update('notification_emails.follow': false) user.save put :update, params: { user: { settings_attributes: { 'notification_emails.follow': '1', - 'interactions.must_be_follower': '0', }, }, } @@ -39,7 +38,6 @@ describe Settings::Preferences::NotificationsController do expect(response).to redirect_to(settings_preferences_notifications_path) user.reload expect(user.settings['notification_emails.follow']).to be true - expect(user.settings['interactions.must_be_follower']).to be false end end end diff --git a/spec/fabricators/notification_permission_fabricator.rb b/spec/fabricators/notification_permission_fabricator.rb new file mode 100644 index 0000000000..d421ddd81f --- /dev/null +++ b/spec/fabricators/notification_permission_fabricator.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +Fabricator(:notification_permission) do + account + from_account { Fabricate.build(:account) } +end diff --git a/spec/fabricators/notification_policy_fabricator.rb b/spec/fabricators/notification_policy_fabricator.rb new file mode 100644 index 0000000000..f33438fec7 --- /dev/null +++ b/spec/fabricators/notification_policy_fabricator.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +Fabricator(:notification_policy) do + account + filter_not_following false + filter_not_followers false + filter_new_accounts false + filter_private_mentions true +end diff --git a/spec/fabricators/notification_request_fabricator.rb b/spec/fabricators/notification_request_fabricator.rb new file mode 100644 index 0000000000..05a13b8ef8 --- /dev/null +++ b/spec/fabricators/notification_request_fabricator.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +Fabricator(:notification_request) do + account + from_account { Fabricate.build(:account) } + last_status { Fabricate.build(:status) } + dismissed false +end diff --git a/spec/models/notification_policy_spec.rb b/spec/models/notification_policy_spec.rb new file mode 100644 index 0000000000..bbfa548cf4 --- /dev/null +++ b/spec/models/notification_policy_spec.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe NotificationPolicy do + describe '#summarize!' do + subject { Fabricate(:notification_policy) } + + let(:sender) { Fabricate(:account) } + + before do + Fabricate.times(2, :notification, account: subject.account, activity: Fabricate(:status, account: sender)) + Fabricate(:notification_request, account: subject.account, from_account: sender) + subject.summarize! + end + + it 'sets pending_requests_count' do + expect(subject.pending_requests_count).to eq 1 + end + + it 'sets pending_notifications_count' do + expect(subject.pending_notifications_count).to eq 2 + end + end +end diff --git a/spec/models/notification_request_spec.rb b/spec/models/notification_request_spec.rb new file mode 100644 index 0000000000..f4613aaede --- /dev/null +++ b/spec/models/notification_request_spec.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe NotificationRequest do + describe '#reconsider_existence!' do + subject { Fabricate(:notification_request, dismissed: dismissed) } + + let(:dismissed) { false } + + context 'when there are remaining notifications' do + before do + Fabricate(:notification, account: subject.account, activity: Fabricate(:status, account: subject.from_account)) + subject.reconsider_existence! + end + + it 'leaves request intact' do + expect(subject.destroyed?).to be false + end + + it 'updates notifications_count' do + expect(subject.notifications_count).to eq 1 + end + end + + context 'when there are no notifications' do + before do + subject.reconsider_existence! + end + + context 'when dismissed' do + let(:dismissed) { true } + + it 'leaves request intact' do + expect(subject.destroyed?).to be false + end + end + + it 'removes the request' do + expect(subject.destroyed?).to be true + end + end + end +end diff --git a/spec/requests/api/v1/conversations_spec.rb b/spec/requests/api/v1/conversations_spec.rb index e2327d9a93..caa0f5c52c 100644 --- a/spec/requests/api/v1/conversations_spec.rb +++ b/spec/requests/api/v1/conversations_spec.rb @@ -12,6 +12,7 @@ RSpec.describe 'API V1 Conversations' do describe 'GET /api/v1/conversations', :sidekiq_inline do before do + user.account.follow!(other.account) PostStatusService.new.call(other.account, text: 'Hey @alice', visibility: 'direct') PostStatusService.new.call(user.account, text: 'Hey, nobody here', visibility: 'direct') end diff --git a/spec/requests/api/v1/notifications/policies_spec.rb b/spec/requests/api/v1/notifications/policies_spec.rb new file mode 100644 index 0000000000..fe6bdbd973 --- /dev/null +++ b/spec/requests/api/v1/notifications/policies_spec.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Policies' do + let(:user) { Fabricate(:user, account_attributes: { username: 'alice' }) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'read:notifications write:notifications' } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + + describe 'GET /api/v1/notifications/policy', :sidekiq_inline do + subject do + get '/api/v1/notifications/policy', headers: headers, params: params + end + + let(:params) { {} } + + before do + Fabricate(:notification_request, account: user.account) + end + + it_behaves_like 'forbidden for wrong scope', 'write write:notifications' + + context 'with no options' do + it 'returns http success', :aggregate_failures do + subject + + expect(response).to have_http_status(200) + end + end + end + + describe 'PUT /api/v1/notifications/policy' do + subject do + put '/api/v1/notifications/policy', headers: headers, params: params + end + + let(:params) { {} } + + it_behaves_like 'forbidden for wrong scope', 'read read:notifications' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + end +end diff --git a/spec/requests/api/v1/notifications/requests_spec.rb b/spec/requests/api/v1/notifications/requests_spec.rb new file mode 100644 index 0000000000..64675d562c --- /dev/null +++ b/spec/requests/api/v1/notifications/requests_spec.rb @@ -0,0 +1,107 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Requests' do + let(:user) { Fabricate(:user, account_attributes: { username: 'alice' }) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'read:notifications write:notifications' } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + + describe 'GET /api/v1/notifications/requests', :sidekiq_inline do + subject do + get '/api/v1/notifications/requests', headers: headers, params: params + end + + let(:params) { {} } + + before do + Fabricate(:notification_request, account: user.account) + Fabricate(:notification_request, account: user.account, dismissed: true) + end + + it_behaves_like 'forbidden for wrong scope', 'write write:notifications' + + context 'with no options' do + it 'returns http success', :aggregate_failures do + subject + + expect(response).to have_http_status(200) + end + end + + context 'with dismissed' do + let(:params) { { dismissed: '1' } } + + it 'returns http success', :aggregate_failures do + subject + + expect(response).to have_http_status(200) + end + end + end + + describe 'POST /api/v1/notifications/requests/:id/accept' do + subject do + post "/api/v1/notifications/requests/#{notification_request.id}/accept", headers: headers + end + + let(:notification_request) { Fabricate(:notification_request, account: user.account) } + + it_behaves_like 'forbidden for wrong scope', 'read read:notifications' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'creates notification permission' do + subject + + expect(NotificationPermission.find_by(account: notification_request.account, from_account: notification_request.from_account)).to_not be_nil + end + + context 'when notification request belongs to someone else' do + let(:notification_request) { Fabricate(:notification_request) } + + it 'returns http not found' do + subject + + expect(response).to have_http_status(404) + end + end + end + + describe 'POST /api/v1/notifications/requests/:id/dismiss' do + subject do + post "/api/v1/notifications/requests/#{notification_request.id}/dismiss", headers: headers + end + + let(:notification_request) { Fabricate(:notification_request, account: user.account) } + + it_behaves_like 'forbidden for wrong scope', 'read read:notifications' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'dismisses the notification request' do + subject + + expect(notification_request.reload.dismissed?).to be true + end + + context 'when notification request belongs to someone else' do + let(:notification_request) { Fabricate(:notification_request) } + + it 'returns http not found' do + subject + + expect(response).to have_http_status(404) + end + end + end +end diff --git a/spec/services/notify_service_spec.rb b/spec/services/notify_service_spec.rb index e818fadcbe..57ff326c73 100644 --- a/spec/services/notify_service_spec.rb +++ b/spec/services/notify_service_spec.rb @@ -41,7 +41,8 @@ RSpec.describe NotifyService, type: :service do it 'does not notify when sender is silenced and not followed' do sender.silence! - expect { subject }.to_not change(Notification, :count) + subject + expect(Notification.find_by(activity: activity).filtered?).to be true end it 'does not notify when recipient is suspended' do @@ -49,66 +50,6 @@ RSpec.describe NotifyService, type: :service do expect { subject }.to_not change(Notification, :count) end - context 'with direct messages' do - let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct)) } - let(:type) { :mention } - - before do - user.settings.update('interactions.must_be_following_dm': enabled) - user.save - end - - context 'when recipient is supposed to be following sender' do - let(:enabled) { true } - - it 'does not notify' do - expect { subject }.to_not change(Notification, :count) - end - - context 'when the message chain is initiated by recipient, but is not direct message' do - let(:reply_to) { Fabricate(:status, account: recipient) } - let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: reply_to)) } - - before { Fabricate(:mention, account: sender, status: reply_to) } - - it 'does not notify' do - expect { subject }.to_not change(Notification, :count) - end - end - - context 'when the message chain is initiated by recipient, but without a mention to the sender, even if the sender sends multiple messages in a row' do - let(:reply_to) { Fabricate(:status, account: recipient) } - let(:dummy_reply) { Fabricate(:status, account: sender, visibility: :direct, thread: reply_to) } - let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: dummy_reply)) } - - before { Fabricate(:mention, account: sender, status: reply_to) } - - it 'does not notify' do - expect { subject }.to_not change(Notification, :count) - end - end - - context 'when the message chain is initiated by the recipient with a mention to the sender' do - let(:reply_to) { Fabricate(:status, account: recipient, visibility: :direct) } - let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: reply_to)) } - - before { Fabricate(:mention, account: sender, status: reply_to) } - - it 'does notify' do - expect { subject }.to change(Notification, :count) - end - end - end - - context 'when recipient is NOT supposed to be following sender' do - let(:enabled) { false } - - it 'does notify' do - expect { subject }.to change(Notification, :count) - end - end - end - describe 'reblogs' do let(:status) { Fabricate(:status, account: Fabricate(:account)) } let(:activity) { Fabricate(:status, account: sender, reblog: status) } @@ -187,4 +128,189 @@ RSpec.describe NotifyService, type: :service do end end end + + describe NotifyService::FilterCondition do + subject { described_class.new(notification) } + + let(:activity) { Fabricate(:mention, status: Fabricate(:status)) } + let(:notification) { Fabricate(:notification, type: :mention, activity: activity, from_account: activity.status.account, account: activity.account) } + + describe '#filter?' do + context 'when sender is silenced' do + before do + notification.from_account.silence! + end + + it 'returns true' do + expect(subject.filter?).to be true + end + + context 'when recipient follows sender' do + before do + notification.account.follow!(notification.from_account) + end + + it 'returns false' do + expect(subject.filter?).to be false + end + end + end + + context 'when recipient is filtering not-followed senders' do + before do + Fabricate(:notification_policy, account: notification.account, filter_not_following: true) + end + + it 'returns true' do + expect(subject.filter?).to be true + end + + context 'when sender has permission' do + before do + Fabricate(:notification_permission, account: notification.account, from_account: notification.from_account) + end + + it 'returns false' do + expect(subject.filter?).to be false + end + end + + context 'when sender is followed by recipient' do + before do + notification.account.follow!(notification.from_account) + end + + it 'returns false' do + expect(subject.filter?).to be false + end + end + end + + context 'when recipient is filtering not-followers' do + before do + Fabricate(:notification_policy, account: notification.account, filter_not_followers: true) + end + + it 'returns true' do + expect(subject.filter?).to be true + end + + context 'when sender has permission' do + before do + Fabricate(:notification_permission, account: notification.account, from_account: notification.from_account) + end + + it 'returns false' do + expect(subject.filter?).to be false + end + end + + context 'when sender follows recipient' do + before do + notification.from_account.follow!(notification.account) + end + + it 'returns true' do + expect(subject.filter?).to be true + end + end + + context 'when sender follows recipient for longer than 3 days' do + before do + follow = notification.from_account.follow!(notification.account) + follow.update(created_at: 4.days.ago) + end + + it 'returns false' do + expect(subject.filter?).to be false + end + end + end + + context 'when recipient is filtering new accounts' do + before do + Fabricate(:notification_policy, account: notification.account, filter_new_accounts: true) + end + + it 'returns true' do + expect(subject.filter?).to be true + end + + context 'when sender has permission' do + before do + Fabricate(:notification_permission, account: notification.account, from_account: notification.from_account) + end + + it 'returns false' do + expect(subject.filter?).to be false + end + end + + context 'when sender is older than 30 days' do + before do + notification.from_account.update(created_at: 31.days.ago) + end + + it 'returns false' do + expect(subject.filter?).to be false + end + end + end + + context 'when recipient is not filtering anyone' do + before do + Fabricate(:notification_policy, account: notification.account) + end + + it 'returns false' do + expect(subject.filter?).to be false + end + end + + context 'when recipient is filtering unsolicited private mentions' do + before do + Fabricate(:notification_policy, account: notification.account, filter_private_mentions: true) + end + + context 'when notification is not a private mention' do + it 'returns false' do + expect(subject.filter?).to be false + end + end + + context 'when notification is a private mention' do + before do + notification.target_status.update(visibility: :direct) + end + + it 'returns true' do + expect(subject.filter?).to be true + end + + context 'when the message chain is initiated by recipient, but sender is not mentioned' do + before do + original_status = Fabricate(:status, account: notification.account, visibility: :direct) + notification.target_status.update(thread: original_status) + end + + it 'returns true' do + expect(subject.filter?).to be true + end + end + + context 'when the message chain is initiated by recipient, and sender is mentioned' do + before do + original_status = Fabricate(:status, account: notification.account, visibility: :direct) + notification.target_status.update(thread: original_status) + Fabricate(:mention, status: original_status, account: notification.from_account) + end + + it 'returns false' do + expect(subject.filter?).to be false + end + end + end + end + end + end end From 509528e2dc2f87d59bc385efee82a9a83bb1b63f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 18:33:54 +0100 Subject: [PATCH 127/954] Update dependency pg to v1.5.6 (#29477) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 59b24e1035..047465fae6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -505,7 +505,7 @@ GEM parslet (2.0.0) pastel (0.8.0) tty-color (~> 0.5) - pg (1.5.5) + pg (1.5.6) pghero (3.4.1) activerecord (>= 6) posix-spawn (0.3.15) From e8605a69d22e369e34914548338c15c053db9667 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 19:02:24 +0100 Subject: [PATCH 128/954] Update omniauth packages (#25306) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Renaud Chaput --- Gemfile.lock | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 047465fae6..73ddfb4cff 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -465,11 +465,11 @@ GEM statsd-ruby (~> 1.4, >= 1.4.0) oj (3.16.3) bigdecimal (>= 3.0) - omniauth (2.1.1) + omniauth (2.1.2) hashie (>= 3.4.6) rack (>= 2.2.3) rack-protection - omniauth-cas (3.0.0.beta.1) + omniauth-cas (3.0.0) addressable (~> 2.8) nokogiri (~> 1.12) omniauth (~> 2.1) @@ -543,8 +543,9 @@ GEM httpclient json-jwt (>= 1.11.0) rack (>= 2.1.0) - rack-protection (3.0.5) - rack + rack-protection (3.2.0) + base64 (>= 0.1.0) + rack (~> 2.2, >= 2.2.4) rack-proxy (0.7.6) rack rack-session (1.0.2) From e85a2aa18dfb619e64f6f5acc6c401f72587fc72 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 8 Mar 2024 10:10:07 +0100 Subject: [PATCH 129/954] Fix interaction settings migration error when encountering no settings (#29529) --- .../20240304090449_migrate_interaction_settings_to_policy.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb b/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb index a167baadcc..0e9a42f8df 100644 --- a/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb +++ b/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb @@ -20,6 +20,9 @@ class MigrateInteractionSettingsToPolicy < ActiveRecord::Migration[7.1] def up User.includes(account: :notification_policy).find_each do |user| deserialized_settings = Oj.load(user.attributes_before_type_cast['settings']) + + next if deserialized_settings.nil? + policy = user.account.notification_policy || user.account.build_notification_policy requires_new_policy = false From 81400b02b12115a5f3b6d386f1741b5deedf5cd8 Mon Sep 17 00:00:00 2001 From: gunchleoc Date: Sun, 10 Mar 2024 10:25:13 +0000 Subject: [PATCH 130/954] Add nds locale to posting languages (#27434) --- app/helpers/languages_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb index 79d8cf794c..9e1c0a7db1 100644 --- a/app/helpers/languages_helper.rb +++ b/app/helpers/languages_helper.rb @@ -198,6 +198,7 @@ module LanguagesHelper ldn: ['Láadan', 'Láadan'].freeze, lfn: ['Lingua Franca Nova', 'lingua franca nova'].freeze, moh: ['Mohawk', 'Kanienʼkéha'].freeze, + nds: ['Low German', 'Plattdüütsch'].freeze, pdc: ['Pennsylvania Dutch', 'Pennsilfaani-Deitsch'].freeze, sco: ['Scots', 'Scots'].freeze, sma: ['Southern Sami', 'Åarjelsaemien Gïele'].freeze, From f85168b1893722a5fa7d499f5fc5a6b5f5ad3d90 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 08:37:04 +0100 Subject: [PATCH 131/954] New Crowdin Translations (automated) (#29467) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/ar.json | 6 + app/javascript/mastodon/locales/bg.json | 4 +- app/javascript/mastodon/locales/br.json | 5 +- app/javascript/mastodon/locales/de.json | 4 +- app/javascript/mastodon/locales/es-AR.json | 2 +- app/javascript/mastodon/locales/es-MX.json | 6 +- app/javascript/mastodon/locales/es.json | 14 +- app/javascript/mastodon/locales/et.json | 20 +- app/javascript/mastodon/locales/fi.json | 12 +- app/javascript/mastodon/locales/gd.json | 18 +- app/javascript/mastodon/locales/ia.json | 5 + app/javascript/mastodon/locales/kab.json | 56 +- app/javascript/mastodon/locales/lt.json | 554 +++++---- app/javascript/mastodon/locales/lv.json | 204 ++-- app/javascript/mastodon/locales/nl.json | 4 +- app/javascript/mastodon/locales/no.json | 1 + app/javascript/mastodon/locales/ru.json | 2 +- app/javascript/mastodon/locales/ry.json | 20 +- app/javascript/mastodon/locales/sk.json | 1055 +++++++++--------- app/javascript/mastodon/locales/sr-Latn.json | 6 + app/javascript/mastodon/locales/sr.json | 3 +- app/javascript/mastodon/locales/tok.json | 44 +- app/javascript/mastodon/locales/zh-TW.json | 28 +- config/locales/activerecord.kab.yml | 2 +- config/locales/activerecord.sk.yml | 12 +- config/locales/af.yml | 2 - config/locales/an.yml | 2 - config/locales/ar.yml | 2 - config/locales/ast.yml | 2 - config/locales/be.yml | 37 +- config/locales/bg.yml | 44 +- config/locales/br.yml | 11 +- config/locales/ca.yml | 37 +- config/locales/ckb.yml | 1 - config/locales/co.yml | 1 - config/locales/cs.yml | 2 - config/locales/cy.yml | 37 +- config/locales/da.yml | 37 +- config/locales/de.yml | 39 +- config/locales/devise.et.yml | 1 + config/locales/devise.fi.yml | 2 +- config/locales/devise.fr-CA.yml | 1 + config/locales/devise.fr.yml | 1 + config/locales/devise.gd.yml | 10 + config/locales/devise.lv.yml | 12 +- config/locales/devise.no.yml | 1 + config/locales/devise.sk.yml | 143 +-- config/locales/devise.sv.yml | 2 + config/locales/doorkeeper.lv.yml | 6 +- config/locales/doorkeeper.sk.yml | 178 +-- config/locales/doorkeeper.tr.yml | 4 +- config/locales/doorkeeper.zh-TW.yml | 6 +- config/locales/el.yml | 2 - config/locales/en-GB.yml | 2 - config/locales/eo.yml | 2 - config/locales/es-AR.yml | 45 +- config/locales/es-MX.yml | 43 +- config/locales/es.yml | 41 +- config/locales/et.yml | 45 +- config/locales/eu.yml | 37 +- config/locales/fa.yml | 2 - config/locales/fi.yml | 42 +- config/locales/fo.yml | 37 +- config/locales/fr-CA.yml | 44 +- config/locales/fr.yml | 42 +- config/locales/fy.yml | 23 +- config/locales/gd.yml | 86 +- config/locales/gl.yml | 37 +- config/locales/he.yml | 37 +- config/locales/hr.yml | 1 - config/locales/hu.yml | 37 +- config/locales/hy.yml | 1 - config/locales/id.yml | 2 - config/locales/ie.yml | 37 +- config/locales/io.yml | 2 - config/locales/is.yml | 37 +- config/locales/it.yml | 37 +- config/locales/ja.yml | 39 +- config/locales/ka.yml | 1 - config/locales/kab.yml | 60 +- config/locales/kk.yml | 1 - config/locales/ko.yml | 48 +- config/locales/ku.yml | 2 - config/locales/lad.yml | 21 +- config/locales/lt.yml | 406 +++++-- config/locales/lv.yml | 114 +- config/locales/ms.yml | 2 - config/locales/my.yml | 2 - config/locales/nl.yml | 37 +- config/locales/nn.yml | 37 +- config/locales/no.yml | 27 +- config/locales/oc.yml | 1 - config/locales/pl.yml | 37 +- config/locales/pt-BR.yml | 2 - config/locales/pt-PT.yml | 37 +- config/locales/ro.yml | 1 - config/locales/ru.yml | 2 - config/locales/sc.yml | 1 - config/locales/sco.yml | 2 - config/locales/si.yml | 1 - config/locales/simple_form.ca.yml | 4 +- config/locales/simple_form.et.yml | 2 + config/locales/simple_form.fi.yml | 2 +- config/locales/simple_form.fy.yml | 2 + config/locales/simple_form.gd.yml | 4 +- config/locales/simple_form.ja.yml | 2 + config/locales/simple_form.kab.yml | 9 + config/locales/simple_form.lv.yml | 14 +- config/locales/simple_form.no.yml | 2 + config/locales/simple_form.sr-Latn.yml | 2 + config/locales/simple_form.sr.yml | 2 + config/locales/simple_form.sv.yml | 2 + config/locales/simple_form.vi.yml | 2 + config/locales/simple_form.zh-TW.yml | 14 +- config/locales/sk.yml | 13 +- config/locales/sl.yml | 37 +- config/locales/sq.yml | 36 +- config/locales/sr-Latn.yml | 58 +- config/locales/sr.yml | 44 +- config/locales/sv.yml | 46 +- config/locales/th.yml | 29 +- config/locales/tr.yml | 37 +- config/locales/uk.yml | 8 +- config/locales/vi.yml | 39 +- config/locales/zh-CN.yml | 37 +- config/locales/zh-HK.yml | 2 - config/locales/zh-TW.yml | 129 ++- 127 files changed, 3437 insertions(+), 1451 deletions(-) diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 2eebd1369c..914c15ad95 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -277,7 +277,13 @@ "follow_request.authorize": "ترخيص", "follow_request.reject": "رفض", "follow_requests.unlocked_explanation": "حتى وإن كان حسابك غير مقفل، يعتقد فريق {domain} أنك قد ترغب في مراجعة طلبات المتابعة من هذه الحسابات يدوياً.", + "follow_suggestions.curated_suggestion": "اختيار الموظفين", "follow_suggestions.dismiss": "لا تُظهرها مجدّدًا", + "follow_suggestions.hints.featured": "تم اختيار هذا الملف الشخصي يدوياً من قبل فريق {domain}.", + "follow_suggestions.hints.friends_of_friends": "هذا الملف الشخصي مشهور بين الأشخاص الذين تتابعهم.", + "follow_suggestions.hints.most_followed": "هذا الملف الشخصي هو واحد من الأكثر متابعة على {domain}.", + "follow_suggestions.hints.most_interactions": "هذا الملف الشخصي قد حصل مؤخرا على الكثير من الاهتمام على {domain}.", + "follow_suggestions.hints.similar_to_recently_followed": "هذا الملف الشخصي مشابه للملفات الشخصية التي تابعتها مؤخرا.", "follow_suggestions.personalized_suggestion": "توصية مخصصة", "follow_suggestions.popular_suggestion": "توصية رائجة", "follow_suggestions.view_all": "عرض الكل", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index f08ca46af8..93823496b7 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -480,7 +480,7 @@ "onboarding.action.back": "Върнете ме обратно", "onboarding.actions.back": "Върнете ме обратно", "onboarding.actions.go_to_explore": "Виж тенденции", - "onboarding.actions.go_to_home": "Към началния ви инфоканал", + "onboarding.actions.go_to_home": "Към началния ми инфоканал", "onboarding.compose.template": "Здравейте, #Mastodon!", "onboarding.follows.empty": "За съжаление, в момента не могат да бъдат показани резултати. Може да опитате да търсите или да разгледате, за да намерите кого да последвате, или опитайте отново по-късно.", "onboarding.follows.lead": "Може да бъдете куратор на началния си инфоканал. Последвайки повече хора, по-деен и по-интересен ще става. Тези профили може да са добра начална точка, от която винаги по-късно да спрете да следвате!", @@ -504,7 +504,7 @@ "onboarding.start.skip": "Желаете ли да прескочите?", "onboarding.start.title": "Успяхте!", "onboarding.steps.follow_people.body": "Може да бъдете куратор на инфоканала си. Хайде да го запълним с интересни хора.", - "onboarding.steps.follow_people.title": "Последвайте {count, plural, one {един човек} other {# души}}", + "onboarding.steps.follow_people.title": "Персонализиране на началния ви инфоканал", "onboarding.steps.publish_status.body": "Поздравете целия свят.", "onboarding.steps.publish_status.title": "Направете първата си публикация", "onboarding.steps.setup_profile.body": "Други са по-вероятно да взаимодействат с вас с попълнения профил.", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index 5ce52d527a..3b376ac470 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -113,6 +113,7 @@ "column.directory": "Mont a-dreuz ar profiloù", "column.domain_blocks": "Domani berzet", "column.favourites": "Muiañ-karet", + "column.firehose": "Redoù war-eeun", "column.follow_requests": "Rekedoù heuliañ", "column.home": "Degemer", "column.lists": "Listennoù", @@ -143,6 +144,8 @@ "compose_form.lock_disclaimer.lock": "prennet", "compose_form.placeholder": "Petra emaoc'h o soñjal e-barzh ?", "compose_form.poll.duration": "Pad ar sontadeg", + "compose_form.poll.multiple": "Meur a choaz", + "compose_form.poll.option_placeholder": "Choaz {number}", "compose_form.poll.single": "Dibabit unan", "compose_form.poll.switch_to_multiple": "Kemmañ ar sontadeg evit aotren meur a zibab", "compose_form.poll.switch_to_single": "Kemmañ ar sontadeg evit aotren un dibab hepken", @@ -441,7 +444,7 @@ "onboarding.action.back": "Distreiñ", "onboarding.actions.back": "Distreiñ", "onboarding.actions.go_to_explore": "See what's trending", - "onboarding.actions.go_to_home": "Go to your home feed", + "onboarding.actions.go_to_home": "Mont d'ho red degemer", "onboarding.compose.template": "Salud #Mastodon!", "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", "onboarding.follows.title": "Popular on Mastodon", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 2c94314810..3700b5d91d 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -151,7 +151,7 @@ "compose_form.poll.single": "Einfachauswahl", "compose_form.poll.switch_to_multiple": "Mehrfachauswahl erlauben", "compose_form.poll.switch_to_single": "Nur Einfachauswahl erlauben", - "compose_form.poll.type": "Stil", + "compose_form.poll.type": "Art", "compose_form.publish": "Veröffentlichen", "compose_form.publish_form": "Neuer Beitrag", "compose_form.reply": "Antworten", @@ -277,7 +277,7 @@ "follow_request.authorize": "Genehmigen", "follow_request.reject": "Ablehnen", "follow_requests.unlocked_explanation": "Auch wenn dein Konto öffentlich bzw. nicht geschützt ist, haben die Moderator*innen von {domain} gedacht, dass du diesen Follower lieber manuell bestätigen solltest.", - "follow_suggestions.curated_suggestion": "Vom Server empfohlen", + "follow_suggestions.curated_suggestion": "Vom Server-Team empfohlen", "follow_suggestions.dismiss": "Nicht mehr anzeigen", "follow_suggestions.hints.featured": "Dieses Profil wurde vom {domain}-Team ausgewählt.", "follow_suggestions.hints.friends_of_friends": "Dieses Profil ist bei deinen Followern beliebt.", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 3b63c505e4..ead3355589 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -271,7 +271,7 @@ "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.title": "Filtrar este mensaje", "filter_modal.title.status": "Filtrar un mensaje", - "firehose.all": "Todas", + "firehose.all": "Todos", "firehose.local": "Este servidor", "firehose.remote": "Otros servidores", "follow_request.authorize": "Autorizar", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index aa935e410e..ba54843236 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -279,15 +279,15 @@ "follow_requests.unlocked_explanation": "A pesar de que tu cuenta no es privada, el personal de {domain} ha pensado que quizás deberías revisar manualmente las solicitudes de seguimiento de estas cuentas.", "follow_suggestions.curated_suggestion": "Recomendaciones del equipo", "follow_suggestions.dismiss": "No mostrar de nuevo", - "follow_suggestions.hints.featured": "Este perfil ha sido elegido a mano por el equipo de {domain}.", + "follow_suggestions.hints.featured": "Este perfil ha sido seleccionado a mano por el equipo de {domain}.", "follow_suggestions.hints.friends_of_friends": "Este perfil es popular entre las personas que sigues.", "follow_suggestions.hints.most_followed": "Este perfil es uno de los más seguidos en {domain}.", - "follow_suggestions.hints.most_interactions": "Este perfil ha estado recibiendo recientemente mucha atención en {domain}.", + "follow_suggestions.hints.most_interactions": "Este perfil ha estado recibiendo mucha atención en {domain}.", "follow_suggestions.hints.similar_to_recently_followed": "Este perfil es similar a los perfiles que has seguido recientemente.", "follow_suggestions.personalized_suggestion": "Sugerencia personalizada", "follow_suggestions.popular_suggestion": "Sugerencia popular", "follow_suggestions.view_all": "Ver todo", - "follow_suggestions.who_to_follow": "A quién seguir", + "follow_suggestions.who_to_follow": "Recomendamos seguir", "followed_tags": "Hashtags seguidos", "footer.about": "Acerca de", "footer.directory": "Directorio de perfiles", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 25ff1157fd..b4cc241814 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -529,15 +529,15 @@ "poll_button.add_poll": "Añadir una encuesta", "poll_button.remove_poll": "Eliminar encuesta", "privacy.change": "Ajustar privacidad", - "privacy.direct.long": "Todos los mencionados en el post", + "privacy.direct.long": "Visible únicamente por los mencionados en la publicación", "privacy.direct.short": "Personas específicas", - "privacy.private.long": "Solo tus seguidores", + "privacy.private.long": "Visible únicamente por tus seguidores", "privacy.private.short": "Seguidores", - "privacy.public.long": "Cualquiera dentro y fuera de Mastodon", - "privacy.public.short": "Público", - "privacy.unlisted.additional": "Esto se comporta exactamente igual que el público, excepto que la publicación no aparecerá en la cronología en directo o en las etiquetas, la exploración o búsqueda de Mastodon, incluso si está optado por activar la cuenta de usuario.", - "privacy.unlisted.long": "Menos fanfares algorítmicos", - "privacy.unlisted.short": "Público tranquilo", + "privacy.public.long": "Visible por todo el mundo, dentro y fuera de Mastodon", + "privacy.public.short": "Pública", + "privacy.unlisted.additional": "Se comporta exactamente igual que la visibilidad pública, excepto que la publicación no aparecerá en las cronologías públicas o en las etiquetas, la sección de Explorar o la búsqueda de Mastodon, incluso si has habilitado la opción de búsqueda en tu perfil.", + "privacy.unlisted.long": "Sin algoritmos de descubrimiento", + "privacy.unlisted.short": "Pública silenciosa", "privacy_policy.last_updated": "Actualizado por última vez {date}", "privacy_policy.title": "Política de Privacidad", "recommended": "Recomendado", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index be8bec616d..be0c262c32 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -21,7 +21,7 @@ "account.blocked": "Blokeeritud", "account.browse_more_on_origin_server": "Vaata rohkem algsel profiilil", "account.cancel_follow_request": "Võta jälgimistaotlus tagasi", - "account.copy": "Kopeeri link profiili", + "account.copy": "Kopeeri profiili link", "account.direct": "Maini privaatselt @{name}", "account.disable_notifications": "Peata teavitused @{name} postitustest", "account.domain_blocked": "Domeen peidetud", @@ -277,6 +277,17 @@ "follow_request.authorize": "Autoriseeri", "follow_request.reject": "Hülga", "follow_requests.unlocked_explanation": "Kuigi su konto pole lukustatud, soovitab {domain} personal siiski nende kontode jälgimistaotlused käsitsi üle vaadata.", + "follow_suggestions.curated_suggestion": "Teiste valitud", + "follow_suggestions.dismiss": "Ära enam näita", + "follow_suggestions.hints.featured": "Selle kasutajaprofiili on soovitanud {domain} kasutajad.", + "follow_suggestions.hints.friends_of_friends": "See kasutajaprofiil on jälgitavate seas populaarne.", + "follow_suggestions.hints.most_followed": "See on {domain} enim jälgitud kasutajaprofiil.", + "follow_suggestions.hints.most_interactions": "See on {domain} viimasel ajal enim tähelepanu saanud kasutajaprofiil.", + "follow_suggestions.hints.similar_to_recently_followed": "See kasutajaprofiil sarnaneb neile, mida oled hiljuti jälgima asunud.", + "follow_suggestions.personalized_suggestion": "Isikupärastatud soovitus", + "follow_suggestions.popular_suggestion": "Popuplaarne soovitus", + "follow_suggestions.view_all": "Vaata kõiki", + "follow_suggestions.who_to_follow": "Keda jälgida", "followed_tags": "Jälgitavad märksõnad", "footer.about": "Teave", "footer.directory": "Profiilikataloog", @@ -473,7 +484,7 @@ "onboarding.compose.template": "Tere, #Mastodon!", "onboarding.follows.empty": "Kahjuks ei saa hetkel tulemusi näidata. Proovi kasutada otsingut või lehitse uurimise lehte, et leida inimesi, keda jälgida, või proovi hiljem uuesti.", "onboarding.follows.lead": "Haldad ise oma koduvoogu. Mida rohkemaid inimesi jälgid, seda aktiivsem ja huvitavam see on. Need profiilid võiksid olla head alustamiskohad — saad nende jälgimise alati lõpetada!", - "onboarding.follows.title": "Populaarne Mastodonis", + "onboarding.follows.title": "Isikupärasta oma koduvoogu", "onboarding.profile.discoverable": "Muuda mu profiil avastatavaks", "onboarding.profile.discoverable_hint": "Kui nõustud enda avastamisega Mastodonis, võivad sinu postitused ilmuda otsingutulemustes ja trendides ning sinu profiili võidakse soovitada sinuga sarnaste huvidega inimestele.", "onboarding.profile.display_name": "Näidatav nimi", @@ -493,11 +504,11 @@ "onboarding.start.skip": "Soovid kohe edasi hüpata?", "onboarding.start.title": "Said valmis!", "onboarding.steps.follow_people.body": "Haldad oma koduvoogu. Täida see huvitavate inimestega.", - "onboarding.steps.follow_people.title": "Jälgi {count, plural, one {üht inimest} other {# inimest}}", + "onboarding.steps.follow_people.title": "Isikupärasta oma koduvoogu", "onboarding.steps.publish_status.body": "Ütle maailmale tere.", "onboarding.steps.publish_status.title": "Tee oma esimene postitus", "onboarding.steps.setup_profile.body": "Täidetud profiili korral suhtlevad teised sinuga tõenäolisemalt.", - "onboarding.steps.setup_profile.title": "Kohanda oma profiili", + "onboarding.steps.setup_profile.title": "Isikupärasta oma profiili", "onboarding.steps.share_profile.body": "Anna sõpradele teada, kuidas sind Mastodonist leida!", "onboarding.steps.share_profile.title": "Jaga oma profiili", "onboarding.tips.2fa": "Kas sa teadsid? Saad oma kontot muuta turvalisemaks valides konto seadetes kaheastmelise autoriseerimise. See töötab mistahes sinu valitud TOTP-äpiga, telefoninumbrit pole vaja!", @@ -524,6 +535,7 @@ "privacy.private.short": "Jälgijad", "privacy.public.long": "Nii kasutajad kui mittekasutajad", "privacy.public.short": "Avalik", + "privacy.unlisted.additional": "See on olemuselt küll avalik, aga postitus ei ilmu voogudes ega märksõnades, lehitsedes ega Mastodoni otsingus, isegi kui konto on seadistustes avalik.", "privacy.unlisted.long": "Vähem algoritmilisi teavitusi", "privacy.unlisted.short": "Vaikselt avalik", "privacy_policy.last_updated": "Viimati uuendatud {date}", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 484baae122..7588b084fd 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -201,9 +201,9 @@ "disabled_account_banner.text": "Tilisi {disabledAccount} on tällä hetkellä poissa käytöstä.", "dismissable_banner.community_timeline": "Nämä ovat tuoreimpia julkaisuja käyttäjiltä, joiden tili on palvelimella {domain}.", "dismissable_banner.dismiss": "Hylkää", - "dismissable_banner.explore_links": "Näitä uutisia jaetaan tänään sosiaalisessa verkossa eniten. Uusimmat ja eri käyttäjien eniten lähettämät uutiset nousevat listauksessa korkeimmalle.", - "dismissable_banner.explore_statuses": "Tänään nämä sosiaalisen verkon julkaisut keräävät eniten huomiota. Uusimmat, tehostetuimmat ja suosikeiksi lisätyimmät julkaisut nousevat listauksessa korkeammalle.", - "dismissable_banner.explore_tags": "Nämä sosiaalisen verkon aihetunnisteet keräävät tänään eniten huomiota. Useimman käyttäjän käyttämät aihetunnisteet nousevat listauksessa korkeimmalle.", + "dismissable_banner.explore_links": "Näitä uutisia jaetaan tänään sosiaalisessa verkossa eniten. Uusimmat ja eri käyttäjien eniten lähettämät uutiset nousevat listauksessa korkeammalle.", + "dismissable_banner.explore_statuses": "Nämä sosiaalisen verkon julkaisut keräävät tänään eniten huomiota. Uusimmat, tehostetuimmat ja suosikeiksi lisätyimmät julkaisut nousevat listauksessa korkeammalle.", + "dismissable_banner.explore_tags": "Nämä sosiaalisen verkon aihetunnisteet keräävät tänään eniten huomiota. Useimman käyttäjän käyttämät aihetunnisteet nousevat listauksessa korkeammalle.", "dismissable_banner.public_timeline": "Nämä ovat viimeisimpiä julkaisuja sosiaalisen verkon käyttäjiltä, joita seurataan palvelimella {domain}.", "embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.", "embed.preview": "Tältä se näyttää:", @@ -284,7 +284,7 @@ "follow_suggestions.hints.most_followed": "Tämä profiili on yksi seuratuimmista palvelimella {domain}.", "follow_suggestions.hints.most_interactions": "Tämä profiili on viime aikoina saanut paljon huomiota palvelimella {domain}.", "follow_suggestions.hints.similar_to_recently_followed": "Tämä profiili on samankaltainen kuin profiilit, joita olet viimeksi seurannut.", - "follow_suggestions.personalized_suggestion": "Personoitu ehdotus", + "follow_suggestions.personalized_suggestion": "Mukautettu ehdotus", "follow_suggestions.popular_suggestion": "Suosittu ehdotus", "follow_suggestions.view_all": "Näytä kaikki", "follow_suggestions.who_to_follow": "Ehdotuksia seurattavaksi", @@ -504,7 +504,7 @@ "onboarding.start.skip": "Haluatko hypätä suoraan eteenpäin ilman alkuunpääsyohjeistuksia?", "onboarding.start.title": "Olet tehnyt sen!", "onboarding.steps.follow_people.body": "Mastodon perustuu sinua kiinnostavien henkilöjen julkaisujen seuraamiseen.", - "onboarding.steps.follow_people.title": "Mukauta kotisyötteesi", + "onboarding.steps.follow_people.title": "Mukauta kotisyötettäsi", "onboarding.steps.publish_status.body": "Tervehdi maailmaa sanoin, kuvin tai äänestyksin {emoji}", "onboarding.steps.publish_status.title": "Laadi ensimmäinen julkaisusi", "onboarding.steps.setup_profile.body": "Täydentämällä profiilisi tietoja tehostat vuorovaikutteisuutta.", @@ -657,7 +657,7 @@ "status.filter": "Suodata tämä julkaisu", "status.filtered": "Suodatettu", "status.hide": "Piilota julkaisu", - "status.history.created": "{name} luotu {date}", + "status.history.created": "{name} loi {date}", "status.history.edited": "{name} muokkasi {date}", "status.load_more": "Lataa lisää", "status.media.open": "Avaa napsauttamalla", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index d775a7b027..f4d12d6337 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -145,10 +145,10 @@ "compose_form.lock_disclaimer": "Chan eil an cunntas agad {locked}. ’S urrainn do dhuine sam bith ’gad leantainn is na postaichean agad a tha ag amas air an luchd-leantainn agad a-mhàin a shealltainn.", "compose_form.lock_disclaimer.lock": "glaiste", "compose_form.placeholder": "Dè tha air d’ aire?", - "compose_form.poll.duration": "Faide a’ chunntais-bheachd", - "compose_form.poll.multiple": "Iomadh roghainn", + "compose_form.poll.duration": "Faide a’ chunntais", + "compose_form.poll.multiple": "Iomadh-roghainn", "compose_form.poll.option_placeholder": "Roghainn {number}", - "compose_form.poll.single": "Tagh aonan", + "compose_form.poll.single": "Aonan", "compose_form.poll.switch_to_multiple": "Atharraich an cunntas-bheachd ach an gabh iomadh roghainn a thaghadh", "compose_form.poll.switch_to_single": "Atharraich an cunntas-bheachd gus nach gabh ach aon roghainn a thaghadh", "compose_form.poll.type": "Stoidhle", @@ -277,7 +277,13 @@ "follow_request.authorize": "Ùghdarraich", "follow_request.reject": "Diùlt", "follow_requests.unlocked_explanation": "Ged nach eil an cunntas agad glaiste, tha sgioba {domain} dhen bheachd gum b’ fheàirrde thu lèirmheas a dhèanamh air na h-iarrtasan leantainn o na cunntasan seo a làimh.", + "follow_suggestions.curated_suggestion": "Roghainn an sgioba", "follow_suggestions.dismiss": "Na seall seo a-rithist", + "follow_suggestions.hints.featured": "Chaidh a’ phròifil seo a thaghadh le sgioba {domain} a làimh.", + "follow_suggestions.hints.friends_of_friends": "Tha fèill mhòr air a’ phròifil seo am measg nan daoine a leanas tu.", + "follow_suggestions.hints.most_followed": "Tha a’ phròifil seo am measg an fheadhainn a leanar as trice air {domain}.", + "follow_suggestions.hints.most_interactions": "Chaidh mòran aire a thoirt air a’ phròifil seo air {domain} o chionn goirid.", + "follow_suggestions.hints.similar_to_recently_followed": "Tha a’ phròifil seo coltach ris na pròifilean air an lean thu o chionn goirid.", "follow_suggestions.personalized_suggestion": "Moladh pearsanaichte", "follow_suggestions.popular_suggestion": "Moladh air a bheil fèill mhòr", "follow_suggestions.view_all": "Seall na h-uile", @@ -479,9 +485,11 @@ "onboarding.follows.empty": "Gu mì-fhortanach, chan urrainn dhuinn toradh a shealltainn an-dràsta. Feuch gleus an luirg no duilleag an rùrachaidh airson daoine ri leantainn a lorg no feuch ris a-rithist an ceann tamaill.", "onboarding.follows.lead": "’S e do prìomh-doras do Mhastodon a th’ ann san dachaigh. Mar as motha an t-uiread de dhaoine a leanas tu ’s ann nas beòthaile inntinniche a bhios i. Seo moladh no dhà dhut airson tòiseachadh:", "onboarding.follows.title": "Cuir dreach pearsanta air do dhachaigh", - "onboarding.profile.discoverable": "Bu mhath leam gun gabh a’ phròifil agam a lorg", + "onboarding.profile.discoverable": "Bu mhath leam gun gabh a’ phròifil agam a rùrachadh", + "onboarding.profile.discoverable_hint": "Ma chuir thu romhad gun gabh a’ phròifil agad a rùrachadh air Mastodon, faodaidh na postaichean agad nochdadh ann an toraidhean luirg agus treandaichean agus dh’fhaoidte gun dèid a’ phròifil agad a mholadh dhan fheadhainn aig a bheil ùidhean coltach ri d’ ùidhean-sa.", "onboarding.profile.display_name": "Ainm-taisbeanaidh", "onboarding.profile.display_name_hint": "D’ ainm slàn no spòrsail…", + "onboarding.profile.lead": "’S urrainn dhut seo a choileanadh uair sam bith eile sna roghainnean far am bi roghainnean gnàthachaidh eile ri làimh dhut cuideachd.", "onboarding.profile.note": "Cunntas-beatha", "onboarding.profile.note_hint": "’S urrainn dhut @iomradh a thoirt air càch no air #tagaicheanHais…", "onboarding.profile.save_and_continue": "Sàbhail ’s lean air adhart", @@ -527,6 +535,8 @@ "privacy.private.short": "Luchd-leantainn", "privacy.public.long": "Duine sam bith taobh a-staigh no a-muigh Mhastodon", "privacy.public.short": "Poblach", + "privacy.unlisted.additional": "Tha seo coltach ris an fhaicsinneachd phoblach ach cha nochd am post air loidhnichean-ama an t-saoghail phoblaich, nan tagaichean hais no an rùrachaidh no ann an toraidhean luirg Mhastodon fiù ’s ma thug thu ro-aonta airson sin seachad.", + "privacy.unlisted.long": "Ìre bheag an algairim", "privacy.unlisted.short": "Poblach ach sàmhach", "privacy_policy.last_updated": "An t-ùrachadh mu dheireadh {date}", "privacy_policy.title": "Poileasaidh prìobhaideachd", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 599688cc07..31c9ef7394 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -197,6 +197,7 @@ "firehose.all": "Toto", "firehose.local": "Iste servitor", "firehose.remote": "Altere servitores", + "follow_request.reject": "Rejectar", "follow_suggestions.dismiss": "Non monstrar novemente", "follow_suggestions.personalized_suggestion": "Suggestion personalisate", "follow_suggestions.popular_suggestion": "Suggestion personalisate", @@ -204,6 +205,7 @@ "footer.about": "A proposito de", "footer.directory": "Directorio de profilos", "footer.get_app": "Obtene le application", + "footer.invite": "Invitar personas", "footer.keyboard_shortcuts": "Accessos directe de claviero", "footer.privacy_policy": "Politica de confidentialitate", "footer.source_code": "Vider le codice fonte", @@ -244,6 +246,7 @@ "keyboard_shortcuts.muted": "Aperir lista de usatores silentiate", "keyboard_shortcuts.my_profile": "Aperir tu profilo", "keyboard_shortcuts.notifications": "Aperir columna de notificationes", + "keyboard_shortcuts.open_media": "Aperir medio", "keyboard_shortcuts.profile": "Aperir le profilo del autor", "keyboard_shortcuts.reply": "Responder al message", "keyboard_shortcuts.spoilers": "Monstrar/celar le campo CW", @@ -273,9 +276,11 @@ "navigation_bar.blocks": "Usatores blocate", "navigation_bar.bookmarks": "Marcapaginas", "navigation_bar.community_timeline": "Chronologia local", + "navigation_bar.compose": "Componer un nove message", "navigation_bar.direct": "Mentiones private", "navigation_bar.discover": "Discoperir", "navigation_bar.domain_blocks": "Dominios blocate", + "navigation_bar.explore": "Explorar", "navigation_bar.favourites": "Favoritos", "navigation_bar.filters": "Parolas silentiate", "navigation_bar.lists": "Listas", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index c45543a803..94f620491f 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -1,5 +1,8 @@ { "about.contact": "Anermis:", + "about.disclaimer": "Mastodon d aseɣẓan ilelli, d aseɣẓan n uɣbalu yeldin, d tnezzut n Mastodon gGmbH.", + "about.not_available": "Talɣut-a ur tettwabder ara deg uqeddac-a.", + "about.powered_by": "Azeṭṭa inmetti yettwasɣelsen sɣur {mastodon}", "about.rules": "Ilugan n uqeddac", "account.account_note_header": "Tazmilt", "account.add_or_remove_from_list": "Rnu neɣ kkes seg tebdarin", @@ -10,13 +13,15 @@ "account.block_short": "Sewḥel", "account.blocked": "Yettusewḥel", "account.browse_more_on_origin_server": "Snirem ugar deg umeɣnu aneẓli", - "account.cancel_follow_request": "Withdraw follow request", + "account.cancel_follow_request": "Sefsex taḍfart", "account.copy": "Nɣel assaɣ ɣer umaɣnu", + "account.direct": "Bder-d @{name} weḥd-s", "account.disable_notifications": "Ḥbes ur iyi-d-ttazen ara ilɣa mi ara d-isuffeɣ @{name}", "account.domain_blocked": "Taɣult yeffren", "account.edit_profile": "Ẓreg amaɣnu", "account.enable_notifications": "Azen-iyi-d ilɣa mi ara d-isuffeɣ @{name}", "account.endorse": "Welleh fell-as deg umaɣnu-inek", + "account.featured_tags.last_status_at": "Tasuffeɣt taneggarut ass n {date}", "account.featured_tags.last_status_never": "Ulac tisuffaɣ", "account.follow": "Ḍfer", "account.followers": "Imeḍfaren", @@ -27,14 +32,17 @@ "account.follows.empty": "Ar tura, amseqdac-agi ur yeṭṭafaṛ yiwen.", "account.go_to_profile": "Ddu ɣer umaɣnu", "account.hide_reblogs": "Ffer ayen i ibeṭṭu @{name}", - "account.joined_short": "Izeddi da", + "account.joined_short": "Izeddi da seg ass n", "account.link_verified_on": "Taɣara n useɣwen-a tettwasenqed ass n {date}", "account.locked_info": "Amiḍan-agi uslig isekweṛ. D bab-is kan i izemren ad yeǧǧ, s ufus-is, win ara t-iḍefṛen.", "account.media": "Timidyatin", "account.mention": "Bder-d @{name}", + "account.moved_to": "{name} yenna-d dakken amiḍan-is amaynut yuɣal :", "account.mute": "Sgugem @{name}", + "account.mute_notifications_short": "Susem ilɣa", "account.mute_short": "Sgugem", "account.muted": "Yettwasgugem", + "account.no_bio": "Ulac aglam i d-yettunefken.", "account.open_original_page": "Ldi asebter anasli", "account.posts": "Tisuffaɣ", "account.posts_with_replies": "Tisuffaɣ d tririyin", @@ -69,6 +77,7 @@ "bundle_modal_error.close": "Mdel", "bundle_modal_error.message": "Tella-d kra n tuccḍa mi d-yettali ugbur-agi.", "bundle_modal_error.retry": "Ɛreḍ tikelt-nniḍen", + "closed_registrations_modal.description": "Asnulfu n umiḍan deg {domain} mačči d ayen izemren ad yili, maca ttxil-k·m, err deg lbal-ik·im belli ur teḥwaǧeḍ ara amiḍan s wudem ibanen ɣef {domain} akken ad tesqedceḍ Mastodon.", "closed_registrations_modal.find_another_server": "Aff-d aqeddac nniḍen", "closed_registrations_modal.title": "Ajerred deg Masṭudun", "column.about": "Ɣef", @@ -99,6 +108,7 @@ "community.column_settings.remote_only": "Anmeggag kan", "compose.language.change": "Beddel tutlayt", "compose.language.search": "Nadi tutlayin …", + "compose.published.body": "Yeffeɣ-d yizen-nni.", "compose.published.open": "Ldi", "compose.saved.body": "Tettwasekles tsuffeɣt.", "compose_form.direct_message_warning_learn_more": "Issin ugar", @@ -111,6 +121,7 @@ "compose_form.poll.multiple": "Aṭas n ufran", "compose_form.poll.option_placeholder": "Taxtiṛt {number}", "compose_form.poll.single": "Fren yiwen", + "compose_form.poll.type": "Aɣanib", "compose_form.publish": "Suffeɣ", "compose_form.publish_form": "Tasuffeɣt tamaynut", "compose_form.reply": "Err", @@ -128,6 +139,7 @@ "confirmations.discard_edit_media.confirm": "Sefsex", "confirmations.domain_block.confirm": "Ffer taɣult meṛṛa", "confirmations.edit.confirm": "Ẓreg", + "confirmations.edit.message": "Abeddel tura ad d-yaru izen-nni i d-tegreḍ akka tura. Tetḥeqqeḍ tebɣiḍ ad tkemmleḍ?", "confirmations.logout.confirm": "Ffeɣ", "confirmations.logout.message": "D tidet tebɣiḍ ad teffɣeḍ?", "confirmations.mute.confirm": "Sgugem", @@ -142,14 +154,18 @@ "conversation.mark_as_read": "Creḍ yettwaɣṛa", "conversation.open": "Ssken adiwenni", "conversation.with": "Akked {names}", + "copy_icon_button.copied": "Yettwanɣel ɣer ufus", "copypaste.copied": "Yettwanɣel", + "copypaste.copy_to_clipboard": "Nɣel ɣer afus", "directory.federated": "Deg fedivers yettwasnen", "directory.local": "Seg {domain} kan", "directory.new_arrivals": "Imaynuten id yewḍen", "directory.recently_active": "Yermed xas melmi kan", "disabled_account_banner.account_settings": "Iɣewwaṛen n umiḍan", - "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", - "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", + "dismissable_banner.dismiss": "Agi", + "dismissable_banner.explore_links": "D tiqsiḍin n yisallen i yettwabḍan ass-a deg web inmetti. Tiqsiḍin n yisallen timaynutin i d-yettwassufɣen s wugar n medden yemgaraden, d tid i d-yufraren ugar.", + "dismissable_banner.explore_statuses": "Ti d tisufaɣ seg uzeṭṭa anmetti i d-yettawin tamyigawt ass-a. Tisufaɣ timaynutin yesεan aṭas n lǧehd d tid iḥemmlen s waṭas, ttwaεlayit d timezwura.", + "dismissable_banner.explore_tags": "D wiyi i d ihacṭagen i d-yettawin tamyigawt deg web anmetti ass-a. Ihacṭagen i sseqdacen ugar n medden, εlayit d imezwura.", "embed.instructions": "Ẓẓu addad-agi deg usmel-inek s wenγal n tangalt yellan sdaw-agi.", "embed.preview": "Akka ara d-iban:", "emoji_button.activity": "Aqeddic", @@ -221,19 +237,28 @@ "hashtag.column_settings.tag_mode.any": "Yiwen seg-sen", "hashtag.column_settings.tag_mode.none": "Yiwen ala seg-sen", "hashtag.column_settings.tag_toggle": "Glu-d s yihacṭagen imerna i ujgu-agi", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} imtekki} other {{counter} n imtekkiyen}}", "hashtag.counter_by_uses": "{count, plural, one {{counter} n tsuffeɣt} other {{counter} n tsuffaɣ}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} n tsuffeɣt} other {{counter} n tsuffaɣ}} assa", "hashtag.follow": "Ḍfeṛ ahacṭag", + "hashtags.and_other": "…d {count, plural, one {}other {# nniḍen}}", "home.column_settings.basic": "Igejdanen", "home.column_settings.show_reblogs": "Ssken-d beṭṭu", "home.column_settings.show_replies": "Ssken-d tiririyin", "home.hide_announcements": "Ffer ulɣuyen", "home.pending_critical_update.body": "Ma ulac aɣilif, leqqem aqeddac-ik Mastodon akken kan tzemreḍ !", "home.show_announcements": "Ssken-d ulɣuyen", + "interaction_modal.description.favourite": "S umiḍan ɣef Mastodon, tzemreḍ ad tesmenyifeḍ tasuffeɣt-a akken ad teǧǧeḍ amaru ad iẓer belli tḥemmleḍ-tt u ad tt-id-tsellkeḍ i ticki.", + "interaction_modal.description.follow": "S umiḍan deg Mastodon, tzemreḍ ad tḍefreḍ {name} akken ad d-teṭṭfeḍ iznan-is deg lxiḍ-ik·im agejdan.", + "interaction_modal.description.reblog": "S umiḍan deg Mastodon, tzemreḍ ad tesnerniḍ tasuffeɣt-a akken ad tt-tebḍuḍ d yineḍfaren-ik·im.", + "interaction_modal.description.reply": "S umiḍan deg Mastodon, tzemreḍ ad d-terreḍ ɣef tsuffeɣt-a.", + "interaction_modal.login.action": "Awi-yi ɣer uqeddac-iw", + "interaction_modal.login.prompt": "Taɣult n uqeddac-ik·im agejdan, amedya mastodon.social", "interaction_modal.no_account_yet": "Ulac-ik·ikem deg Maṣṭudun?", "interaction_modal.on_another_server": "Deg uqeddac nniḍen", "interaction_modal.on_this_server": "Deg uqeddac-ayi", "interaction_modal.sign_in": "Ur tekcimeḍ ara ɣer uqeddac-a. Anda yella umiḍan-ik·im ?", + "interaction_modal.sign_in_hint": "Ihi : Wa d asmel ideg tjerdeḍ. Ma ur tecfiḍ ara, nadi imayl n ummager deg tenkult-ik·im. Tzemreḍ daɣen ad d-tefkeḍ isem-ik·im n useqdac ummid ! (amedya @Mastodon@mastodon.social)", "interaction_modal.title.follow": "Ḍfer {name}", "intervals.full.days": "{number, plural, one {# n wass} other {# n wussan}}", "intervals.full.hours": "{number, plural, one {# n usarag} other {# n yesragen}}", @@ -311,6 +336,7 @@ "navigation_bar.lists": "Tibdarin", "navigation_bar.logout": "Ffeɣ", "navigation_bar.mutes": "Iseqdacen yettwasusmen", + "navigation_bar.opened_in_classic_interface": "Tisuffaɣ, imiḍanen akked isebtar-nniḍen igejdanen ldin-d s wudem amezwer deg ugrudem web aklasiki.", "navigation_bar.personal": "Udmawan", "navigation_bar.pins": "Tisuffaɣ yettwasenṭḍen", "navigation_bar.preferences": "Imenyafen", @@ -361,12 +387,18 @@ "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", "onboarding.follows.title": "Popular on Mastodon", "onboarding.profile.display_name": "Isem ara d-yettwaskanen", + "onboarding.profile.note_hint": "Tzemreḍ ad d-@tbedreḍ imdanen niḍen neɣ #ihacṭagen …", + "onboarding.profile.save_and_continue": "Sekles, tkemmleḍ", + "onboarding.profile.title": "Asbadu n umaɣnu", + "onboarding.profile.upload_avatar": "Sali tugna n umaɣnu", + "onboarding.profile.upload_header": "Sali tacacit n umaɣnu", + "onboarding.share.lead": "Ini-asen i medden amek ara k·m-id-afen deg Mastodon!", "onboarding.share.message": "Nekk d {username} deg #Mastodon! Ḍfer iyi-d sya {url}", "onboarding.share.title": "Bḍu amaɣnu-inek·inem", "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", "onboarding.start.skip": "Want to skip right ahead?", "onboarding.start.title": "Tseggmeḍ-tt !", - "onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", + "onboarding.steps.follow_people.body": "Aḍfer n medden yelhan, d tikti n Mastodon.", "onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}", "onboarding.steps.publish_status.body": "Say hello to the world.", "onboarding.steps.publish_status.title": "Aru tasuffeɣt-inek·inem tamezwarutt", @@ -377,6 +409,7 @@ "picture_in_picture.restore": "Err-it amkan-is", "poll.closed": "Tfukk", "poll.refresh": "Smiren", + "poll.reveal": "Wali igmaḍ", "poll.total_people": "{count, plural, one {# n wemdan} other {# n yemdanen}}", "poll.total_votes": "{count, plural, one {# n udɣaṛ} other {# n yedɣaṛen}}", "poll.vote": "Dɣeṛ", @@ -385,10 +418,13 @@ "poll_button.remove_poll": "Kkes asenqed", "privacy.change": "Seggem tabaḍnit n yizen", "privacy.direct.long": "Wid akk i d-yettwabdaren deg tuffeɣt", + "privacy.direct.short": "Imdanen ulmisen", "privacy.private.long": "Ala wid i k-yeṭṭafaṛen", "privacy.private.short": "Imeḍfaren", "privacy.public.long": "Kra n win yellan deg Masṭudun neɣ berra-s", "privacy.public.short": "Azayez", + "privacy.unlisted.long": "Kra kan n ilguritmen", + "privacy_policy.last_updated": "Aleqqem aneggaru {date}", "privacy_policy.title": "Tasertit tabaḍnit", "refresh": "Smiren", "regeneration_indicator.label": "Yessalay-d…", @@ -412,9 +448,11 @@ "report.next": "Uḍfiṛ", "report.placeholder": "Iwenniten-nniḍen", "report.reasons.dislike": "Ur t-ḥemmleɣ ara", + "report.reasons.other": "D ayen nniḍen", "report.reasons.spam": "D aspam", "report.submit": "Azen", "report.target": "Mmel {target}", + "report.thanks.title": "Ur tebɣiḍ ara ad twaliḍ aya?", "report.unfollow": "Seḥbes aḍfar n @{name}", "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", "report_notification.categories.other": "Ayen nniḍen", @@ -422,7 +460,13 @@ "report_notification.open": "Ldi aneqqis", "search.no_recent_searches": "Ulac inadiyen ineggura", "search.placeholder": "Nadi", + "search.quick_action.account_search": "Imaɣnuten mṣadan d {x}", + "search.quick_action.go_to_account": "Ddu ɣer umaɣnu {x}", + "search.quick_action.go_to_hashtag": "Ddu ɣer uhacṭag {x}", + "search.quick_action.open_url": "Ldi tansa URL deg Mastodon", + "search.quick_action.status_search": "Tisuffaɣ mṣadan d {x}", "search.search_or_paste": "Nadi neɣ senṭeḍ URL", + "search_popout.full_text_search_disabled_message": "Ur yelli ara deg {domain}.", "search_popout.language_code": "Tangalt ISO n tutlayt", "search_popout.options": "Iwellihen n unadi", "search_popout.recent": "Inadiyen ineggura", @@ -471,6 +515,7 @@ "status.report": "Cetki ɣef @{name}", "status.sensitive_warning": "Agbur amḥulfu", "status.share": "Bḍu", + "status.show_filter_reason": "Ssken-d akken yebɣu yili", "status.show_less": "Ssken-d drus", "status.show_less_all": "Semẓi akk tisuffɣin", "status.show_more": "Ssken-d ugar", @@ -516,6 +561,7 @@ "upload_modal.preparing_ocr": "Aheyyi n OCR…", "upload_modal.preview_label": "Taskant ({ratio})", "upload_progress.label": "Asali iteddu...", + "username.taken": "Yettwaṭṭef yisem-a n useqdac. Ɛreḍ wayeḍ", "video.close": "Mdel tabidyutt", "video.download": "Sidered afaylu", "video.exit_fullscreen": "Ffeɣ seg ugdil ačuran", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 35722b0e0d..8b757484ce 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -27,8 +27,8 @@ "account.domain_blocked": "Užblokuotas domenas", "account.edit_profile": "Redaguoti profilį", "account.enable_notifications": "Pranešti man, kai @{name} paskelbia", - "account.endorse": "Rekomenduoti profilyje", - "account.featured_tags.last_status_at": "Paskutinį kartą paskelbta {date}", + "account.endorse": "Rodyti profilyje", + "account.featured_tags.last_status_at": "Paskutinis įrašas {date}", "account.featured_tags.last_status_never": "Nėra įrašų", "account.featured_tags.title": "{name} rekomenduojami saitažodžiai", "account.follow": "Sekti", @@ -53,7 +53,7 @@ "account.mute_notifications_short": "Nutildyti pranešimus", "account.mute_short": "Nutildyti", "account.muted": "Nutildytas", - "account.mutual": "Abipusis", + "account.mutual": "Bendri", "account.no_bio": "Nėra pateikto aprašymo.", "account.open_original_page": "Atidaryti originalinį puslapį", "account.posts": "Įrašai", @@ -72,7 +72,7 @@ "account.unmute": "Atšaukti nutildymą @{name}", "account.unmute_notifications_short": "Atšaukti nutildymą pranešimams", "account.unmute_short": "Atšaukti nutildymą", - "account_note.placeholder": "Spustelėk norėdamas (-a) pridėti pastabą", + "account_note.placeholder": "Spustelėk norint pridėti pastabą.", "admin.dashboard.daily_retention": "Naudotojų pasilikimo rodiklis pagal dieną po registracijos", "admin.dashboard.monthly_retention": "Naudotojų pasilikimo rodiklis pagal mėnesį po registracijos", "admin.dashboard.retention.average": "Vidurkis", @@ -89,21 +89,21 @@ "announcement.announcement": "Skelbimas", "attachments_list.unprocessed": "(neapdorotas)", "audio.hide": "Slėpti garsą", - "boost_modal.combo": "Gali paspausti {combo}, kad praleisti kitą kartą", + "boost_modal.combo": "Galima paspausti {combo}, kad praleisti kitą kartą.", "bundle_column_error.copy_stacktrace": "Kopijuoti klaidos ataskaitą", - "bundle_column_error.error.body": "Užklausos puslapio nepavyko atvaizduoti. Tai gali būti dėl mūsų kodo klaidos arba naršyklės suderinamumo problemos.", + "bundle_column_error.error.body": "Paprašytos puslapio nepavyko atvaizduoti. Tai gali būti dėl mūsų kodo klaidos arba naršyklės suderinamumo problemos.", "bundle_column_error.error.title": "O, ne!", "bundle_column_error.network.body": "Bandant užkrauti šį puslapį įvyko klaida. Tai galėjo atsitikti dėl laikinos tavo interneto ryšio arba šio serverio problemos.", "bundle_column_error.network.title": "Tinklo klaida", "bundle_column_error.retry": "Bandyti dar kartą", - "bundle_column_error.return": "Grįžti į pradžią", + "bundle_column_error.return": "Grįžti į pagrindinį", "bundle_column_error.routing.body": "Prašyto puslapio nepavyko rasti. Ar esi tikras (-a), kad adreso juostoje nurodytas URL adresas yra teisingas?", "bundle_column_error.routing.title": "404", "bundle_modal_error.close": "Uždaryti", "bundle_modal_error.message": "Kraunant šį komponentą kažkas nepavyko.", "bundle_modal_error.retry": "Bandyti dar kartą", "closed_registrations.other_server_instructions": "Kadangi Mastodon yra decentralizuotas, gali susikurti paskyrą kitame serveryje ir vis tiek bendrauti su šiuo serveriu.", - "closed_registrations_modal.description": "Sukurti paskyrą {domain} šiuo metu neįmanoma, tačiau nepamiršk, kad norint naudotis Mastodon nebūtina turėti paskyrą domene {domain}.", + "closed_registrations_modal.description": "Sukurti paskyrą {domain} šiuo metu neįmanoma, bet nepamiršk, kad norint naudotis Mastodon nebūtina turėti paskyrą domene {domain}.", "closed_registrations_modal.find_another_server": "Rasti kitą serverį", "closed_registrations_modal.preamble": "Mastodon yra decentralizuotas, todėl nesvarbu, kur susikursi paskyrą, galėsi sekti ir bendrauti su bet kuriuo šiame serveryje esančiu asmeniu. Jį gali net savarankiškai talpinti!", "closed_registrations_modal.title": "Užsiregistruoti Mastodon", @@ -116,7 +116,7 @@ "column.domain_blocks": "Užblokuoti domenai", "column.favourites": "Mėgstamiausi", "column.firehose": "Tiesioginiai srautai", - "column.follow_requests": "Sekimo prašymus", + "column.follow_requests": "Sekimo prašymai", "column.home": "Pagrindinis", "column.lists": "Sąrašai", "column.mutes": "Nutildyti naudotojai", @@ -131,7 +131,7 @@ "column_header.show_settings": "Rodyti nustatymus", "column_header.unpin": "Atsegti", "column_subheading.settings": "Nustatymai", - "community.column_settings.local_only": "Tik vietinis", + "community.column_settings.local_only": "Tik vietinė", "community.column_settings.media_only": "Tik medija", "community.column_settings.remote_only": "Tik nuotolinis", "compose.language.change": "Keisti kalbą", @@ -140,17 +140,17 @@ "compose.published.open": "Atidaryti", "compose.saved.body": "Įrašas išsaugotas.", "compose_form.direct_message_warning_learn_more": "Sužinoti daugiau", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "compose_form.encryption_warning": "Mastodon įrašai nėra šifruojami nuo galo iki galo. Per Mastodon nesidalyk jokia slapta informacija.", "compose_form.hashtag_warning": "Šis įrašas nebus įtraukta į jokį saitažodį, nes ji nėra vieša. Tik viešų įrašų galima ieškoti pagal saitažodį.", "compose_form.lock_disclaimer": "Tavo paskyra nėra {locked}. Bet kas gali sekti tave ir peržiūrėti tik sekėjams skirtus įrašus.", "compose_form.lock_disclaimer.lock": "užrakinta", "compose_form.placeholder": "Kas tavo mintyse?", "compose_form.poll.duration": "Apklausos trukmė", "compose_form.poll.multiple": "Keli pasirinkimai", - "compose_form.poll.option_placeholder": "{number} pasirinkimas", + "compose_form.poll.option_placeholder": "{number} parinktis", "compose_form.poll.single": "Pasirinkti vieną", - "compose_form.poll.switch_to_multiple": "Keisti apklausą, kad būtų galima pasirinkti kelis pasirinkimus", - "compose_form.poll.switch_to_single": "Pakeisti apklausą, kad būtų galima pasirinkti vieną variantą", + "compose_form.poll.switch_to_multiple": "Keisti apklausą, kad būtų galima pasirinkti kelis pasirinkimus.", + "compose_form.poll.switch_to_single": "Keisti apklausą, kad būtų galima pasirinkti vieną pasirinkimą", "compose_form.poll.type": "Stilius", "compose_form.publish": "Skelbti", "compose_form.publish_form": "Naujas įrašas", @@ -166,24 +166,26 @@ "confirmations.cancel_follow_request.confirm": "Atšaukti prašymą", "confirmations.cancel_follow_request.message": "Ar tikrai nori atšaukti savo prašymą sekti {name}?", "confirmations.delete.confirm": "Ištrinti", - "confirmations.delete.message": "Are you sure you want to delete this status?", + "confirmations.delete.message": "Ar tikrai nori ištrinti šį įrašą?", "confirmations.delete_list.confirm": "Ištrinti", "confirmations.delete_list.message": "Ar tikrai nori visam laikui ištrinti šį sąrašą?", "confirmations.discard_edit_media.confirm": "Atmesti", "confirmations.discard_edit_media.message": "Turi neišsaugotų medijos aprašymo ar peržiūros pakeitimų, vis tiek juos atmesti?", - "confirmations.domain_block.confirm": "Hide entire domain", + "confirmations.domain_block.confirm": "Blokuoti visą domeną", + "confirmations.domain_block.message": "Ar tikrai, tikrai nori užblokuoti visą {domain}? Daugeliu atvejų užtenka kelių tikslinių blokavimų arba nutildymų. Šio domeno turinio nematysi jokiose viešose laiko skalėse ar pranešimuose. Tavo sekėjai iš to domeno bus pašalinti.", "confirmations.edit.confirm": "Redaguoti", "confirmations.edit.message": "Redaguojant dabar, bus perrašyta šiuo metu kuriama žinutė. Ar tikrai nori tęsti?", "confirmations.logout.confirm": "Atsijungti", "confirmations.logout.message": "Ar tikrai nori atsijungti?", "confirmations.mute.confirm": "Nutildyti", - "confirmations.mute.explanation": "Tai paslėps jų įrašus ir įrašus, kuriuose jie menėmi, tačiau jie vis tiek galės matyti tavo įrašus ir sekti.", - "confirmations.mute.message": "Ar tikrai norite nutildyti {name}?", - "confirmations.redraft.confirm": "Ištrinti ir perrašyti", + "confirmations.mute.explanation": "Tai paslėps jų įrašus ir įrašus, kuriuose jie menėmi, bet jie vis tiek galės matyti tavo įrašus ir sekti.", + "confirmations.mute.message": "Ar tikrai nori nutildyti {name}?", + "confirmations.redraft.confirm": "Ištrinti ir parengti iš naujo", + "confirmations.redraft.message": "Ar tikrai nori ištrinti šį įrašą ir parengti jį iš naujo kaip juodraštį? Bus prarastos mėgstamiausios ir pakėlimai, o atsakymai į originalinį įrašą taps liekamojais.", "confirmations.reply.confirm": "Atsakyti", "confirmations.reply.message": "Atsakant dabar, bus perrašyta metu kuriama žinutė. Ar tikrai nori tęsti?", "confirmations.unfollow.confirm": "Nebesekti", - "confirmations.unfollow.message": "Ar tikrai norite atsisakyti sekimo {name}?", + "confirmations.unfollow.message": "Ar tikrai nori nebesekti {name}?", "conversation.delete": "Ištrinti pokalbį", "conversation.mark_as_read": "Žymėti kaip skaitytą", "conversation.open": "Peržiūrėti pokalbį", @@ -191,87 +193,94 @@ "copy_icon_button.copied": "Nukopijuota į iškarpinę", "copypaste.copied": "Nukopijuota", "copypaste.copy_to_clipboard": "Kopijuoti į iškarpinę", - "directory.local": "Iš {domain} tik", - "directory.new_arrivals": "Naujos prekės", - "directory.recently_active": "Neseniai aktyvus", + "directory.federated": "Iš žinomų fediversų", + "directory.local": "Tik iš {domain}", + "directory.new_arrivals": "Nauji atvykėliai", + "directory.recently_active": "Neseniai aktyvus (-i)", "disabled_account_banner.account_settings": "Paskyros nustatymai", - "disabled_account_banner.text": "Jūsų paskyra {disabledAccount} šiuo metu yra išjungta.", + "disabled_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu išjungta.", + "dismissable_banner.community_timeline": "Tai – naujausi vieši įrašai, kuriuos paskelbė žmonės, kurių paskyros talpinamos {domain}.", "dismissable_banner.dismiss": "Atmesti", - "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", - "dismissable_banner.explore_statuses": "Tai įrašai iš viso socialinio tinklo, kurie šiandien sulaukia vis daugiau dėmesio. Naujesni įrašai, turintys daugiau boosts ir mėgstamiausių įrašų, yra vertinami aukščiau.", - "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", - "embed.instructions": "Embed this status on your website by copying the code below.", - "embed.preview": "Štai kaip tai atrodys:", + "dismissable_banner.explore_links": "Tai – naujienos, kuriomis šiandien daugiausiai bendrinamasi socialiniame žiniatinklyje. Naujesnės naujienų istorijos, kurias paskelbė daugiau skirtingų žmonių, vertinamos aukščiau.", + "dismissable_banner.explore_statuses": "Tai – įrašai iš viso socialinio žiniatinklio, kurie šiandien sulaukia daug dėmesio. Naujesni įrašai, turintys daugiau pakėlimų ir mėgstamų, vertinami aukščiau.", + "dismissable_banner.explore_tags": "Tai – saitažodžiai, kurie šiandien sulaukia daug dėmesio socialiniame žiniatinklyje. Saitažodžiai, kuriuos naudoja daugiau skirtingų žmonių, vertinami aukščiau.", + "dismissable_banner.public_timeline": "Tai – naujausi vieši įrašai, kuriuos socialiniame žiniatinklyje paskelbė žmonės, sekantys {domain}.", + "embed.instructions": "Įterpk šį įrašą į savo svetainę nukopijavus (-usi) toliau pateiktą kodą.", + "embed.preview": "Štai, kaip tai atrodys:", "emoji_button.activity": "Veikla", "emoji_button.clear": "Išvalyti", "emoji_button.custom": "Pasirinktinis", "emoji_button.flags": "Vėliavos", - "emoji_button.food": "Maistas ir Gėrimai", + "emoji_button.food": "Maistas ir gėrimai", "emoji_button.label": "Įterpti veidelius", "emoji_button.nature": "Gamta", - "emoji_button.not_found": "Nerasta jokių tinkamų jaustukų", + "emoji_button.not_found": "Nerasta jokių tinkamų jaustukų.", "emoji_button.objects": "Objektai", "emoji_button.people": "Žmonės", - "emoji_button.recent": "Dažniausiai naudojama", - "emoji_button.search": "Paieška...", + "emoji_button.recent": "Dažniausiai naudojami", + "emoji_button.search": "Ieškoti...", "emoji_button.search_results": "Paieškos rezultatai", "emoji_button.symbols": "Simboliai", - "emoji_button.travel": "Kelionės ir Vietos", - "empty_column.account_hides_collections": "Šis naudotojas (-a) pasirinko nepadaryti šią informaciją prieinamą", - "empty_column.account_suspended": "Paskyra sustabdyta", - "empty_column.account_timeline": "No toots here!", - "empty_column.account_unavailable": "Profilis neprieinamas", - "empty_column.blocks": "Dar neužblokavote nė vieno naudotojo.", - "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", - "empty_column.community": "Vietinė laiko juosta yra tuščia. Parašykite ką nors viešai, kad pradėtumėte veikti!", - "empty_column.direct": "Dar neturite jokių privačių paminėjimų. Kai išsiųsite arba gausite tokį pranešimą, jis bus rodomas čia.", - "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "Dar neturite mėgstamiausių įrašų. Kai vieną iš jų pamėgsite, jis bus rodomas čia.", - "empty_column.follow_requests": "Dar neturite jokių sekimo užklausų. Kai gausite tokį prašymą, jis bus rodomas čia.", - "empty_column.followed_tags": "Dar nesekėte jokių grotažymių. Kai tai padarysite, jie bus rodomi čia.", + "emoji_button.travel": "Kelionės ir vietos", + "empty_column.account_hides_collections": "Šis (-i) naudotojas (-a) pasirinko nepadaryti šią informaciją prieinamą.", + "empty_column.account_suspended": "Paskyra sustabdyta.", + "empty_column.account_timeline": "Nėra įrašų čia.", + "empty_column.account_unavailable": "Profilis neprieinamas.", + "empty_column.blocks": "Dar neužblokavai nė vieno naudotojo.", + "empty_column.bookmarked_statuses": "Dar neturi nė vienos įrašo žymės. Kai vieną iš jų pridėsi į žymes, jis bus rodomas čia.", + "empty_column.community": "Vietinė laiko skalė tuščia. Parašyk ką nors viešai, kad pradėtum bendrauti!", + "empty_column.direct": "Dar neturi jokių privačių paminėjimų. Kai išsiųsi arba gausi vieną iš jų, jis bus rodomas čia.", + "empty_column.domain_blocks": "Dar nėra užblokuotų domenų.", + "empty_column.explore_statuses": "Šiuo metu niekas nėra tendencinga. Patikrink vėliau.", + "empty_column.favourited_statuses": "Dar neturi mėgstamų įrašų. Kai vieną iš jų pamėgsi, jis bus rodomas čia.", + "empty_column.favourites": "Šio įrašo dar niekas nepamėgo. Kai kas nors tai padarys, jie bus rodomi čia.", + "empty_column.follow_requests": "Dar neturi jokių sekimo prašymų. Kai gausi tokį prašymą, jis bus rodomas čia.", + "empty_column.followed_tags": "Dar neseki jokių saitažodžių. Kai tai padarysi, jie bus rodomi čia.", "empty_column.hashtag": "Nėra nieko šiame saitažodyje kol kas.", - "empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}", - "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", - "empty_column.lists": "Dar neturite jokių sąrašų. Kai jį sukursite, jis bus rodomas čia.", - "empty_column.mutes": "Dar nesate nutildę nė vieno naudotojo.", - "empty_column.notifications": "Dar neturite jokių pranešimų. Kai kiti žmonės su jumis bendraus, matysite tai čia.", - "empty_column.public": "Čia nieko nėra! Parašykite ką nors viešai arba rankiniu būdu sekite naudotojus iš kitų serverių, kad jį užpildytumėte", - "error.unexpected_crash.explanation": "Dėl mūsų kodo klaidos arba naršyklės suderinamumo problemos šis puslapis negalėjo būti rodomas teisingai.", - "error.unexpected_crash.explanation_addons": "Šį puslapį nepavyko teisingai parodyti. Šią klaidą greičiausiai sukėlė naršyklės priedas arba automatinio vertimo įrankiai.", - "error.unexpected_crash.next_steps": "Pabandykite atnaujinti puslapį. Jei tai nepadeda, galbūt vis dar galėsite naudotis \"Mastodon\" naudodami kitą naršyklę arba vietinę programėlę.", - "error.unexpected_crash.next_steps_addons": "Pabandykite juos išjungti ir atnaujinti puslapį. Jei tai nepadeda, galbūt vis dar galėsite naudotis \"Mastodon\" naudodami kitą naršyklę arba vietinę programėlę.", - "errors.unexpected_crash.report_issue": "Pranešti apie triktį", + "empty_column.home": "Tavo pagrindinio laiko skalė tuščia! Sek daugiau žmonių, kad ją užpildytum.", + "empty_column.list": "Nėra nieko šiame sąraše kol kas. Kai šio sąrašo nariai paskelbs naujų įrašų, jie bus rodomi čia.", + "empty_column.lists": "Dar neturi jokių sąrašų. Kai jį sukursi, jis bus rodomas čia.", + "empty_column.mutes": "Dar nesi nutildęs (-usi) nė vieno naudotojo.", + "empty_column.notifications": "Dar neturi jokių pranešimų. Kai kiti žmonės su tavimi bendraus, matysi tai čia.", + "empty_column.public": "Čia nieko nėra! Parašyk ką nors viešai arba rankiniu būdu sek naudotojus iš kitų serverių, kad jį užpildytum.", + "error.unexpected_crash.explanation": "Dėl mūsų kodo riktos arba naršyklės suderinamumo problemos šis puslapis negalėjo būti rodomas teisingai.", + "error.unexpected_crash.explanation_addons": "Šį puslapį nepavyko parodyti teisingai. Šią klaidą greičiausiai sukėlė naršyklės priedas arba automatinio vertimo įrankiai.", + "error.unexpected_crash.next_steps": "Pabandyk atnaujinti puslapį. Jei tai nepadeda, galbūt vis dar galėsi naudotis Mastodon per kitą naršyklę arba savąją programėlę.", + "error.unexpected_crash.next_steps_addons": "Pabandyk juos išjungti ir atnaujinti puslapį. Jei tai nepadeda, galbūt vis dar galėsi naudotis Mastodon per kitą naršyklę arba savąją programėlę.", + "errors.unexpected_crash.copy_stacktrace": "Kopijuoti dėklo eigą į iškarpinę", + "errors.unexpected_crash.report_issue": "Pranešti apie problemą", "explore.search_results": "Paieškos rezultatai", "explore.suggested_follows": "Žmonės", "explore.title": "Naršyti", "explore.trending_links": "Naujienos", "explore.trending_statuses": "Įrašai", "explore.trending_tags": "Saitažodžiai", - "filter_modal.added.context_mismatch_explanation": "Ši filtro kategorija netaikoma kontekste, kuriame peržiūrėjote šį pranešimą. Jei norite, kad pranešimas būtų filtruojamas ir šiame kontekste, turėsite redaguoti filtrą.", - "filter_modal.added.context_mismatch_title": "Konteksto neatitikimas!", - "filter_modal.added.expired_explanation": "Ši filtro kategorija nustojo galioti, kad ji būtų taikoma, turėsite pakeisti galiojimo datą.", - "filter_modal.added.expired_title": "Pasibaigė filtro galiojimo laikas!", - "filter_modal.added.review_and_configure": "Norėdami peržiūrėti ir toliau konfigūruoti šią filtro kategoriją, eikite į {settings_link}.", - "filter_modal.added.review_and_configure_title": "Filtro nuostatos", + "filter_modal.added.context_mismatch_explanation": "Ši filtro kategorija netaikoma kontekstui, kuriame peržiūrėjai šį įrašą. Jei nori, kad įrašas būtų filtruojamas ir šiame kontekste, turėsi redaguoti filtrą.", + "filter_modal.added.context_mismatch_title": "Konteksto neatitikimas.", + "filter_modal.added.expired_explanation": "Ši filtro kategorija nustojo galioti. Kad ji būtų taikoma, turėsi pakeisti galiojimo datą.", + "filter_modal.added.expired_title": "Baigėsi filtro galiojimas.", + "filter_modal.added.review_and_configure": "Norint peržiūrėti ir toliau konfigūruoti šią filtro kategoriją, eik į nuorodą {settings_link}.", + "filter_modal.added.review_and_configure_title": "Filtro nustatymai", "filter_modal.added.settings_link": "nustatymų puslapis", - "filter_modal.added.short_explanation": "Šis pranešimas buvo įtrauktas į šią filtro kategoriją: {title}.", - "filter_modal.added.title": "Pridėtas filtras!", - "filter_modal.select_filter.context_mismatch": "netaikoma šiame kontekste", - "filter_modal.select_filter.expired": "nebegalioja", + "filter_modal.added.short_explanation": "Šis įrašas buvo pridėtas į šią filtro kategoriją: {title}.", + "filter_modal.added.title": "Pridėtas filtras.", + "filter_modal.select_filter.context_mismatch": "netaikoma šiame kontekste.", + "filter_modal.select_filter.expired": "nebegalioja.", "filter_modal.select_filter.prompt_new": "Nauja kategorija: {name}", "filter_modal.select_filter.search": "Ieškoti arba sukurti", - "filter_modal.select_filter.subtitle": "Naudoti esamą kategoriją arba sukurti naują", + "filter_modal.select_filter.subtitle": "Naudok esamą kategoriją arba sukurk naują.", "filter_modal.select_filter.title": "Filtruoti šį įrašą", - "filter_modal.title.status": "Filtruoti šį įrašą", + "filter_modal.title.status": "Filtruoti įrašą", "firehose.all": "Visi", "firehose.local": "Šis serveris", "firehose.remote": "Kiti serveriai", - "follow_request.authorize": "Autorizuoti", + "follow_request.authorize": "Leisti", "follow_request.reject": "Atmesti", - "follow_requests.unlocked_explanation": "Nors tavo paskyra neužrakinta, {domain} personalas mano, kad galbūt norėsi rankiniu būdu patikrinti šių paskyrų sekimo užklausas.", + "follow_requests.unlocked_explanation": "Nors tavo paskyra neužrakinta, {domain} personalas mano, kad galbūt norėsi rankiniu būdu patikrinti šių paskyrų sekimo prašymus.", "follow_suggestions.curated_suggestion": "Personalo pasirinkimai", "follow_suggestions.dismiss": "Daugiau nerodyti", - "follow_suggestions.hints.friends_of_friends": "Šis profilis yra populiarus tarp žmonių, kuriuos sekei.", + "follow_suggestions.hints.featured": "Šį profilį atrinko {domain} komanda.", + "follow_suggestions.hints.friends_of_friends": "Šis profilis yra populiarus tarp žmonių, kuriuos seki.", "follow_suggestions.hints.most_followed": "Šis profilis yra vienas iš labiausiai sekamų {domain}.", "follow_suggestions.hints.most_interactions": "Pastaruoju metu šis profilis sulaukia daug dėmesio šiame {domain}.", "follow_suggestions.hints.similar_to_recently_followed": "Šis profilis panašus į profilius, kuriuos neseniai sekei.", @@ -279,7 +288,7 @@ "follow_suggestions.popular_suggestion": "Populiarus pasiūlymas", "follow_suggestions.view_all": "Peržiūrėti viską", "follow_suggestions.who_to_follow": "Ką sekti", - "followed_tags": "Sekamos saitažodžiai", + "followed_tags": "Sekami saitažodžiai", "footer.about": "Apie", "footer.directory": "Profilių katalogas", "footer.get_app": "Gauti programėlę", @@ -289,214 +298,243 @@ "footer.source_code": "Peržiūrėti šaltinio kodą", "footer.status": "Būsena", "generic.saved": "Išsaugoti", - "getting_started.heading": "Pradedant", + "getting_started.heading": "Kaip pradėti", "hashtag.column_header.tag_mode.all": "ir {additional}", "hashtag.column_header.tag_mode.any": "ar {additional}", "hashtag.column_header.tag_mode.none": "be {additional}", - "hashtag.column_settings.select.no_options_message": "Pasiūlymų nerasta", - "hashtag.column_settings.select.placeholder": "Įvesti grotažymes…", + "hashtag.column_settings.select.no_options_message": "Pasiūlymų nerasta.", + "hashtag.column_settings.select.placeholder": "Įvesti saitažodžius…", "hashtag.column_settings.tag_mode.all": "Visi šie", - "hashtag.column_settings.tag_mode.any": "Bet kuris šių", + "hashtag.column_settings.tag_mode.any": "Bet kuris iš šių", "hashtag.column_settings.tag_mode.none": "Nė vienas iš šių", - "hashtag.column_settings.tag_toggle": "Include additional tags in this column", - "hashtag.counter_by_accounts": "{count, plural,one {{counter} dalyvis}other {{counter} dalyviai}}", - "hashtag.counter_by_uses": "{count, plural, one {{counter} įrašas} other {{counter} įrašų}}", - "hashtag.counter_by_uses_today": "{count, plural, one {{counter} įrašas} other {{counter} įrašų}} šiandien", - "hashtag.follow": "Sekti grotažymę", - "hashtag.unfollow": "Nesekti grotažymės", - "hashtags.and_other": "…ir{count, plural,other {#daugiau}}", - "home.column_settings.basic": "Pagrindinis", - "home.column_settings.show_reblogs": "Rodyti \"boosts\"", + "hashtag.column_settings.tag_toggle": "Įtraukti papildomas šio stulpelio žymes", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} dalyvis} few {{counter} dalyviai} many {{counter} dalyvio} other {{counter} dalyvių}}", + "hashtag.counter_by_uses": "{count, plural, one {{counter} įrašas} few {{counter} įrašai} many {{counter} įrašo} other {{counter} įrašų}}", + "hashtag.counter_by_uses_today": "{count, plural, one {{counter} įrašas} few {{counter} įrašai} many {{counter} įrašo} other {{counter} įrašų}} šiandien", + "hashtag.follow": "Sekti saitažodį", + "hashtag.unfollow": "Nebesekti saitažodį", + "hashtags.and_other": "…ir {count, plural, one {# daugiau} few {# daugiau} many {# daugiau}other {# daugiau}}", + "home.column_settings.basic": "Paprastas", + "home.column_settings.show_reblogs": "Rodyti pakėlimus", "home.column_settings.show_replies": "Rodyti atsakymus", "home.hide_announcements": "Slėpti skelbimus", - "home.pending_critical_update.link": "Žiūrėti atnaujinimus", - "home.pending_critical_update.title": "Galimas kritinis saugumo atnaujinimas!", + "home.pending_critical_update.body": "Kuo greičiau atnaujink savo Mastodon serverį!", + "home.pending_critical_update.link": "Žiūrėti naujinimus", + "home.pending_critical_update.title": "Galimas kritinis saugumo naujinimas.", + "home.show_announcements": "Rodyti skelbimus", + "interaction_modal.description.favourite": "Su Mastodon paskyra gali pamėgti šį įrašą, kad autorius (-ė) žinotų, jog vertinti tai ir išsaugoti jį vėliau.", + "interaction_modal.description.follow": "Su Mastodon paskyra gali sekti {name}, kad gautum jų įrašus į pagrindinį srautą.", + "interaction_modal.description.reblog": "Su Mastodon paskyra gali pakelti šią įrašą ir pasidalyti juo su savo sekėjais.", + "interaction_modal.description.reply": "Su Mastodon paskyra gali atsakyti į šį įrašą.", + "interaction_modal.login.action": "Į pagrindinį puslapį", + "interaction_modal.login.prompt": "Tavo pagrindinio serverio domenas, pvz., mastodon.social.", "interaction_modal.no_account_yet": "Nesi Mastodon?", "interaction_modal.on_another_server": "Kitame serveryje", "interaction_modal.on_this_server": "Šiame serveryje", - "interaction_modal.sign_in": "Nesi prisijungęs (-usi) prie šio serverio. Kur yra laikoma tavo paskyra?", + "interaction_modal.sign_in": "Nesi prisijungęs (-usi) prie šio serverio. Kur yra talpinama tavo paskyra?", "interaction_modal.sign_in_hint": "Patarimas: tai svetainė, kurioje užsiregistravai. Jei neprisimeni, ieškok sveikinimo el. laiško savo pašto dėžutėje. Taip pat gali įvesti visą savo naudotojo vardą (pvz., @Mastodon@mastodon.social).", - "interaction_modal.title.favourite": "Mėgstamiausias {name} įrašas", + "interaction_modal.title.favourite": "Pamėgti {name} įrašą", "interaction_modal.title.follow": "Sekti {name}", - "keyboard_shortcuts.back": "to navigate back", - "keyboard_shortcuts.blocked": "to open blocked users list", - "keyboard_shortcuts.boost": "to boost", - "keyboard_shortcuts.column": "to focus a status in one of the columns", - "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.direct": "to open direct messages column", - "keyboard_shortcuts.down": "to move down in the list", - "keyboard_shortcuts.enter": "to open status", - "keyboard_shortcuts.federated": "to open federated timeline", - "keyboard_shortcuts.heading": "Keyboard Shortcuts", - "keyboard_shortcuts.home": "to open home timeline", + "interaction_modal.title.reblog": "Pakelti {name} įrašą", + "interaction_modal.title.reply": "Atsakyti į {name} įrašą", + "intervals.full.days": "{number, plural, one {# diena} few {# dienos} many {# dienos} other {# dienų}}", + "intervals.full.hours": "{number, plural, one {# valanda} few {# valandos} many {# valandos} other {# valandų}}", + "intervals.full.minutes": "{number, plural, one {# minutė} few {# minutes} many {# minutės} other {# minučių}}", + "keyboard_shortcuts.back": "Naršyti atgal", + "keyboard_shortcuts.blocked": "Atidaryti užblokuotų naudotojų sąrašą", + "keyboard_shortcuts.boost": "Pakelti įrašą", + "keyboard_shortcuts.column": "Fokusuoti stulpelį", + "keyboard_shortcuts.compose": "Fokusuoti rengykles teksto sritį", + "keyboard_shortcuts.description": "Aprašymas", + "keyboard_shortcuts.direct": "atidaryti privačių paminėjimų stulpelį", + "keyboard_shortcuts.down": "Perkelti žemyn sąraše", + "keyboard_shortcuts.enter": "Atidaryti įrašą", + "keyboard_shortcuts.favourite": "Pamėgti įrašą", + "keyboard_shortcuts.favourites": "Atidaryti mėgstamųjų sąrašą", + "keyboard_shortcuts.federated": "Atidaryti federacinę laiko skalę", + "keyboard_shortcuts.heading": "Spartieji klavišai", + "keyboard_shortcuts.home": "Atidaryti pagrindinį laiko skalę", "keyboard_shortcuts.hotkey": "Spartusis klavišas", - "keyboard_shortcuts.legend": "to display this legend", - "keyboard_shortcuts.local": "to open local timeline", - "keyboard_shortcuts.mention": "to mention author", - "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", + "keyboard_shortcuts.legend": "Rodyti šią legendą", + "keyboard_shortcuts.local": "Atidaryti vietinę laiko skalę", + "keyboard_shortcuts.mention": "Paminėti autorių (-ę)", + "keyboard_shortcuts.muted": "Atidaryti nutildytų naudotojų sąrašą", + "keyboard_shortcuts.my_profile": "Atidaryti savo profilį", + "keyboard_shortcuts.notifications": "Atidaryti pranešimų stulpelį", "keyboard_shortcuts.open_media": "Atidaryti mediją", - "keyboard_shortcuts.pinned": "to open pinned toots list", - "keyboard_shortcuts.profile": "to open author's profile", - "keyboard_shortcuts.reply": "to reply", - "keyboard_shortcuts.requests": "to open follow requests list", - "keyboard_shortcuts.search": "to focus search", - "keyboard_shortcuts.spoilers": "to show/hide CW field", - "keyboard_shortcuts.start": "to open \"get started\" column", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.pinned": "Atidaryti prisegtų įrašų sąrašą", + "keyboard_shortcuts.profile": "Atidaryti autoriaus (-ės) profilį", + "keyboard_shortcuts.reply": "Atsakyti į įrašą", + "keyboard_shortcuts.requests": "Atidaryti sekimo prašymų sąrašą", + "keyboard_shortcuts.search": "Fokusuoti paieškos juostą", + "keyboard_shortcuts.spoilers": "Rodyti / slėpti TĮ lauką", + "keyboard_shortcuts.start": "Atidarykite stulpelį Kaip pradėti", + "keyboard_shortcuts.toggle_hidden": "Rodyti / slėpti tekstą po TĮ", "keyboard_shortcuts.toggle_sensitivity": "Rodyti / slėpti mediją", - "keyboard_shortcuts.toot": "to start a brand new toot", - "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", - "keyboard_shortcuts.up": "to move up in the list", + "keyboard_shortcuts.toot": "Pradėti naują įrašą", + "keyboard_shortcuts.unfocus": "Nebefokusuoti rengykles teksto sritį / paiešką", + "keyboard_shortcuts.up": "Perkelti į viršų sąraše", "lightbox.close": "Uždaryti", + "lightbox.compress": "Suspausti vaizdo peržiūros langelį", + "lightbox.expand": "Išplėsti vaizdo peržiūros langelį", "lightbox.next": "Kitas", "lightbox.previous": "Ankstesnis", "limited_account_hint.action": "Vis tiek rodyti profilį", - "limited_account_hint.title": "Šį profilį paslėpė {domain} moderatoriai.", + "limited_account_hint.title": "Šį profilį paslėpė {domain} prižiūrėtojai.", "link_preview.author": "Sukūrė {name}", "lists.account.add": "Pridėti į sąrašą", "lists.account.remove": "Pašalinti iš sąrašo", "lists.delete": "Ištrinti sąrašą", "lists.edit": "Redaguoti sąrašą", - "lists.edit.submit": "Prierašo pakeitimas", + "lists.edit.submit": "Keisti pavadinimą", + "lists.exclusive": "Slėpti šiuos įrašus iš pagrindinio", "lists.new.create": "Pridėti sąrašą", "lists.new.title_placeholder": "Naujas sąrašo pavadinimas", - "lists.replies_policy.followed": "Bet kuris sekamas naudotojas", - "lists.replies_policy.list": "Sąrašo nariai", - "lists.replies_policy.none": "Nei vienas", + "lists.replies_policy.followed": "Bet kuriam sekamam naudotojui", + "lists.replies_policy.list": "Sąrašo nariams", + "lists.replies_policy.none": "Nei vienam", "lists.replies_policy.title": "Rodyti atsakymus:", "lists.search": "Ieškoti tarp sekamų žmonių", - "lists.subheading": "Jūsų sąrašai", + "lists.subheading": "Tavo sąrašai", + "load_pending": "{count, plural, one {# naujas elementas} few {# nauji elementai} many {# naujo elemento} other {# naujų elementų}}", "loading_indicator.label": "Kraunama…", "media_gallery.toggle_visible": "{number, plural, one {Slėpti vaizdą} few {Slėpti vaizdus} many {Slėpti vaizdo} other {Slėpti vaizdų}}", - "moved_to_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu yra išjungta, nes persikėlei į {movedToAccount}.", + "moved_to_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu išjungta, nes persikėlei į {movedToAccount}.", "mute_modal.duration": "Trukmė", "mute_modal.hide_notifications": "Slėpti šio naudotojo pranešimus?", - "mute_modal.indefinite": "Neribotas", + "mute_modal.indefinite": "Neribota", "navigation_bar.about": "Apie", - "navigation_bar.advanced_interface": "Atidarykite išplėstinę žiniatinklio sąsają", + "navigation_bar.advanced_interface": "Atidaryti išplėstinę žiniatinklio sąsają", "navigation_bar.blocks": "Užblokuoti naudotojai", "navigation_bar.bookmarks": "Žymės", - "navigation_bar.compose": "Compose new toot", + "navigation_bar.community_timeline": "Vietinė laiko skalė", + "navigation_bar.compose": "Sukurti naują įrašą", "navigation_bar.direct": "Privatūs paminėjimai", "navigation_bar.discover": "Atrasti", - "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.domain_blocks": "Užblokuoti domenai", "navigation_bar.explore": "Naršyti", - "navigation_bar.favourites": "Mėgstamiausi", - "navigation_bar.filters": "Nutylėti žodžiai", - "navigation_bar.follow_requests": "Sekti prašymus", - "navigation_bar.followed_tags": "Sekti grotažymę", + "navigation_bar.favourites": "Mėgstami", + "navigation_bar.filters": "Nutildyti žodžiai", + "navigation_bar.follow_requests": "Sekimo prašymai", + "navigation_bar.followed_tags": "Sekami saitažodžiai", "navigation_bar.follows_and_followers": "Sekimai ir sekėjai", "navigation_bar.lists": "Sąrašai", "navigation_bar.logout": "Atsijungti", - "navigation_bar.mutes": "Užtildyti naudotojai", + "navigation_bar.mutes": "Nutildyti naudotojai", "navigation_bar.opened_in_classic_interface": "Įrašai, paskyros ir kiti konkretūs puslapiai pagal numatytuosius nustatymus atidaromi klasikinėje žiniatinklio sąsajoje.", "navigation_bar.personal": "Asmeninis", - "navigation_bar.pins": "Pinned toots", + "navigation_bar.pins": "Prisegti įrašai", "navigation_bar.preferences": "Nuostatos", - "navigation_bar.public_timeline": "Federuota laiko juosta", + "navigation_bar.public_timeline": "Federacinė laiko skalė", "navigation_bar.search": "Ieškoti", "navigation_bar.security": "Apsauga", - "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", - "notification.admin.report": "{name} pranešė.{target}", + "not_signed_in_indicator.not_signed_in": "Norint pasiekti šį išteklį, reikia prisijungti.", + "notification.admin.report": "{name} pranešė {target}", "notification.admin.sign_up": "{name} užsiregistravo", - "notification.favourite": "{name} pamėgo jūsų įrašą", - "notification.follow": "{name} pradėjo jus sekti", - "notification.follow_request": "{name} nori tapti jūsų sekėju", - "notification.mention": "{name} paminėjo jus", + "notification.favourite": "{name} pamėgo tavo įrašą", + "notification.follow": "{name} seka tave", + "notification.follow_request": "{name} paprašė tave sekti", + "notification.mention": "{name} paminėjo tave", "notification.own_poll": "Tavo apklausa baigėsi", "notification.poll": "Apklausa, kurioje balsavai, pasibaigė", - "notification.reblog": "{name} boosted your status", + "notification.reblog": "{name} pakėlė tavo įrašą", "notification.status": "{name} ką tik paskelbė", "notification.update": "{name} redagavo įrašą", "notifications.clear": "Išvalyti pranešimus", "notifications.clear_confirmation": "Ar tikrai nori visam laikui išvalyti visus pranešimus?", - "notifications.column_settings.admin.report": "Nauji ataskaitos:", - "notifications.column_settings.admin.sign_up": "Nauji prisiregistravimai:", + "notifications.column_settings.admin.report": "Naujos ataskaitos:", + "notifications.column_settings.admin.sign_up": "Naujos registracijos:", "notifications.column_settings.alert": "Darbalaukio pranešimai", - "notifications.column_settings.favourite": "Mėgstamiausi:", + "notifications.column_settings.favourite": "Mėgstami:", "notifications.column_settings.filter_bar.advanced": "Rodyti visas kategorijas", - "notifications.column_settings.filter_bar.category": "Greito filtro juosta", + "notifications.column_settings.filter_bar.category": "Spartaus filtro juosta", "notifications.column_settings.filter_bar.show_bar": "Rodyti filtro juostą", "notifications.column_settings.follow": "Nauji sekėjai:", - "notifications.column_settings.follow_request": "Nauji prašymai sekti:", + "notifications.column_settings.follow_request": "Nauji sekimo prašymai:", "notifications.column_settings.mention": "Paminėjimai:", "notifications.column_settings.poll": "Balsavimo rezultatai:", - "notifications.column_settings.push": "\"Push\" pranešimai", + "notifications.column_settings.push": "Stumdomieji pranešimai", "notifications.column_settings.reblog": "Pakėlimai:", "notifications.column_settings.show": "Rodyti stulpelyje", "notifications.column_settings.sound": "Paleisti garsą", - "notifications.column_settings.status": "New toots:", + "notifications.column_settings.status": "Nauji įrašai:", "notifications.column_settings.unread_notifications.category": "Neperskaityti pranešimai", "notifications.column_settings.unread_notifications.highlight": "Paryškinti neperskaitytus pranešimus", "notifications.column_settings.update": "Redagavimai:", "notifications.filter.all": "Visi", - "notifications.filter.boosts": "\"Boost\" kiekis", - "notifications.filter.favourites": "Mėgstamiausi", + "notifications.filter.boosts": "Pakėlimai", + "notifications.filter.favourites": "Mėgstami", "notifications.filter.follows": "Sekimai", "notifications.filter.mentions": "Paminėjimai", "notifications.filter.polls": "Balsavimo rezultatai", - "notifications.filter.statuses": "Atnaujinimai iš žmonių kuriuos sekate", + "notifications.filter.statuses": "Naujinimai iš žmonių, kuriuos seki", "notifications.grant_permission": "Suteikti leidimą.", "notifications.group": "{count} pranešimai", "notifications.mark_as_read": "Pažymėti kiekvieną pranešimą kaip perskaitytą", - "notifications.permission_denied": "Darbalaukio pranešimai nepasiekiami dėl anksčiau atmestos naršyklės leidimų užklausos", - "notifications.permission_denied_alert": "Negalima įjungti darbalaukio pranešimų, nes prieš tai naršyklės leidimas buvo atmestas", - "notifications.permission_required": "Darbalaukio pranešimai nepasiekiami, nes nesuteiktas reikiamas leidimas.", + "notifications.permission_denied": "Darbalaukio pranešimai nepasiekiami dėl anksčiau atmestos naršyklės leidimų užklausos.", + "notifications.permission_denied_alert": "Negalima įjungti darbalaukio pranešimų, nes prieš tai naršyklės leidimas buvo atmestas.", + "notifications.permission_required": "Darbalaukio pranešimai nepasiekiami, nes nebuvo suteiktas reikiamas leidimas.", "notifications_permission_banner.enable": "Įjungti darbalaukio pranešimus", - "notifications_permission_banner.how_to_control": "Jei norite gauti pranešimus, kai \"Mastodon\" nėra atidarytas, įjunkite darbalaukio pranešimus. Įjungę darbalaukio pranešimus, galite tiksliai valdyti, kokių tipų sąveikos generuoja darbalaukio pranešimus, naudodamiesi pirmiau esančiu mygtuku {icon}.", - "notifications_permission_banner.title": "Niekada nieko nepraleiskite", - "onboarding.action.back": "Gražinkite mane atgal", - "onboarding.actions.back": "Gražinkite mane atgal", - "onboarding.actions.go_to_explore": "See what's trending", - "onboarding.actions.go_to_home": "Go to your home feed", + "notifications_permission_banner.how_to_control": "Jei nori gauti pranešimus, kai Mastodon nėra atidarytas, įjunk darbalaukio pranešimus. Įjungęs (-usi) darbalaukio pranešimus, gali tiksliai valdyti, kokių tipų sąveikos generuoja darbalaukio pranešimus, naudojant pirmiau esančiu mygtuku {icon}.", + "notifications_permission_banner.title": "Niekada nieko nepraleisk", + "onboarding.action.back": "Grąžinti mane atgal", + "onboarding.actions.back": "Grąžinti mane atgal", + "onboarding.actions.go_to_explore": "Į tendencijų puslapį", + "onboarding.actions.go_to_home": "Į mano pagrindinį srautų puslapį", "onboarding.compose.template": "Sveiki #Mastodon!", - "onboarding.follows.empty": "Deja, šiuo metu jokių rezultatų parodyti negalima. Galite pabandyti naudoti paiešką arba naršyti atradimo puslapyje, kad surastumėte žmonių, kuriuos norite sekti, arba pabandyti vėliau.", - "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", - "onboarding.follows.title": "Popular on Mastodon", + "onboarding.follows.empty": "Deja, šiuo metu jokių rezultatų parodyti negalima. Gali pabandyti naudoti paiešką arba naršyti atradimo puslapį, kad surastum žmonių, kuriuos nori sekti, arba bandyti vėliau.", + "onboarding.follows.lead": "Tavo pagrindinis srautas – pagrindinis būdas patirti Mastodon. Kuo daugiau žmonių seksi, tuo jis bus aktyvesnis ir įdomesnis. Norint pradėti, pateikiame keletą pasiūlymų:", + "onboarding.follows.title": "Suasmenink savo pagrindinį srautą", "onboarding.profile.discoverable": "Padaryti mano profilį atrandamą", - "onboarding.profile.discoverable_hint": "Kai pasirenki Mastodon atrandamumą, tavo įrašai gali būti rodomi paieškos rezultatuose ir trendose, o profilis gali būti siūlomas panašių interesų turintiems žmonėms.", + "onboarding.profile.discoverable_hint": "Kai pasirenki Mastodon atrandamumą, tavo įrašai gali būti rodomi paieškos rezultatuose ir tendencijose, o profilis gali būti siūlomas panašių pomėgių turintiems žmonėms.", "onboarding.profile.display_name": "Rodomas vardas", "onboarding.profile.display_name_hint": "Tavo pilnas vardas arba linksmas vardas…", "onboarding.profile.lead": "Gali visada tai užbaigti vėliau nustatymuose, kur yra dar daugiau pritaikymo parinkčių.", "onboarding.profile.note": "Biografija", "onboarding.profile.note_hint": "Gali @paminėti kitus žmones arba #saitažodžius…", "onboarding.profile.save_and_continue": "Išsaugoti ir tęsti", - "onboarding.profile.title": "Profilio konfigūravimas", + "onboarding.profile.title": "Profilio sąranka", "onboarding.profile.upload_avatar": "Įkelti profilio nuotrauką", "onboarding.profile.upload_header": "Įkelti profilio antraštę", - "onboarding.share.lead": "Praneškite žmonėms, kaip jus rasti \"Mastodon\"!", - "onboarding.share.message": "Aš {username} #Mastodon! Ateik sekti manęs adresu {url}", + "onboarding.share.lead": "Leisk žmonėms sužinoti, kaip tave rasti Mastodon!", + "onboarding.share.message": "Aš {username}, esant #Mastodon! Ateik sekti manęs adresu {url}.", "onboarding.share.next_steps": "Galimi kiti žingsniai:", - "onboarding.share.title": "Bendrinkite savo profilį", - "onboarding.start.lead": "Dabar esi Mastodon dalis – unikalios decentralizuotos socialinės žiniasklaidos platformos, kurioje tu, o ne algoritmas, pats nustatai savo patirtį. Pradėkime tavo kelionę šioje naujoje socialinėje erdvėje:", - "onboarding.start.skip": "Want to skip right ahead?", - "onboarding.start.title": "Jums pavyko!", - "onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", - "onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}", - "onboarding.steps.publish_status.body": "Say hello to the world.", - "onboarding.steps.publish_status.title": "Susikūrk savo pirmąjį įrašą", - "onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.", - "onboarding.steps.setup_profile.title": "Customize your profile", - "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", - "onboarding.steps.share_profile.title": "Share your profile", - "picture_in_picture.restore": "Padėkite jį atgal", - "poll.closed": "Uždaryti", + "onboarding.share.title": "Bendrink savo profilį", + "onboarding.start.lead": "Dabar esi Mastodon dalis – unikalios decentralizuotos socialinės medijos platformos, kurioje tu, o ne algoritmas, pats nustatai savo patirtį. Pradėkime tavo kelionę šioje naujoje socialinėje erdvėje:", + "onboarding.start.skip": "Nereikia pagalbos pradėti?", + "onboarding.start.title": "Tau pavyko!", + "onboarding.steps.follow_people.body": "Sekti įdomius žmones – tai, kas yra Mastodon.", + "onboarding.steps.follow_people.title": "Suasmenink savo pagrindinį srautą", + "onboarding.steps.publish_status.body": "Sakyk labas pasauliui tekstu, nuotraukomis, vaizdo įrašais arba apklausomis {emoji}.", + "onboarding.steps.publish_status.title": "Sukūrk savo pirmąjį įrašą", + "onboarding.steps.setup_profile.body": "Padidink savo sąveiką turint išsamų profilį.", + "onboarding.steps.setup_profile.title": "Suasmenink savo profilį", + "onboarding.steps.share_profile.body": "Leisk draugams sužinoti, kaip tave rasti Mastodon.", + "onboarding.steps.share_profile.title": "Bendrink savo Mastodon profilį", + "onboarding.tips.2fa": "Ar žinojai? Savo paskyrą gali apsaugoti nustatęs (-usi) dviejų veiksnių tapatybės nustatymą paskyros nustatymuose. Jis veikia su bet kuria pasirinkta TOTP programėle, telefono numeris nebūtinas.", + "onboarding.tips.accounts_from_other_servers": "Ar žinojai? Kadangi Mastodon decentralizuotas, kai kurie profiliai, su kuriais susidursi, bus talpinami ne tavo, o kituose serveriuose. Ir vis tiek galėsi su jais sklandžiai bendrauti! Jų serveris yra antroje naudotojo vardo pusėje.", + "onboarding.tips.migration": "Ar žinojai? Jei manai, kad {domain} serveris ateityje tau netiks, gali persikelti į kitą Mastodon serverį neprarandant savo sekėjų. Gali net talpinti savo paties serverį.", + "onboarding.tips.verification": "Ar žinojai? Savo paskyrą gali patvirtinti pateikęs (-usi) nuorodą į Mastodon profilį savo interneto svetainėje ir pridėjęs (-usi) svetainę prie savo profilio. Nereikia jokių mokesčių ar dokumentų.", + "password_confirmation.exceeds_maxlength": "Slaptažodžio patvirtinimas viršija maksimalų slaptažodžio ilgį.", + "password_confirmation.mismatching": "Slaptažodžio patvirtinimas nesutampa.", + "picture_in_picture.restore": "Padėti jį atgal", + "poll.closed": "Uždaryta", "poll.refresh": "Atnaujinti", "poll.reveal": "Peržiūrėti rezultatus", + "poll.total_people": "{count, plural, one {# žmogus} few {# žmonės} many {# žmogus} other {# žmonių}}", + "poll.total_votes": "{count, plural, one {# balsas} few {# balsai} many {# balso} other {# balsų}}", "poll.vote": "Balsuoti", "poll.voted": "Tu balsavai už šį atsakymą", "poll.votes": "{votes, plural, one {# balsas} few {# balsai} many {# balso} other {# balsų}}", "poll_button.add_poll": "Pridėti apklausą", - "poll_button.remove_poll": "Šalinti apklausą", - "privacy.change": "Adjust status privacy", + "poll_button.remove_poll": "Pašalinti apklausą", + "privacy.change": "Keisti įrašo privatumą", "privacy.direct.long": "Visus, paminėtus įraše", "privacy.direct.short": "Konkretūs žmonės", "privacy.private.long": "Tik sekėjams", "privacy.private.short": "Sekėjai", "privacy.public.long": "Bet kas iš Mastodon ir ne Mastodon", - "privacy.public.short": "Viešas", + "privacy.public.short": "Vieša", "privacy.unlisted.additional": "Tai veikia lygiai taip pat, kaip ir vieša, tik įrašas nebus rodomas tiesioginiuose srautuose, saitažodžiose, naršyme ar Mastodon paieškoje, net jei esi įtraukęs (-usi) visą paskyrą.", "privacy.unlisted.long": "Mažiau algoritminių fanfarų", "privacy.unlisted.short": "Tyliai vieša", @@ -504,8 +542,14 @@ "privacy_policy.title": "Privatumo politika", "recommended": "Rekomenduojama", "refresh": "Atnaujinti", - "regeneration_indicator.label": "Kraunasi…", + "regeneration_indicator.label": "Kraunama…", + "regeneration_indicator.sublabel": "Ruošiamas tavo pagrindinis srautas!", + "relative_time.days": "{number} d.", + "relative_time.full.days": "prieš {number, plural, one {# dieną} few {# dienas} many {# dienos} other {# dienų}}", + "relative_time.full.hours": "prieš {number, plural, one {# valandą} few {# valandas} many {# valandos} other {# valandų}}", "relative_time.full.just_now": "ką tik", + "relative_time.full.minutes": "prieš {number, plural, one {# minutę} few {# minutes} many {# minutės} other {# minučių}}", + "relative_time.full.seconds": "prieš {number, plural, one {# sekundę} few {# sekundes} many {# sekundės} other {# sekundžių}}", "relative_time.hours": "{number} val.", "relative_time.just_now": "dabar", "relative_time.minutes": "{number} min.", @@ -515,15 +559,20 @@ "reply_indicator.cancel": "Atšaukti", "reply_indicator.poll": "Apklausa", "report.block": "Blokuoti", - "report.categories.legal": "Legalus", + "report.block_explanation": "Jų įrašų nematysi. Jie negalės matyti tavo įrašų ar sekti tavęs. Jie galės pamatyti, kad yra užblokuoti.", + "report.categories.legal": "Teisinės", "report.categories.other": "Kita", "report.categories.spam": "Šlamštas", "report.categories.violation": "Turinys pažeidžia vieną ar daugiau serverio taisyklių", - "report.category.subtitle": "Pasirinkite tinkamiausią variantą", + "report.category.subtitle": "Pasirink geriausią atitikmenį.", + "report.category.title": "Papasakok mums, kas vyksta su šiuo {type}", "report.category.title_account": "profilis", "report.category.title_status": "įrašas", "report.close": "Atlikta", - "report.comment.title": "Ar yra dar kas nors, ką, jūsų manymu, turėtume žinoti?", + "report.comment.title": "Ar yra dar kas nors, ką, tavo manymu, turėtume žinoti?", + "report.forward": "Persiųsti į {target}", + "report.forward_hint": "Paskyra yra iš kito serverio. Siųsti anoniminę šios ataskaitos kopiją ir ten?", + "report.mute": "Nutildyti", "report.mute_explanation": "Jų įrašų nematysi. Jie vis tiek gali tave sekti ir matyti įrašus, bet nežinos, kad jie nutildyti.", "report.next": "Tęsti", "report.placeholder": "Papildomi komentarai", @@ -532,41 +581,42 @@ "report.reasons.legal": "Tai nelegalu", "report.reasons.legal_description": "Manai, kad tai pažeidžia tavo arba serverio šalies įstatymus", "report.reasons.other": "Tai kažkas kita", - "report.reasons.other_description": "Šis klausimas neatitinka kitų kategorijų", + "report.reasons.other_description": "Problema netinka kitoms kategorijoms", "report.reasons.spam": "Tai šlamštas", "report.reasons.spam_description": "Kenkėjiškos nuorodos, netikras įsitraukimas arba pasikartojantys atsakymai", "report.reasons.violation": "Tai pažeidžia serverio taisykles", "report.reasons.violation_description": "Žinai, kad tai pažeidžia konkrečias taisykles", - "report.rules.subtitle": "Pasirink viską, kas tinka", + "report.rules.subtitle": "Pasirink viską, kas tinka.", "report.rules.title": "Kokios taisyklės pažeidžiamos?", - "report.statuses.subtitle": "Pasirinkti viską, kas tinka", - "report.statuses.title": "Ar yra kokių nors įrašų, patvirtinančių šį pranešimą?", + "report.statuses.subtitle": "Pasirink viską, kas tinka.", + "report.statuses.title": "Ar yra kokių nors įrašų, patvirtinančių šį ataskaitą?", "report.submit": "Pateikti", - "report.target": "Report {target}", - "report.thanks.take_action": "Čia pateikiamos galimybės kontroliuoti, ką matote \"Mastodon\":", - "report.thanks.take_action_actionable": "Kol tai peržiūrėsime, galite imtis veiksmų prieš @{name}:", - "report.thanks.title": "Nenorite to matyti?", - "report.thanks.title_actionable": "Ačiū, kad pranešėte, mes tai išnagrinėsime.", + "report.target": "Pranešama apie {target}", + "report.thanks.take_action": "Štai parinktys, kaip kontroliuoti, ką matai Mastodon:", + "report.thanks.take_action_actionable": "Kol peržiūrėsime, gali imtis veiksmų prieš {name}:", + "report.thanks.title": "Nenori to matyti?", + "report.thanks.title_actionable": "Ačiū, kad pranešei, mes tai išnagrinėsime.", "report.unfollow": "Nebesekti @{name}", - "report.unfollow_explanation": "Jūs sekate šią paskyrą. Norėdami nebematyti jų įrašų savo pagrindiniame kanale, panaikinkite jų sekimą.", - "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", - "report_notification.categories.legal": "Legalus", + "report.unfollow_explanation": "Tu seki šią paskyrą. Jei nori nebematyti jų įrašų savo pagrindiniame sraute, nebesek jų.", + "report_notification.attached_statuses": "Pridėti {count, plural, one {{count} įrašas} few {{count} įrašai} many {{count} įrašo} other {{count} įrašų}}", + "report_notification.categories.legal": "Teisinės", "report_notification.categories.other": "Kita", "report_notification.categories.spam": "Šlamštas", "report_notification.categories.violation": "Taisyklės pažeidimas", - "search.no_recent_searches": "Paieškos įrašų nėra", + "report_notification.open": "Atidaryti ataskaitą", + "search.no_recent_searches": "Nėra naujausių paieškų.", "search.placeholder": "Paieška", "search.quick_action.account_search": "Profiliai, atitinkantys {x}", "search.quick_action.go_to_account": "Eiti į profilį {x}", - "search.quick_action.go_to_hashtag": "Eiti į hashtag {x}", + "search.quick_action.go_to_hashtag": "Eiti į saitažodį {x}", "search.quick_action.open_url": "Atidaryti URL adresą Mastodon", "search.quick_action.status_search": "Pranešimai, atitinkantys {x}", - "search.search_or_paste": "Ieškok arba įklijuok URL", + "search.search_or_paste": "Ieškoti arba įklijuoti URL", "search_popout.full_text_search_disabled_message": "Nepasiekima {domain}.", "search_popout.full_text_search_logged_out_message": "Pasiekiama tik prisijungus.", "search_popout.language_code": "ISO kalbos kodas", "search_popout.options": "Paieškos nustatymai", - "search_popout.quick_actions": "Greiti veiksmai", + "search_popout.quick_actions": "Spartūs veiksmai", "search_popout.recent": "Naujausios paieškos", "search_popout.specific_date": "konkreti data", "search_popout.user": "naudotojas", @@ -575,23 +625,25 @@ "search_results.hashtags": "Saitažodžiai", "search_results.nothing_found": "Nepavyko rasti nieko pagal šiuos paieškos terminus.", "search_results.see_all": "Žiūrėti viską", - "search_results.statuses": "Toots", + "search_results.statuses": "Įrašai", "search_results.title": "Ieškoti {q}", "server_banner.about_active_users": "Žmonės, kurie naudojosi šiuo serveriu per pastarąsias 30 dienų (mėnesio aktyvūs naudotojai)", "server_banner.active_users": "aktyvūs naudotojai", "server_banner.administered_by": "Administruoja:", - "server_banner.introduction": "{domain} yra decentralizuoto socialinio tinklo, kurį valdo {mastodon}, dalis.", + "server_banner.introduction": "{domain} – decentralizuoto socialinio tinklo dalis, kurį palaiko {mastodon}.", "server_banner.learn_more": "Sužinoti daugiau", "server_banner.server_stats": "Serverio statistika:", "sign_in_banner.create_account": "Sukurti paskyrą", "sign_in_banner.sign_in": "Prisijungimas", - "sign_in_banner.sso_redirect": "Prisijungti arba Registruotis", + "sign_in_banner.sso_redirect": "Prisijungti arba užsiregistruoti", "sign_in_banner.text": "Prisijunk, kad galėtum sekti profilius arba saitažodžius, mėgsti, bendrinti ir atsakyti į įrašus. Taip pat gali bendrauti iš savo paskyros kitame serveryje.", - "status.admin_account": "Atvira moderavimo sąsaja @{name}", - "status.admin_domain": "Atvira moderavimo sąsaja {domain}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Atidaryti prižiūrėjimo sąsają @{name}", + "status.admin_domain": "Atidaryti prižiūrėjimo sąsają {domain}", + "status.admin_status": "Atidaryti šį įrašą prižiūrėjimo sąsajoje", "status.block": "Blokuoti @{name}", - "status.bookmark": "Žymė", + "status.bookmark": "Pridėti į žymės", + "status.cancel_reblog_private": "Nebepakelti", + "status.cannot_reblog": "Šis įrašas negali būti pakeltas.", "status.copy": "Kopijuoti nuorodą į įrašą", "status.delete": "Ištrinti", "status.detailed_status": "Išsami pokalbio peržiūra", @@ -599,15 +651,15 @@ "status.direct_indicator": "Privatus paminėjimas", "status.edit": "Redaguoti", "status.edited": "Redaguota {date}", - "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", - "status.embed": "Įterptas", - "status.favourite": "Mėgstamiausias", + "status.edited_x_times": "Redaguota {count, plural, one {{count} kartą} few {{count} kartus} many {{count} karto} other {{count} kartų}}", + "status.embed": "Įterpti", + "status.favourite": "Pamėgti", "status.filter": "Filtruoti šį įrašą", "status.filtered": "Filtruota", "status.hide": "Slėpti įrašą", - "status.history.created": "{name} sukurtas {date}", - "status.history.edited": "{name} redaguotas {date}", - "status.load_more": "Pakrauti daugiau", + "status.history.created": "{name} sukurta {date}", + "status.history.edited": "{name} redaguota {date}", + "status.load_more": "Krauti daugiau", "status.media.open": "Spausk, kad atidaryti", "status.media.show": "Spausk, kad matyti", "status.media_hidden": "Paslėpta medija", @@ -615,15 +667,20 @@ "status.more": "Daugiau", "status.mute": "Nutildyti @{name}", "status.mute_conversation": "Nutildyti pokalbį", - "status.open": "Expand this status", + "status.open": "Išplėsti šį įrašą", "status.pin": "Prisegti prie profilio", "status.pinned": "Prisegtas įrašas", "status.read_more": "Skaityti daugiau", - "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", - "status.redraft": "Ištrinti ir iš naujo parengti juodraštį", + "status.reblog": "Pakelti", + "status.reblog_private": "Pakelti su originaliu matomumu", + "status.reblogged_by": "{name} pakėlė", + "status.reblogs.empty": "Šio įrašo dar niekas nepakėlė. Kai kas nors tai padarys, jie bus rodomi čia.", + "status.redraft": "Ištrinti ir parengti iš naujo", + "status.remove_bookmark": "Pašalinti žymę", + "status.replied_to": "Atsakyta į {name}", "status.reply": "Atsakyti", "status.replyAll": "Atsakyti į giją", - "status.report": "Pranešti @{name}", + "status.report": "Pranešti apie @{name}", "status.sensitive_warning": "Jautrus turinys", "status.share": "Bendrinti", "status.show_filter_reason": "Rodyti vis tiek", @@ -632,37 +689,62 @@ "status.show_more": "Rodyti daugiau", "status.show_more_all": "Rodyti daugiau visiems", "status.show_original": "Rodyti originalą", - "status.title.with_attachments": "{user}{attachmentCount, plural, one {priedas} few {{attachmentCount} priedai} many {{attachmentCount} priedo} other {{attachmentCount} priedų}}", + "status.title.with_attachments": "{user} paskelbė {attachmentCount, plural, one {priedą} few {{attachmentCount} priedus} many {{attachmentCount} priedo} other {{attachmentCount} priedų}}", "status.translate": "Versti", - "status.translated_from_with": "Išversta iš {lang} naudojant {provider}", - "status.uncached_media_warning": "Peržiūra nepasiekiama", - "subscribed_languages.lead": "Po pakeitimo tavo pagrindinėje ir sąrašo laiko juostose bus rodomi tik įrašai pasirinktomis kalbomis. Jei nori gauti įrašus visomis kalbomis, pasirink nė vieno.", - "tabs_bar.home": "Pradžia", + "status.translated_from_with": "Išversta iš {lang} naudojant {provider}.", + "status.uncached_media_warning": "Peržiūra nepasiekiama.", + "status.unmute_conversation": "Atšaukti pokalbio nutildymą", + "status.unpin": "Atsegti iš profilio", + "subscribed_languages.lead": "Po pakeitimo tavo pagrindinėje ir sąrašo laiko skalėje bus rodomi tik įrašai pasirinktomis kalbomis. Jei nori gauti įrašus visomis kalbomis, pasirink nė vieno.", + "subscribed_languages.save": "Išsaugoti pakeitimus", + "subscribed_languages.target": "Keisti prenumeruojamas kalbas {target}", + "tabs_bar.home": "Pagrindinis", "tabs_bar.notifications": "Pranešimai", - "time_remaining.days": "Liko {number, plural, one {# diena} few {# dienos} many {# dieno} other {# dienų}}", - "timeline_hint.remote_resource_not_displayed": "{resource} iš kitų serverių nerodomas.", + "time_remaining.days": "liko {number, plural, one {# diena} few {# dienos} many {# dienos} other {# dienų}}", + "time_remaining.hours": "liko {number, plural, one {# valanda} few {# valandos} many {# valandos} other {# valandų}}", + "time_remaining.minutes": "liko {number, plural, one {# minutė} few {# minutės} many {# minutės} other {# minučių}}", + "time_remaining.moments": "liko akimirkos", + "time_remaining.seconds": "liko {number, plural, one {# sekundė} few {# sekundės} many {# sekundės} other {# sekundžių}}", + "timeline_hint.remote_resource_not_displayed": "{resource} iš kitų serverių nerodomi.", "timeline_hint.resources.followers": "Sekėjai", "timeline_hint.resources.follows": "Seka", "timeline_hint.resources.statuses": "Senesni įrašai", - "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}", + "trends.counter_by_accounts": "{count, plural, one {{counter} žmogus} few {{counter} žmonės} many {{counter} žmogus} other {{counter} žmonių}} per {days, plural, one {dieną} few {{days} dienas} many {{days} dienas} other {{days} dienų}}", + "trends.trending_now": "Tendencinga dabar", "ui.beforeunload": "Jei paliksi Mastodon, tavo juodraštis bus prarastas.", + "units.short.billion": "{count} mlrd.", + "units.short.million": "{count} mln.", "units.short.thousand": "{count} tūkst.", - "upload_form.audio_description": "Describe for people with hearing loss", - "upload_form.description": "Describe for the visually impaired", + "upload_area.title": "Nuvilk, kad įkeltum", + "upload_button.label": "Pridėti vaizdų, vaizdo įrašą arba garso failą", + "upload_error.limit": "Viršyta failo įkėlimo riba.", + "upload_error.poll": "Failų įkėlimas neleidžiamas su apklausomis.", + "upload_form.audio_description": "Aprašyk žmonėms, kurie yra kurtieji ar neprigirdintys.", + "upload_form.description": "Aprašyk žmonėms, kurie yra aklieji arba silpnaregiai.", "upload_form.edit": "Redaguoti", - "upload_form.video_description": "Describe for people with hearing loss or visual impairment", + "upload_form.thumbnail": "Keisti miniatiūrą", + "upload_form.video_description": "Aprašyk žmonėms, kurie yra kurtieji, neprigirdintys, aklieji ar silpnaregiai.", + "upload_modal.analyzing_picture": "Analizuojamas vaizdas…", + "upload_modal.apply": "Taikyti", + "upload_modal.applying": "Pritaikoma…", "upload_modal.choose_image": "Pasirinkti vaizdą", "upload_modal.description_placeholder": "Greita rudoji lapė peršoka tinginį šunį", + "upload_modal.detect_text": "Aptikti tekstą iš nuotraukos", "upload_modal.edit_media": "Redaguoti mediją", + "upload_modal.hint": "Spustelėk arba nuvilk apskritimą peržiūroje, kad pasirinktum centrinį tašką, kuris visada bus matomas visose miniatiūrose.", + "upload_modal.preparing_ocr": "Rengimas OCR…", + "upload_modal.preview_label": "Peržiūra ({ratio})", "upload_progress.label": "Įkeliama...", "upload_progress.processing": "Apdorojama…", "username.taken": "Šis naudotojo vardas užimtas. Pabandyk kitą.", "video.close": "Uždaryti vaizdo įrašą", "video.download": "Atsisiųsti failą", "video.exit_fullscreen": "Išeiti iš viso ekrano", + "video.expand": "Išplėsti vaizdo įrašą", "video.fullscreen": "Visas ekranas", "video.hide": "Slėpti vaizdo įrašą", - "video.mute": "Nutildyti garsą", + "video.mute": "Išjungti garsą", + "video.pause": "Pristabdyti", "video.play": "Leisti", - "video.unmute": "Atitildyti garsą" + "video.unmute": "Įjungti garsą" } diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 07a7b25a79..8044e78923 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -21,24 +21,26 @@ "account.blocked": "Bloķēts", "account.browse_more_on_origin_server": "Pārlūkot vairāk sākotnējā profilā", "account.cancel_follow_request": "Atsaukt sekošanas pieprasījumu", + "account.copy": "Ievietot saiti uz profilu starpliktuvē", "account.direct": "Pieminēt @{name} privāti", "account.disable_notifications": "Pārtraukt man paziņot, kad @{name} publicē ierakstu", "account.domain_blocked": "Domēns ir bloķēts", - "account.edit_profile": "Rediģēt profilu", + "account.edit_profile": "Labot profilu", "account.enable_notifications": "Paziņot man, kad @{name} publicē ierakstu", "account.endorse": "Izcelts profilā", "account.featured_tags.last_status_at": "Beidzamā ziņa {date}", "account.featured_tags.last_status_never": "Ierakstu nav", "account.featured_tags.title": "{name} izceltie tēmturi", "account.follow": "Sekot", + "account.follow_back": "Sekot atpakaļ", "account.followers": "Sekotāji", "account.followers.empty": "Šim lietotājam vēl nav sekotāju.", - "account.followers_counter": "{count, plural, one {{counter} Sekotājs} other {{counter} Sekotāji}}", + "account.followers_counter": "{count, plural, zero {{counter} sekotāju} one {{counter} sekotājs} other {{counter} sekotāji}}", "account.following": "Seko", - "account.following_counter": "{count, plural, one {{counter} sekojamais} other {{counter} sekojamie}}", + "account.following_counter": "{count, plural, zero{{counter} sekojamo} one {{counter} sekojamais} other {{counter} sekojamie}}", "account.follows.empty": "Šis lietotājs pagaidām nevienam neseko.", "account.go_to_profile": "Doties uz profilu", - "account.hide_reblogs": "Slēpt @{name} izceltas ziņas", + "account.hide_reblogs": "Paslēpt @{name} pastiprinātos ierakstus", "account.in_memoriam": "Piemiņai.", "account.joined_short": "Pievienojās", "account.languages": "Mainīt abonētās valodas", @@ -51,13 +53,14 @@ "account.mute_notifications_short": "Izslēgt paziņojumu skaņu", "account.mute_short": "Apklusināt", "account.muted": "Apklusināts", + "account.mutual": "Savstarpējs", "account.no_bio": "Apraksts nav sniegts.", "account.open_original_page": "Atvērt oriģinālo lapu", "account.posts": "Ieraksti", "account.posts_with_replies": "Ieraksti un atbildes", "account.report": "Sūdzēties par @{name}", "account.requested": "Gaida apstiprinājumu. Nospied, lai atceltu sekošanas pieparasījumu", - "account.requested_follow": "{name} nosūtīja tev sekošanas pieprasījumu", + "account.requested_follow": "{name} nosūtīja Tev sekošanas pieprasījumu", "account.share": "Dalīties ar @{name} profilu", "account.show_reblogs": "Parādīt @{name} pastiprinātos ierakstus", "account.statuses_counter": "{count, plural, zero {{counter} ierakstu} one {{counter} ieraksts} other {{counter} ieraksti}}", @@ -97,18 +100,18 @@ "bundle_column_error.routing.body": "Pieprasīto lapu nevarēja atrast. Vai esi pārliecināts, ka URL adreses joslā ir pareizs?", "bundle_column_error.routing.title": "404", "bundle_modal_error.close": "Aizvērt", - "bundle_modal_error.message": "Kaut kas nogāja greizi, ielādējot šo komponenti.", + "bundle_modal_error.message": "Kaut kas nogāja greizi šīs sastāvdaļas ielādēšanas laikā.", "bundle_modal_error.retry": "Mēģināt vēlreiz", "closed_registrations.other_server_instructions": "Tā kā Mastodon ir decentralizēts, tu vari izveidot kontu citā serverī un joprojām mijiedarboties ar šo.", - "closed_registrations_modal.description": "Pašlaik nav iespējams izveidot kontu domēnā {domain}, taču ņem vērā, ka tev nav nepieciešams konts tieši {domain}, lai lietotu Mastodon.", + "closed_registrations_modal.description": "Pašlaik nav iespējams izveidot kontu {domain}, bet, lūdzu, ņem vērā, ka Tev nav nepieciešams tieši {domain} konts, lai lietotu Mastodon!", "closed_registrations_modal.find_another_server": "Atrast citu serveri", - "closed_registrations_modal.preamble": "Mastodon ir decentralizēts, tāpēc neatkarīgi no tā, kur tu izveido savu kontu, varēsi sekot līdzi un sazināties ar ikvienu šajā serverī. Tu pat vari vadīt to pats!", + "closed_registrations_modal.preamble": "Mastodon ir decentralizēts, tāpēc neatkarīgi no tā, kur Tu izveido savu kontu, varēsi sekot un mijiedarboties ar ikvienu šajā serverī. Tu pat vari to pašizvietot!", "closed_registrations_modal.title": "Reģistrēšanās Mastodon", "column.about": "Par", "column.blocks": "Bloķētie lietotāji", "column.bookmarks": "Grāmatzīmes", "column.community": "Vietējā laika līnija", - "column.direct": "Privāti pieminēti", + "column.direct": "Privātas pieminēšanas", "column.directory": "Pārlūkot profilus", "column.domain_blocks": "Bloķētie domēni", "column.favourites": "Iecienītie", @@ -133,21 +136,28 @@ "community.column_settings.remote_only": "Tikai attālinātie", "compose.language.change": "Mainīt valodu", "compose.language.search": "Meklēt valodas...", - "compose.published.body": "Ziņa publicēta.", + "compose.published.body": "Ieraksts publicēta.", "compose.published.open": "Atvērt", "compose.saved.body": "Ziņa saglabāta.", "compose_form.direct_message_warning_learn_more": "Uzzināt vairāk", - "compose_form.encryption_warning": "Ziņas vietnē Mastodon nav pilnībā šifrētas. Nedalies ar sensitīvu informāciju caur Mastodon.", + "compose_form.encryption_warning": "Mastodon ieraksti nav pilnībā šifrēti. Nedalies ar jebkādu jutīgu informāciju caur Mastodon!", "compose_form.hashtag_warning": "Šī ziņa netiks norādīta zem nevienas atsauces, jo tā nav publiska. Tikai publiskās ziņās var meklēt pēc atsauces.", - "compose_form.lock_disclaimer": "Tavs konts nav {locked}. Ikviens var tev piesekot un redzēt tikai sekotājiem paredzētos ziņojumus.", + "compose_form.lock_disclaimer": "Tavs konts nav {locked}. Ikviens var Tev sekot, lai redzētu tikai sekotājiem paredzētos ierakstus.", "compose_form.lock_disclaimer.lock": "slēgts", - "compose_form.placeholder": "Kas tev padomā?", + "compose_form.placeholder": "Kas Tev padomā?", "compose_form.poll.duration": "Aptaujas ilgums", + "compose_form.poll.multiple": "Vairākas izvēles iespējas", + "compose_form.poll.option_placeholder": "Izvēle {number}", + "compose_form.poll.single": "Jāizvēlas viens", "compose_form.poll.switch_to_multiple": "Mainīt aptaujas veidu, lai atļautu vairākas izvēles", "compose_form.poll.switch_to_single": "Mainīt aptaujas veidu, lai atļautu vienu izvēli", + "compose_form.publish": "Iesūtīt", "compose_form.publish_form": "Jauns ieraksts", + "compose_form.reply": "Atbildēt", + "compose_form.save_changes": "Atjaunināt", "compose_form.spoiler.marked": "Noņemt satura brīdinājumu", "compose_form.spoiler.unmarked": "Pievienot satura brīdinājumu", + "compose_form.spoiler_placeholder": "Satura brīdinājums (pēc izvēles)", "confirmation_modal.cancel": "Atcelt", "confirmations.block.block_and_report": "Bloķēt un ziņot", "confirmations.block.confirm": "Bloķēt", @@ -157,28 +167,29 @@ "confirmations.delete.confirm": "Dzēst", "confirmations.delete.message": "Vai tiešām vēlies dzēst šo ierakstu?", "confirmations.delete_list.confirm": "Dzēst", - "confirmations.delete_list.message": "Vai tiešam vēlies neatgriezeniski dzēst šo sarakstu?", + "confirmations.delete_list.message": "Vai tiešām neatgriezeniski izdzēst šo sarakstu?", "confirmations.discard_edit_media.confirm": "Atmest", - "confirmations.discard_edit_media.message": "Tev ir nesaglabātas izmaiņas multivides aprakstā vai priekšskatījumā. Vēlies tās atmest?", + "confirmations.discard_edit_media.message": "Ir nesaglabātas izmaiņas informācijas nesēja aprakstā vai priekšskatījumā. Vēlies tās atmest tik un tā?", "confirmations.domain_block.confirm": "Bloķēt visu domēnu", "confirmations.domain_block.message": "Vai tu tiešām vēlies bloķēt visu domēnu {domain}? Parasti pietiek, ja nobloķē vai apklusini kādu. Tu neredzēsi saturu vai paziņojumus no šī domēna nevienā laika līnijā. Tavi sekotāji no šī domēna tiks noņemti.", - "confirmations.edit.confirm": "Rediģēt", + "confirmations.edit.confirm": "Labot", "confirmations.edit.message": "Rediģējot, tiks pārrakstīts ziņojums, kuru tu šobrīd raksti. Vai tiešām vēlies turpināt?", "confirmations.logout.confirm": "Iziet", "confirmations.logout.message": "Vai tiešām vēlies izrakstīties?", "confirmations.mute.confirm": "Apklusināt", - "confirmations.mute.explanation": "Šādi no viņiem tiks slēptas ziņas un ziņas, kurās viņi tiek pieminēti, taču viņi joprojām varēs redzēt tavas ziņas un sekot tev.", + "confirmations.mute.explanation": "Šādi tiks slēpti ieraksti no viņiem un ieraksti, kuros viņi tiek pieminēti, taču viņi joprojām varēs redzēt Tavus ierakstus un sekot Tev.", "confirmations.mute.message": "Vai tiešām vēlies apklusināt {name}?", "confirmations.redraft.confirm": "Dzēst un pārrakstīt", "confirmations.redraft.message": "Vai tiešām vēlies dzēst šo ziņu un no jauna noformēt to? Izlase un pastiprinājumi tiks zaudēti, un atbildes uz sākotnējo ziņu tiks atstātas bez autoratlīdzības.", "confirmations.reply.confirm": "Atbildēt", - "confirmations.reply.message": "Ja tagad atbildēsi, tavs ziņas uzmetums tiks dzēsts. Vai tiešām vēlies turpināt?", + "confirmations.reply.message": "Tūlītēja atbildēšana pārrakstīs pašlaik sastādīto ziņu. Vai tiešām turpināt?", "confirmations.unfollow.confirm": "Pārstāt sekot", "confirmations.unfollow.message": "Vai tiešam vairs nevēlies sekot lietotājam {name}?", "conversation.delete": "Dzēst sarunu", "conversation.mark_as_read": "Atzīmēt kā izlasītu", "conversation.open": "Skatīt sarunu", "conversation.with": "Ar {names}", + "copy_icon_button.copied": "Ievietots starpliktuvē", "copypaste.copied": "Nokopēts", "copypaste.copy_to_clipboard": "Kopēt uz starpliktuvi", "directory.federated": "No pazīstamas federācijas", @@ -187,12 +198,12 @@ "directory.recently_active": "Nesen aktīvie", "disabled_account_banner.account_settings": "Konta iestatījumi", "disabled_account_banner.text": "Tavs konts {disabledAccount} pašlaik ir atspējots.", - "dismissable_banner.community_timeline": "Šīs ir jaunākās publiskās ziņas no personām, kuru kontus mitina {domain}.", + "dismissable_banner.community_timeline": "Šie ir jaunākie publiskie ieraksti no cilvēkiem, kuru konti ir mitināti {domain}.", "dismissable_banner.dismiss": "Atcelt", "dismissable_banner.explore_links": "Par šiem jaunumiem šobrīd runā cilvēki šajā un citos decentralizētā tīkla serveros.", - "dismissable_banner.explore_statuses": "Ieraksti, kas šobrīd gūst arvien lielāku ievērību visā sociālajā tīklā. Augstāk tiek kārtoti neseni ieraksti, kas pastiprināti un pievienoti izlasēm.", + "dismissable_banner.explore_statuses": "Šie ir ieraksti, kas šodien gūst arvien lielāku ievērību visā sociālajā tīklā. Augstāk tiek kārtoti jaunāki ieraksti, kuri tiek vairāk pastiprināti un ievietoti izlasēs.", "dismissable_banner.explore_tags": "Šie tēmturi šobrīd kļūst arvien populārāki cilvēku vidū šajā un citos decentralizētā tīkla serveros.", - "dismissable_banner.public_timeline": "Šīs ir jaunākās publiskās ziņas no lietotājiem sociālajā tīmeklī, kurām seko lietotāji domēnā {domain}.", + "dismissable_banner.public_timeline": "Šie ir jaunākie publiskie ieraksti no lietotājiem sociālajā tīmeklī, kuriem {domain} seko cilvēki.", "embed.instructions": "Iestrādā šo ziņu savā mājaslapā, kopējot zemāk redzamo kodu.", "embed.preview": "Tas izskatīsies šādi:", "emoji_button.activity": "Aktivitāte", @@ -215,22 +226,22 @@ "empty_column.account_timeline": "Šeit ziņojumu nav!", "empty_column.account_unavailable": "Profils nav pieejams", "empty_column.blocks": "Pašreiz tu neesi nevienu bloķējis.", - "empty_column.bookmarked_statuses": "Pašreiz tev nav neviena grāmatzīmēm pievienota ieraksta. Kad tādu pievienosi, tas parādīsies šeit.", + "empty_column.bookmarked_statuses": "Pašlaik Tev nav neviena grāmatzīmēs pievienota ieraksta. Kad tādu pievienosi, tas parādīsies šeit.", "empty_column.community": "Vietējā laika līnija ir tukša. Uzraksti kaut ko publiski, lai viss notiktu!", - "empty_column.direct": "Jums vēl nav nevienas privātas pieminēšanas. Nosūtot vai saņemot to, tas tiks parādīts šeit.", + "empty_column.direct": "Tev vēl nav privātu pieminēšanu. Kad Tu nosūtīsi vai saņemsi kādu, tā pārādīsies šeit.", "empty_column.domain_blocks": "Vēl nav neviena bloķēta domēna.", - "empty_column.explore_statuses": "Pašlaik nekā aktuāla nav. Pārbaudi vēlāk!", - "empty_column.favourited_statuses": "Tev vēl nav nevienas iecienītākās ziņas. Kad iecienīsi kādu, tas tiks parādīts šeit.", + "empty_column.explore_statuses": "Pašlaik nav nekā aktuāla. Ieskaties šeit vēlāk!", + "empty_column.favourited_statuses": "Tev vēl nav iecienītāko ierakstu. Kad pievienosi kādu izlasei, tas tiks parādīts šeit.", "empty_column.favourites": "Šo ziņu neviens vēl nav pievienojis izlasei. Kad kāds to izdarīs, tas parādīsies šeit.", - "empty_column.follow_requests": "Šobrīd tev nav sekošanas pieprasījumu. Kad kāds pieteiksies tev sekot, pieprasījums parādīsies šeit.", + "empty_column.follow_requests": "Šobrīd Tev nav sekošanas pieprasījumu. Kad saņemsi kādu, tas parādīsies šeit.", "empty_column.followed_tags": "Tu vēl neesi sekojis nevienam tēmturim. Kad to izdarīsi, tie tiks parādīti šeit.", "empty_column.hashtag": "Ar šo tēmturi nekas nav atrodams.", - "empty_column.home": "Tava mājas laikrinda ir tukša! Lai to aizpildītu, pieseko vairāk cilvēkiem.", - "empty_column.list": "Šis saraksts pašreiz ir tukšs. Kad šī saraksta dalībnieki publicēs jaunas ziņas, tās parādīsies šeit.", - "empty_column.lists": "Pašreiz tev nav neviena saraksta. Kad tādu izveidosi, tas parādīsies šeit.", + "empty_column.home": "Tava mājas laikjosla ir tukša. Seko vairāk cilvēkiem, lai to piepildītu!", + "empty_column.list": "Pagaidām šajā sarakstā nekā nav. Kad šī saraksta dalībnieki ievietos jaunus ierakstus, tie parādīsies šeit.", + "empty_column.lists": "Pašlaik Tev nav neviena saraksta. Kad tādu izveidosi, tas parādīsies šeit.", "empty_column.mutes": "Neviens lietotājs vēl nav apklusināts.", - "empty_column.notifications": "Tev vēl nav paziņojumu. Kad citi cilvēki ar tevi mijiedarbosies, tu to redzēsi šeit.", - "empty_column.public": "Šeit vēl nekā nav! Ieraksti ko publiski vai pieseko lietotājiem no citiem serveriem", + "empty_column.notifications": "Tev vēl nav paziņojumu. Kad citi cilvēki ar Tevi mijiedarbosies, Tu to redzēsi šeit.", + "empty_column.public": "Šeit nekā nav! Ieraksti kaut ko publiski vai seko lietotājiem no citiem serveriem, lai iegūtu saturu", "error.unexpected_crash.explanation": "Koda kļūdas vai pārlūkprogrammas saderības problēmas dēļ šo lapu nevarēja parādīt pareizi.", "error.unexpected_crash.explanation_addons": "Šo lapu nevarēja parādīt pareizi. Šo kļūdu, iespējams, izraisīja pārlūkprogrammas papildinājums vai automātiskās tulkošanas rīki.", "error.unexpected_crash.next_steps": "Mēģini atsvaidzināt lapu. Ja tas nepalīdz, iespējams, varēsi lietot Mastodon, izmantojot citu pārlūkprogrammu vai lietotni.", @@ -239,13 +250,13 @@ "errors.unexpected_crash.report_issue": "Ziņot par problēmu", "explore.search_results": "Meklēšanas rezultāti", "explore.suggested_follows": "Cilvēki", - "explore.title": "Pārlūkot", + "explore.title": "Izpētīt", "explore.trending_links": "Jaunumi", - "explore.trending_statuses": "Ziņas", + "explore.trending_statuses": "Ieraksti", "explore.trending_tags": "Tēmturi", - "filter_modal.added.context_mismatch_explanation": "Šī filtra kategorija neattiecas uz kontekstu, kurā esi piekļuvis šai ziņai. Ja vēlies, lai ziņa tiktu filtrēta arī šajā kontekstā, tev būs jārediģē filtrs.", + "filter_modal.added.context_mismatch_explanation": "Šī atlases kategorija neattiecas uz kontekstu, kurā esi piekļuvis šim ierakstam. Ja vēlies, lai ieraksts tiktu atlasīts arī šajā kontekstā, Tev būs jālabo atlase.", "filter_modal.added.context_mismatch_title": "Konteksta neatbilstība!", - "filter_modal.added.expired_explanation": "Šai filtra kategorijai ir beidzies derīguma termiņš. Lai to lietotu, tev būs jāmaina derīguma termiņš.", + "filter_modal.added.expired_explanation": "Šai atlases kategorijai ir beidzies derīguma termiņš. Lai to lietotu, Tev būs jāmaina derīguma termiņš.", "filter_modal.added.expired_title": "Filtra termiņš beidzies!", "filter_modal.added.review_and_configure": "Lai pārskatītu un tālāk konfigurētu šo filtru kategoriju, dodies uz {settings_link}.", "filter_modal.added.review_and_configure_title": "Filtra iestatījumi", @@ -255,7 +266,7 @@ "filter_modal.select_filter.context_mismatch": "neattiecas uz šo kontekstu", "filter_modal.select_filter.expired": "beidzies", "filter_modal.select_filter.prompt_new": "Jauna kategorija: {name}", - "filter_modal.select_filter.search": "Meklē vai izveido", + "filter_modal.select_filter.search": "Meklēt vai izveidot", "filter_modal.select_filter.subtitle": "Izmanto esošu kategoriju vai izveido jaunu", "filter_modal.select_filter.title": "Filtrēt šo ziņu", "filter_modal.title.status": "Filtrēt ziņu", @@ -264,7 +275,11 @@ "firehose.remote": "Citi serveri", "follow_request.authorize": "Autorizēt", "follow_request.reject": "Noraidīt", - "follow_requests.unlocked_explanation": "Lai gan tavs konts nav bloķēts, {domain} darbinieki iedomājās, ka, iespējams, vēlēsies pārskatīt pieprasījumus no šiem kontiem.", + "follow_requests.unlocked_explanation": "Lai gan Tavs konts nav slēgts, {domain} darbinieki iedomājās, ka Tu varētu vēlēties pašrocīgi pārskatīt sekošanas pieprasījumus no šiem kontiem.", + "follow_suggestions.curated_suggestion": "Darbinieku izvēle", + "follow_suggestions.dismiss": "Vairs nerādīt", + "follow_suggestions.view_all": "Skatīt visu", + "follow_suggestions.who_to_follow": "Kam sekot", "followed_tags": "Sekojamie tēmturi", "footer.about": "Par", "footer.directory": "Profilu direktorija", @@ -286,8 +301,8 @@ "hashtag.column_settings.tag_mode.none": "Neviens no šiem", "hashtag.column_settings.tag_toggle": "Pievienot kolonnai papildu tēmturus", "hashtag.counter_by_accounts": "{count, plural, one {{counter} dalībnieks} other {{counter} dalībnieki}}", - "hashtag.counter_by_uses": "{count, plural, zero {{counter} ziņa} one {{counter} ieraksts} other {{counter} ziņas}}", - "hashtag.counter_by_uses_today": "{count, plural, one {{counter} ziņa} other {{counter} ziņas}} šodien", + "hashtag.counter_by_uses": "{count, plural, zero {{counter} ierakstu} one {{counter} ieraksts} other {{counter} ieraksti}}", + "hashtag.counter_by_uses_today": "{count, plural, zero {{counter} ierakstu} one {{counter} ieraksts} other {{counter} ieraksti}} šodien", "hashtag.follow": "Sekot tēmturim", "hashtag.unfollow": "Pārstāt sekot tēmturim", "hashtags.and_other": "..un {count, plural, other {# vairāk}}", @@ -300,16 +315,16 @@ "home.pending_critical_update.title": "Pieejams kritisks drošības jauninājums!", "home.show_announcements": "Rādīt paziņojumus", "interaction_modal.description.favourite": "Ar Mastodon kontu tu vari pievienot šo ziņu izlasei, lai informētu autoru, ka to novērtē, un saglabātu to vēlākai lasīšanai.", - "interaction_modal.description.follow": "Ar Mastodon kontu tu vari sekot {name}, lai saņemtu viņu ziņas savā mājas plūsmā.", - "interaction_modal.description.reblog": "Izmantojot kontu Mastodon, tu vari izcelt šo ziņu, lai kopīgotu to ar saviem sekotājiem.", + "interaction_modal.description.follow": "Ar Mastodon kontu Tu vari sekot {name}, lai saņemtu lietotāja ierakstus savā mājas plūsmā.", + "interaction_modal.description.reblog": "Ar Mastodon kontu Tu vari izvirzīt šo ierakstu, lai kopīgotu to ar saviem sekotājiem.", "interaction_modal.description.reply": "Ar Mastodon kontu tu vari atbildēt uz šo ziņu.", - "interaction_modal.login.action": "Nogādā mani mājās", + "interaction_modal.login.action": "Nogādāt mani mājās", "interaction_modal.login.prompt": "Tavas mājvietas servera domēns, piem., mastodon.social", "interaction_modal.no_account_yet": "Neesi Mastodon?", "interaction_modal.on_another_server": "Citā serverī", "interaction_modal.on_this_server": "Šajā serverī", - "interaction_modal.sign_in": "Tu neesi pieteicies šajā serverī. Kur tiek mitināts tavs konts?", - "interaction_modal.sign_in_hint": "Padoms: Šī ir vietne, kurā tu piereģistrējies. Ja neatceries, meklē sveiciena e-pastu savā iesūtnē. Vari arī ievadīt pilnu lietotājvārdu! (piem., @Mastodon@mastodon.social)", + "interaction_modal.sign_in": "Tu neesi pieteicies šajā serverī. Kur tiek mitināts Tavs konts?", + "interaction_modal.sign_in_hint": "Padoms: tā ir tīmekļvietne, kurā Tu reģistrējies. Ja neatceries, jāmeklē sveiciena e-pasts savā iesūtnē. Vari arī ievadīt pilnu lietotājvārdu (piem., @Mastodon@mastodon.social).", "interaction_modal.title.favourite": "Pievienot {name} ziņu izlasei", "interaction_modal.title.follow": "Sekot {name}", "interaction_modal.title.reblog": "Pastiprināt {name} ierakstu", @@ -361,12 +376,12 @@ "link_preview.author": "Pēc {name}", "lists.account.add": "Pievienot sarakstam", "lists.account.remove": "Noņemt no saraksta", - "lists.delete": "Dzēst sarakstu", - "lists.edit": "Rediģēt sarakstu", + "lists.delete": "Izdzēst sarakstu", + "lists.edit": "Labot sarakstu", "lists.edit.submit": "Mainīt virsrakstu", - "lists.exclusive": "Paslēpt šīs ziņas no mājvietas", + "lists.exclusive": "Nerādīt šos ierakstus sākumā", "lists.new.create": "Pievienot sarakstu", - "lists.new.title_placeholder": "Jaunais saraksta nosaukums", + "lists.new.title_placeholder": "Jaunā saraksta nosaukums", "lists.replies_policy.followed": "Jebkuram sekotajam lietotājam", "lists.replies_policy.list": "Saraksta dalībniekiem", "lists.replies_policy.none": "Nevienam", @@ -374,8 +389,9 @@ "lists.search": "Meklēt starp cilvēkiem, kuriem tu seko", "lists.subheading": "Tavi saraksti", "load_pending": "{count, plural, one {# jauna lieta} other {# jaunas lietas}}", + "loading_indicator.label": "Ielādē…", "media_gallery.toggle_visible": "{number, plural, one {Slēpt attēlu} other {Slēpt attēlus}}", - "moved_to_account_banner.text": "Tavs konts {disabledAccount} pašlaik ir atspējots, jo pārcēlies uz kontu {movedToAccount}.", + "moved_to_account_banner.text": "Tavs konts {disabledAccount} pašlaik ir atspējots, jo Tu pārcēlies uz kontu {movedToAccount}.", "mute_modal.duration": "Ilgums", "mute_modal.hide_notifications": "Slēpt paziņojumus no šī lietotāja?", "mute_modal.indefinite": "Beztermiņa", @@ -385,10 +401,10 @@ "navigation_bar.bookmarks": "Grāmatzīmes", "navigation_bar.community_timeline": "Vietējā laika līnija", "navigation_bar.compose": "Veidot jaunu ziņu", - "navigation_bar.direct": "Privāti pieminēti", + "navigation_bar.direct": "Privātas pieminēšanas", "navigation_bar.discover": "Atklāt", "navigation_bar.domain_blocks": "Bloķētie domēni", - "navigation_bar.explore": "Pārlūkot", + "navigation_bar.explore": "Izpētīt", "navigation_bar.favourites": "Izlase", "navigation_bar.filters": "Apklusinātie vārdi", "navigation_bar.follow_requests": "Sekošanas pieprasījumi", @@ -397,23 +413,23 @@ "navigation_bar.lists": "Saraksti", "navigation_bar.logout": "Iziet", "navigation_bar.mutes": "Apklusinātie lietotāji", - "navigation_bar.opened_in_classic_interface": "Ziņas, konti un citas noteiktas lapas pēc noklusējuma tiek atvērtas klasiskajā tīmekļa saskarnē.", + "navigation_bar.opened_in_classic_interface": "Ieraksti, konti un citas noteiktas lapas pēc noklusējuma tiek atvērtas klasiskajā tīmekļa saskarnē.", "navigation_bar.personal": "Personīgie", "navigation_bar.pins": "Piespraustās ziņas", "navigation_bar.preferences": "Iestatījumi", "navigation_bar.public_timeline": "Apvienotā laika līnija", "navigation_bar.search": "Meklēt", "navigation_bar.security": "Drošība", - "not_signed_in_indicator.not_signed_in": "Lai piekļūtu šim resursam, tev ir jāpierakstās.", + "not_signed_in_indicator.not_signed_in": "Ir jāpiesakās, lai piekļūtu šim resursam.", "notification.admin.report": "{name} ziņoja par {target}", "notification.admin.sign_up": "{name} ir pierakstījies", "notification.favourite": "{name} pievienoja tavu ziņu izlasei", - "notification.follow": "{name} uzsāka tev sekot", - "notification.follow_request": "{name} nosūtīja tev sekošanas pieprasījumu", - "notification.mention": "{name} pieminēja tevi", + "notification.follow": "{name} uzsāka Tev sekot", + "notification.follow_request": "{name} nosūtīja Tev sekošanas pieprasījumu", + "notification.mention": "{name} pieminēja Tevi", "notification.own_poll": "Tava aptauja ir noslēgusies", "notification.poll": "Aptauja, kurā tu piedalījies, ir noslēgusies", - "notification.reblog": "{name} pastiprināja tavu ierakstu", + "notification.reblog": "{name} pastiprināja Tavu ierakstu", "notification.status": "{name} tikko publicēja", "notification.update": "{name} rediģēja ierakstu", "notifications.clear": "Notīrīt paziņojumus", @@ -427,7 +443,7 @@ "notifications.column_settings.filter_bar.show_bar": "Rādīt filtru joslu", "notifications.column_settings.follow": "Jauni sekotāji:", "notifications.column_settings.follow_request": "Jauni sekošanas pieprasījumi:", - "notifications.column_settings.mention": "Pieminējumi:", + "notifications.column_settings.mention": "Pieminēšanas:", "notifications.column_settings.poll": "Aptaujas rezultāti:", "notifications.column_settings.push": "Uznirstošie paziņojumi", "notifications.column_settings.reblog": "Pastiprinātie ieraksti:", @@ -441,7 +457,7 @@ "notifications.filter.boosts": "Pastiprinātie ieraksti", "notifications.filter.favourites": "Izlases", "notifications.filter.follows": "Seko", - "notifications.filter.mentions": "Pieminējumi", + "notifications.filter.mentions": "Pieminēšanas", "notifications.filter.polls": "Aptaujas rezultāti", "notifications.filter.statuses": "Jaunumi no cilvēkiem, kuriem tu seko", "notifications.grant_permission": "Piešķirt atļauju.", @@ -458,27 +474,36 @@ "onboarding.actions.go_to_explore": "Skatīt tendences", "onboarding.actions.go_to_home": "Dodieties uz manu mājas plūsmu", "onboarding.compose.template": "Sveiki, #Mastodon!", - "onboarding.follows.empty": "Diemžēl pašlaik nevar parādīt rezultātus. Vari mēģināt izmantot meklēšanu vai pārlūkot izpētes lapu, lai atrastu personas, kurām sekot, vai mēģināt vēlreiz vēlāk.", + "onboarding.follows.empty": "Diemžēl pašlaik nevar parādīt rezultātus. Vari mēģināt izmantot meklēšanu vai pārlūkot izpētes lapu, lai atrastu cilvēkus, kuriem sekot, vai vēlāk mēģināt vēlreiz.", "onboarding.follows.lead": "Tava mājas plūsma ir galvenais veids, kā izbaudīt Mastodon. Jo vairāk cilvēku sekosi, jo aktīvāk un interesantāk tas būs. Lai sāktu, šeit ir daži ieteikumi:", "onboarding.follows.title": "Populārs Mastodon", - "onboarding.share.lead": "Paziņo citiem, kā viņi tevi var atrast Mastodon!", + "onboarding.profile.discoverable": "Padarīt manu profilu atklājamu", + "onboarding.profile.display_name": "Attēlojamais vārds", + "onboarding.profile.display_name_hint": "Tavs pilnais vārds vai Tavs joku vārds…", + "onboarding.profile.note": "Apraksts", + "onboarding.profile.note_hint": "Tu vari @pieminēt citus cilvēkus vai #tēmturus…", + "onboarding.profile.save_and_continue": "Saglabāt un turpināt", + "onboarding.profile.title": "Profila iestatīšana", + "onboarding.profile.upload_avatar": "Augšupielādēt profila attēlu", + "onboarding.profile.upload_header": "Augšupielādēt profila galveni", + "onboarding.share.lead": "Dari cilvēkiem zināmu, ka viņi var Tevi atrast Mastodon!", "onboarding.share.message": "Es esmu {username} #Mastodon! Nāc sekot man uz {url}", "onboarding.share.next_steps": "Iespējamie nākamie soļi:", "onboarding.share.title": "Kopīgo savu profilu", - "onboarding.start.lead": "Tagad tu esat daļa no Mastodon — unikālas, decentralizētas sociālo mediju platformas, kurā tu, nevis algoritms, veido savu pieredzi. Sāksim darbu šajā jaunajā sociālajā jomā:", + "onboarding.start.lead": "Tagad Tu esi daļa no Mastodon — vienreizējas, decentralizētas sociālās mediju platformas, kurā Tu, nevis algoritms, veido Tavu pieredzi. Sāksim darbu šajā jaunajā sociālajā jomā:", "onboarding.start.skip": "Nav nepieciešama palīdzība darba sākšanai?", "onboarding.start.title": "Tev tas izdevās!", "onboarding.steps.follow_people.body": "Tu pats veido savu plūsmu. Piepildīsim to ar interesantiem cilvēkiem.", "onboarding.steps.follow_people.title": "Sekot {count, plural, one {one person} other {# cilvēkiem}}", "onboarding.steps.publish_status.body": "Sveicini pasauli ar tekstu, fotoattēliem, video, vai aptaujām {emoji}", "onboarding.steps.publish_status.title": "Izveido savu pirmo ziņu", - "onboarding.steps.setup_profile.body": "Citi, visticamāk, sazināsies ar tevi, izmantojot aizpildītu profilu.", + "onboarding.steps.setup_profile.body": "Palielini mijiedarbību ar aptverošu profilu!", "onboarding.steps.setup_profile.title": "Pielāgo savu profilu", - "onboarding.steps.share_profile.body": "Paziņo saviem draugiem, kā tevi atrast Mastodon!", + "onboarding.steps.share_profile.body": "Dari saviem draugiem zināmu, kā Tevi atrast Mastodon!", "onboarding.steps.share_profile.title": "Kopīgo savu Mastodon profilu", - "onboarding.tips.2fa": "Vai zināji? Tu vari aizsargāt savu kontu, konta iestatījumos iestatot divu faktoru autentifikāciju. Tas darbojas ar jebkuru tevis izvēlētu TOTP lietotni, nav nepieciešams tālruņa numurs!", + "onboarding.tips.2fa": "Vai zināji? Tu vari aizsargāt savu kontu, konta iestatījumos iestatot divpakāpju autentifikāciju. Tas darbojas ar jebkuru Tevis izvēlētu TOTP lietotni, nav nepieciešams tālruņa numurs!", "onboarding.tips.accounts_from_other_servers": "Vai zināji? Tā kā Mastodon ir decentralizēts, daži profili, ar kuriem saskaraties, tiks mitināti citos, nevis tavos serveros. Un tomēr tu varat sazināties ar viņiem nevainojami! Viņu serveris atrodas viņu lietotājvārda otrajā pusē!", - "onboarding.tips.migration": "Vai zināji? Ja uzskati, ka {domain} nākotnē nav lieliska servera izvēle, vari pāriet uz citu Mastodon serveri, nezaudējot savus sekotājus. Tu pat vari mitināt savu personīgo serveri!", + "onboarding.tips.migration": "Vai zināji? Ja uzskati, ka {domain} nākotnē nav lieliska servera izvēle, vari pāriet uz citu Mastodon serveri, nezaudējot savus sekotājus. Tu pat vari mitināt savu serveri!", "onboarding.tips.verification": "Vai zināji? Tu vari verificēt savu kontu, ievietojot saiti uz savu Mastodon profilu savā vietnē un pievienojot vietni savam profilam. Nav nepieciešami nekādi maksājumi vai dokumenti!", "password_confirmation.exceeds_maxlength": "Paroles apstiprināšana pārsniedz maksimālo paroles garumu", "password_confirmation.mismatching": "Paroles apstiprinājums neatbilst", @@ -494,9 +519,14 @@ "poll_button.add_poll": "Pievienot aptauju", "poll_button.remove_poll": "Noņemt aptauju", "privacy.change": "Mainīt ieraksta privātumu", + "privacy.direct.long": "Visi ierakstā pieminētie", + "privacy.direct.short": "Noteikti cilvēki", + "privacy.private.long": "Tikai Tavi sekotāji", + "privacy.private.short": "Sekotāji", "privacy.public.short": "Publiska", "privacy_policy.last_updated": "Pēdējo reizi atjaunināta {date}", "privacy_policy.title": "Privātuma politika", + "recommended": "Ieteicams", "refresh": "Atsvaidzināt", "regeneration_indicator.label": "Ielādē…", "regeneration_indicator.sublabel": "Tiek gatavota tava plūsma!", @@ -512,8 +542,9 @@ "relative_time.seconds": "{number}s", "relative_time.today": "šodien", "reply_indicator.cancel": "Atcelt", + "reply_indicator.poll": "Aptauja", "report.block": "Bloķēt", - "report.block_explanation": "Tu neredzēsi viņu ziņas. Viņi nevarēs redzēt tavas ziņas vai sekot tev. Viņi varēs saprast, ka ir bloķēti.", + "report.block_explanation": "Tu neredzēsi viņu ierakstus. Viņi nevarēs redzēt Tavus ierakstus vai sekot tev. Viņi varēs saprast, ka ir bloķēti.", "report.categories.legal": "Tiesisks", "report.categories.other": "Citi", "report.categories.spam": "Spams", @@ -527,7 +558,7 @@ "report.forward": "Pārsūtīt {target}", "report.forward_hint": "Konts ir no cita servera. Vai nosūtīt anonimizētu sūdzības kopiju arī tam?", "report.mute": "Apklusināt", - "report.mute_explanation": "Tu neredzēsi viņu ziņas. Viņi joprojām var tev sekot un redzēt tavas ziņas un nezinās, ka viņi ir apklusināti.", + "report.mute_explanation": "Tu neredzēsi viņu ierakstus. Viņi joprojām var Tev sekot un redzēt Tavus ierakstus un nezinās, ka viņi ir apklusināti.", "report.next": "Tālāk", "report.placeholder": "Papildu komentāri", "report.reasons.dislike": "Man tas nepatīk", @@ -543,15 +574,15 @@ "report.rules.subtitle": "Atlasi visus atbilstošos", "report.rules.title": "Kuri noteikumi tiek pārkāpti?", "report.statuses.subtitle": "Atlasi visus atbilstošos", - "report.statuses.title": "Vai ir kādi ieraksti, kas atbalsta šo sūdzību?", + "report.statuses.title": "Vai ir kādi ieraksti, kas apstiprina šo ziņojumu?", "report.submit": "Iesniegt", "report.target": "Ziņošana par: {target}", - "report.thanks.take_action": "Tālāk ir norādītas iespējas, kā kontrolēt Mastodon redzamo saturu:", + "report.thanks.take_action": "Šeit ir iespējas, lai pārvaldītu Mastodon redzamo saturu:", "report.thanks.take_action_actionable": "Kamēr mēs to izskatām, tu vari veikt darbības pret @{name}:", "report.thanks.title": "Vai nevēlies to redzēt?", "report.thanks.title_actionable": "Paldies, ka ziņoji, mēs to izskatīsim.", "report.unfollow": "Pārtraukt sekot @{name}", - "report.unfollow_explanation": "Tu seko šim kontam. Lai vairs neredzētu viņu ziņas savā mājas plūsmā, pārtrauc viņiem sekot.", + "report.unfollow_explanation": "Tu seko šim kontam. Lai vairs neredzētu tā ierakstus savā mājas plūsmā, pārtrauc sekot tam!", "report_notification.attached_statuses": "Pievienoti {count, plural,one {{count} sūtījums} other {{count} sūtījumi}}", "report_notification.categories.legal": "Tiesisks", "report_notification.categories.other": "Cita", @@ -564,19 +595,20 @@ "search.quick_action.go_to_account": "Doties uz profilu {x}", "search.quick_action.go_to_hashtag": "Doties uz tēmturi {x}", "search.quick_action.open_url": "Atvērt URL Mastodonā", - "search.quick_action.status_search": "Ziņas atbilst {x}", - "search.search_or_paste": "Meklē vai iekopē URL", + "search.quick_action.status_search": "Ieraksti, kas atbilst {x}", + "search.search_or_paste": "Meklēt vai ielīmēt URL", "search_popout.full_text_search_disabled_message": "Nav pieejams {domain}.", + "search_popout.full_text_search_logged_out_message": "Pieejams tikai pēc pieteikšanās.", "search_popout.language_code": "ISO valodas kods", "search_popout.options": "Meklēšanas iespējas", "search_popout.quick_actions": "Ātrās darbības", "search_popout.recent": "Nesen meklētais", - "search_popout.specific_date": "konkrēts datums", + "search_popout.specific_date": "noteikts datums", "search_popout.user": "lietotājs", "search_results.accounts": "Profili", "search_results.all": "Visi", "search_results.hashtags": "Tēmturi", - "search_results.nothing_found": "Nevarēja atrast neko šiem meklēšanas vienumiem", + "search_results.nothing_found": "Nevarēja atrast neko, kas atbilstu šim meklēšanas vaicājumam", "search_results.see_all": "Skatīt visus", "search_results.statuses": "Ieraksti", "search_results.title": "Meklēt {q}", @@ -587,9 +619,9 @@ "server_banner.learn_more": "Uzzināt vairāk", "server_banner.server_stats": "Servera statistika:", "sign_in_banner.create_account": "Izveidot kontu", - "sign_in_banner.sign_in": "Pierakstīties", + "sign_in_banner.sign_in": "Pieteikties", "sign_in_banner.sso_redirect": "Piesakies vai Reģistrējies", - "sign_in_banner.text": "Pieraksties, lai sekotu profiliem vai atsaucēm, pievienotu izlasei, kopīgotu ziņas un atbildētu uz tām. Vari arī mijiedarboties no sava konta citā serverī.", + "sign_in_banner.text": "Jāpiesakās, lai sekotu profiliem vai tēmturiem, pievienotu izlasei, kopīgotu ierakstus un atbildētu uz tiem. Vari arī mijiedarboties ar savu kontu citā serverī.", "status.admin_account": "Atvērt @{name} moderēšanas saskarni", "status.admin_domain": "Atvērt {domain} moderēšanas saskarni", "status.admin_status": "Atvērt šo ziņu moderācijas saskarnē", @@ -602,16 +634,16 @@ "status.detailed_status": "Detalizēts sarunas skats", "status.direct": "Pieminēt @{name} privāti", "status.direct_indicator": "Pieminēts privāti", - "status.edit": "Rediģēt", - "status.edited": "Rediģēts {date}", - "status.edited_x_times": "Rediģēts {count, plural, one {{count} reize} other {{count} reizes}}", + "status.edit": "Labot", + "status.edited": "Labots {date}", + "status.edited_x_times": "Labots {count, plural, one {{count} reizi} other {{count} reizes}}", "status.embed": "Iestrādāt", "status.favourite": "Iecienīts", "status.filter": "Filtrē šo ziņu", "status.filtered": "Filtrēts", "status.hide": "Slēpt ierakstu", "status.history.created": "{name} izveidoja {date}", - "status.history.edited": "{name} rediģēja {date}", + "status.history.edited": "{name} laboja {date}", "status.load_more": "Ielādēt vairāk", "status.media.open": "Noklikšķini, lai atvērtu", "status.media.show": "Noklikšķini, lai parādītu", @@ -648,7 +680,7 @@ "status.uncached_media_warning": "Priekšskatījums nav pieejams", "status.unmute_conversation": "Noņemt sarunas apklusinājumu", "status.unpin": "Noņemt profila piespraudumu", - "subscribed_languages.lead": "Pēc izmaiņu veikšanas tavā mājas un sarakstu laika līnijā tiks rādītas tikai ziņas atlasītajās valodās. Neatlasi nevienu, lai saņemtu ziņas visās valodās.", + "subscribed_languages.lead": "Pēc izmaiņu veikšanas Tavā mājas un sarakstu laika līnijā tiks rādīti tikai tie ieraksti atlasītajās valodās. Neatlasīt nevienu, lai saņemtu ierakstus visās valodās.", "subscribed_languages.save": "Saglabāt izmaiņas", "subscribed_languages.target": "Mainīt abonētās valodas priekš {target}", "tabs_bar.home": "Sākums", @@ -662,8 +694,8 @@ "timeline_hint.resources.followers": "Sekotāji", "timeline_hint.resources.follows": "Seko", "timeline_hint.resources.statuses": "Vecāki ieraksti", - "trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} cilvēki}} par {days, plural, one {# dienu} other {{days} dienām}}", - "trends.trending_now": "Aktuālās tendences", + "trends.counter_by_accounts": "{count, plural, zero {{counter} cilvēku} one {{counter} cilvēks} other {{counter} cilvēki}} {days, plural, one {{day} dienā} other {{days} dienās}}", + "trends.trending_now": "Pašlaik populāri", "ui.beforeunload": "Ja pametīsit Mastodonu, jūsu melnraksts tiks zaudēts.", "units.short.billion": "{count}Mjd", "units.short.million": "{count}M", @@ -674,7 +706,7 @@ "upload_error.poll": "Datņu augšupielādes aptaujās nav atļautas.", "upload_form.audio_description": "Pievieno aprakstu cilvēkiem ar dzirdes zudumu", "upload_form.description": "Pievieno aprakstu vājredzīgajiem", - "upload_form.edit": "Rediģēt", + "upload_form.edit": "Labot", "upload_form.thumbnail": "Nomainīt sīktēlu", "upload_form.video_description": "Pievieno aprakstu cilvēkiem ar dzirdes vai redzes traucējumiem", "upload_modal.analyzing_picture": "Analizē attēlu…", @@ -683,7 +715,7 @@ "upload_modal.choose_image": "Izvēlēties attēlu", "upload_modal.description_placeholder": "Raibais runcis rīgā ratu rumbā rūc", "upload_modal.detect_text": "Noteikt tekstu no attēla", - "upload_modal.edit_media": "Rediģēt multividi", + "upload_modal.edit_media": "Labot informācijas nesēju", "upload_modal.hint": "Noklikšķini vai velc apli priekšskatījumā, lai izvēlētos fokusa punktu, kas vienmēr būs redzams visos sīktēlos.", "upload_modal.preparing_ocr": "Sagatavo OCR…", "upload_modal.preview_label": "Priekšskatīt ({ratio})", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index f2367f6463..a8d42e5ff6 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -530,7 +530,7 @@ "poll_button.remove_poll": "Peiling verwijderen", "privacy.change": "Zichtbaarheid van bericht aanpassen", "privacy.direct.long": "Alleen voor mensen die specifiek in het bericht worden vermeld", - "privacy.direct.short": "Specifieke mensen", + "privacy.direct.short": "Privébericht", "privacy.private.long": "Alleen jouw volgers", "privacy.private.short": "Volgers", "privacy.public.long": "Iedereen op Mastodon en daarbuiten", @@ -666,7 +666,7 @@ "status.mention": "@{name} vermelden", "status.more": "Meer", "status.mute": "@{name} negeren", - "status.mute_conversation": "Negeer gesprek", + "status.mute_conversation": "Gesprek negeren", "status.open": "Volledig bericht tonen", "status.pin": "Aan profielpagina vastmaken", "status.pinned": "Vastgemaakt bericht", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 27ca611722..a172fc69f4 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -277,6 +277,7 @@ "follow_request.authorize": "Autoriser", "follow_request.reject": "Avvis", "follow_requests.unlocked_explanation": "Selv om kontoen din ikke er låst, tror {domain} ansatte at du kanskje vil gjennomgå forespørsler fra disse kontoene manuelt.", + "follow_suggestions.view_all": "Vis alle", "followed_tags": "Fulgte emneknagger", "footer.about": "Om", "footer.directory": "Profilkatalog", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 5fcca414cf..fde170db60 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -375,7 +375,7 @@ "lightbox.previous": "Назад", "limited_account_hint.action": "Все равно показать профиль", "limited_account_hint.title": "Этот профиль был скрыт модераторами {domain}.", - "link_preview.author": "По алфавиту", + "link_preview.author": "Автор: {name}", "lists.account.add": "Добавить в список", "lists.account.remove": "Убрать из списка", "lists.delete": "Удалить список", diff --git a/app/javascript/mastodon/locales/ry.json b/app/javascript/mastodon/locales/ry.json index 0967ef424b..59de039777 100644 --- a/app/javascript/mastodon/locales/ry.json +++ b/app/javascript/mastodon/locales/ry.json @@ -1 +1,19 @@ -{} +{ + "about.blocks": "Модеровані серверы", + "about.contact": "Контакт:", + "about.disclaimer": "Mastodon є задарьнов проґрамов из удпертым кодом тай торговов значков Mastodon gGmbH.", + "about.domain_blocks.no_reason_available": "Причины не ясні", + "about.domain_blocks.silenced.title": "Обмежено", + "about.domain_blocks.suspended.explanation": "Ниякі податкы из сього сервера не будут уброблені, усокочені ци поміняні, што чинит невозможнов хоть-яку інтеракцію ци зязок из хосновачами из сього сервера.", + "about.domain_blocks.suspended.title": "Заблоковано", + "about.rules": "Правила сервера", + "account.account_note_header": "Примітка", + "account.add_or_remove_from_list": "Дати авадь забрати из исписа", + "account.badges.bot": "Автоматічно", + "account.badges.group": "Ґрупа", + "account.block": "Заблоковати @{name}", + "account.block_domain": "Заблоковати домен {domain}", + "account.block_short": "Заблоковати", + "account.blocked": "Заблоковано", + "account.browse_more_on_origin_server": "Позирайте бульше на ориґіналнум профілю" +} diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 37c0dd1383..7eee0c29c2 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -1,741 +1,750 @@ { "about.blocks": "Moderované servery", "about.contact": "Kontakt:", - "about.disclaimer": "Mastodon je bezplatný softvér s otvoreným zdrojovým kódom a ochranná známka spoločnosti Mastodon gGmbH.", - "about.domain_blocks.no_reason_available": "Dôvod nie je k dispozícii", - "about.domain_blocks.preamble": "Mastodon vo všeobecnosti umožňuje prezerať obsah a komunikovať s používateľmi z akéhokoľvek iného servera vo fediverse. Toto sú výnimky, ktoré boli urobené na tomto konkrétnom serveri.", - "about.domain_blocks.silenced.explanation": "Vo všeobecnosti neuvidíte profily a obsah z tohto servera, pokiaľ si ho nevyhľadáte alebo sa neprihlásite k jeho sledovaniu.", - "about.domain_blocks.silenced.title": "Obmedzená", + "about.disclaimer": "Mastodon je bezplatný open-source softvér s otvoreným zdrojovým kódom a ochranná známka spoločnosti Mastodon gGmbH.", + "about.domain_blocks.no_reason_available": "Dôvod nebol uvedený", + "about.domain_blocks.preamble": "Mastodon vo všeobecnosti umožňuje prezerať obsah a komunikovať s používateľmi z akéhokoľvek iného servera vo fediverze. Tu sú uvedené výnimky, ktoré boli urobené na tomto konkrétnom serveri.", + "about.domain_blocks.silenced.explanation": "Vo všeobecnosti neuvidíte profily a obsah z tohto servera, pokiaľ si ich nevyhľadáte alebo sa neprihlásite k ich sledovaniu.", + "about.domain_blocks.silenced.title": "Obmedzený", "about.domain_blocks.suspended.explanation": "Žiadne údaje z tohto servera nebudú spracovávané, ukladané ani vymieňané, čo znemožní akúkoľvek interakciu alebo komunikáciu s používateľmi z tohto servera.", - "about.domain_blocks.suspended.title": "Vylúčená", + "about.domain_blocks.suspended.title": "Vylúčený", "about.not_available": "Tieto informácie neboli sprístupnené na tomto serveri.", - "about.powered_by": "Decentralizované sociálne médiá poháňané technológiou {mastodon}", + "about.powered_by": "Decentralizovaná sociálna sieť na základe technológie {mastodon}", "about.rules": "Pravidlá servera", "account.account_note_header": "Poznámka", - "account.add_or_remove_from_list": "Pridaj alebo odober zo zoznamov", + "account.add_or_remove_from_list": "Pridať alebo odobrať zo zoznamov", "account.badges.bot": "Bot", "account.badges.group": "Skupina", - "account.block": "Blokuj @{name}", - "account.block_domain": "Skry všetko z {domain}", - "account.block_short": "Blokuj", - "account.blocked": "Blokovaný/á", - "account.browse_more_on_origin_server": "Prehľadávaj viac na pôvodnom profile", - "account.cancel_follow_request": "Zruš žiadosť o sledovanie", - "account.copy": "Skopíruj odkaz na profil", - "account.direct": "Spomeň @{name} súkromne", - "account.disable_notifications": "Prestaň mi oznamovať, keď má @{name} príspevky", - "account.domain_blocked": "Doména skrytá", - "account.edit_profile": "Uprav profil", - "account.enable_notifications": "Oznamuj mi, keď má @{name} príspevky", - "account.endorse": "Zobrazuj na profile", + "account.block": "Blokovať @{name}", + "account.block_domain": "Blokovať doménu {domain}", + "account.block_short": "Blokovať", + "account.blocked": "Účet blokovaný", + "account.browse_more_on_origin_server": "Zobraziť viac na pôvodnom profile", + "account.cancel_follow_request": "Zrušiť žiadosť o sledovanie", + "account.copy": "Skopírovať odkaz na profil", + "account.direct": "Súkromne označiť @{name}", + "account.disable_notifications": "Zrušiť upozornenia na príspevky od @{name}", + "account.domain_blocked": "Doména blokovaná", + "account.edit_profile": "Upraviť profil", + "account.enable_notifications": "Zapnúť upozornenia na príspevky od @{name}", + "account.endorse": "Zobraziť na vlastnom profile", "account.featured_tags.last_status_at": "Posledný príspevok dňa {date}", "account.featured_tags.last_status_never": "Žiadne príspevky", - "account.featured_tags.title": "Odporúčané hashtagy používateľa {name}", - "account.follow": "Sleduj", - "account.follow_back": "Nasleduj späť", + "account.featured_tags.title": "Odporúčané hashtagy účtu {name}", + "account.follow": "Sledovať", + "account.follow_back": "Sledovať späť", "account.followers": "Sledovatelia", - "account.followers.empty": "Tohto používateľa ešte nikto nenasleduje.", - "account.followers_counter": "{count, plural, one {{counter} Sledujúci} other {{counter} Sledujúci}}", - "account.following": "Sledujem", - "account.following_counter": "{count, plural, one {{counter} Sledovaných} other {{counter} Sledujúcich}}", - "account.follows.empty": "Tento používateľ ešte nikoho nesleduje.", - "account.go_to_profile": "Prejdi na profil", - "account.hide_reblogs": "Skry zdieľania od @{name}", - "account.in_memoriam": "In Memoriam.", - "account.joined_short": "Pridal/a sa", + "account.followers.empty": "Tento účet ešte nikto nesleduje.", + "account.followers_counter": "{count, plural, one {{counter} sledujúci účet} few {{counter} sledujúce účty} many {{counter} sledujúcich účtov} other {{counter} sledujúcich účtov}}", + "account.following": "Sledovaný účet", + "account.following_counter": "{count, plural, one {{counter} sledovaný účet} few {{counter} sledované účty} many {{counter} sledovaných účtov} other {{counter} sledovaných účtov}}", + "account.follows.empty": "Tento účet ešte nikoho nesleduje.", + "account.go_to_profile": "Prejsť na profil", + "account.hide_reblogs": "Skryť zdieľania od @{name}", + "account.in_memoriam": "In memoriam.", + "account.joined_short": "Dátum registrácie", "account.languages": "Zmeniť odoberané jazyky", "account.link_verified_on": "Vlastníctvo tohto odkazu bolo skontrolované {date}", "account.locked_info": "Stav súkromia pre tento účet je nastavený na zamknutý. Jeho vlastník sa sám rozhoduje, kto ho môže sledovať.", "account.media": "Médiá", - "account.mention": "Spomeň @{name}", - "account.moved_to": "{name} uvádza, že jeho/jej nový účet je teraz:", - "account.mute": "Stíš @{name}", - "account.mute_notifications_short": "Stíš oznámenia", - "account.mute_short": "Stíš", - "account.muted": "Stíšený", + "account.mention": "Označiť @{name}", + "account.moved_to": "{name} uvádza, že má nový účet:", + "account.mute": "Stíšiť @{name}", + "account.mute_notifications_short": "Stíšiť upozornenia", + "account.mute_short": "Stíšiť", + "account.muted": "Účet stíšený", "account.mutual": "Spoločné", "account.no_bio": "Nie je uvedený žiadny popis.", - "account.open_original_page": "Otvor pôvodnú stránku", + "account.open_original_page": "Otvoriť pôvodnú stránku", "account.posts": "Príspevky", "account.posts_with_replies": "Príspevky a odpovede", - "account.report": "Nahlás @{name}", - "account.requested": "Čaká na schválenie. Klikni pre zrušenie žiadosti", - "account.requested_follow": "{name} ti poslal žiadosť na sledovanie", - "account.share": "Zdieľaj @{name} profil", - "account.show_reblogs": "Ukáž vyzdvihnutia od @{name}", - "account.statuses_counter": "{count, plural, one {{counter} príspevok} other {{counter} príspevkov}}", - "account.unblock": "Odblokuj @{name}", - "account.unblock_domain": "Prestaň skrývať {domain}", - "account.unblock_short": "Odblokuj", - "account.unendorse": "Nezobrazuj na profile", - "account.unfollow": "Prestaň nasledovať", - "account.unmute": "Prestaň ignorovať @{name}", - "account.unmute_notifications_short": "Zruš nevšímanie si obznámení", - "account.unmute_short": "Zruš nevšímanie", - "account_note.placeholder": "Klikni pre vloženie poznámky", + "account.report": "Nahlásiť @{name}", + "account.requested": "Čaká na schválenie. Žiadosť zrušíte kliknutím sem", + "account.requested_follow": "{name} vás chce sledovať", + "account.share": "Zdieľaj profil @{name}", + "account.show_reblogs": "Zobrazovať zdieľania od @{name}", + "account.statuses_counter": "{count, plural, one {{counter} príspevok} few {{counter} príspevky} many {{counter} príspevkov} other {{counter} príspevkov}}", + "account.unblock": "Odblokovať @{name}", + "account.unblock_domain": "Odblokovať doménu {domain}", + "account.unblock_short": "Odblokovať", + "account.unendorse": "Nezobrazovať na vlastnom profile", + "account.unfollow": "Zrušiť sledovanie", + "account.unmute": "Vypnúť stíšenie @{name}", + "account.unmute_notifications_short": "Vypnúť stíšenie upozornení", + "account.unmute_short": "Zrušiť stíšenie", + "account_note.placeholder": "Kliknutím pridať poznámku", "admin.dashboard.daily_retention": "Miera udržania používateľov podľa dňa po registrácii", "admin.dashboard.monthly_retention": "Miera udržania používateľov podľa mesiaca po registrácii", "admin.dashboard.retention.average": "Priemer", - "admin.dashboard.retention.cohort": "Mesiac zaregistrovania sa", - "admin.dashboard.retention.cohort_size": "Noví užívatelia", + "admin.dashboard.retention.cohort": "Dátum registrácie", + "admin.dashboard.retention.cohort_size": "Nové účty", "admin.impact_report.instance_accounts": "Profily účtov, ktoré by boli odstránené", "admin.impact_report.instance_followers": "Sledovatelia, o ktorých by naši používatelia prišli", "admin.impact_report.instance_follows": "Sledovatelia, o ktorých by ich používatelia prišli", "admin.impact_report.title": "Zhrnutie dopadu", - "alert.rate_limited.message": "Prosím, skús to znova za {retry_time, time, medium}.", - "alert.rate_limited.title": "Tempo obmedzené", + "alert.rate_limited.message": "Prosím, skúste to znova o {retry_time, time, medium}.", + "alert.rate_limited.title": "Priveľa žiadostí", "alert.unexpected.message": "Vyskytla sa nečakaná chyba.", "alert.unexpected.title": "Ups!", "announcement.announcement": "Oznámenie", "attachments_list.unprocessed": "(nespracované)", - "audio.hide": "Skry zvuk", - "boost_modal.combo": "Nabudúce môžeš kliknúť {combo} pre preskočenie", + "audio.hide": "Skryť zvuk", + "boost_modal.combo": "Nabudúce môžete preskočiť stlačením {combo}", "bundle_column_error.copy_stacktrace": "Kopírovať chybovú hlášku", "bundle_column_error.error.body": "Požadovanú stránku nebolo možné vykresliť. Môže to byť spôsobené chybou v našom kóde alebo problémom s kompatibilitou prehliadača.", "bundle_column_error.error.title": "Ale nie!", - "bundle_column_error.network.body": "Pri pokuse o načítanie tejto stránky sa vyskytla chyba. Môže to byť spôsobené dočasným problémom s Vaším internetovým pripojením alebo týmto serverom.", + "bundle_column_error.network.body": "Pri pokuse o načítanie tejto stránky sa vyskytla chyba. Môže to byť spôsobené dočasným problémom s vaším internetovým pripojením alebo týmto serverom.", "bundle_column_error.network.title": "Chyba siete", - "bundle_column_error.retry": "Skús to znova", - "bundle_column_error.return": "Prejdi späť na domovskú stránku", - "bundle_column_error.routing.body": "Žiadaná stránka nebola nájdená. Ste si istý, že zadaná adresa URL je správna?", + "bundle_column_error.retry": "Skúste to znova", + "bundle_column_error.return": "Prejdite späť na domovskú stránku", + "bundle_column_error.routing.body": "Žiadaná stránka nebola nájdená. Ste si istí, že zadaná adresa URL je správna?", "bundle_column_error.routing.title": "404", - "bundle_modal_error.close": "Zatvor", - "bundle_modal_error.message": "Nastala chyba pri načítaní tohto komponentu.", + "bundle_modal_error.close": "Zatvoriť", + "bundle_modal_error.message": "Pri načítavaní tohto komponentu nastala chyba.", "bundle_modal_error.retry": "Skúsiť znova", "closed_registrations.other_server_instructions": "Keďže Mastodon je decentralizovaný, môžete si vytvoriť účet na inom serveri a stále komunikovať s týmto serverom.", - "closed_registrations_modal.description": "Vytvorenie účtu na {domain} nie je v súčasnosti možné, ale majte prosím na pamäti, že nepotrebujete účet práve na {domain}, aby bolo možné používať Mastodon.", - "closed_registrations_modal.find_another_server": "Nájdi iný server", + "closed_registrations_modal.description": "Vytvorenie účtu na {domain} nie je v súčasnosti možné, ale myslite na to, že na používanie Mastodonu nepotrebujete účet práve na {domain}.", + "closed_registrations_modal.find_another_server": "Nájsť iný server", "closed_registrations_modal.preamble": "Mastodon je decentralizovaný, takže bez ohľadu na to, kde si vytvoríte účet, budete môcť sledovať a komunikovať s kýmkoľvek na tomto serveri. Môžete ho dokonca hostiť sami!", - "closed_registrations_modal.title": "Registrácia na Mastodon", + "closed_registrations_modal.title": "Registrácia na Mastodone", "column.about": "O tomto serveri", - "column.blocks": "Blokovaní užívatelia", + "column.blocks": "Blokované účty", "column.bookmarks": "Záložky", "column.community": "Miestna časová os", - "column.direct": "Súkromné spomenutia", - "column.directory": "Prehľadávaj profily", - "column.domain_blocks": "Skryté domény", + "column.direct": "Súkromné označenia", + "column.directory": "Prehľadávať profily", + "column.domain_blocks": "Blokované domény", "column.favourites": "Obľúbené", "column.firehose": "Živé kanály", "column.follow_requests": "Žiadosti o sledovanie", "column.home": "Domov", "column.lists": "Zoznamy", - "column.mutes": "Nevšímaní užívatelia", - "column.notifications": "Oznámenia", + "column.mutes": "Stíšené účty", + "column.notifications": "Upozornenia", "column.pins": "Pripnuté príspevky", "column.public": "Federovaná časová os", "column_back_button.label": "Späť", "column_header.hide_settings": "Skryť nastavenia", - "column_header.moveLeft_settings": "Presuň stĺpec doľava", - "column_header.moveRight_settings": "Presuň stĺpec doprava", - "column_header.pin": "Pripni", - "column_header.show_settings": "Ukáž nastavenia", - "column_header.unpin": "Odopni", + "column_header.moveLeft_settings": "Presunúť stĺpec doľava", + "column_header.moveRight_settings": "Presunúť stĺpec doprava", + "column_header.pin": "Pripnúť", + "column_header.show_settings": "Zobraziť nastavenia", + "column_header.unpin": "Odopnúť", "column_subheading.settings": "Nastavenia", - "community.column_settings.local_only": "Iba miestna", + "community.column_settings.local_only": "Iba miestne", "community.column_settings.media_only": "Iba médiá", - "community.column_settings.remote_only": "Iba odľahlé", - "compose.language.change": "Zmeň jazyk", - "compose.language.search": "Hľadaj medzi jazykmi...", + "community.column_settings.remote_only": "Iba vzdialené", + "compose.language.change": "Zmeniť jazyk", + "compose.language.search": "Vyhľadávať jazyky…", "compose.published.body": "Príspevok zverejnený.", - "compose.published.open": "Otvor", + "compose.published.open": "Otvoriť", "compose.saved.body": "Príspevok uložený.", - "compose_form.direct_message_warning_learn_more": "Zisti viac", - "compose_form.encryption_warning": "Príspevky na Mastodon nie sú end-to-end šifrované. Nezdieľajte cez Mastodon žiadne citlivé informácie.", - "compose_form.hashtag_warning": "Tento príspevok nebude zobrazený pod žiadným haštagom, lebo nieje verejne listovaný. Iba verejné príspevky môžu byť nájdené podľa haštagu.", - "compose_form.lock_disclaimer": "Tvoj účet nie je {locked}. Ktokoľvek ťa môže nasledovať a vidieť tvoje príspevky pre sledujúcich.", + "compose_form.direct_message_warning_learn_more": "Viac informácií", + "compose_form.encryption_warning": "Príspevky na Mastodone nie sú šifrované end-to-end. Nezdieľajte cez Mastodon žiadne citlivé informácie.", + "compose_form.hashtag_warning": "Tento príspevok nebude zobrazený pod žiadným hashtagom, lebo nie je verejný. Iba verejné príspevky môžu byť nájdené podľa hashtagu.", + "compose_form.lock_disclaimer": "Váš účet nie je {locked}. Ktokoľvek vás môže sledovať a vidieť vaše príspevky pre sledujúcich.", "compose_form.lock_disclaimer.lock": "zamknutý", - "compose_form.placeholder": "Čo máš na mysli?", + "compose_form.placeholder": "Na čo práve myslíte?", "compose_form.poll.duration": "Trvanie ankety", "compose_form.poll.multiple": "Viacero možností", - "compose_form.poll.option_placeholder": "Voľba {number}", - "compose_form.poll.single": "Vyber jednu", - "compose_form.poll.switch_to_multiple": "Zmeň anketu pre povolenie viacerých možností", - "compose_form.poll.switch_to_single": "Zmeň anketu na takú s jedinou voľbou", + "compose_form.poll.option_placeholder": "Možnosť {number}", + "compose_form.poll.single": "Jediný výber", + "compose_form.poll.switch_to_multiple": "Zmeniť anketu a povoliť viaceré možnosti", + "compose_form.poll.switch_to_single": "Zmeniť anketu na jediný povolený výber", "compose_form.poll.type": "Typ", - "compose_form.publish": "Prispej", - "compose_form.publish_form": "Zverejniť", - "compose_form.reply": "Odpovedz", - "compose_form.save_changes": "Aktualizácia", - "compose_form.spoiler.marked": "Text je ukrytý za varovaním", - "compose_form.spoiler.unmarked": "Text nieje ukrytý", + "compose_form.publish": "Uverejniť", + "compose_form.publish_form": "Nový príspevok", + "compose_form.reply": "Odpovedať", + "compose_form.save_changes": "Aktualizovať", + "compose_form.spoiler.marked": "Odstrániť varovanie o obsahu", + "compose_form.spoiler.unmarked": "Pridať varovanie o obsahu", "compose_form.spoiler_placeholder": "Varovanie o obsahu (voliteľné)", "confirmation_modal.cancel": "Zruš", - "confirmations.block.block_and_report": "Zablokuj a nahlás", - "confirmations.block.confirm": "Blokuj", - "confirmations.block.message": "Si si istý/á, že chceš blokovať {name}?", - "confirmations.cancel_follow_request.confirm": "Odvolanie žiadosti", - "confirmations.cancel_follow_request.message": "Naozaj chcete stiahnuť svoju žiadosť o sledovanie {name}?", - "confirmations.delete.confirm": "Vymaž", - "confirmations.delete.message": "Si si istý/á, že chceš vymazať túto správu?", - "confirmations.delete_list.confirm": "Vymaž", - "confirmations.delete_list.message": "Si si istý/á, že chceš natrvalo vymazať tento zoznam?", - "confirmations.discard_edit_media.confirm": "Zahoď", + "confirmations.block.block_and_report": "Zablokovať a nahlásiť", + "confirmations.block.confirm": "Zablokovať", + "confirmations.block.message": "Určite chcete zablokovať {name}?", + "confirmations.cancel_follow_request.confirm": "Stiahnuť žiadosť", + "confirmations.cancel_follow_request.message": "Určite chcete stiahnuť svoju žiadosť o sledovanie {name}?", + "confirmations.delete.confirm": "Vymazať", + "confirmations.delete.message": "Určite chcete tento príspevok vymazať?", + "confirmations.delete_list.confirm": "Vymazať", + "confirmations.delete_list.message": "Určite chcete tento zoznam trvalo vymazať?", + "confirmations.discard_edit_media.confirm": "Zahodiť", "confirmations.discard_edit_media.message": "Máte neuložené zmeny v popise alebo náhľade média, zahodiť ich aj tak?", - "confirmations.domain_block.confirm": "Skry celú doménu", - "confirmations.domain_block.message": "Si si naozaj istý/á, že chceš blokovať celú doménu {domain}? Vo väčšine prípadov stačí blokovať alebo ignorovať pár konkrétnych užívateľov, čo sa doporučuje. Neuvidíš obsah z tejto domény v žiadnej verejnej časovej osi, ani v oznámeniach. Tvoji následovníci pochádzajúci z tejto domény budú odstránení.", - "confirmations.edit.confirm": "Uprav", - "confirmations.edit.message": "Úpravou teraz prepíšeš správu, ktorú práve zostavuješ. Si si istý/á, že chceš pokračovať?", - "confirmations.logout.confirm": "Odhlás sa", - "confirmations.logout.message": "Si si istý/á, že sa chceš odhlásiť?", - "confirmations.mute.confirm": "Nevšímaj si", - "confirmations.mute.explanation": "Toto nastavenie skryje ich príspevky, alebo príspevky od iných v ktorých sú spomenutí, ale umožní im vidieť tvoje príspevky, aj ťa nasledovať.", - "confirmations.mute.message": "Naozaj si chceš nevšímať {name}?", - "confirmations.redraft.confirm": "Vyčisti a prepíš", - "confirmations.redraft.message": "Ste si istý, že chcete premazať a prepísať tento príspevok? Jeho nadobudnuté vyzdvihnutia a obľúbenia, ale i odpovede na pôvodný príspevok budú odlúčené.", - "confirmations.reply.confirm": "Odpovedz", + "confirmations.domain_block.confirm": "Blokovať celú doménu", + "confirmations.domain_block.message": "Určite chcete blokovať celú doménu {domain}? Vo väčšine prípadov stačí blokovať alebo ignorovať pár konkrétnych účtov, čo aj odporúčame. Obsah z tejto domény neuvidíte v žiadnej verejnej časovej osi ani v upozorneniach. Vaši sledujúci pochádzajúci z tejto domény budú odstránení.", + "confirmations.edit.confirm": "Upraviť", + "confirmations.edit.message": "Úpravou prepíšete príspevok, ktorý máte rozpísaný. Určite chcete pokračovať?", + "confirmations.logout.confirm": "Odhlásiť sa", + "confirmations.logout.message": "Určite sa chcete odhlásiť?", + "confirmations.mute.confirm": "Stíšiť", + "confirmations.mute.explanation": "Toto nastavenie skryje príspevky od daného účtu alebo príspevky od iných, v ktorých je tento účet spomenutý. Účet bude stále vidieť vaše príspevky a môcť vás sledovať.", + "confirmations.mute.message": "Určite chcete stíšiť {name}?", + "confirmations.redraft.confirm": "Vymazať a prepísať", + "confirmations.redraft.message": "Určite chcete tento príspevok vymazať a prepísať? Prídete o jeho zdieľania a ohviezdičkovania a odpovede na pôvodný príspevok budú odlúčené.", + "confirmations.reply.confirm": "Odpovedať", "confirmations.reply.message": "Odpovedaním akurát teraz prepíšeš správu, ktorú máš práve rozpísanú. Si si istý/á, že chceš pokračovať?", - "confirmations.unfollow.confirm": "Prestaň sledovať", - "confirmations.unfollow.message": "Naozaj chceš prestať sledovať {name}?", - "conversation.delete": "Vymaž konverzáciu", - "conversation.mark_as_read": "Označ za prečítané", - "conversation.open": "Ukáž konverzáciu", + "confirmations.unfollow.confirm": "Prestať sledovať", + "confirmations.unfollow.message": "Určite chcete prestať sledovať {name}?", + "conversation.delete": "Vymazať konverzáciu", + "conversation.mark_as_read": "Označiť ako prečítanú", + "conversation.open": "Zobraziť konverzáciu", "conversation.with": "S {names}", - "copy_icon_button.copied": "Skopírovaný do schránky", + "copy_icon_button.copied": "Skopírované do schránky", "copypaste.copied": "Skopírované", - "copypaste.copy_to_clipboard": "Skopíruj do schránky", - "directory.federated": "Zo známého fedivesmíru", + "copypaste.copy_to_clipboard": "Skopírovať do schránky", + "directory.federated": "Zo známého fediverza", "directory.local": "Iba z {domain}", "directory.new_arrivals": "Nové príchody", - "directory.recently_active": "Nedávno aktívne", + "directory.recently_active": "Nedávna aktivita", "disabled_account_banner.account_settings": "Nastavenia účtu", - "disabled_account_banner.text": "Vaše konto {disabledAccount} je momentálne vypnuté.", - "dismissable_banner.community_timeline": "Toto sú najnovšie verejné príspevky od ľudí, ktorých účty sú hostované na {domain}.", + "disabled_account_banner.text": "Váš účet {disabledAccount} je momentálne deaktivovaný.", + "dismissable_banner.community_timeline": "Toto sú najnovšie verejné príspevky od účtov hostených na {domain}.", "dismissable_banner.dismiss": "Zrušiť", - "dismissable_banner.explore_links": "Tieto správy sú dnes najviac zdieľané naprieč sociálnou sieťou. Novšie správy, zdieľané viacerými rôznymi ľudmi sú zoradené vyššie.", - "dismissable_banner.explore_statuses": "Toto sú príspevky naprieč celej sociálnej sieti, ktoré dnes naberajú na ťahu. Novšie príspevky s viacerými vyzdvihnutiami sú radené vyššie.", - "dismissable_banner.explore_tags": "Tieto haštagy práve teraz získavajú popularitu, medzi ľuďmi na tomto a ďalších serveroch decentralizovanej siete.", - "dismissable_banner.public_timeline": "Toto sú najnovšie verejné príspevky od ľudí, ktorí sledujú {domain}, cez celú sociálnu sieť.", - "embed.instructions": "Umiestni kód uvedený nižšie pre pridanie tohto statusu na tvoju web stránku.", - "embed.preview": "Tu je ako to bude vyzerať:", + "dismissable_banner.explore_links": "Toto sú správy zo sociálnej siete, ktoré sú dnes populárne. Novšie správy s viacerými ohviezdičkovaniami a zdieľaniami sú radené vyššie.", + "dismissable_banner.explore_statuses": "Toto sú príspevky z celej sociálnej siete, ktoré sú dnes populárne. Novšie príspevky s viacerými ohviezdičkovaniami a zdieľaniami sú radené vyššie.", + "dismissable_banner.explore_tags": "Toto sú hashtagy zo sociálnej siete, ktoré sú dnes populárne. Novšie hashtagy používané viacerými ľuďmi sú radené vyššie.", + "dismissable_banner.public_timeline": "Toto sú najnovšie verejné príspevky od účtov na sociálnej sieti, ktoré sú sledované účtami z {domain}.", + "embed.instructions": "Tento príspevok môžete pridať na svoju webovú stránku použitím tohto kódu.", + "embed.preview": "Takto bude vyzerať:", "emoji_button.activity": "Aktivita", - "emoji_button.clear": "Vyčisti", + "emoji_button.clear": "Vyčistiť", "emoji_button.custom": "Vlastné", "emoji_button.flags": "Vlajky", "emoji_button.food": "Jedlá a nápoje", - "emoji_button.label": "Vlož emotikony", - "emoji_button.nature": "Prírodné", - "emoji_button.not_found": "Nie emotikony!! (╯°□°)╯︵ ┻━┻", + "emoji_button.label": "Vložiť emotikony", + "emoji_button.nature": "Príroda", + "emoji_button.not_found": "Žiadne emotikony", "emoji_button.objects": "Predmety", "emoji_button.people": "Ľudia", "emoji_button.recent": "Často používané", - "emoji_button.search": "Hľadaj...", + "emoji_button.search": "Hľadať…", "emoji_button.search_results": "Výsledky hľadania", "emoji_button.symbols": "Symboly", "emoji_button.travel": "Cestovanie a miesta", - "empty_column.account_hides_collections": "Tento užívateľ si zvolil nesprístupniť túto informáciu", + "empty_column.account_hides_collections": "Tento účet sa rozhodol túto informáciu nesprístupniť", "empty_column.account_suspended": "Účet bol pozastavený", - "empty_column.account_timeline": "Nie sú tu žiadne príspevky!", + "empty_column.account_timeline": "Nie sú tu žiadne príspevky.", "empty_column.account_unavailable": "Profil nedostupný", - "empty_column.blocks": "Ešte si nikoho nezablokoval/a.", - "empty_column.bookmarked_statuses": "Ešte nemáš žiadné záložky. Keď si pridáš príspevok k záložkám, zobrazí sa tu.", - "empty_column.community": "Lokálna časová os je prázdna. Napíšte niečo, aby sa to tu začalo hýbať!", - "empty_column.direct": "Ešte nemáš žiadne priame zmienky. Keď nejakú pošleš alebo dostaneš, ukáže sa tu.", - "empty_column.domain_blocks": "Žiadne domény ešte niesú skryté.", - "empty_column.explore_statuses": "Momentálne nie je nič trendové. Pozrite sa neskôr!", - "empty_column.favourited_statuses": "Zatiaľ nemáš žiadne obľúbené príspevky. Akonáhle označíš nejaký ako obľúbený, zobrazí sa tu.", - "empty_column.favourites": "Nikto si zatiaľ tento príspevok neobľúbil. Akonáhle tak niekto urobí, zobrazí sa tu.", - "empty_column.follow_requests": "Ešte nemáš žiadne požiadavky o následovanie. Keď nejaké dostaneš, budú tu zobrazené.", - "empty_column.followed_tags": "Ešte nenasleduješ žiadne haštagy. Keď tak urobíš, zobrazia sa tu.", + "empty_column.blocks": "Nemáte blokované žiadne účty.", + "empty_column.bookmarked_statuses": "Ešte nemáte záložku v žiadnom príspevku. Keď si ju do nejakého príspevkuk pridáte, zobrazí sa tu.", + "empty_column.community": "Miesta časová os je prázdna. Napíšte niečo, aby to tu ožilo!", + "empty_column.direct": "Ešte nemáte žiadne súkromné označenia. Keď nejaké pošlete alebo dostanete, zobrazí sa tu.", + "empty_column.domain_blocks": "Žiadne domény ešte nie sú blokované.", + "empty_column.explore_statuses": "Momentálne nie je nič populárne. Skontrolujte to zas neskôr.", + "empty_column.favourited_statuses": "Zatiaľ nemáte žiadne ohviezdičkované príspevky. Akonáhle nejaký ohviezdičkujete, zobrazí sa tu.", + "empty_column.favourites": "Zatiaľ tento príspevok nikto neohviezdičkoval. Akonáhle sa tak stane, zobrazí sa tu.", + "empty_column.follow_requests": "Zatiaľ nemáte žiadne žiadosti o sledovanie. Keď nejakú dostanete, zobrazí sa tu.", + "empty_column.followed_tags": "Zatiaľ nesledujete žiadne hashtagy. Keď tak urobíte, zobrazia sa tu.", "empty_column.hashtag": "Pod týmto hashtagom sa ešte nič nenachádza.", - "empty_column.home": "Tvoja lokálna osa je zatiaľ prázdna! Pre začiatok navštív {public}, alebo použi vyhľadávanie a nájdi tak aj iných užívateľov.", - "empty_column.list": "Tento zoznam je ešte prázdny. Keď ale členovia tohoto zoznamu napíšu nové správy, tak tie sa objavia priamo tu.", - "empty_column.lists": "Nemáš ešte žiadne zoznamy. Keď nejaký vytvoríš, bude zobrazený práve tu.", - "empty_column.mutes": "Ešte si nestĺmil žiadných užívateľov.", - "empty_column.notifications": "Ešte nemáš žiadne oznámenia. Začni komunikovať s ostatnými, aby diskusia mohla začať.", - "empty_column.public": "Ešte tu nič nie je. Napíš niečo verejne, alebo začni sledovať užívateľov z iných serverov, aby tu niečo pribudlo", - "error.unexpected_crash.explanation": "Kvôli chybe v našom kóde, alebo problému s kompatibilitou prehliadača, túto stránku nebolo možné zobraziť správne.", - "error.unexpected_crash.explanation_addons": "Túto stránku sa nepodarilo zobraziť správne. Táto chyba je pravdepodobne spôsobená rozšírením v prehliadači, alebo nástrojmi automatického prekladu.", - "error.unexpected_crash.next_steps": "Skús obnoviť stránku. Ak to nepomôže, pravdepodobne budeš stále môcť používať Mastodon cez iný prehliadač, alebo natívnu aplikáciu.", - "error.unexpected_crash.next_steps_addons": "Skús ich vypnúť, a obnoviť túto stránku. Ak to nepomôže, pravdepodobne budeš stále môcť Mastodon používať cez iný prehliadač, alebo natívnu aplikáciu.", - "errors.unexpected_crash.copy_stacktrace": "Skopíruj stacktrace do schránky", - "errors.unexpected_crash.report_issue": "Nahlás problém", + "empty_column.home": "Vaša domáca časová os je zatiaľ prázdna. Začnite sledovať ostatných a naplňte si ju.", + "empty_column.list": "Tento zoznam je zatiaľ prázdny. Keď ale členovia tohoto zoznamu uverejnia nové príspevky, objavia sa tu.", + "empty_column.lists": "Zatiaľ nemáte žiadne zoznamy. Keď nejaký vytvoríte, zobrazí sa tu.", + "empty_column.mutes": "Zatiaľ ste si nikoho nestíšili.", + "empty_column.notifications": "Zatiaľ nemáte žiadne upozornenia. Začnú vám pribúdať, keď s vami začnú interagovať ostatní.", + "empty_column.public": "Zatiaľ tu nič nie je. Napíšte niečo verejné alebo začnite sledovať účty z iných serverov, aby tu niečo pribudlo.", + "error.unexpected_crash.explanation": "Pre chybu v našom kóde alebo problém s kompatibilitou prehliadača nebolo túto stránku možné zobraziť správne.", + "error.unexpected_crash.explanation_addons": "Túto stránku sa nepodarilo zobraziť správne. Táto chyba je pravdepodobne spôsobená rozšírením v prehliadači alebo nástrojmi automatického prekladu.", + "error.unexpected_crash.next_steps": "Skúste stránku obnoviť. Ak to nepomôže, pravdepodobne budete stále môcť používať Mastodon cez iný prehliadač alebo natívnu aplikáciu.", + "error.unexpected_crash.next_steps_addons": "Skúste ich vypnúť a stránku obnoviť. Ak to nepomôže, pravdepodobne budete stále môcť Mastodon používať cez iný prehliadač alebo natívnu aplikáciu.", + "errors.unexpected_crash.copy_stacktrace": "Kopírovať stacktrace do schránky", + "errors.unexpected_crash.report_issue": "Nahlásiť problém", "explore.search_results": "Výsledky hľadania", "explore.suggested_follows": "Ľudia", - "explore.title": "Objavuj", - "explore.trending_links": "Novinky", + "explore.title": "Objavovať", + "explore.trending_links": "Správy", "explore.trending_statuses": "Príspevky", - "explore.trending_tags": "Haštagy", + "explore.trending_tags": "Hashtagy", "filter_modal.added.context_mismatch_explanation": "Táto kategória filtrov sa nevzťahuje na kontext, v ktorom ste získali prístup k tomuto príspevku. Ak chcete, aby sa príspevok filtroval aj v tomto kontexte, budete musieť filter upraviť.", "filter_modal.added.context_mismatch_title": "Nesúlad kontextu!", "filter_modal.added.expired_explanation": "Platnosť tejto kategórie filtra vypršala, aby sa použila, je potrebné zmeniť dátum vypršania platnosti.", "filter_modal.added.expired_title": "Vypršala platnosť filtra!", "filter_modal.added.review_and_configure": "Ak chcete skontrolovať a ďalej konfigurovať túto kategóriu filtrov, prejdite na odkaz {settings_link}.", - "filter_modal.added.review_and_configure_title": "Nastavenie triedenia", - "filter_modal.added.settings_link": "stránka s nastaveniami", + "filter_modal.added.review_and_configure_title": "Nastavenia filtrov", + "filter_modal.added.settings_link": "stránka nastavení", "filter_modal.added.short_explanation": "Tento príspevok bol pridaný do nasledujúcej kategórie filtrov: {title}.", - "filter_modal.added.title": "Triedenie pridané!", + "filter_modal.added.title": "Filter bol pridaný.", "filter_modal.select_filter.context_mismatch": "sa na tento kontext nevzťahuje", - "filter_modal.select_filter.expired": "vypršalo", + "filter_modal.select_filter.expired": "vypršal", "filter_modal.select_filter.prompt_new": "Nová kategória: {name}", - "filter_modal.select_filter.search": "Vyhľadávať alebo vytvoriť", + "filter_modal.select_filter.search": "Vyhľadať alebo vytvoriť", "filter_modal.select_filter.subtitle": "Použite existujúcu kategóriu alebo vytvorte novú", "filter_modal.select_filter.title": "Filtrovanie tohto príspevku", "filter_modal.title.status": "Filtrovanie príspevku", - "firehose.all": "Všetky", + "firehose.all": "Všetko", "firehose.local": "Tento server", - "firehose.remote": "Iné servery", - "follow_request.authorize": "Povoľ prístup", - "follow_request.reject": "Odmietni", - "follow_requests.unlocked_explanation": "Síce Váš učet nie je uzamknutý, ale {domain} tím si myslel že môžete chcieť skontrolovať žiadosti o sledovanie z týchto účtov manuálne.", - "follow_suggestions.curated_suggestion": "Staff pick", - "follow_suggestions.dismiss": "Znovu nezobrazuj", - "follow_suggestions.personalized_suggestion": "Prispôsobené odporúčania", - "follow_suggestions.popular_suggestion": "Populárne návrhy", - "follow_suggestions.view_all": "Zobraz všetky", - "follow_suggestions.who_to_follow": "Koho nasledovať", - "followed_tags": "Nasledované haštagy", - "footer.about": "O", + "firehose.remote": "Ostatné servery", + "follow_request.authorize": "Povoliť", + "follow_request.reject": "Zamietnuť", + "follow_requests.unlocked_explanation": "Aj keď váš účet nie je uzamknutý, tím domény {domain} si myslel, že môžete chcieť skontrolovať žiadosti o sledovanie z týchto účtov manuálne.", + "follow_suggestions.curated_suggestion": "Výber redakcie", + "follow_suggestions.dismiss": "Znova nezobrazovať", + "follow_suggestions.hints.featured": "Tento profil bol ručne zvolený tímom domény {domain}.", + "follow_suggestions.hints.friends_of_friends": "Tento profil je obľúbený medzi účtami, ktoré sledujete.", + "follow_suggestions.hints.most_followed": "Tento profil patrí na doméne {domain} medzi najsledovanejšie.", + "follow_suggestions.hints.most_interactions": "Tento profil má v poslednej dobe na doméne {domain} veľa interakcií.", + "follow_suggestions.hints.similar_to_recently_followed": "Tento profil je podobný profilom, ktoré ste nedávno začali sledovať.", + "follow_suggestions.personalized_suggestion": "Prispôsobený návrh", + "follow_suggestions.popular_suggestion": "Obľúbený návrh", + "follow_suggestions.view_all": "Zobraziť všetky", + "follow_suggestions.who_to_follow": "Koho sledovať", + "followed_tags": "Sledované hashtagy", + "footer.about": "Viac informácií", "footer.directory": "Adresár profilov", "footer.get_app": "Stiahnuť aplikáciu", - "footer.invite": "Pozvi ľudí", + "footer.invite": "Pozvať ľudí", "footer.keyboard_shortcuts": "Klávesové skratky", - "footer.privacy_policy": "Zásady súkromia", + "footer.privacy_policy": "Pravidlá ochrany súkromia", "footer.source_code": "Zobraziť zdrojový kód", "footer.status": "Stav", "generic.saved": "Uložené", - "getting_started.heading": "Začni tu", + "getting_started.heading": "Začíname", "hashtag.column_header.tag_mode.all": "a {additional}", "hashtag.column_header.tag_mode.any": "alebo {additional}", "hashtag.column_header.tag_mode.none": "bez {additional}", "hashtag.column_settings.select.no_options_message": "Žiadne návrhy neboli nájdené", - "hashtag.column_settings.select.placeholder": "Zadaj haštagy…", + "hashtag.column_settings.select.placeholder": "Zadajte hashtagy…", "hashtag.column_settings.tag_mode.all": "Všetky tieto", - "hashtag.column_settings.tag_mode.any": "Hociktorý z týchto", + "hashtag.column_settings.tag_mode.any": "Ľubovoľné z týchto", "hashtag.column_settings.tag_mode.none": "Žiaden z týchto", - "hashtag.column_settings.tag_toggle": "Vlož dodatočné haštagy pre tento stĺpec", - "hashtag.counter_by_accounts": "{count, plural, one {{counter} účastník} other {{counter} účastníci}}", + "hashtag.column_settings.tag_toggle": "Vložte dodatočné hashtagy pre tento stĺpec", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} prispievateľ} few {{counter} prispievatelia} many {{counter} prispievateľov} other {{counter} prispievateľov}}", "hashtag.counter_by_uses": "{count, plural, one {{counter} príspevok} few {{counter} príspevky} many {{counter} príspevkov} other {{counter} príspevkov}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} príspevok} few {{counter} príspevky} many {{counter} príspevkov} other {{counter} príspevkov}} dnes", - "hashtag.follow": "Sleduj haštag", - "hashtag.unfollow": "Nesleduj haštag", - "hashtags.and_other": "…a {count, plural, one {} few {# ďalšie} many {# ďalších}other {# ďalších}}", + "hashtag.follow": "Sledovať hashtag", + "hashtag.unfollow": "Prestať sledovať hashtag", + "hashtags.and_other": "…a {count, plural, other {# ďalších}}", "home.column_settings.basic": "Základné", - "home.column_settings.show_reblogs": "Ukáž vyzdvihnuté", - "home.column_settings.show_replies": "Ukáž odpovede", - "home.hide_announcements": "Skry oznámenia", - "home.pending_critical_update.body": "Prosím aktualizuj si svoj Mastodon server, ako náhle to bude možné!", - "home.pending_critical_update.link": "Pozri aktualizácie", - "home.pending_critical_update.title": "Je dostupná kritická bezpečnostná aktualizácia!", - "home.show_announcements": "Ukáž oznámenia", - "interaction_modal.description.favourite": "S účtom na Mastodone si môžeš tento príspevok obľúbiť, aby si dal/a autorovi vedieť, že ho oceňuješ, a uložiť si ho na neskôr.", - "interaction_modal.description.follow": "Ak máte konto na Mastodone, môžete sledovať {name} a dostávať príspevky do svojho domovského kanála.", - "interaction_modal.description.reblog": "Ak máte účet na Mastodone, môžete tento príspevok posilniť a zdieľať ho s vlastnými sledovateľmi.", - "interaction_modal.description.reply": "Ak máte účet na Mastodone, môžete reagovať na tento príspevok.", + "home.column_settings.show_reblogs": "Zobraziť zdieľania", + "home.column_settings.show_replies": "Zobraziť odpovede", + "home.hide_announcements": "Skryť oznámenia", + "home.pending_critical_update.body": "Prosíme, aktualizujte si svoj Mastodon server, hneď ako to bude možné.", + "home.pending_critical_update.link": "Zobraziť aktualizácie", + "home.pending_critical_update.title": "Je dostupná kritická bezpečnostná aktualizácia.", + "home.show_announcements": "Zobraziť oznámenia", + "interaction_modal.description.favourite": "S účtom na Mastodone môžete tento príspevok ohviezdičkovať, tak dať autorovi vedieť, že sa vám páči, a uložiť si ho na neskôr.", + "interaction_modal.description.follow": "S účtom na Mastodone môžete {name} sledovať a vidieť ich príspevky vo svojom domovskom kanáli.", + "interaction_modal.description.reblog": "S účtom na Mastodone môžete tento príspevok zdeľať so svojimi sledovateľmi.", + "interaction_modal.description.reply": "S účtom na Mastodone môžete na tento príspevok odpovedať.", "interaction_modal.login.action": "Prejsť domov", - "interaction_modal.login.prompt": "Doména tvojho domovského servera, napr. mastodon.social", - "interaction_modal.no_account_yet": "Niesi na Mastodone?", + "interaction_modal.login.prompt": "Doména vášho domovského servera, napr. mastodon.social", + "interaction_modal.no_account_yet": "Nie ste na Mastodone?", "interaction_modal.on_another_server": "Na inom serveri", "interaction_modal.on_this_server": "Na tomto serveri", - "interaction_modal.sign_in": "Nie si prihláseý/á na tomto serveri. Kde je tvoj účet hostovaný?", - "interaction_modal.sign_in_hint": "Tip: Toto je webová stránka, na ktorej ste sa zaregistrovali. Ak si nepamätáte, pohľadajte uvítací e-mail vo svojej schránke. Môžete tiež zadať svoje celé používateľské meno! (napr. @Mastodon@mastodon.social)", - "interaction_modal.title.favourite": "Obľúb si {name} ov/in príspevok", - "interaction_modal.title.follow": "Nasleduj {name}", - "interaction_modal.title.reblog": "Vyzdvihni {name}ov/in príspevok", - "interaction_modal.title.reply": "Odpovedz na {name}ov/in príspevok", - "intervals.full.days": "{number, plural, one {# deň} few {# dní} many {# dní} other {# dní}}", - "intervals.full.hours": "{number, plural, one {# hodina} few {# hodín} many {# hodín} other {# hodín}}", - "intervals.full.minutes": "{number, plural, one {# minúta} few {# minút} many {# minút} other {# minút}}", - "keyboard_shortcuts.back": "dostať sa naspäť", - "keyboard_shortcuts.blocked": "otvor zoznam blokovaných užívateľov", - "keyboard_shortcuts.boost": "Vyzdvihni príspevok", - "keyboard_shortcuts.column": "zameraj sa na príspevok v jednom zo stĺpcov", - "keyboard_shortcuts.compose": "zameraj sa na písaciu plochu", + "interaction_modal.sign_in": "Na tomto serveri nie ste prihlásený. Kde je váš účet hostený?", + "interaction_modal.sign_in_hint": "Tip: Toto je webová stránka, na ktorej ste sa zaregistrovali. Ak si nepamätáte, pohľadajte uvítací e-mail vo svojej schránke. Môžete tiež zadať svoje celé používateľské meno (napr. @Mastodon@mastodon.social).", + "interaction_modal.title.favourite": "Ohviezdičkovať príspevok od {name}", + "interaction_modal.title.follow": "Sledovať {name}", + "interaction_modal.title.reblog": "Zdieľať príspevok od {name}", + "interaction_modal.title.reply": "Odpovedať na príspevok od {name}", + "intervals.full.days": "{number, plural, one {# deň} few {# dni} many {# dní} other {# dní}}", + "intervals.full.hours": "{number, plural, one {# hodina} few {# hodiny} many {# hodín} other {# hodín}}", + "intervals.full.minutes": "{number, plural, one {# minúta} few {# minúty} many {# minút} other {# minút}}", + "keyboard_shortcuts.back": "Ísť späť", + "keyboard_shortcuts.blocked": "Otvoriť zoznam blokovaných užívateľov", + "keyboard_shortcuts.boost": "Zdieľať príspevok", + "keyboard_shortcuts.column": "Prejsť na stĺpec", + "keyboard_shortcuts.compose": "Prejsť na textové pole", "keyboard_shortcuts.description": "Popis", - "keyboard_shortcuts.direct": "to open direct messages column", - "keyboard_shortcuts.down": "posunúť sa dole v zozname", - "keyboard_shortcuts.enter": "Otvor príspevok", - "keyboard_shortcuts.favourite": "Obľúb si príspevok", - "keyboard_shortcuts.favourites": "Otvor zoznam obľúbených", - "keyboard_shortcuts.federated": "otvor federovanú časovú os", + "keyboard_shortcuts.direct": "Otvoriť stĺpec súkromných označení", + "keyboard_shortcuts.down": "Posunúť sa dole v zozname", + "keyboard_shortcuts.enter": "Otvoriť príspevok", + "keyboard_shortcuts.favourite": "Ohviezdičkovať príspevok", + "keyboard_shortcuts.favourites": "Otvoriť zoznam ohviezdičkovaných", + "keyboard_shortcuts.federated": "Otvoriť federovanú časovú os", "keyboard_shortcuts.heading": "Klávesové skratky", - "keyboard_shortcuts.home": "otvor domácu časovú os", - "keyboard_shortcuts.hotkey": "Klávesa", - "keyboard_shortcuts.legend": "zobraz túto legendu", - "keyboard_shortcuts.local": "otvor miestnu časovú os", - "keyboard_shortcuts.mention": "spomeň autora", - "keyboard_shortcuts.muted": "otvor zoznam stíšených užívateľov", - "keyboard_shortcuts.my_profile": "otvor svoj profil", - "keyboard_shortcuts.notifications": "Otvor panel oznámení", - "keyboard_shortcuts.open_media": "Otvorenie médií", - "keyboard_shortcuts.pinned": "otvor zoznam pripnutých príspevkov", - "keyboard_shortcuts.profile": "otvor autorov profil", - "keyboard_shortcuts.reply": "odpovedať", - "keyboard_shortcuts.requests": "otvor zoznam žiadostí o sledovanie", - "keyboard_shortcuts.search": "zameraj sa na vyhľadávanie", - "keyboard_shortcuts.spoilers": "to show/hide CW field", - "keyboard_shortcuts.start": "otvor panel ''začíname''", - "keyboard_shortcuts.toggle_hidden": "ukáž/skry text za CW", - "keyboard_shortcuts.toggle_sensitivity": "Ukáž/skry médiá", - "keyboard_shortcuts.toot": "začni úplne nový príspevok", - "keyboard_shortcuts.unfocus": "nesústreď sa na písaciu plochu, alebo hľadanie", - "keyboard_shortcuts.up": "posuň sa vyššie v zozname", - "lightbox.close": "Zatvor", + "keyboard_shortcuts.home": "Otvoriť domácu časovú os", + "keyboard_shortcuts.hotkey": "Kláves", + "keyboard_shortcuts.legend": "Zobraziť túto legendu", + "keyboard_shortcuts.local": "Otvoriť miestnu časovú os", + "keyboard_shortcuts.mention": "Označiť autora", + "keyboard_shortcuts.muted": "Otvoriť zoznam stíšených užívateľov", + "keyboard_shortcuts.my_profile": "Otvoriť svoj profil", + "keyboard_shortcuts.notifications": "Otvoriť panel upozornení", + "keyboard_shortcuts.open_media": "Otvoriť médiá", + "keyboard_shortcuts.pinned": "Otvoriť zoznam pripnutých príspevkov", + "keyboard_shortcuts.profile": "Otvoriť autorov profil", + "keyboard_shortcuts.reply": "Odpovedať na príspevok", + "keyboard_shortcuts.requests": "Otvoriť zoznam žiadostí o sledovanie", + "keyboard_shortcuts.search": "Prejsť na vyhľadávacie pole", + "keyboard_shortcuts.spoilers": "Zobraziť/skryť pole varovania o obsahu", + "keyboard_shortcuts.start": "Otvoriť panel „Začíname“", + "keyboard_shortcuts.toggle_hidden": "Zobraziť/skryť text za varovaním o obsahu", + "keyboard_shortcuts.toggle_sensitivity": "Zobraziť/skryť médiá", + "keyboard_shortcuts.toot": "Vytvoriť nový príspevok", + "keyboard_shortcuts.unfocus": "Odísť z textového poľa", + "keyboard_shortcuts.up": "Posunúť sa vyššie v zozname", + "lightbox.close": "Zatvoriť", "lightbox.compress": "Zmenšiť náhľad obrázku", "lightbox.expand": "Rozšíriť náhľad obrázku", - "lightbox.next": "Ďalšie", - "lightbox.previous": "Predchádzajúci", - "limited_account_hint.action": "Ukáž profil aj tak", - "limited_account_hint.title": "Tento profil bol skrytý moderátormi stránky {domain}.", - "link_preview.author": "Podľa {name}", - "lists.account.add": "Pridaj do zoznamu", - "lists.account.remove": "Odober zo zoznamu", - "lists.delete": "Vymaž list", - "lists.edit": "Uprav zoznam", - "lists.edit.submit": "Zmeň názov", + "lightbox.next": "Ďalej", + "lightbox.previous": "Späť", + "limited_account_hint.action": "Aj tak zobraziť profil", + "limited_account_hint.title": "Tento profil bol skrytý správcami servera {domain}.", + "link_preview.author": "Autor: {name}", + "lists.account.add": "Pridať do zoznamu", + "lists.account.remove": "Odstrániť zo zoznamu", + "lists.delete": "Vymazať zoznam", + "lists.edit": "Upraviť zoznam", + "lists.edit.submit": "Zmeniť názov", "lists.exclusive": "Skryť tieto príspevky z domovskej stránky", - "lists.new.create": "Pridaj zoznam", + "lists.new.create": "Pridať zoznam", "lists.new.title_placeholder": "Názov nového zoznamu", - "lists.replies_policy.followed": "Akýkoľvek nasledovaný užívateľ", - "lists.replies_policy.list": "Členovia na zozname", - "lists.replies_policy.none": "Nikto", - "lists.replies_policy.title": "Ukáž odpovede na:", - "lists.search": "Vyhľadávaj medzi užívateľmi, ktorých sleduješ", - "lists.subheading": "Tvoje zoznamy", - "load_pending": "{count, plural, one {# nová položka} other {# nových položiek}}", - "loading_indicator.label": "Načítam…", - "media_gallery.toggle_visible": "Zapni/Vypni viditeľnosť", - "moved_to_account_banner.text": "Vaše konto {disabledAccount} je momentálne zablokované, pretože ste sa presunuli na {movedToAccount}.", + "lists.replies_policy.followed": "Akémukoľvek sledovanému účtu", + "lists.replies_policy.list": "Členom zoznamu", + "lists.replies_policy.none": "Nikomu", + "lists.replies_policy.title": "Zobraziť odpovede:", + "lists.search": "Vyhľadávať medzi účtami, ktoré sledujete", + "lists.subheading": "Vaše zoznamy", + "load_pending": "{count, plural, one {# nová položka} few {# nové položky} many {# nových položiek} other {# nových položiek}}", + "loading_indicator.label": "Načítavanie…", + "media_gallery.toggle_visible": "{number, plural, one {Skryť obrázok} other {Skryť obrázky}}", + "moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálne deaktivovaný, pretože ste sa presunuli na {movedToAccount}.", "mute_modal.duration": "Trvanie", - "mute_modal.hide_notifications": "Skry oznámenia od tohto používateľa?", + "mute_modal.hide_notifications": "Skryť upozornenia od tohto účtu?", "mute_modal.indefinite": "Bez obmedzenia", "navigation_bar.about": "O tomto serveri", - "navigation_bar.advanced_interface": "Otvor v pokročilom webovom rozhraní", - "navigation_bar.blocks": "Blokovaní užívatelia", + "navigation_bar.advanced_interface": "Otvoriť v pokročilom webovom rozhraní", + "navigation_bar.blocks": "Blokované účty", "navigation_bar.bookmarks": "Záložky", "navigation_bar.community_timeline": "Miestna časová os", - "navigation_bar.compose": "Napíš nový príspevok", - "navigation_bar.direct": "Súkromné spomenutia", - "navigation_bar.discover": "Objavuj", - "navigation_bar.domain_blocks": "Skryté domény", - "navigation_bar.explore": "Objavuj", - "navigation_bar.favourites": "Obľúbené", + "navigation_bar.compose": "Vytvoriť nový príspevok", + "navigation_bar.direct": "Súkromné označenia", + "navigation_bar.discover": "Objavovanie", + "navigation_bar.domain_blocks": "Blokované domény", + "navigation_bar.explore": "Objavovať", + "navigation_bar.favourites": "Ohviezdičkované", "navigation_bar.filters": "Filtrované slová", "navigation_bar.follow_requests": "Žiadosti o sledovanie", - "navigation_bar.followed_tags": "Nasledované haštagy", - "navigation_bar.follows_and_followers": "Sledovania a následovatelia", + "navigation_bar.followed_tags": "Sledované hashtagy", + "navigation_bar.follows_and_followers": "Sledovania a sledovatelia", "navigation_bar.lists": "Zoznamy", - "navigation_bar.logout": "Odhlás sa", - "navigation_bar.mutes": "Stíšení užívatelia", - "navigation_bar.opened_in_classic_interface": "Príspevky, účty a iné špeciálne stránky, sú z východiska otvárané v klasickom webovom rozhraní.", + "navigation_bar.logout": "Odhlásiť sa", + "navigation_bar.mutes": "Stíšené účty", + "navigation_bar.opened_in_classic_interface": "Príspevky, účty a iné špeciálne stránky sú predvolene otvárané v klasickom webovom rozhraní.", "navigation_bar.personal": "Osobné", "navigation_bar.pins": "Pripnuté príspevky", "navigation_bar.preferences": "Nastavenia", "navigation_bar.public_timeline": "Federovaná časová os", - "navigation_bar.search": "Hľadaj", - "navigation_bar.security": "Zabezbečenie", - "not_signed_in_indicator.not_signed_in": "Ak chcete získať prístup k tomuto zdroju, musíte sa prihlásiť.", - "notification.admin.report": "{name} nahlásil/a {target}", - "notification.admin.sign_up": "{name} sa zaregistroval/a", - "notification.favourite": "{name} si obľúbil/a tvoj príspevok", - "notification.follow": "{name} ťa začal/a nasledovať", - "notification.follow_request": "{name} ťa žiada nasledovať", - "notification.mention": "{name} ťa spomenul/a", - "notification.own_poll": "Tvoja anketa sa skončila", - "notification.poll": "Anketa v ktorej si hlasoval/a sa skončila", - "notification.reblog": "{name} zdieľal/a tvoj príspevok", - "notification.status": "{name} práve uverejnil/a", - "notification.update": "{name} upravil/a príspevok", - "notifications.clear": "Vyčisti oznámenia", - "notifications.clear_confirmation": "Naozaj chceš nenávratne odstrániť všetky tvoje oznámenia?", + "navigation_bar.search": "Hľadať", + "navigation_bar.security": "Zabezpečenie", + "not_signed_in_indicator.not_signed_in": "Ak chcete získať prístup k tomuto zdroju, prihláste sa.", + "notification.admin.report": "Účet {name} nahlásil {target}", + "notification.admin.sign_up": "Nová registráciu účtu {name}", + "notification.favourite": "{name} hviezdičkuje váš príspevok", + "notification.follow": "{name} vás sleduje", + "notification.follow_request": "{name} vás žiada sledovať", + "notification.mention": "{name} vás spomína", + "notification.own_poll": "Vaša anketa sa skončila", + "notification.poll": "Anketa, v ktorej ste hlasovali, sa skončila", + "notification.reblog": "{name} zdieľa váš príspevok", + "notification.status": "{name} uverejňuje niečo nové", + "notification.update": "{name} upravuje príspevok", + "notifications.clear": "Vyčistiť upozornenia", + "notifications.clear_confirmation": "Určite chcete nenávratne odstrániť všetky svoje upozornenia?", "notifications.column_settings.admin.report": "Nové hlásenia:", "notifications.column_settings.admin.sign_up": "Nové registrácie:", - "notifications.column_settings.alert": "Oznámenia na ploche", - "notifications.column_settings.favourite": "Obľúbené:", - "notifications.column_settings.filter_bar.advanced": "Zobraz všetky kategórie", - "notifications.column_settings.filter_bar.category": "Rýchle triedenie", - "notifications.column_settings.filter_bar.show_bar": "Ukáž filtrovací panel", - "notifications.column_settings.follow": "Noví sledujúci:", - "notifications.column_settings.follow_request": "Nové žiadosti o následovanie:", - "notifications.column_settings.mention": "Zmienenia:", - "notifications.column_settings.poll": "Výsledky ankiet:", - "notifications.column_settings.push": "Push notifikácie", - "notifications.column_settings.reblog": "Vyzdvihnutia:", - "notifications.column_settings.show": "Ukáž v stĺpci", - "notifications.column_settings.sound": "Prehraj zvuk", + "notifications.column_settings.alert": "Upozornenia na ploche", + "notifications.column_settings.favourite": "Ohviezdičkované:", + "notifications.column_settings.filter_bar.advanced": "Zobraziť všetky kategórie", + "notifications.column_settings.filter_bar.category": "Rýchly filter", + "notifications.column_settings.filter_bar.show_bar": "Zobraziť filter", + "notifications.column_settings.follow": "Nové sledovania od:", + "notifications.column_settings.follow_request": "Nové žiadosti o sledovanie od:", + "notifications.column_settings.mention": "Označenia:", + "notifications.column_settings.poll": "Výsledky ankety:", + "notifications.column_settings.push": "Upozornenia push", + "notifications.column_settings.reblog": "Zdieľania:", + "notifications.column_settings.show": "Zobraziť v stĺpci", + "notifications.column_settings.sound": "Prehrať zvuk", "notifications.column_settings.status": "Nové príspevky:", - "notifications.column_settings.unread_notifications.category": "Neprečítané oznámenia", - "notifications.column_settings.unread_notifications.highlight": "Zdôrazni neprečítané oznámenia", + "notifications.column_settings.unread_notifications.category": "Neprečítané upozornenia", + "notifications.column_settings.unread_notifications.highlight": "Zvýrazniť neprečítané upozornenia", "notifications.column_settings.update": "Úpravy:", "notifications.filter.all": "Všetky", - "notifications.filter.boosts": "Vyzdvihnutia", - "notifications.filter.favourites": "Obľúbené", + "notifications.filter.boosts": "Zdieľania", + "notifications.filter.favourites": "Ohviezdičkovania", "notifications.filter.follows": "Sledovania", - "notifications.filter.mentions": "Iba spomenutia", + "notifications.filter.mentions": "Označenia", "notifications.filter.polls": "Výsledky ankiet", - "notifications.filter.statuses": "Aktualizácie od ľudí, ktorých nasleduješ", - "notifications.grant_permission": "Udeľ povolenie.", - "notifications.group": "{count} Oznámení", - "notifications.mark_as_read": "Označ každé oznámenie za prečítané", - "notifications.permission_denied": "Oznámenia na ploche sú nedostupné, kvôli predtým zamietnutej požiadavke prehliadača", - "notifications.permission_denied_alert": "Oznámenia na ploche nemôžu byť zapnuté, pretože požiadavka prehliadača bola už skôr zamietnutá", - "notifications.permission_required": "Oznámenia na ploche sú nedostupné, pretože potrebné povolenia neboli udelené.", - "notifications_permission_banner.enable": "Povoliť oznámenia na ploche", + "notifications.filter.statuses": "Novinky od ľudí, ktorých sledujete", + "notifications.grant_permission": "Udeliť povolenie.", + "notifications.group": "{count} upozornení", + "notifications.mark_as_read": "Označiť všetky upozornenia ako prečítané", + "notifications.permission_denied": "Upozornenia na ploche sú nedostupné pre už skôr zamietnutú požiadavku prehliadača", + "notifications.permission_denied_alert": "Upozornenia na ploche nemôžu byť zapnuté, pretože požiadavka prehliadača bola už skôr zamietnutá", + "notifications.permission_required": "Upozornenia na ploche sú nedostupné, pretože neboli udelené potrebné povolenia.", + "notifications_permission_banner.enable": "Povoliť upozornenia na ploche", "notifications_permission_banner.how_to_control": "Ak chcete dostávať upozornenia, keď Mastodon nie je otvorený, povoľte upozornenia na ploche. Po ich zapnutí môžete presne kontrolovať, ktoré typy interakcií generujú upozornenia na ploche, a to prostredníctvom tlačidla {icon} vyššie.", - "notifications_permission_banner.title": "Nikdy nezmeškaj jedinú vec", - "onboarding.action.back": "Vziať ma späť", - "onboarding.actions.back": "Vziať ma späť", - "onboarding.actions.go_to_explore": "See what's trending", - "onboarding.actions.go_to_home": "Go to your home feed", - "onboarding.compose.template": "Nazdar #Mastodon!", + "notifications_permission_banner.title": "Nenechajte si nič ujsť", + "onboarding.action.back": "Ísť späť", + "onboarding.actions.back": "Ísť späť", + "onboarding.actions.go_to_explore": "Prejsť na populárne", + "onboarding.actions.go_to_home": "Prejsť na domovský kanál", + "onboarding.compose.template": "Ahoj, #Mastodon!", "onboarding.follows.empty": "Žiaľ, momentálne sa nedajú zobraziť žiadne výsledky. Môžete skúsiť použiť vyhľadávanie alebo navštíviť stránku objavovania a nájsť ľudí, ktorých chcete sledovať, alebo to skúste znova neskôr.", - "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", - "onboarding.follows.title": "Popular on Mastodon", - "onboarding.profile.discoverable": "Urob môj profil objaviteľný", - "onboarding.profile.display_name": "Zobrazované meno", - "onboarding.profile.display_name_hint": "Tvoje plné meno, alebo tvoje zábavné meno…", - "onboarding.profile.lead": "Toto môžeš vždy dokončiť neskôr v nastaveniach, kde je dostupných ešte viac volieb na prispôsobenie.", - "onboarding.profile.note": "O tebe", - "onboarding.profile.note_hint": "Môžeš @spomenúť iných ľudí, alebo #haštagy…", - "onboarding.profile.save_and_continue": "Ulož a pokračuj", + "onboarding.follows.lead": "Váš domovský kanál je váš hlavný spôsob objavovania Mastodonu. Čím viac ľudí sledujete, tým bude aktívnejší a zaujímavejší. Tu je pár tipov na začiatok:", + "onboarding.follows.title": "Prispôsobte si svoj domovský kanál", + "onboarding.profile.discoverable": "Nastavte svoj profil ako objaviteľný", + "onboarding.profile.discoverable_hint": "Keď si na Mastodone zapnete objaviteľnosť, vaše príspevky sa môžu zobrazovať vo výsledkoch vyhľadávania a v populárnych. Váš profil môže byť navyše navrhovaný ľuďom, s ktorými máte podobné záujmy.", + "onboarding.profile.display_name": "Používateľské meno", + "onboarding.profile.display_name_hint": "Vaše celé meno alebo pokojne aj vtipná prezývka…", + "onboarding.profile.lead": "Vždy si to môžete doplniť neskôr v nastaveniach, kde nájdete aj ďalšie možnosti prispôsobenia.", + "onboarding.profile.note": "Niečo o vás", + "onboarding.profile.note_hint": "Môžete @označiť iných ľudí alebo #hashtagy…", + "onboarding.profile.save_and_continue": "Uložiť a pokračovať", "onboarding.profile.title": "Nastavenie profilu", - "onboarding.profile.upload_avatar": "Nahraj profilový obrázok", - "onboarding.profile.upload_header": "Nahraj profilové záhlavie", - "onboarding.share.lead": "Daj ľudom vedieť, ako ťa môžu na Mastodone nájsť!", - "onboarding.share.message": "Na Mastodone som {username}. Príď ma nasledovať na {url}", + "onboarding.profile.upload_avatar": "Nahrať profilový obrázok", + "onboarding.profile.upload_header": "Nahrať obrázok záhlavia profilu", + "onboarding.share.lead": "Dajte ostatným vedieť, ako vás môžu na Mastodone nájsť.", + "onboarding.share.message": "Na #Mastodon⁠e som {username}. Príď ma sledovať na {url}!", "onboarding.share.next_steps": "Ďalšie možné kroky:", - "onboarding.share.title": "Zdieľaj svoj profil", - "onboarding.start.lead": "Teraz si súčasťou Mastodonu, unikátnej, decentralizovanej sociálnej platformy, kde ty, nie algoritmus, spravuješ svoj vlastný zážitok. Poďme ťa naštartovať na tomto novom sociálnom pomedzí:", - "onboarding.start.skip": "Want to skip right ahead?", + "onboarding.share.title": "Zdieľajte svoj profil", + "onboarding.start.lead": "Teraz ste súčasťou Mastodonu, jedinečnej decentralizovanej sociálnej platformy, kde o všetkom rozhodujete vy, nie algoritmus. Poďme sa pozrieť, ako môžete začať:", + "onboarding.start.skip": "Nepotrebujete pomoc so začiatkom?", "onboarding.start.title": "Zvládli ste to!", - "onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", - "onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}", - "onboarding.steps.publish_status.body": "Say hello to the world.", - "onboarding.steps.publish_status.title": "Vytvor svoj prvý príspevok", - "onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.", - "onboarding.steps.setup_profile.title": "Customize your profile", - "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", - "onboarding.steps.share_profile.title": "Share your profile", + "onboarding.steps.follow_people.body": "Mastodon je vybudovaný okolo sledovania zaujímavých ľudí.", + "onboarding.steps.follow_people.title": "Prispôsobte si svoj domovský kanál", + "onboarding.steps.publish_status.body": "Predstavte sa svetu textom, fotkami, videami či anketami {emoji}", + "onboarding.steps.publish_status.title": "Vytvorte svoj prvý príspevok", + "onboarding.steps.setup_profile.body": "Plnší profil vám pomôže mať viac interakcií.", + "onboarding.steps.setup_profile.title": "Upravte si profil", + "onboarding.steps.share_profile.body": "Dajte svojej partii vedieť, ako vás môžu na Mastodone nájsť.", + "onboarding.steps.share_profile.title": "Zdieľajte svoj profil na Mastodone", "onboarding.tips.2fa": "Vedeli ste? Svoj účet môžete zabezpečiť nastavením dvojfaktorového overenia v nastaveniach účtu. Funguje to s akoukoľvek aplikáciou TOTP podľa vášho výberu, nie je potrebné žiadne telefónne číslo!", "onboarding.tips.accounts_from_other_servers": "Vedeli ste? Keďže Mastodon je decentralizovaný, niektoré profily, s ktorými sa stretnete, budú na iných serveroch, ako je váš. Aj napriek tomu s nimi môžete bezproblémovo komunikovať! Ich server je v druhej časti ich používateľského mena!", - "onboarding.tips.migration": "Vedeli ste? Ak máte pocit, že doména {domain} pre vás v budúcnosti nebude skvelou voľbou, môžete prejsť na iný server Mastodon bez straty svojich sledovateľov. Môžete dokonca hostovať svoj vlastný server!", - "onboarding.tips.verification": "Vedeli ste? Svoj účet môžete overiť umiestnením odkazu na svoj profil Mastodon na svoju vlastnú webovú lokalitu a pridaním webovej lokality do svojho profilu. Nie sú potrebné žiadne poplatky ani doklady!", + "onboarding.tips.migration": "Vedeli ste? Ak máte pocit, že doména {domain} pre vás v budúcnosti nebude skvelou voľbou, môžete prejsť na iný server Mastodon bez straty svojich sledovateľov. Môžete dokonca hostiť svoj vlastný server!", + "onboarding.tips.verification": "Vedeli ste? Svoj účet môžete overiť umiestnením odkazu na svoj profil na Mastodone na svoju vlastnú webovú lokalitu a pridaním webovej lokality do svojho profilu. Nie sú potrebné žiadne poplatky ani doklady!", "password_confirmation.exceeds_maxlength": "Potvrdené heslo presahuje maximálnu dĺžku hesla", "password_confirmation.mismatching": "Zadané heslá sa nezhodujú", "picture_in_picture.restore": "Vrátiť späť", "poll.closed": "Uzatvorená", "poll.refresh": "Obnoviť", - "poll.reveal": "Pozri výsledky", - "poll.total_people": "{count, plural, one {# človek} few {# ľudia} other {# ľudí}}", - "poll.total_votes": "{count, plural, one {# hlas} few {# hlasov} many {# hlasov} other {# hlasov}}", - "poll.vote": "Hlasuj", - "poll.voted": "Hlasoval/a si za túto voľbu", - "poll.votes": "{votes, plural, one {# hlas} few {# hlasov} many {# hlasov} other {# hlasy}}", - "poll_button.add_poll": "Pridaj anketu", - "poll_button.remove_poll": "Odstráň anketu", - "privacy.change": "Uprav súkromie príspevku", + "poll.reveal": "Zobraziť výsledky", + "poll.total_people": "{count, plural, one {# človek} few {# ľudia} many {# ľudí} other {# ľudí}}", + "poll.total_votes": "{count, plural, one {# hlas} few {# hlasy} many {# hlasov} other {# hlasov}}", + "poll.vote": "Hlasovať", + "poll.voted": "Hlasovali ste za túto voľbu", + "poll.votes": "{votes, plural, one {# hlas} few {# hlasy} many {# hlasov} other {# hlasov}}", + "poll_button.add_poll": "Pridať anketu", + "poll_button.remove_poll": "Odstrániť anketu", + "privacy.change": "Zmeniť nastavenia súkromia príspevku", "privacy.direct.long": "Všetci spomenutí v príspevku", "privacy.direct.short": "Konkrétni ľudia", - "privacy.private.long": "Iba tvoji nasledovatelia", + "privacy.private.long": "Iba vaši sledovatelia", "privacy.private.short": "Sledovatelia", - "privacy.public.long": "Ktokoľvek na, aj mimo Mastodonu", + "privacy.public.long": "Ktokoľvek na Mastodone aj mimo neho", "privacy.public.short": "Verejné", - "privacy.unlisted.short": "Verejný v tichosti", + "privacy.unlisted.additional": "Presne ako verejné, s tým rozdielom, že sa príspevok nezobrazí v živých kanáloch, hashtagoch, objavovaní či vo vyhľadávaní na Mastodone, aj keď máte pre účet objaviteľnosť zapnutú.", + "privacy.unlisted.long": "Menej algoritmických výmyslov", + "privacy.unlisted.short": "Tiché verejné", "privacy_policy.last_updated": "Posledná úprava {date}", - "privacy_policy.title": "Zásady súkromia", + "privacy_policy.title": "Pravidlá ochrany súkromia", "recommended": "Odporúčané", "refresh": "Obnoviť", - "regeneration_indicator.label": "Načítava sa…", - "regeneration_indicator.sublabel": "Tvoja domovská nástenka sa pripravuje!", - "relative_time.days": "{number}dní", - "relative_time.full.days": "Ostáva {number, plural, one {# deň} few {# dní} many {# dní} other {# dni}}", - "relative_time.full.hours": "Pred {number, plural, one {# hodinou} few {# hodinami} many {# hodinami} other {# hodinami}}", - "relative_time.full.just_now": "práve teraz", - "relative_time.full.minutes": "Pred {number, plural, one {# minútou} few {# minútami} many {# minútami} other {# minútami}}", - "relative_time.full.seconds": "Pred {number, plural, one {# sekundou} few {# sekundami} many {# sekundami} other {# sekundami}}", - "relative_time.hours": "{number}hod", - "relative_time.just_now": "teraz", - "relative_time.minutes": "{number}min", - "relative_time.seconds": "{number}sek", - "relative_time.today": "dnes", + "regeneration_indicator.label": "Načítavanie…", + "regeneration_indicator.sublabel": "Váš domovský kanál sa pripravuje.", + "relative_time.days": "{number} dní", + "relative_time.full.days": "Pred {number, plural, one {# dňom} other {# dňami}}", + "relative_time.full.hours": "Pred {number, plural, one {# hodinou} other {# hodinami}}", + "relative_time.full.just_now": "Práve teraz", + "relative_time.full.minutes": "Pred {number, plural, one {# minútou} other {# minútami}}", + "relative_time.full.seconds": "Pred {number, plural, one {# sekundou} other {# sekundami}}", + "relative_time.hours": "{number} hod", + "relative_time.just_now": "Teraz", + "relative_time.minutes": "{number} min", + "relative_time.seconds": "{number} sek", + "relative_time.today": "Dnes", + "reply_indicator.attachments": "{count, plural, one {# príloha} few {# prílohy} other {# príloh}}", "reply_indicator.cancel": "Zrušiť", "reply_indicator.poll": "Anketa", - "report.block": "Blokuj", + "report.block": "Blokovať", "report.block_explanation": "Ich príspevky neuvidíte. Nebudú môcť vidieť vaše príspevky ani vás sledovať. Budú môcť zistiť, že sú zablokovaní.", - "report.categories.legal": "Právne ujednania", + "report.categories.legal": "Právne", "report.categories.other": "Ostatné", "report.categories.spam": "Spam", "report.categories.violation": "Obsah porušuje jedno alebo viacero pravidiel servera", - "report.category.subtitle": "Vyberte si najlepšiu voľbu", - "report.category.title": "Povedzte nám, čo sa deje s týmto {type}", - "report.category.title_account": "profilom", - "report.category.title_status": "príspevkom", + "report.category.subtitle": "Vyberte najlepšiu voľbu", + "report.category.title": "Povedzte nám, čo je zlé na tomto {type}", + "report.category.title_account": "profile", + "report.category.title_status": "príspevku", "report.close": "Hotovo", "report.comment.title": "Je ešte niečo, čo by sme podľa vás mali vedieť?", - "report.forward": "Posuň ku {target}", - "report.forward_hint": "Tento účet je z iného serveru. Chceš poslať anonymnú kópiu hlásenia aj tam?", - "report.mute": "Nevšímaj si", - "report.mute_explanation": "Ich príspevky neuvidíte. Stále vás môžu sledovať a vidieť vaše príspevky a nebudú vedieť, že sú stlmené.", + "report.forward": "Preposlať na {target}", + "report.forward_hint": "Tento účet je z iného serveru. Chcete poslať anonymnú kópiu hlásenia aj tam?", + "report.mute": "Stíšiť", + "report.mute_explanation": "Ich príspevky neuvidíte. Stále vás môžu sledovať a vidieť vaše príspevky a nebudú vedieť, že ste ich stíšili.", "report.next": "Ďalej", "report.placeholder": "Ďalšie komentáre", "report.reasons.dislike": "Nepáči sa mi", - "report.reasons.dislike_description": "Nieje to niečo, čo chceš vidieť", - "report.reasons.legal": "Je to nelegálne", + "report.reasons.dislike_description": "Nie je to niečo, čo chcete vidieť", + "report.reasons.legal": "Je nelegálny", "report.reasons.legal_description": "Domnievate sa, že porušuje zákony vašej krajiny alebo krajiny servera", - "report.reasons.other": "Je to niečo iné", + "report.reasons.other": "Ide o niečo iné", "report.reasons.other_description": "Tento problém nepatrí do iných kategórií", "report.reasons.spam": "Je to spam", "report.reasons.spam_description": "Škodlivé odkazy, falošné zapojenie alebo opakované odpovede", "report.reasons.violation": "Porušuje pravidlá servera", "report.reasons.violation_description": "Ste si vedomí, že porušuje špecifické pravidlá", - "report.rules.subtitle": "Vyberte všetky, ktoré sa vzťahujú", - "report.rules.title": "Ktoré pravidlá sa porušujú?", - "report.statuses.subtitle": "Vyberte všetky, ktoré sa vzťahujú", + "report.rules.subtitle": "Vyberte všetky príslušné možnosti", + "report.rules.title": "Ktoré pravidlá sú porušované?", + "report.statuses.subtitle": "Vyberte všetky príslušné možnosti", "report.statuses.title": "Sú k dispozícii príspevky podporujúce toto hlásenie?", - "report.submit": "Odošli", - "report.target": "Nahlás {target}", - "report.thanks.take_action": "Tu sú tvoje možnosti kontrolovať, čo vidíš na Mastodone:", - "report.thanks.take_action_actionable": "Kým to vyhodnotíme, môžeš podniknúť kroky voči @{name}:", - "report.thanks.title": "Nechceš to vidieť?", - "report.thanks.title_actionable": "Vďaka za nahlásenie, pozrieme sa na to.", - "report.unfollow": "Nesleduj @{name}", - "report.unfollow_explanation": "Tento účet sledujete. Ak už nechcete vidieť jeho príspevky vo svojom domovskom kanáli, zrušte jeho sledovanie.", - "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", - "report_notification.categories.legal": "Právne ujednania", + "report.submit": "Odoslať", + "report.target": "Nahlásiť {target}", + "report.thanks.take_action": "Tu sú vaše možnosti kontrolovať to, čo vidíte na Mastodone:", + "report.thanks.take_action_actionable": "Kým to vyhodnotíme, môžete podniknúť kroky voči @{name}:", + "report.thanks.title": "Nechcete to vidieť?", + "report.thanks.title_actionable": "Ďakujeme za nahlásenie, pozrieme sa na to.", + "report.unfollow": "Prestať sledovať @{name}", + "report.unfollow_explanation": "Tento účet sledujete. Ak už nechcete vidieť jeho príspevky vo svojom domovskom kanáli, prestaňte ho sledovať.", + "report_notification.attached_statuses": "{count, plural, one {{count} príspevok} few {{count} príspevky} other {{count} príspevkov}} ako príloha", + "report_notification.categories.legal": "Právne", "report_notification.categories.other": "Ostatné", "report_notification.categories.spam": "Spam", "report_notification.categories.violation": "Porušenie pravidla", - "report_notification.open": "Otvor hlásenie", + "report_notification.open": "Otvoriť hlásenie", "search.no_recent_searches": "Žiadne nedávne vyhľadávania", - "search.placeholder": "Hľadaj", + "search.placeholder": "Hľadať", "search.quick_action.account_search": "Profily zodpovedajúce {x}", - "search.quick_action.go_to_account": "Prejdi na profil {x}", - "search.quick_action.go_to_hashtag": "Choď na haštag {x}", - "search.quick_action.open_url": "Otvor URL v rámci Mastodonu", + "search.quick_action.go_to_account": "Prejsť na profil {x}", + "search.quick_action.go_to_hashtag": "Prejsť na hashtag {x}", + "search.quick_action.open_url": "Otvoriť URL v rámci Mastodonu", "search.quick_action.status_search": "Príspevky zodpovedajúce {x}", - "search.search_or_paste": "Hľadaj, alebo vlož URL adresu", + "search.search_or_paste": "Hľadať alebo vložiť adresu URL", "search_popout.full_text_search_disabled_message": "Nie je k dispozícii v doméne {domain}.", - "search_popout.full_text_search_logged_out_message": "Dostupné iba keď si prihlásený/á.", - "search_popout.language_code": "ISO kód jazyka", + "search_popout.full_text_search_logged_out_message": "Dostupné iba po prihlásení.", + "search_popout.language_code": "Kód jazyka ISO", "search_popout.options": "Možnosti vyhľadávania", "search_popout.quick_actions": "Rýchle akcie", "search_popout.recent": "Nedávne vyhľadávania", - "search_popout.specific_date": "presný dátum", - "search_popout.user": "užívateľ", + "search_popout.specific_date": "Presný dátum", + "search_popout.user": "Účet", "search_results.accounts": "Profily", "search_results.all": "Všetky", - "search_results.hashtags": "Haštagy", - "search_results.nothing_found": "Pre tieto výrazy nemožno nič nájsť", - "search_results.see_all": "Ukáž všetky", + "search_results.hashtags": "Hashtagy", + "search_results.nothing_found": "Pre tieto výrazy nebolo možné nič nájsť", + "search_results.see_all": "Zobraziť všetky", "search_results.statuses": "Príspevky", - "search_results.title": "Hľadaj {q}", - "server_banner.about_active_users": "Ľudia používajúci tento server za posledných 30 dní (Aktívni používatelia za mesiac)", - "server_banner.active_users": "aktívni užívatelia", - "server_banner.administered_by": "Správcom je:", + "search_results.title": "Hľadať {q}", + "server_banner.about_active_users": "Ľudia používajúci tento server za posledných 30 dní (aktívni používatelia za mesiac)", + "server_banner.active_users": "Aktívne účty", + "server_banner.administered_by": "Správa servera:", "server_banner.introduction": "{domain} je súčasťou decentralizovanej sociálnej siete využívajúcej technológiu {mastodon}.", - "server_banner.learn_more": "Zisti viac", - "server_banner.server_stats": "Serverové štatistiky:", - "sign_in_banner.create_account": "Vytvor účet", - "sign_in_banner.sign_in": "Prihlás sa", - "sign_in_banner.sso_redirect": "Prihlás sa, alebo zaregistruj", - "sign_in_banner.text": "Prihláste sa, aby ste mohli sledovať profily alebo haštagy, obľúbené veci, zdieľať ich a odpovedať na príspevky. Môžete tiež komunikovať zo svojho účtu na inom serveri.", - "status.admin_account": "Otvor moderovacie rozhranie užívateľa @{name}", - "status.admin_domain": "Otvor rozhranie na moderovanie domény {domain}", - "status.admin_status": "Otvor tento príspevok v moderovacom rozhraní", - "status.block": "Blokuj @{name}", - "status.bookmark": "Záložka", - "status.cancel_reblog_private": "Nezdieľaj", - "status.cannot_reblog": "Tento príspevok nemôže byť zdieľaný", - "status.copy": "Skopíruj odkaz na príspevok", - "status.delete": "Zmazať", + "server_banner.learn_more": "Viac informácií", + "server_banner.server_stats": "Štatistiky servera:", + "sign_in_banner.create_account": "Vytvoriť účet", + "sign_in_banner.sign_in": "Prihlásiť sa", + "sign_in_banner.sso_redirect": "Prihlásenie alebo registrácia", + "sign_in_banner.text": "Prihláste sa, aby ste mohli sledovať profily alebo hashtagy, hviezdičkovať, zdieľať a odpovedať na príspevky. Môžete tiež komunikovať zo svojho účtu na inom serveri.", + "status.admin_account": "Moderovať @{name}", + "status.admin_domain": "Moderovať {domain}", + "status.admin_status": "Moderovať príspevok", + "status.block": "Blokovať @{name}", + "status.bookmark": "Pridať záložku", + "status.cancel_reblog_private": "Zrušiť zdieľanie", + "status.cannot_reblog": "Tento príspevok nie je možné zdieľať", + "status.copy": "Kopírovať odkaz na príspevok", + "status.delete": "Vymazať", "status.detailed_status": "Podrobný náhľad celej konverzácie", - "status.direct": "Spomeň @{name} v súkromí", - "status.direct_indicator": "Súkromné spomenutie", - "status.edit": "Uprav", + "status.direct": "Súkromne označiť @{name}", + "status.direct_indicator": "Súkromné označenie", + "status.edit": "Upraviť", "status.edited": "Upravené {date}", - "status.edited_x_times": "Upravený {count, plural, one {{count} krát} other {{count} krát}}", + "status.edited_x_times": "Upravený {count, plural, other {{count}×}}", "status.embed": "Vložiť", - "status.favourite": "Páči sa mi", + "status.favourite": "Ohviezdičkované", "status.filter": "Filtrovanie tohto príspevku", "status.filtered": "Filtrované", - "status.hide": "Skry príspevok", - "status.history.created": "{name} vytvoril/a {date}", - "status.history.edited": "{name} upravil/a {date}", - "status.load_more": "Ukáž viac", - "status.media.open": "Klikni pre otvorenie", - "status.media.show": "Kliknutím zobrazíš", + "status.hide": "Skryť príspevok", + "status.history.created": "Vytvorené účtom {name} {date}", + "status.history.edited": "Upravené účtom {name} {date}", + "status.load_more": "Načitať viac", + "status.media.open": "Otvoriť kliknutím", + "status.media.show": "Zobraziť kliknutím", "status.media_hidden": "Skryté médiá", - "status.mention": "Spomeň @{name}", + "status.mention": "Označiť @{name}", "status.more": "Viac", - "status.mute": "Nevšímaj si @{name}", - "status.mute_conversation": "Nevšímaj si konverzáciu", - "status.open": "Otvor tento príspevok", - "status.pin": "Pripni na profil", + "status.mute": "Stíšiť @{name}", + "status.mute_conversation": "Stíšiť konverzáciu", + "status.open": "Rozbaliť príspevok", + "status.pin": "Pripnúť na profil", "status.pinned": "Pripnutý príspevok", "status.read_more": "Čítaj ďalej", - "status.reblog": "Vyzdvihni", - "status.reblog_private": "Vyzdvihni k pôvodnému publiku", - "status.reblogged_by": "{name} vyzdvihli", - "status.reblogs.empty": "Nikto ešte nevyzdvihol tento príspevok. Keď tak niekto urobí, bude to zobrazené práve tu.", - "status.redraft": "Vymaž a prepíš", - "status.remove_bookmark": "Odstráň záložku", + "status.reblog": "Zdieľať", + "status.reblog_private": "Zdieľať pôvodnému publiku", + "status.reblogged_by": "{name} zdieľa", + "status.reblogs.empty": "Nikto ešte tento príspevok nezdieľal. Keď tak niekto urobí, zobrazí sa to tu.", + "status.redraft": "Vymazať a prepísať", + "status.remove_bookmark": "Odstrániť záložku", "status.replied_to": "Odpoveď na {name}", "status.reply": "Odpovedať", - "status.replyAll": "Odpovedz na diskusiu", - "status.report": "Nahlás @{name}", - "status.sensitive_warning": "Chúlostivý obsah", - "status.share": "Zdieľaj", - "status.show_filter_reason": "Ukáž aj tak", - "status.show_less": "Zobraz menej", - "status.show_less_all": "Všetkým ukáž menej", - "status.show_more": "Ukáž viac", - "status.show_more_all": "Všetkým ukáž viac", - "status.show_original": "Ukáž pôvodný", - "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", + "status.replyAll": "Odpovedať vo vlákne", + "status.report": "Nahlásiť @{name}", + "status.sensitive_warning": "Citlivý obsah", + "status.share": "Zdieľať", + "status.show_filter_reason": "Aj tak zobraziť", + "status.show_less": "Zobraziť menej", + "status.show_less_all": "Všetkým zobraziť menej", + "status.show_more": "Zobraziť viac", + "status.show_more_all": "Všetkým zobraziť viac", + "status.show_original": "Zobraziť originál", + "status.title.with_attachments": "Účet {user} nahral {attachmentCount, plural, one {prílohu} few {{attachmentCount} prílohy} many {{attachmentCount} príloh} other {{attachmentCount} príloh}}", "status.translate": "Preložiť", "status.translated_from_with": "Preložené z {lang} pomocou {provider}", "status.uncached_media_warning": "Náhľad nie je k dispozícii", - "status.unmute_conversation": "Prestaň si nevšímať konverzáciu", - "status.unpin": "Odopni z profilu", + "status.unmute_conversation": "Zrušiť stíšenie konverzácie", + "status.unpin": "Odopnúť z profilu", "subscribed_languages.lead": "Po zmene sa na vašej domovskej stránke a časovej osi zoznamu zobrazia iba príspevky vo vybraných jazykoch. Ak chcete dostávať príspevky vo všetkých jazykoch, vyberte možnosť žiadne.", - "subscribed_languages.save": "Ulož zmeny", + "subscribed_languages.save": "Uložiť zmeny", "subscribed_languages.target": "Zmeniť prihlásené jazyky pre {target}", "tabs_bar.home": "Domov", - "tabs_bar.notifications": "Oznámenia", - "time_remaining.days": "Ostáva {number, plural, one {# deň} few {# dní} many {# dní} other {# dní}}", - "time_remaining.hours": "Ostáva {number, plural, one {# hodina} few {# hodín} many {# hodín} other {# hodiny}}", - "time_remaining.minutes": "Ostáva {number, plural, one {# minúta} few {# minút} many {# minút} other {# minúty}}", + "tabs_bar.notifications": "Upozornenia", + "time_remaining.days": "Ostáva{number, plural, one { # deň} few {jú # dni} many { # dní} other { # dní}}", + "time_remaining.hours": "Ostáva{number, plural, one { # hodina} few {jú # hodiny} many { # hodín} other { # hodín}}", + "time_remaining.minutes": "Ostáva{number, plural, one { # minúta} few {jú # minúty} many { # minút} other { # minút}}", "time_remaining.moments": "Ostáva už iba chviľka", - "time_remaining.seconds": "Ostáva {number, plural, one {# sekunda} few {# sekúnd} many {# sekúnd} other {# sekúnd}}", - "timeline_hint.remote_resource_not_displayed": "{resource} z iných serverov sa nezobrazí.", + "time_remaining.seconds": "Ostáva{number, plural, one { # sekunda} few {jú # sekundy} many { # sekúnd} other { # sekúnd}}", + "timeline_hint.remote_resource_not_displayed": "{resource} z iných serverov sa nezobrazia.", "timeline_hint.resources.followers": "Sledujúci", - "timeline_hint.resources.follows": "Nasleduje", + "timeline_hint.resources.follows": "Sledovaní", "timeline_hint.resources.statuses": "Staršie príspevky", - "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}", + "trends.counter_by_accounts": "{count, plural, one {{counter} osoba} few {{counter} ľudia} many {{counter} ľudí} other {{counter} ľudí}} za posledn{days, plural, one {ý deň} few {é {days} dni} many {ých {days} dní} other {ých {days} dní}}", "trends.trending_now": "Teraz populárne", - "ui.beforeunload": "Čo máš rozpísané sa stratí, ak opustíš Mastodon.", - "units.short.billion": "{count}mld.", - "units.short.million": "{count}mil.", - "units.short.thousand": "{count}tis.", - "upload_area.title": "Pretiahni a pusť pre nahratie", - "upload_button.label": "Pridaj obrázky, video, alebo zvukový súbor", + "ui.beforeunload": "Po opustení Mastodonu prídete o to, čo máte rozpísané.", + "units.short.billion": "{count} mld.", + "units.short.million": "{count} mil.", + "units.short.thousand": "{count} tis.", + "upload_area.title": "Nahráte potiahnutím a pustením", + "upload_button.label": "Pridať obrázky, video alebo zvukový súbor", "upload_error.limit": "Limit pre nahrávanie súborov bol prekročený.", - "upload_error.poll": "Nahrávanie súborov pri anketách nieje možné.", - "upload_form.audio_description": "Popíš, pre ľudí so stratou sluchu", - "upload_form.description": "Opis pre slabo vidiacich", - "upload_form.edit": "Uprav", + "upload_error.poll": "Nahrávanie súborov nie je pri anketách možné.", + "upload_form.audio_description": "Popis pre sluchovo postihnutých ľudí", + "upload_form.description": "Popis pre zrakovo postihnutých ľudí", + "upload_form.edit": "Upraviť", "upload_form.thumbnail": "Zmeniť miniatúru", - "upload_form.video_description": "Popíš, pre ľudí so stratou sluchu, alebo očným znevýhodnením", - "upload_modal.analyzing_picture": "Analyzujem obrázok…", - "upload_modal.apply": "Použi", - "upload_modal.applying": "Nastavovanie…", - "upload_modal.choose_image": "Vyber obrázok", - "upload_modal.description_placeholder": "Rýchla hnedá líška skáče ponad lenivého psa", - "upload_modal.detect_text": "Rozpoznaj text z obrázka", - "upload_modal.edit_media": "Uprav médiá", - "upload_modal.hint": "Klikni, alebo potiahni okruh ukážky pre zvolenie z ktorého východzieho bodu bude vždy v dohľadne na všetkých náhľadoch.", - "upload_modal.preparing_ocr": "Pripravujem OCR…", + "upload_form.video_description": "Popís pre ľudí so zrakovým alebo sluchovým postihnutím", + "upload_modal.analyzing_picture": "Prebieha analýza obrázka…", + "upload_modal.apply": "Použiť", + "upload_modal.applying": "Ukladanie…", + "upload_modal.choose_image": "Vybrať obrázok", + "upload_modal.description_placeholder": "Kde bolo, tam bolo, bol raz jeden Mastodon", + "upload_modal.detect_text": "Rozpoznať text z obrázka", + "upload_modal.edit_media": "Upraviť médiá", + "upload_modal.hint": "Kliknite alebo potiahnite kruh na ukážke, a tak vyberte bod, ktorý bude viditeľný na všetkých náhľadoch.", + "upload_modal.preparing_ocr": "Pripravujem rozpoznávanie…", "upload_modal.preview_label": "Náhľad ({ratio})", - "upload_progress.label": "Nahráva sa...", + "upload_progress.label": "Nahráva sa…", "upload_progress.processing": "Spracovávanie…", "username.taken": "Používateľské meno je obsadené. Skúste iné", - "video.close": "Zavri video", - "video.download": "Stiahni súbor", - "video.exit_fullscreen": "Vypni zobrazenie na celú obrazovku", - "video.expand": "Zväčši video", - "video.fullscreen": "Zobraz na celú obrazovku", - "video.hide": "Skry video", - "video.mute": "Stlm zvuk", - "video.pause": "Pauza", - "video.play": "Prehraj", - "video.unmute": "Zapni zvuk" + "video.close": "Zatvoriť video", + "video.download": "Stiahnuť súbor", + "video.exit_fullscreen": "Ukončiť režim celej obrazovky", + "video.expand": "Zväčšiť video", + "video.fullscreen": "Zobraziť na celú obrazovku", + "video.hide": "Skryť video", + "video.mute": "Stlmiť zvuk", + "video.pause": "Pozastaviť", + "video.play": "Prehrať", + "video.unmute": "Zapnúť zvuk" } diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index e6be3f3795..35bfc79f2e 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -277,7 +277,13 @@ "follow_request.authorize": "Odobri", "follow_request.reject": "Odbij", "follow_requests.unlocked_explanation": "Iako vaš nalog nije zaključan, osoblje {domain} smatra da biste možda želeli da ručno pregledate zahteve za praćenje sa ovih naloga.", + "follow_suggestions.curated_suggestion": "Izbor osoblja", "follow_suggestions.dismiss": "Ne prikazuj ponovo", + "follow_suggestions.hints.featured": "Ovaj profil je ručno izabrao tim {domain}.", + "follow_suggestions.hints.friends_of_friends": "Ovaj profil je popularan među ljudima koje pratite.", + "follow_suggestions.hints.most_followed": "Ovaj profil je jedan od najpraćenijih na {domain}.", + "follow_suggestions.hints.most_interactions": "Ovaj profil je nedavno dobio veliku pažnju na {domain}.", + "follow_suggestions.hints.similar_to_recently_followed": "Ovaj profil je sličan profilima koje ste nedavno zapratili.", "follow_suggestions.personalized_suggestion": "Personalizovani predlog", "follow_suggestions.popular_suggestion": "Popularni predlog", "follow_suggestions.view_all": "Prikaži sve", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 3143b5215e..dc20585c92 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -277,6 +277,7 @@ "follow_request.authorize": "Одобри", "follow_request.reject": "Одбиј", "follow_requests.unlocked_explanation": "Иако ваш налог није закључан, особље {domain} сматра да бисте можда желели да ручно прегледате захтеве за праћење са ових налога.", + "follow_suggestions.curated_suggestion": "Избор особља", "follow_suggestions.dismiss": "Не приказуј поново", "follow_suggestions.hints.featured": "Овај профил је ручно изабрао тим {domain}.", "follow_suggestions.hints.friends_of_friends": "Овај профил је популаран међу људима које пратите.", @@ -507,7 +508,7 @@ "onboarding.steps.publish_status.body": "Поздравите свет текстом, сликама, видео снимцима или анкетама {emoji}", "onboarding.steps.publish_status.title": "Напишите своју прву објаву", "onboarding.steps.setup_profile.body": "Појачајте своје интеракције тако што ћете имати свеобухватан профил.", - "onboarding.steps.setup_profile.title": "Персонализујтее свој профил", + "onboarding.steps.setup_profile.title": "Персонализујте свој профил", "onboarding.steps.share_profile.body": "Нека ваши пријатељи знају како да вас пронађу на Mastodon-у!", "onboarding.steps.share_profile.title": "Поделите свој Mastodon профил", "onboarding.tips.2fa": "Да ли сте знали? Можете да заштитите свој налог подешавањем двоструке потврде идентитета у подешавањима налога. Ради са било којом TOTP апликацијом по вашем избору, није потребан број телефона!", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index 4d2cc3d1dc..64c3f98db7 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -119,6 +119,7 @@ "compose_form.save_changes": "o sin e ni", "compose_form.spoiler.marked": "o weka e toki pi ijo ike ken", "confirmation_modal.cancel": "o pini", + "confirmations.block.block_and_report": "o weka e jan o toki e jan tawa lawa", "confirmations.block.confirm": "o weka", "confirmations.block.message": "sina o wile ala wile weka e jan {name}?", "confirmations.cancel_follow_request.confirm": "o weka e wile sina", @@ -132,20 +133,24 @@ "confirmations.domain_block.confirm": "o weka.", "confirmations.domain_block.message": "sina wile ala a wile a len e ma {domain} ꞏ ken suli la len jan taso li pona ꞏ len pi ma ni la sina ken ala lukin e ijo pi ma ni lon lipu toki ale anu lukin toki ꞏ len ni la jan kute sina pi ma ni li weka", "confirmations.edit.confirm": "o ante", + "confirmations.edit.message": "sina ante e toki sina la toki pali sina li weka. sina wile ala wile e ni?", "confirmations.logout.confirm": "o weka", "confirmations.logout.message": "sina wile ala wile weka", "confirmations.mute.confirm": "o len", + "confirmations.mute.explanation": "ni la sina lukin ala e toki ona e toki kepeken nimi ona. taso la ona li ken lukin e toki sina li ken kute e ona.", "confirmations.mute.message": "sina awen ala awen wile kute ala e {name}?", "confirmations.redraft.confirm": "o weka o pali sin e toki", "confirmations.redraft.message": "pali sin e toki ni la sina wile ala wile weka e ona? sina ni la suli pi toki ni en wawa pi toki ni li weka. kin la toki lon toki ni li jo e mama ala.", "confirmations.reply.confirm": "toki lon toki ni", - "confirmations.reply.message": "toki tawa ona li weka e toki pali sina ꞏ sina wile ala wile ni", + "confirmations.reply.message": "sina toki lon toki ni la toki pali sina li weka. sina wile ala wile e ni?", "confirmations.unfollow.confirm": "o pini kute", "confirmations.unfollow.message": "sina o wile ala wile pini kute e jan {name}?", "conversation.delete": "o weka e toki ni", "conversation.mark_as_read": "ni o sin ala", "conversation.open": "o lukin e toki", "conversation.with": "lon {names}", + "copy_icon_button.copied": "toki li awen lon ilo sina", + "copypaste.copy_to_clipboard": "o awen lon ilo sina", "directory.local": "tan {domain} taso", "directory.new_arrivals": "jan pi kama sin", "directory.recently_active": "jan lon tenpo poka", @@ -154,6 +159,9 @@ "dismissable_banner.community_timeline": "ni li toki pi tenpo poka tawa ale tan jan lon ma lawa pi nimi {domain}.", "dismissable_banner.dismiss": "o weka", "dismissable_banner.explore_links": "ni li toki pi ijo sin ꞏ jan mute li pana e ni lon tenpo suno ni ꞏ sin la jan mute li pana la ni li kama suli", + "dismissable_banner.explore_statuses": "suni ni la jan mute li lukin e toki ni. jan mute li wawa e toki li suli e toki la toki ni li lon sewi. toki li sin la toki ni li lon sewi.", + "dismissable_banner.explore_tags": "suni ni la jan mute li lukin e toki pi toki ni. jan mute li kepeken toki la toki ni li lon sewi.", + "dismissable_banner.public_timeline": "toki ni li sin. jan li pali e toki ni la jan ante mute pi ma {domain} li kute e jan ni.", "embed.preview": "ni li jo e sitelen ni:", "emoji_button.activity": "musi", "emoji_button.flags": "len ma", @@ -171,15 +179,25 @@ "empty_column.account_timeline": "toki ala li lon!", "empty_column.account_unavailable": "ken ala lukin e lipu jan", "empty_column.blocks": "jan ala li weka tawa sina.", + "empty_column.direct": "jan ala li toki len e sina. jan li toki len e sina la sina ken lukin e ni lon ni.", + "empty_column.domain_blocks": "ma ala li weka tawa sina.", + "empty_column.favourited_statuses": "sina suli ala e toki. sina suli e toki la sina ken lukin e toki ni lon ni.", + "empty_column.favourites": "jan ala li suli e toki ni. jan li suli e toki ni la sina ken lukin e ona lon ni.", + "empty_column.follow_requests": "jan ala li toki pi wile kute tawa sina. jan li toki pi wile kute tawa sina la sina ken lukin e toki ni lon ni.", "empty_column.followed_tags": "sina alasa ala e toki ꞏ sina alasa e toki la toki li lon ni", "empty_column.hashtag": "ala li lon toki ni", + "empty_column.home": "ala a li lon lipu open sina! sina wile lon e ijo lon ni la o kute e jan pi toki suli.", + "empty_column.list": "ala li lon kulupu lipu ni. jan pi kulupu lipu ni li toki sin la toki ni li lon ni.", + "empty_column.lists": "sina jo ala e kulupu lipu. sina pali sin e kulupu lipu la ona li lon ni.", "empty_column.mutes": "jan ala li len tawa sina.", + "error.unexpected_crash.explanation": "ilo li ken ala pana e lipu ni. ni li ken tan pakala mi tan pakala pi ilo sina.", "errors.unexpected_crash.report_issue": "o toki e pakala tawa lawa", "explore.search_results": "ijo pi alasa ni", "explore.suggested_follows": "jan", "explore.title": "o alasa", "explore.trending_links": "sin", "explore.trending_statuses": "toki", + "filter_modal.added.settings_link": "lipu lawa", "filter_modal.select_filter.expired": "tenpo pini", "filter_modal.select_filter.search": "o alasa anu pali", "firehose.all": "ale", @@ -187,6 +205,10 @@ "firehose.remote": "kulupu ante", "follow_request.authorize": "o ken", "follow_request.reject": "o ala", + "follow_suggestions.hints.friends_of_friends": "jan kute sina li lukin mute e toki pi jan ni.", + "follow_suggestions.hints.most_followed": "jan mute lon ma {domain} li kute e jan ni.", + "follow_suggestions.hints.most_interactions": "tenpo poka la jan mute pi ma {domain} li lukin mute e toki pi jan ni.", + "follow_suggestions.hints.similar_to_recently_followed": "sina kute e jan lon tenpo poka la jan ni li sama ona.", "follow_suggestions.view_all": "o lukin e ale", "follow_suggestions.who_to_follow": "sina o kute e ni", "footer.about": "sona", @@ -203,11 +225,14 @@ "hashtag.column_settings.tag_mode.any": "wan ni", "hashtag.column_settings.tag_mode.none": "ala ni", "home.pending_critical_update.link": "o lukin e ijo ilo sin", + "interaction_modal.login.action": "o lon tomo", "interaction_modal.on_another_server": "lon ma ante", "interaction_modal.on_this_server": "lon ma ni", "interaction_modal.title.favourite": "o suli e toki {name}", "interaction_modal.title.follow": "o kute e {name}", "interaction_modal.title.reblog": "o wawa e toki {name}", + "interaction_modal.title.reply": "o toki lon toki pi jan {name}", + "intervals.full.days": "{number, plural, other {suni #}}", "keyboard_shortcuts.blocked": "o lukin e lipu sina pi jan weka", "keyboard_shortcuts.boost": "o pana sin e toki", "keyboard_shortcuts.down": "o tawa anpa lon lipu", @@ -253,25 +278,42 @@ "navigation_bar.pins": "toki sewi", "navigation_bar.preferences": "wile sina", "navigation_bar.search": "o alasa", + "notification.admin.report": "jan {name} li toki e jan {target} tawa lawa", "notification.admin.sign_up": "{name} li kama", "notification.favourite": "{name} li suli e toki sina", "notification.follow": " {name} li kute e sina", "notification.follow_request": "{name} li wile kute e sina", "notification.mention": "jan {name} li toki e sina", + "notification.poll": "sina pana lon pana la pana ni li pini", "notification.reblog": "{name} li wawa e toki sina", "notification.status": "{name} li toki", "notification.update": "{name} li ante e toki", "notifications.column_settings.follow": "jan kute sin", + "notifications.column_settings.poll": "pana lon pana ni:", + "notifications.column_settings.reblog": "wawa:", + "notifications.column_settings.update": "ante toki:", "notifications.filter.all": "ale", + "notifications.filter.polls": "pana lon pana ni", "onboarding.compose.template": "toki a, #Mastodon o!", + "onboarding.profile.display_name": "nimi tawa jan ante", + "onboarding.share.lead": "o toki lon nasin Masoton pi alasa sina tawa jan", + "onboarding.share.message": "ilo #Mastodon la mi jan {username} a! o kute e mi lon ni: {url}", "onboarding.start.title": "sina o kama pona a!", + "onboarding.tips.migration": "sina sona ala sona e ni? tenpo kama la sina pilin ike tawa ma {domain} la, sina ken tawa ma ante lon ilo Masoton. jan li kute e sina la jan ni li awen kute e sina. kin la sina ken lawa e ma pi sina taso a!", "poll.total_people": "{count, plural, other {jan #}}", + "poll.total_votes": "{count, plural, other {pana #}}", + "poll.vote": "o pana", + "poll.voted": "sina pana e ni", + "poll.votes": "{votes, plural, other {pana #}}", + "privacy.direct.long": "jan ale lon toki", "privacy.public.short": "tawa ale", "relative_time.full.just_now": "tenpo ni", "relative_time.just_now": "tenpo ni", "relative_time.today": "tenpo suno ni", "report.block": "o weka e jan", "report.block_explanation": "sina kama lukin ala e toki ona. ona li kama ala ken lukin e toki sina li kama ala ken kute e sina. ona li ken sona e kama ni.", + "report.categories.other": "ante", + "report.categories.spam": "ike tan toki mute", "report.category.title": "ike seme li lon {type} ni", "report.category.title_account": "lipu", "report.category.title_status": "toki", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 4962aedad5..f52f283810 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -6,7 +6,7 @@ "about.domain_blocks.preamble": "Mastodon 基本上允許您瀏覽聯邦宇宙中任何伺服器的內容並與使用者互動。以下是在本伺服器上設定的例外。", "about.domain_blocks.silenced.explanation": "一般來說您不會看到來自這個伺服器的個人檔案和內容,除非您明確搜尋或主動跟隨對方。", "about.domain_blocks.silenced.title": "已受限", - "about.domain_blocks.suspended.explanation": "來自此伺服器的資料都不會被處理、儲存或交換,也無法與此伺服器上的使用者互動或交流。", + "about.domain_blocks.suspended.explanation": "來自此伺服器的資料都不會被處理、儲存或交換,也無法和此伺服器上的使用者互動與交流。", "about.domain_blocks.suspended.title": "已停權", "about.not_available": "無法於本伺服器上使用此資訊。", "about.powered_by": "由 {mastodon} 提供的去中心化社群媒體", @@ -212,7 +212,7 @@ "emoji_button.custom": "自訂", "emoji_button.flags": "旗幟", "emoji_button.food": "食物 & 飲料", - "emoji_button.label": "插入表情符號", + "emoji_button.label": "插入 emoji 表情符號", "emoji_button.nature": "自然", "emoji_button.not_found": "啊就沒這表情符號吼!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "物件", @@ -227,7 +227,7 @@ "empty_column.account_timeline": "這裡還沒有嘟文!", "empty_column.account_unavailable": "無法取得個人檔案", "empty_column.blocks": "您還沒有封鎖任何使用者。", - "empty_column.bookmarked_statuses": "您還沒有建立任何書籤。當您建立書籤時,它將於此顯示。", + "empty_column.bookmarked_statuses": "您還沒有新增任何書籤。當您新增書籤時,它將於此顯示。", "empty_column.community": "本站時間軸是空的。快公開嘟些文搶頭香啊!", "empty_column.direct": "您還沒有收到任何私訊。當您私訊別人或收到私訊時,它將於此顯示。", "empty_column.domain_blocks": "尚未封鎖任何網域。", @@ -239,7 +239,7 @@ "empty_column.hashtag": "這個主題標籤下什麼也沒有。", "empty_column.home": "您的首頁時間軸是空的!跟隨更多人來將它填滿吧!", "empty_column.list": "這份列表下什麼也沒有。當此列表的成員嘟出新的嘟文時,它們將顯示於此。", - "empty_column.lists": "您還沒有建立任何列表。當您建立列表時,它將於此顯示。", + "empty_column.lists": "您還沒有新增任何列表。當您新增列表時,它將於此顯示。", "empty_column.mutes": "您尚未靜音任何使用者。", "empty_column.notifications": "您還沒有收到任何通知,當您與別人開始互動時,它將於此顯示。", "empty_column.public": "這裡什麼都沒有!嘗試寫些公開的嘟文,或者跟隨其他伺服器的使用者後,就會有嘟文出現了", @@ -322,10 +322,10 @@ "home.pending_critical_update.link": "檢視更新內容", "home.pending_critical_update.title": "有可取得的重要安全性更新!", "home.show_announcements": "顯示公告", - "interaction_modal.description.favourite": "在 Mastodon 上有個帳號的話,您可以將此嘟文加入最愛以讓作者知道您欣賞它且將它儲存下來。", - "interaction_modal.description.follow": "在 Mastodon 上有個帳號的話,您可以跟隨 {name} 以於首頁時間軸接收他們的嘟文。", - "interaction_modal.description.reblog": "在 Mastodon 上有個帳號的話,您可以轉嘟此嘟文以分享給您的跟隨者們。", - "interaction_modal.description.reply": "在 Mastodon 上有個帳號的話,您可以回覆此嘟文。", + "interaction_modal.description.favourite": "若於 Mastodon 上有個帳號,您可以將此嘟文加入最愛使作者知道您欣賞它且將它儲存下來。", + "interaction_modal.description.follow": "若於 Mastodon 上有個帳號,您可以跟隨 {name} 以於首頁時間軸接收他們的嘟文。", + "interaction_modal.description.reblog": "若於 Mastodon 上有個帳號,您可以轉嘟此嘟文以分享給您的跟隨者們。", + "interaction_modal.description.reply": "若於 Mastodon 上有個帳號,您可以回覆此嘟文。", "interaction_modal.login.action": "返回首頁", "interaction_modal.login.prompt": "您帳號所屬伺服器之網域,例如:mastodon.social", "interaction_modal.no_account_yet": "還沒有 Mastodon 帳號嗎?", @@ -347,7 +347,7 @@ "keyboard_shortcuts.compose": "將游標移至文字撰寫區塊", "keyboard_shortcuts.description": "說明", "keyboard_shortcuts.direct": "開啟私訊對話欄", - "keyboard_shortcuts.down": "往下移動", + "keyboard_shortcuts.down": "向下移動", "keyboard_shortcuts.enter": "檢視嘟文", "keyboard_shortcuts.favourite": "加到最愛", "keyboard_shortcuts.favourites": "開啟最愛列表", @@ -373,7 +373,7 @@ "keyboard_shortcuts.toggle_sensitivity": "顯示或隱藏媒體", "keyboard_shortcuts.toot": "發個新嘟文", "keyboard_shortcuts.unfocus": "跳離文字撰寫區塊或搜尋框", - "keyboard_shortcuts.up": "往上移動", + "keyboard_shortcuts.up": "向上移動", "lightbox.close": "關閉", "lightbox.compress": "折疊圖片檢視框", "lightbox.expand": "展開圖片檢視框", @@ -483,7 +483,7 @@ "onboarding.actions.go_to_home": "前往您的首頁時間軸", "onboarding.compose.template": "哈囉 #Mastodon!", "onboarding.follows.empty": "很遺憾,目前未能顯示任何結果。您可以嘗試使用搜尋、瀏覽探索頁面以找尋人們跟隨、或稍候再試。", - "onboarding.follows.lead": "您的首頁時間軸是 Mastodon 的核心體驗。若您跟隨更多人的話,它將會變得更活躍有趣。這些個人檔案也許是個好起點,您可以隨時取消跟隨他們!", + "onboarding.follows.lead": "您的首頁時間軸是 Mastodon 的核心體驗。若您跟隨更多人,它將會變得更活躍有趣。這些個人檔案也許是個好起點,您可以隨時取消跟隨他們!", "onboarding.follows.title": "客製化您的首頁時間軸", "onboarding.profile.discoverable": "使我的個人檔案可以被找到", "onboarding.profile.discoverable_hint": "當您於 Mastodon 上選擇加入可發現性時,您的嘟文可能會出現於搜尋結果與趨勢中。您的個人檔案可能會被推薦給與您志趣相投的人。", @@ -505,7 +505,7 @@ "onboarding.start.title": "噹噹!完成啦!", "onboarding.steps.follow_people.body": "Mastodon 的趣味就是跟隨些有趣的人們!", "onboarding.steps.follow_people.title": "客製化您的首頁時間軸", - "onboarding.steps.publish_status.body": "向新世界打聲招呼吧。", + "onboarding.steps.publish_status.body": "透過文字、照片、影片或投票 {emoji} 向新世界打聲招呼吧。", "onboarding.steps.publish_status.title": "撰寫您第一則嘟文", "onboarding.steps.setup_profile.body": "若您完整填寫個人檔案,其他人比較願意與您互動。", "onboarding.steps.setup_profile.title": "客製化您的個人檔案", @@ -526,7 +526,7 @@ "poll.vote": "投票", "poll.voted": "您已對此問題投票", "poll.votes": "{votes, plural, one {# 張票} other {# 張票}}", - "poll_button.add_poll": "建立投票", + "poll_button.add_poll": "新增投票", "poll_button.remove_poll": "移除投票", "privacy.change": "調整嘟文隱私狀態", "privacy.direct.long": "此嘟文提及之所有人", @@ -716,7 +716,7 @@ "units.short.million": "{count}M", "units.short.thousand": "{count}K", "upload_area.title": "拖放來上傳", - "upload_button.label": "上傳圖片、影片、或者音樂檔案", + "upload_button.label": "上傳圖片、影片、或者音訊檔案", "upload_error.limit": "已達到檔案上傳限制。", "upload_error.poll": "不允許於投票時上傳檔案。", "upload_form.audio_description": "為聽障人士增加文字說明", diff --git a/config/locales/activerecord.kab.yml b/config/locales/activerecord.kab.yml index 909ff68c24..b3ca90069b 100644 --- a/config/locales/activerecord.kab.yml +++ b/config/locales/activerecord.kab.yml @@ -19,7 +19,7 @@ kab: account: attributes: username: - invalid: isekkilen, uṭṭunen d yijerriden n wadda kan + invalid: ilaq ad ilin isekkilen, uṭṭunen d yijerriden n wadda kan reserved: yettwaṭṭef status: attributes: diff --git a/config/locales/activerecord.sk.yml b/config/locales/activerecord.sk.yml index d13c416e51..809d006471 100644 --- a/config/locales/activerecord.sk.yml +++ b/config/locales/activerecord.sk.yml @@ -7,11 +7,11 @@ sk: options: Voľby user: agreement: Dohoda o poskytovaní služieb - email: Emailová adresa + email: E-mailová adresa locale: Jazyk password: Heslo user/account: - username: Meno používateľa + username: Používateľské meno user/invite_request: text: Dôvod errors: @@ -41,9 +41,9 @@ sk: attributes: email: blocked: používa nepovoleného poskytovateľa e-mailu - unreachable: zdá sa, že neexistuje + unreachable: vyzerá, že neexistuje role_id: - elevated: nemôže byť vyššia ako vaša súčasná rola + elevated: nemôže byť viac ako vaša súčasná rola user_role: attributes: permissions_as_keys: @@ -51,9 +51,9 @@ sk: elevated: nemôže obsahovať povolenia, ktoré vaša aktuálna rola nemá own_role: nie je možné zmeniť s vašou aktuálnou rolou position: - elevated: nemôže byť vyššia ako vaša súčasná rola + elevated: nemôže byť viac ako vaša súčasná rola own_role: nie je možné zmeniť s vašou aktuálnou rolou webhook: attributes: events: - invalid_permissions: nemožno zahrnúť udalosti, ku ktorým nemáte práva + invalid_permissions: nemôže zahrnúť udalosti, ku ktorým nemáte práva diff --git a/config/locales/af.yml b/config/locales/af.yml index 62c52fa493..adc9d5dbd5 100644 --- a/config/locales/af.yml +++ b/config/locales/af.yml @@ -173,5 +173,3 @@ af: warning: title: silence: Rekening beperk - welcome: - edit_profile_action: Stel profiel op diff --git a/config/locales/an.yml b/config/locales/an.yml index 7ad1986b24..27abf2203a 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -1596,8 +1596,6 @@ an: silence: Cuenta limitada suspend: Cuenta suspendida welcome: - edit_profile_action: Configurar lo perfil - edit_profile_step: Puetz personalizar lo tuyo perfil puyando una foto de perfil, cambiando lo tuyo nombre d'usuario y muito mas. Puetz optar per revisar a los nuevos seguidores antes que puedan seguir-te. explanation: Aquí i hai qualques consellos pa empecipiar subject: Bienveniu a Mastodon title: Te damos la bienvenida a bordo, %{name}! diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 8e9338d80a..2e227f53a7 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -1965,8 +1965,6 @@ ar: silence: الحساب محدود suspend: الحساب مُعلَّق welcome: - edit_profile_action: تهيئة الملف التعريفي - edit_profile_step: يمكنك تخصيص ملفك الشخصي عن طريق رفع صورة ملفك الشخصي, تغيير اسم العرض الخاص بك والمزيد. يمكنك اختيار مراجعة المتابعين الجدد قبل السماح لهم بمتابعتك. explanation: ها هي بعض النصائح قبل بداية الاستخدام subject: أهلًا بك على ماستدون title: أهلاً بك، %{name}! diff --git a/config/locales/ast.yml b/config/locales/ast.yml index ee9105b05f..9b9d5510c0 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -899,8 +899,6 @@ ast: none: Alvertencia suspend: Cuenta suspendida welcome: - edit_profile_action: Configurar el perfil - edit_profile_step: Pues personalizar el perfil pente la xuba d'una semeya, el cambéu del nome visible ya muncho más. Tamién, si lo prefieres, pues revisar los perfiles nuevos enantes de que puedan siguite. explanation: Equí tienes dalgunos conseyos pa que comiences subject: Afáyate en Mastodon title: "¡Afáyate, %{name}!" diff --git a/config/locales/be.yml b/config/locales/be.yml index bd75870a18..d0cc96d6d8 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1906,9 +1906,42 @@ be: silence: Уліковы запіс абмежаваны suspend: Уліковы запіс выключаны welcome: - edit_profile_action: Наладзіць профіль - edit_profile_step: Вы можаце наладзіць свой профіль, запампаваўшы выяву профілю, змяніўшы адлюстраванае імя і іншае. Вы можаце праглядаць новых падпісчыкаў, перш чым ім будзе дазволена падпісацца на вас. + apps_android_action: Спампаваць з Google Play + apps_ios_action: Спампваваць з App Store + apps_step: Спампуйце нашыя афіцыйныя праграмы. + apps_title: Кліенты Mastodon + checklist_subtitle: 'Давайце паспрабуем разабрацца ў гэтай новай сацыяльнай сетцы:' + checklist_title: З чаго пачаць + edit_profile_action: Персаналізаваць + edit_profile_step: Узмацніце ўзаемадзеянне, запоўніўшы поўны профіль. + edit_profile_title: Наладзьце свой профіль explanation: Вось некаторыя парады каб пачаць + feature_action: Даведацца больш + feature_audience: Mastodon дае ўнікальную магчымасць кіраваць сваёй аўдыторыяй без пасрэднікаў. Маючы сервер Mastodon, разгорнуты на ўласнай інфраструктуры, яго карыстальнікі могуць узаемадзейнічаць з любым іншым серверам Mastodon, не аддаючы кантроль у чужыя рукі. + feature_audience_title: Фармуйце сваю аўдыторыю з упэўненасцю + feature_control: Толькі вы дакладна ведаеце, што хочаце бачыць на сваім серверы. Ніякіх алгарытмаў або рэкламы, якія марнуюць ваш час. Сачыце за любым серверам Mastodon з аднаго ўліковага запісу і атрымлівайце паведамленні ў храналагічным парадку, каб ваш куток Інтэрнэту быў крыху падобны на вас. + feature_control_title: Кіруйце сваёй стужкай + feature_creativity: Mastodon падтрымлівае публікацыі з аўдыя, відэа і малюнкамі, апісаннем даступнасці, апытаннямі, папярэджаннямі аб змесце, аніміраванымі аватарамі, карыстальніцкімі эмодзі, мініяцюрамі, элементамі кіравання абрэзкай мініяцюр і іншым. Незалежна ад таго, дзеліцеся вы сваім мастацтвам, музыкай або падкастам, Mastodon тут для вас. + feature_creativity_title: Неабмежаваны творчы патэнцыял + feature_moderation: Mastodon вяртае прыняцце рашэнняў у вашыя рукі. У адрозненне ад сацыяльных сетак, якія належаць карпарацыям, якія спускаюць свае правілы зверху, кожны сервер Mastodon усталёўвае свае правілы і нормы, якія выконваюцца на мясцовым узроўні, што робіць іх найболей гнуткімі ў задавальненні запатрабаванняў розных груп людзей. Далучайцеся да сервера з правіламі, з якімі вы згодны, ці стварыце свой уласны. + feature_moderation_title: Мадэрацыя, якой яна павінна быць + follow_action: Падпісацца + follow_step: Падпіска на цікавых людзей - гэта галоўнае ў Mastodon. + follow_title: Наладзьце сваю хатнюю стужку + follows_subtitle: Падпішыцеся на папулярных карыстальнікаў + follows_title: На каго падпісацца + follows_view_more: Прагледзець больш людзей, на якіх варта падпісацца + hashtags_recent_count: "%{people} людзей за апошнія %{days} дні" + hashtags_subtitle: Даведайцеся што было папулярна ў апошнія 2 дні + hashtags_title: Папулярныя хэштэгі + hashtags_view_more: Прагледзець іншыя папулярныя хэштэгі + post_action: Стварыць + post_step: Скажыце ўсім прывітанне з дапамогай тэксту, фатаграфій, відэа і апытанняў. + post_title: Стварыце свой першы допіс + share_action: Абагуліць + share_step: Няхай вашыя сябры ведаюць, як знайсці вас у Mastodon. + share_title: Абагульце ваш профіль у Mastodon + sign_in_action: Увайсці subject: Вітаем у Mastodon title: Рады вітаць вас, %{name}! users: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 3d1b6d291f..8689b0359e 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -767,6 +767,7 @@ bg: disabled: До никого users: До влезнали локални потребители registrations: + moderation_recommandation: Уверете се, че имате адекватен и реактивен модераторски екип преди да отворите регистриранията за всеки! preamble: Управлява кой може да създава акаунт на сървъра ви. title: Регистрации registrations_mode: @@ -774,6 +775,7 @@ bg: approved: Изисква се одобрение за регистриране none: Никой не може да се регистрира open: Всеки може да се регистрира + warning_hint: Препоръчваме употребата на „Изисква се одобрение за регистриране“, освен ако сте уверени, че екипът ви за модериране може да се справи със спама и зловредните регистрирания своевременно. security: authorized_fetch: Изисква се удостоверяване от федеративни сървъри authorized_fetch_hint: Изискването удостоверяване от феративните сървъри позволява по-строго прилагане на блокирания както на ниво потребител, така и на ниво сървър. Това обаче снижава производителността, намалява обхвата на вашите отговори и може да възникнат проблеми със съвместимостта с някои федеративни услуги. Освен това, то не пречи на посветени участници да извличат вашите обществени публикации и акаунти. @@ -966,6 +968,9 @@ bg: title: Уебкуки webhook: Уебкука admin_mailer: + auto_close_registrations: + body: Поради липса на скорошна дейност по модериране, регистрациите на %{instance} бяха самодейно превключени в режим, изискващ ръчна проверка, за да се предотврати употребата на %{instance} като платформа за потенциални зложелатели. Може да превключите обратно в режим „отворено регистриране“ по всяко време. + subject: Регистриранията за %{instance} са самодейно превключени към изискване на одобрение new_appeal: actions: delete_statuses: за изтриване на публикациите им @@ -1009,7 +1014,7 @@ bg: remove: Разкачвне на псевдонима appearance: advanced_web_interface: Разширен уеб интерфейс - advanced_web_interface_hint: 'Ако желаете да се възползвате от цялата ширина на своя екран, разширеният уеб интерфейс ще ви позволи да настроите няколко различни колони, за да виждате едновременно различна информация: Начало, известия, федерирана хронология, множество списъци и хаштагове.' + advanced_web_interface_hint: 'Ако искате да употребявате цялата ширина на екрана си, разширеният уеб интерфейс ви позволява да настроите най-различни колони, за да виждате едновременно множество сведения, колкото искате: Начало, известия, федеративен инфоканал, произволен брой списъци и хаштагове.' animations_and_accessibility: Анимация и достъпност confirmation_dialogs: Диалогов прозорец за потвърждение discovery: Откриване @@ -1837,9 +1842,42 @@ bg: silence: Акаунтът има ограничение suspend: Акаунтът е спрян welcome: - edit_profile_action: Настройване на профила - edit_profile_step: Може да настроите профила си, качвайки снимката на профила, променяйки показваното си име и други неща. Може да се включите за преглед на нови последователи преди да бъдат позволени да ви последват. + apps_android_action: Вземане от Google Play + apps_ios_action: Изтегляне в App Store + apps_step: Изтегляне на служебните ни приложения. + apps_title: Приложения на Mastodon + checklist_subtitle: 'Нека започнем приключение в тази нова социална граница:' + checklist_title: Добре дошли при контролния списък + edit_profile_action: Персонализиране + edit_profile_step: Подсилете взаимодействията си, изграждайки цялостен профил. + edit_profile_title: Пригодете профила си explanation: Ето няколко стъпки за начало + feature_action: Научете повече + feature_audience: Mastodon ви осигурява с неповторимата възможност на управление на публиката ви без посредници. Mastodon се разгръща на ваша собствена инфраструктура, позволяваща ви да следвате и да бъдете последвани от всеки друг сървър на Mastodon в мрежата и не е под ничий контрол освен ваш. + feature_audience_title: Изградете публиката си с увереност + feature_control: Вие знаете най-добре какво искате да виждате на началния си инфоканал. Няма алгоритми или реклами, за да ви губят времето. Последвате всекиго през всеки сървър на Mastodon от един акаунт и получавате публикациите им в хронологичен ред, а и правете свое кътче в интернет малко по-подобно на вас. + feature_control_title: Поддържайте управлението на часовата си ос + feature_creativity: Mastodon поддържа публикации със звук, картина и видео, описания на достъпността, анкети, предупреждения за съдържание, анимирани аватари, потребителски емоджита, контрол на изрязване на миниобрази и още, за да ви помогнат да се изразите в мрежата. Независимо дали публикувате свое изкуство, музика или свой подкаст, то Mastodon е там за вас. + feature_creativity_title: Несравнимо творчество + feature_moderation: Mastodon връща вземането на решения в ръцете ви. Всеки сървър сътворява свои правила и регулации, прилагащи се локално, а не отгоре надолу като корпоративна социална медия, което го прави най-гъвкав в отговор на нуждите на различни групи хора. Присъединете се към сървър, с който сте съгласни, или пък си хоствайте свой. + feature_moderation_title: Модерирайте начина, по който трябва да е + follow_action: Последване + follow_step: Последването на интересни хора е основната цел на Mastodon. + follow_title: Персонализиране на началния ви инфоканал + follows_subtitle: Следвайте добре известни акаунти + follows_title: Кого да се последва + follows_view_more: Преглед на още хора за последване + hashtags_recent_count: "%{people} души за последните %{days} дни" + hashtags_subtitle: Проучете какво изгрява от последните 2 дни + hashtags_title: Изгряващи хаштагове + hashtags_view_more: Преглед на още изгряващи хаштагове + post_action: Съставяне + post_step: Поздравете света с текст, снимки, видео или анкети. + post_title: Направете първата си публикация + share_action: Споделяне + share_step: Позволете на приятелите си да знаят как да ви намират в Mastodon. + share_title: Споделете профила си в Mastodon + sign_in_action: Вход subject: Добре дошли в Mastodon title: Добре дошли на борда, %{name}! users: diff --git a/config/locales/br.yml b/config/locales/br.yml index 01c6db4ef5..fa6d266f62 100644 --- a/config/locales/br.yml +++ b/config/locales/br.yml @@ -560,7 +560,16 @@ br: title: none: Diwall welcome: - edit_profile_action: Kefluniañ ar profil + apps_android_action: Tapit anezhañ war Google Play + apps_ios_action: Pellgargañ war an App Store + apps_step: Pellgargit hon arloadoù ofisiel. + apps_title: Arloadoù Mastodon + edit_profile_action: Personelaat + edit_profile_title: Personelaat ho profil + feature_action: Gouzout hiroc'h + follow_action: Heuliañ + share_action: Rannañ + sign_in_action: Kevreañ subject: Donemat e Mastodon title: Degemer mat e bourzh, %{name}! users: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index d4213a258e..15a06559be 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1842,9 +1842,42 @@ ca: silence: Compte limitat suspend: Compte suspès welcome: - edit_profile_action: Configura el perfil - edit_profile_step: Pots personalitzar el teu perfil pujant-hi un avatar, canviant el teu nom de visualització i molt més. Si ho prefereixes, pots revisar els seguidors nous abans que et puguin seguir. + apps_android_action: Obteniu-lo a Google Play + apps_ios_action: Descarregueu-la de la botiga d'aplicacions + apps_step: Descarregueu-vos les aplicacions oficials. + apps_title: Aplicacions de Mastodon + checklist_subtitle: 'Inicieu-vos en aquesta nova frontera social:' + checklist_title: Control inicial + edit_profile_action: Personalitzeu + edit_profile_step: Augmenteu les vostres interaccions amb un perfil complet. + edit_profile_title: Personalitzeu el perfil explanation: Aquests són alguns consells per a començar + feature_action: Per a saber-ne més + feature_audience: Mastodon us proporciona una possibilitat única de gestionar la vostra audiència sense intermediaris. Instal·lat a la vostra pròpia infraestructura us permet seguir i ser seguit només per altres servidors Mastodon i ningú més que vosaltres el controla. + feature_audience_title: Construïu la vostra audiència en confiança + feature_control: Sabeu perfectament què voleu veure a la línia temporal. Sense algorismes ni anuncis que us facin malbaratar el temps. Seguiu qualsevol persona de qualsevol servidor Mastodon des d'un sol compte en ordre cronològic i feu-vos a mida un racó d'internet. + feature_control_title: Tingueu el control de la vostra línia temporal + feature_creativity: Mastodon us permet de publicar àudio, vídeo i imatges, descripcions d'accessibilitat, enquestes, avisos de contingut, avatars animats, emojis personalitzats, retallar miniatures i més, a fi d'ajudar-vos a expressar-vos en línia. Tant si publiqueu el vostre art, música o un podcast, Mastodon us ajudarà. + feature_creativity_title: Creativitat incomparable + feature_moderation: Mastodon posa les decisions a les vostres mans. Cada servidor crea les seves pròpies regles, que només s'apliquen als usuaris locals, a diferència de les xarxes socials corporatives, permetent una flexibilitat que s'adapta a tota mena de grups. Uniu-vos a un servidor si esteu d'acord amb les seves regles, o creeu-ne un. + feature_moderation_title: Moderant com ha de ser + follow_action: Seguiu + follow_step: Mastodon va de seguir gent interessant. + follow_title: Personalitzeu la pantalla d'inici + follows_subtitle: Seguiu comptes populars + follows_title: A qui seguir + follows_view_more: Més persones a qui seguir + hashtags_recent_count: "%{people} persones en els últims %{days} dies" + hashtags_subtitle: Exploreu què és tendència des de fa 2 dies + hashtags_title: Etiquetes en tendència + hashtags_view_more: Més etiquetes en tendència + post_action: Redacteu + post_step: Saludeu el món amb text, fotos, vídeos o enquestes. + post_title: Feu la primera publicació + share_action: Compartiu + share_step: Permeteu als vostres amics de saber com trobar-vos a Mastodon. + share_title: Compartiu el perfil + sign_in_action: Inicieu sessió subject: Et donem la benvinguda a Mastodon title: Benvingut a bord, %{name}! users: diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index 7f1c28defc..f4733c27e5 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -1032,7 +1032,6 @@ ckb: silence: هەژماری سنووردار suspend: هەژمار ڕاگیرا welcome: - edit_profile_action: پرۆفایلی جێگیرکردن explanation: ئەمە چەند ئامۆژگارییەکن بۆ دەست پێکردنت subject: بەخێربیت بۆ ماستۆدۆن title: بەخێربێیت، بەکارهێنەر %{name}! diff --git a/config/locales/co.yml b/config/locales/co.yml index ecf8606455..8668cc6953 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -1047,7 +1047,6 @@ co: silence: Contu limitatu suspend: Contu suspesu welcome: - edit_profile_action: Cunfigurazione di u prufile explanation: Eccu alcune idee per principià subject: Benvenutu·a nant’à Mastodon title: Benvenutu·a, %{name}! diff --git a/config/locales/cs.yml b/config/locales/cs.yml index fd24ac05c6..2ecc360666 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1906,8 +1906,6 @@ cs: silence: Účet omezen suspend: Účet pozastaven welcome: - edit_profile_action: Nastavit profil - edit_profile_step: Váš profil si můžete přizpůsobit nahráním profilového obrázku, změnou zobrazovaného jména a dalším. Můžete se přihlásit k přezkoumání nových následovatelů, než vás budou moci následovat. explanation: Zde je pár tipů do začátku subject: Vítejte na Mastodonu title: Vítejte na palubě, %{name}! diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 241d599464..17c4280508 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1970,9 +1970,42 @@ cy: silence: Cyfrif cyfyngedig suspend: Cyfrif wedi'i atal welcome: - edit_profile_action: Sefydlu proffil - edit_profile_step: Gallwch addasu'ch proffil trwy lwytho llun proffil, newid eich enw dangos a mwy. Gallwch ddewis i adolygu dilynwyr newydd cyn iddyn nhw gael caniatâd i'ch dilyn. + apps_android_action: Ar gael ar Google Play + apps_ios_action: Ei lwytho i lawr o'r App Store + apps_step: Llwythwch i awr ein apiau swyddogol. + apps_title: Apiau Mastodon + checklist_subtitle: 'Gadewch i ni eich rhoi ar ben ffordd ar y datblygiad cymdeithasol newydd hon:' + checklist_title: Rhestr Wirio Croeso + edit_profile_action: Personoli + edit_profile_step: Rhowch hwb i'ch rhyngweithiadau trwy gael proffil cynhwysfawr. + edit_profile_title: Personoli'ch proffil explanation: Dyma ambell nodyn i'ch helpu i ddechrau + feature_action: Dysgu mwy + feature_audience: Mae Mastodon yn rhoi posibilrwydd unigryw i chi reoli'ch cynulleidfa'n ddirwystr. Mae'r Mastodon sy'n cael ei ddefnyddio ar eich seilwaith eich hun yn caniatáu ichi ddilyn a chael eich dilyn o unrhyw weinydd Mastodon arall ar-lein ac nid yw o dan reolaeth neb ond eich un chi. + feature_audience_title: Adeiladu eich cynulleidfa gyda hyder + feature_control: Chi sy'n gwybod orau beth rydych chi am ei weld ar eich llif cartref. Dim algorithmau na hysbysebion i wastraffu'ch amser. Dilynwch unrhyw un ar draws unrhyw weinydd Mastodon o gyfrif sengl a derbyn eu postiadau mewn trefn gronolegol, a gwnewch eich cornel chi o'r rhyngrwyd ychydig yn debycach i chi. + feature_control_title: Cadwch reolaeth ar eich llinell amser eich hun + feature_creativity: Mae Mastodon yn cefnogi postiadau sain, fideo a llun, disgrifiadau hygyrchedd, arolygon barn, rhybuddion cynnwys, afatarau animeiddiedig, emojis wedi'u teilwra, rheolaeth lluniau bach a mwy, i'ch helpu chi i fynegi'ch hun ar-lein. P'un a ydych chi'n cyhoeddi'ch celf, eich cerddoriaeth, neu'ch podlediad, mae Mastodon yno i chi. + feature_creativity_title: Creadigrwydd heb ei ail + feature_moderation: Mae Mastodon yn gosod penderfyniadau'n ôl yn eich dwylo chi. Mae pob gweinydd yn creu eu rheolau a'u rheoliadau eu hunain, sy'n cael eu gorfodi'n lleol ac nid o'r top i lawr fel cyfryngau cymdeithasol corfforaethol, gan ei wneud yn fwyaf hyblyg wrth ymateb i anghenion gwahanol grwpiau o bobl. Ymunwch â gweinydd gyda'r rheolau rydych chi'n cytuno â nhw, neu gwesteiwch eich un chi. + feature_moderation_title: Cymedroli'r ffordd y dylai fod + follow_action: Dilyn + follow_step: Dilyn pobl ddiddorol yw hanfod Mastodon. + follow_title: Personoli eich llif cartref + follows_subtitle: Dilynwch gyfrifon adnabyddus + follows_title: Pwy i ddilyn + follows_view_more: Gweld mwy o bobl i ddilyn + hashtags_recent_count: "%{people} person yn y %{days} diwrnod diwethaf" + hashtags_subtitle: Gweld beth sy'n tueddu dros y 2 ddiwrnod diwethaf + hashtags_title: Hashnodau tuedd + hashtags_view_more: Gweld mwy o hashnodau tuedd + post_action: Creu + post_step: Dywedwch helo wrth y byd gyda thestun, lluniau, fideos neu arolygon barn. + post_title: Creu'ch postiad cyntaf + share_action: Rhannu + share_step: Gadewch i'ch ffrindiau wybod sut i ddod o hyd i chi ar Mastodon! + share_title: Rhannwch eich proffil Mastodon + sign_in_action: Mewngofnodi subject: Croeso i Mastodon title: Croeso, %{name}! users: diff --git a/config/locales/da.yml b/config/locales/da.yml index 6bc0d96797..527f2240c7 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1842,9 +1842,42 @@ da: silence: Konto begrænset suspend: Konto suspenderet welcome: - edit_profile_action: Opsæt profil - edit_profile_step: Man kan tilpasse sin profil ved at uploade profilfoto, overskrift, ændre visningsnavn mv. Ønskes nye følgere vurderet, før de må følge dig, kan kontoen låses. + apps_android_action: Hent den fra Google Play + apps_ios_action: Download i App Store + apps_step: Download vores officielle apps. + apps_title: Mastodon apps + checklist_subtitle: 'Kom i gang på denne nye sociale frontløber:' + checklist_title: Velkomsttjekliste + edit_profile_action: Personliggør + edit_profile_step: Andre er mere tilbøjelige til at interagere med brugere med udfyldte profiler. + edit_profile_title: Personliggør din profil explanation: Her er nogle råd for at få dig i gang + feature_action: Læs mere + feature_audience: Mastodon giver brugeren en unik mulighed for at styre sit publikum uden mellemled. Mastodon udrullet på egen infrastruktur giver mulighed for at følge og blive fulgt fra enhver anden Mastodon-server online, kontrolleret/styret alene af brugen selv. + feature_audience_title: Opbyg et publikum i tillid + feature_control: Man ved selv bedst, hvad man ønsker at se på sit hjemmefeed. Ingen algoritmer eller annoncer til at spilde tiden. Følg alle på tværs af enhver Mastodon-server fra en enkelt konto og modtag deres indlæg i kronologisk rækkefølge, og gør dette hjørne af internet lidt mere personligt. + feature_control_title: Hold styr på egen tidslinje + feature_creativity: Mastodon understøtter indlæg med lyd, video og billede, tilgængelighedsbeskrivelser, meningsmålinger, indhold advarsler, animerede avatarer, tilpassede emojis, miniaturebeskæringskontrol og mere, for at gøre det lettere at udtrykke sig online. Uanset om man udgiver sin kunst, musik eller podcast, så står Mastodon til rådighed. + feature_creativity_title: Uovertruffen kreativitet + feature_moderation: Mastodon lægger beslutningstagning tilbage i brugerens hænder. Hver server opretter deres egne regler og reguleringer, som håndhæves lokalt og ikke ovenfra som virksomhedernes sociale medier, hvilket gør det til den mest fleksible mht. at reagere på behovene hos forskellige persongrupper. Deltag på en server med de regler, man er enige med, eller driv en egen server. + feature_moderation_title: Moderering af måden, tingene bør være på + follow_action: Følg + follow_step: At følge interessante personer, det er, hvad Mastodon handler om. + follow_title: Personliggør hjemmefeedet + follows_subtitle: Følg velkendte konti + follows_title: Hvem, som skal følges + follows_view_more: Vis nogle personer at følge + hashtags_recent_count: "%{people} personer de seneste %{days} dage" + hashtags_subtitle: Udforsk de seneste 2 dages tendenser + hashtags_title: Populære hashtags + hashtags_view_more: Se flere populære hashtags + post_action: Skriv + post_step: Sig hej til verden med tekst, fotos, videoer eller afstemninger. + post_title: Opret det første indlæg + share_action: Del + share_step: Lad vennerne vide, hvor man kan findes på Mastodon. + share_title: Del Mastodon-profilen + sign_in_action: Log ind subject: Velkommen til Mastodon title: Velkommen ombord, %{name}! users: diff --git a/config/locales/de.yml b/config/locales/de.yml index 0636122373..262c0166c9 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -425,7 +425,7 @@ de: view: Domain-Sperre ansehen email_domain_blocks: add_new: Neue hinzufügen - allow_registrations_with_approval: Registrierungen mit Genehmigung erlauben + allow_registrations_with_approval: Registrierungen mit Genehmigung zulassen attempts_over_week: one: "%{count} Registrierungsversuch in der vergangenen Woche" other: "%{count} Registrierungsversuche in der vergangenen Woche" @@ -1842,9 +1842,42 @@ de: silence: Konto stummgeschaltet suspend: Konto gesperrt welcome: - edit_profile_action: Profil einrichten - edit_profile_step: Du kannst dein Profil anpassen, indem du ein Profilbild hochlädst, deinen Anzeigenamen änderst und vieles mehr. Du kannst dich dafür entscheiden, neue Follower zu überprüfen, bevor sie dir folgen dürfen. + apps_android_action: Aus dem Google Play Store herunterladen + apps_ios_action: Im App Store herunterladen + apps_step: Lade unsere offiziellen Apps herunter. + apps_title: Mastodon-Apps + checklist_subtitle: 'Fangen wir an, diese neue soziale Dimension zu erkunden:' + checklist_title: Willkommensleitfaden + edit_profile_action: Personalisieren + edit_profile_step: Mit einem vollständigen Profil interagieren andere eher mit dir. + edit_profile_title: Personalisiere dein Profil explanation: Hier sind ein paar Tipps, um loszulegen + feature_action: Mehr erfahren + feature_audience: Mastodon bietet dir eine einzigartige Möglichkeit, deine Reichweite ohne Mittelsperson zu verwalten. Auf deiner eigenen Infrastruktur bereitgestellt, ermöglicht Mastodon es dir, jedem anderen Mastodon-Server zu folgen und von jedem anderen Server aus gefolgt zu werden. Ebenso steht Mastodon unter deiner Kontrolle. + feature_audience_title: Baue deine Reichweite mit Vertrauen auf + feature_control: Du weißt am besten, was du auf deiner Startseite sehen möchtest. Keine Algorithmen oder Werbung, die deine Zeit verschwenden. Folge Nutzer*innen von jedem Mastodon-Server von einem einzelnen Konto aus und empfange deren Beiträge in chronologischer Reihenfolge. Mache Mastodon zu deinem ganz persönlichen Fleckchen im Internet. + feature_control_title: Behalte die Kontrolle über deine eigene Timeline + feature_creativity: Mastodon unterstützt Audio-, Video- und Bildbeiträge, Beschreibungen, Umfragen, Inhaltswarnungen, animierte Avatare, benutzerdefinierte Emojis, das Zuschneiden von Vorschaubildern und vieles mehr, um dir zu helfen, dich online zu entfalten. Egal, ob du deine Kunst, deine Musik oder deinen Podcast veröffentlichst – Mastodon ist für dich da. + feature_creativity_title: Einzigartige Kreativität + feature_moderation: Mastodon legt die Entscheidungskraft zurück in deine Hände. Jeder Server erstellt eigene Regeln und Vorschriften, die nur lokal, pro einzelnem Server durchgesetzt werden – und nicht von oben herab, wie es bei den kommerziellen sozialen Medien der Fall ist. Dadurch ist Mastodon viel anpassungsfähiger für verschiedene Gruppen von Menschen. Registriere dich bei einem Server, dessen Regeln du magst, oder hoste deinen eigenen Server. + feature_moderation_title: Moderation so, wie sie sein sollte + follow_action: Folgen + follow_step: Interessanten Profilen zu folgen ist das, was Mastodon ausmacht. + follow_title: Personalisiere deine Startseite + follows_subtitle: Folge bekannten Profilen + follows_title: Empfohlene Profile + follows_view_more: Weitere Profile zum Folgen entdecken + hashtags_recent_count: "%{people} Personen in den letzten %{days} Tagen" + hashtags_subtitle: Entdecke, was in den letzten 2 Tagen angesagt war + hashtags_title: Angesagte Hashtags + hashtags_view_more: Weitere angesagte Hashtags entdecken + post_action: Verfassen + post_step: Begrüße die Welt mit Text, Fotos, Videos oder Umfragen. + post_title: Erstelle deinen ersten Beitrag + share_action: Teilen + share_step: Lass deine Freund*innen wissen, wie sie dich auf Mastodon finden können. + share_title: Teile dein Mastodon-Profil + sign_in_action: Anmelden subject: Willkommen bei Mastodon! title: Willkommen an Bord, %{name}! users: diff --git a/config/locales/devise.et.yml b/config/locales/devise.et.yml index 3e749f9a0b..76fbf619cc 100644 --- a/config/locales/devise.et.yml +++ b/config/locales/devise.et.yml @@ -12,6 +12,7 @@ et: last_attempt: Sul on veel üks katse, enne kui konto lukustatakse. locked: Konto on lukustatud. not_found_in_database: Valed %{authentication_keys} või salasõna. + omniauth_user_creation_failure: Sellele identiteedile konto loomine nurjus. pending: Sinu konto on siiani läbivaatamisel. timeout: Sinu sessioon on aegunud. Jätkamiseks palun sisene uuesti. unauthenticated: Pead sisenema või looma konto enne kui jätkad. diff --git a/config/locales/devise.fi.yml b/config/locales/devise.fi.yml index 003d48417b..8963bf5a45 100644 --- a/config/locales/devise.fi.yml +++ b/config/locales/devise.fi.yml @@ -58,7 +58,7 @@ fi: subtitle: Kaksivaiheinen todennus on otettu käyttöön tilillesi. title: Kaksivaiheinen todennus käytössä two_factor_recovery_codes_changed: - explanation: Uudet palautuskoodit on nyt luotu, ja vanhat mitätöity. + explanation: Uudet palautuskoodit on nyt luotu ja vanhat mitätöity. subject: 'Mastodon: Kaksivaihetodennuksen palautuskoodit luotiin uudelleen' subtitle: Aiemmat palautuskoodit on mitätöity, ja korvaavat uudet koodit on luotu. title: 2-vaiheisen todennuksen palautuskoodit vaihdettiin diff --git a/config/locales/devise.fr-CA.yml b/config/locales/devise.fr-CA.yml index 7f13f67828..69ee177e33 100644 --- a/config/locales/devise.fr-CA.yml +++ b/config/locales/devise.fr-CA.yml @@ -12,6 +12,7 @@ fr-CA: last_attempt: Vous avez droit à une dernière tentative avant que votre compte ne soit verrouillé. locked: Votre compte est verrouillé. not_found_in_database: "%{authentication_keys} ou mot de passe invalide." + omniauth_user_creation_failure: Erreur lors de la création d'un compte pour cette identité. pending: Votre compte est toujours en cours d'approbation. timeout: Votre session a expiré. Veuillez vous reconnecter pour continuer. unauthenticated: Vous devez vous connecter ou vous inscrire pour continuer. diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml index 8a5b8384e0..631a2eee6f 100644 --- a/config/locales/devise.fr.yml +++ b/config/locales/devise.fr.yml @@ -12,6 +12,7 @@ fr: last_attempt: Vous avez droit à une dernière tentative avant que votre compte ne soit verrouillé. locked: Votre compte est verrouillé. not_found_in_database: "%{authentication_keys} ou mot de passe invalide." + omniauth_user_creation_failure: Erreur lors de la création d'un compte pour cette identité. pending: Votre compte est toujours en cours d'approbation. timeout: Votre session a expiré. Veuillez vous reconnecter pour continuer. unauthenticated: Vous devez vous connecter ou vous inscrire pour continuer. diff --git a/config/locales/devise.gd.yml b/config/locales/devise.gd.yml index 1bf489cfbb..ca9dcc4969 100644 --- a/config/locales/devise.gd.yml +++ b/config/locales/devise.gd.yml @@ -12,6 +12,7 @@ gd: last_attempt: Tha aon oidhirp eile agad mus dèid an cunntas agad a ghlasadh. locked: Tha an cunntas agad glaiste. not_found_in_database: "%{authentication_keys} no facal-faire mì-dhligheach." + omniauth_user_creation_failure: Thachair mearachd le cruthachadh cunntais dhan dearbh-aithne seo. pending: Tha an cunntas agad fo lèirmheas fhathast. timeout: Dh’fhalbh an ùine air an t-seisean agad. Clàraich a-steach a-rithist airson leantainn air adhart. unauthenticated: Feumaidh tu clàradh a-steach no clàradh leinn mus lean thu air adhart. @@ -47,14 +48,19 @@ gd: subject: 'Mastodon: Stiùireadh air ath-shuidheachadh an fhacail-fhaire' title: Ath-shuidheachadh an fhacail-fhaire two_factor_disabled: + explanation: "’S urrainn dhut clàradh a-steach le seòladh puist-d is facal-faire a-mhàin a-nis." subject: 'Mastodon: Tha an dearbhadh dà-cheumnach à comas' + subtitle: Chaidh an dearbhadh dà-cheumnach a chur à comas dhan chunntas agad. title: Dearbhadh dà-cheumnach à comas two_factor_enabled: + explanation: Bidh feum air tòcan a ghineas an aplacaid TOTP a chaidh a phaidhreachadh airson clàradh a-steach. subject: 'Mastodon: Tha an dearbhadh dà-cheumnach an comas' + subtitle: Chaidh an dearbhadh dà-cheumnach a chur an comas dhan chunntas agad. title: Dearbhadh dà-cheumnach an comas two_factor_recovery_codes_changed: explanation: Tha na còdan aisig a bh’ agad cheana mì-dhligheach a-nis agus chaidh feadhainn ùra a ghintinn. subject: 'Mastodon: Chaidh còdan aisig dà-cheumnach ath-ghintinn' + subtitle: Tha na còdan aisig a bh’ agad cheana mì-dhligheach a-nis agus chaidh feadhainn ùra a ghintinn. title: Dh’atharraich còdan aisig an dearbhaidh dà-cheumnaich unlock_instructions: subject: 'Mastodon: Stiùireadh neo-ghlasaidh' @@ -68,9 +74,13 @@ gd: subject: 'Mastodon: Chaidh iuchair tèarainteachd a sguabadh às' title: Chaidh tè dhe na h-iuchraichean tèarainteachd agad a sguabadh às webauthn_disabled: + explanation: Chaidh an dearbhadh le iuchraichean tèarainteachd a chur à comas dhan chunntas agad. + extra: "’S urrainn dhut clàradh a-steach leis an tòcan a ghineas an aplacaid TOTP paidhrichte a-mhàin a-nis." subject: 'Mastodon: Tha dearbhadh le iuchraichean tèarainteachd à comas' title: Chaidh na h-iuchraichean tèarainteachd a chur à comas webauthn_enabled: + explanation: Chaidh an dearbhadh le iuchair tèarainteachd a chur an comas dhan chunntas agad. + extra: "’S urrainn dhut an iuchair tèarainteachd agad a chleachdadh airson clàradh a-steach a-nis." subject: 'Mastodon: Tha dearbhadh le iuchair tèarainteachd an comas' title: Chaidh na h-iuchraichean tèarainteachd a chur an comas omniauth_callbacks: diff --git a/config/locales/devise.lv.yml b/config/locales/devise.lv.yml index ed4b4fb8c6..6746e813d8 100644 --- a/config/locales/devise.lv.yml +++ b/config/locales/devise.lv.yml @@ -12,6 +12,7 @@ lv: last_attempt: Tev ir vēl viens mēģinājums, pirms tavs konts tiks bloķēts. locked: Tavs konts ir bloķēts. not_found_in_database: Nederīga %{authentication_keys} vai parole. + omniauth_user_creation_failure: Kļūda šīs identitātes konta izveidošanā. pending: Tavs konts joprojām tiek pārskatīts. timeout: Tava sesija ir beigusies. Lūdzu, pieraksties vēlreiz, lai turpinātu. unauthenticated: Lai turpinātu, tev ir jāpierakstās vai jāreģistrējas. @@ -37,7 +38,7 @@ lv: title: Parole nomainīta reconfirmation_instructions: explanation: Apstiprini jauno adresi, lai mainītu savu e-pastu. - extra: Ja šīs izmaiņas neesi veicis tu, lūdzu, ignorē šo e-pasta ziņojumu. Mastodon konta e-pasta adrese nemainīsies, kamēr nebūsi piekļuvis iepriekš norādītajai saitei. + extra: Ja šīs izmaiņas neveici Tu, lūgums neņemt vērā šo e-pasta ziņojumu. Mastodon konta e-pasta adrese netiks mainīta, līdz Tu izmantosi augstāk esošo saiti. subject: 'Mastodon: Apstiprini e-pastu %{instance}' title: Apstiprini e-pasta adresi reset_password_instructions: @@ -47,14 +48,19 @@ lv: subject: 'Mastodon: Norādījumi paroles atiestatīšanai' title: Paroles atiestatīšana two_factor_disabled: + explanation: Pieteikšanās tagad ir iespējama izmantojot tikai e-pasta adresi un paroli. subject: 'Mastodon: Divfaktoru autentifikācija atspējota' + subtitle: Tavam kontam tika atspējota divpakāpju autentifikācija. title: 2FA atspējota two_factor_enabled: + explanation: Būs nepieciešams TOTP lietotnes izveidots kods, lai pieteiktos. subject: 'Mastodon: Divfaktoru autentifikācija iespējota' + subtitle: Tavam kontam tika iespējota divpakāpju autentifikācija. title: 2FA iespējota two_factor_recovery_codes_changed: explanation: Iepriekšējie atkopšanas kodi ir atzīti par nederīgiem un ģenerēti jauni. subject: 'Mastodon: Divfaktoru atkopšanas kodi pārģenerēti' + subtitle: Iepriekšējie atkopšanas kodi tika padarīti par nederīgiem, un tika izveidoti jauni. title: 2FA atkopšanas kodi mainīti unlock_instructions: subject: 'Mastodon: Norādījumi atbloķēšanai' @@ -68,9 +74,13 @@ lv: subject: 'Mastodon: Drošības atslēga izdzēsta' title: Viena no tavām drošības atslēgām tika izdzēsta webauthn_disabled: + explanation: Tavam kontam tika atspējota autentifikācija ar drošības atslēgām. + extra: Pieteikšanās tagad ir iespējama izmantojot tikai TOTP lietotnes izveidotu kodu. subject: 'Mastodon: Autentifikācija ar drošības atslēgām ir atspējota' title: Drošības atslēgas atspējotas webauthn_enabled: + explanation: Tavam kontam tika iespējota drošības atslēgas autentifikācija. + extra: Drošības atslēgu tagad var izmantot, lai pieteiktos. subject: 'Mastodon: Drošības atslēgas autentifikācija iespējota' title: Drošības atslēgas iespējotas omniauth_callbacks: diff --git a/config/locales/devise.no.yml b/config/locales/devise.no.yml index 961778eaa5..2cd433c6e0 100644 --- a/config/locales/devise.no.yml +++ b/config/locales/devise.no.yml @@ -12,6 +12,7 @@ last_attempt: Du har ett forsøk igjen før kontoen din låses. locked: Kontoen din er låst. not_found_in_database: Ugyldig %{authentication_keys} eller passord. + omniauth_user_creation_failure: Feil ved opprettelse av konto for denne identiteten. pending: Kontoen din er fortsatt under gjennomgang. timeout: Økten din har utløpt. Logg inn igjen for å fortsette. unauthenticated: Du må logge inn eller registrere deg før du kan fortsette. diff --git a/config/locales/devise.sk.yml b/config/locales/devise.sk.yml index bc01b73ccf..b36416b317 100644 --- a/config/locales/devise.sk.yml +++ b/config/locales/devise.sk.yml @@ -2,63 +2,66 @@ sk: devise: confirmations: - confirmed: Tvoja emailová adresa bola úspešne overená. - send_instructions: O niekoľko minút obdržíš email s pokynmi ako potvrdiť svoj účet. Prosím, skontroluj si aj zložku spam, ak sa k tebe toto potvrdenie nedostalo. - send_paranoid_instructions: Ak sa tvoja emailová adresa nachádza v našej databázi, o niekoľko minút obdržíš email s pokynmi ako potvrdiť svoj účet. Prosím, skontroluj aj zložku spam, ak sa k tebe toto potvrdenie nedostalo. + confirmed: Vaša e-mailová adresa bola úspešne potvrdená. + send_instructions: O niekoľko minút obdržíte e-mail s pokynmi na potvrdenie svojho účtu. Prosíme, skontrolujte si aj zložku spam, ak ste tento e-mail nedostali. + send_paranoid_instructions: Ak sa vaša e-mailová adresa nachádza v našej databáze, o niekoľko minút obdržíte e-mail s pokynmi na potvrdenie svojho účtu. Prosíme, skontrolujte aj zložku spam, ste tento e-mail nedostali. failure: - already_authenticated: Už si prihlásený/á. - inactive: Tvoj účet ešte nebol potvrdený. - invalid: Nesprávny %{authentication_keys}, alebo heslo. - last_attempt: Máš posledný pokus pred zamknutím tvojho účtu. - locked: Tvoj účet je zamknutý. - not_found_in_database: Nesprávny %{authentication_keys}, alebo heslo. + already_authenticated: Už ste sa prihlásili. + inactive: Váš účet ešte nie je aktivovaný. + invalid: Nesprávny %{authentication_keys} alebo heslo. + last_attempt: Máte posledný pokus, potom bude váš účet uzamknutý. + locked: Váš účet bol uzamknutý. + not_found_in_database: Nesprávny %{authentication_keys} alebo heslo. omniauth_user_creation_failure: Chyba pri vytváraní účtu pre túto identitu. - pending: Tvoj účet je stále prehodnocovaný. - timeout: Tvoja aktívna sezóna vypršala. Pre pokračovanie sa prosím prihlás znovu. - unauthenticated: K pokračovaniu sa musíš zaregistrovať alebo prihlásiť. - unconfirmed: Pred pokračovaním musíš potvrdiť svoj email. + pending: Váš účet stále kontrolujeme. + timeout: Vaše aktívne prihlásenie vypršalo. Pre pokračovanie sa, prosím, prihláste znovu. + unauthenticated: Pred pokračovaním sa musíte prihlásiť alebo zaregistrovať. + unconfirmed: Pred pokračovaním musíte potvrdiť svoj e-mail. mailer: confirmation_instructions: - action: Potvrď emailovú adresu - action_with_app: Potvrď a vráť sa na %{app} - explanation: S touto emailovou adresou si si vytvoril/a účet na %{host}. Si iba jeden klik od jeho aktivácie. Pokiaľ si to ale nebol/a ty, prosím ignoruj tento email. + action: Overiť e-mailovú adresu + action_with_app: Potvrdiť a vrátiť sa do %{app} + explanation: S touto e-mailovou adresou ste si vytvorili účet na %{host}. Od aktivácie vás delí jediné kliknutie. Ak ste to neboli vy, tento e-mail ignorujte. explanation_when_pending: S touto e-mailovou adresou ste požiadali o pozvánku na %{host}. Po potvrdení vašej e-mailovej adresy vašu žiadosť skontrolujeme. Môžete sa prihlásiť, aby ste zmenili svoje údaje alebo vymazali svoje konto, ale kým nebude vaše konto schválené, nebudete mať prístup k väčšine funkcií. Ak bude vaša žiadosť zamietnutá, vaše údaje budú odstránené, takže sa od vás nebudú vyžadovať žiadne ďalšie kroky. Ak ste to neboli vy, tento e-mail ignorujte. - extra_html: Prosím, pozri sa aj na
pravidlá tohto servera, a naše užívaťeľské podiemky. + extra_html: Prosím, pozrite sa aj na pravidlá tohto servera a naše pravidlá používania. subject: 'Mastodon: Potvrdzovacie pokyny pre %{instance}' - title: Potvrď emailovú adresu + title: Overte svoj e-mail email_changed: - explanation: 'Emailová adresa tvojho účtu bude zmenená na:' - extra: Ak si nezmenil/a svoj email, je pravdepodobné, že niekto iný získal prístup k tvojmu účtu. Naliehavo preto prosím zmeň svoje heslo, alebo kontaktuj administrátora tohto serveru, pokiaľ si vymknutý/á zo svojho účtu. - subject: 'Mastodon: Emailová adresa bola zmenená' - title: Nová emailová adresa + explanation: 'E-mailová adresa vášho účtu bude zmenená na:' + extra: Ak ste svoj e-mail nezmenili vy, je pravdepodobné, že niekto iný získal prístup k vášmu účtu. Čo najskôr zmeňte svoje heslo alebo, pokiaľ sa neviete prihlásiť, kontaktujte administrátora serveru. + subject: 'Mastodon: E-mailová adresa bola zmenená' + title: Nová e-mailová adresa password_change: - explanation: Heslo k tvojmu účtu bolo zmenené. - extra: Ak si heslo nezmenil/a, je pravdepodobné, že niekto iný získal prístup k tvojmu účtu. Naliehavo preto prosím zmeň svoje heslo, alebo kontaktuj administrátora tohto serveru, pokiaľ si vymknutý/á zo svojho účtu. + explanation: Heslo k vášmu účtu bolo zmenené. + extra: Ak ste si heslo nezmenili vy, je pravdepodobné, že niekto iný získal prístup k vášmu účtu. Čo najskôr zmeňte svoje heslo alebo, pokiaľ sa neviete prihlásiť, kontaktujte administrátora serveru. subject: 'Mastodon: Heslo bolo zmenené' title: Heslo bolo zmenené reconfirmation_instructions: - explanation: Potvrď novú emailovú adresu na ktorú chceš zmeniť svoj email. - extra: Pokiaľ si túto akciu nevyžiadal/a, prosím ignoruj tento email. Emailová adresa pre tvoj Mastodon účet totiž nebude zmenená pokiaľ nepostúpiš na adresu uvedenú vyššie. - subject: 'Mastodon: Potvrď email pre %{instance}' - title: Over emailovú adresu + explanation: E-mail zmeníte potvrdením novej e-mailovej adresy. + extra: Pokiaľ ste túto akciu nevyžiadali vy, ignorujte tento email. E-mailová adresa pre váš účet na Mastodone totiž nebude zmenená, pokiaľ neprejdete na odkaz uvedený vyššie. + subject: 'Mastodon: Overte e-mail pre %{instance}' + title: Overte e-mailovú adresu reset_password_instructions: - action: Zmeň svoje heslo - explanation: Vyžiadal/a si si nové heslo pre svoj účet. - extra: Ak si túto akciu nevyžiadal/a, prosím ignoruj tento email. Tvoje heslo nebude zmenené pokiaľ nepostúpiš na adresu uvedenú vyššie a vytvoríš si nové. + action: Zmeniť heslo + explanation: Vyžiadali ste si pre svoj účet nové heslo. + extra: Ak ste túto akciu nevyžiadali vy, ignorujte tento email. Vaše heslo nebude zmenené, pokiaľ neprejdete na odkaz uvedený vyššie a nevytvoríte si nové heslo. subject: 'Mastodon: Pokyny pre obnovu hesla' - title: Nastav nové heslo + title: Obnova hesla two_factor_disabled: - explanation: Prihlásenie je teraz možné iba pomocou emailu a hesla. + explanation: Prihlásenie je teraz možné iba pomocou e-mailu a hesla. subject: 'Mastodon: Dvojfázové overovanie vypnuté' - subtitle: Dvoj-faktorové overenie bolo pre tvoj účet vypnuté. - title: Dvoj-faktorové overovanie vypnuté + subtitle: Dvojfázové overenie bolo pre váš účet vypnuté. + title: Dvojfaktorové overovanie vypnuté two_factor_enabled: + explanation: Na prihlásenie budete potrebovať kód vygenerovaný spárovanou aplikáciou pre overovanie. subject: 'Mastodon: Dvojfázové overovanie zapnuté' - title: Dvoj-faktorové overovanie zapnuté + subtitle: Dvojfázové overenie bolo pre váš účet zapnuté. + title: Dvojfaktorové overovanie zapnuté two_factor_recovery_codes_changed: - explanation: Predošlé obnovovacie kódy boli urobené neplatnými a boli vygenerované nové. - subject: 'Mastodon: dvojfázové zálohové kódy boli znovu vygenerované' - title: Obnovovacie kódy pre dvoj-faktorové overovanie zmenené + explanation: Predošlé obnovovacie kódy boli zneplatnené a boli vygenerované nové. + subject: 'Mastodon: Dvojfázové obnovovacie kódy boli znovu vygenerované' + subtitle: Predošlé obnovovacie kódy boli zneplatnené a boli vygenerované nové. + title: Obnovovacie kódy pre dvojfaktorové overovanie zmenené unlock_instructions: subject: 'Mastodon: Pokyny na odomknutie účtu' webauthn_credential: @@ -71,46 +74,50 @@ sk: subject: 'Mastodon: Bezpečnostný kľúč odstránený' title: Jeden z vašich bezpečnostných kľúčov bol odstránený webauthn_disabled: - subject: 'Mastodon: Overovanie s vypnutými bezpečnostnými kľúčmi' + explanation: Overenie bezpečnostnými kľúčmi bolo pre váš účet vypnuté. + extra: Odteraz sa môžete prihlásiť iba pomocou kódu vygenerovaného spárovanou aplikáciou pre overovanie. + subject: 'Mastodon: Overovanie s bezpečnostnými kľúčmi vypnuté' title: Bezpečnostné kľúče sú vypnuté webauthn_enabled: - subject: 'Mastodon: Povolené overovanie bezpečnostného kľúča' + explanation: Overenie bezpečnostnými kľúčmi bolo pre váš účet zapnuté. + extra: Odteraz môžete na prihlásenie použiť svoj bezpečnostný kľúč. + subject: 'Mastodon: Povolené overovanie bezpečnostným kľúčom' title: Povolené bezpečnostné kľúče omniauth_callbacks: - failure: Nebolo možné ťa overiť z %{kind}, lebo "%{reason}". + failure: 'Nebolo možné vás overiť z %{kind}, uvedený dôvod: „%{reason}“.' success: Úspešné overenie z účtu %{kind}. passwords: - no_token: Túto stránku nemôžeš navštíviť, ak neprichádzaš z emailu s pokynmi na obnovu hesla. Pokiaľ prichádzaš z tohto emailu, prosím uisti sa že si použil/a celú URL adresu z emailu. - send_instructions: Ak sa tvoja emailová adresa nachádza v databázi, tak o niekoľko minút obdržíš email s pokynmi ako nastaviť nové heslo. Ak máš pocit, že si email neobdržal/a, prosím skontroluj aj svoju spam zložku. - send_paranoid_instructions: Ak sa tvoja emailová adresa nachádza v databázi, za chvíľu obdržíš odkaz pre obnovu hesla na svoj email. Skontroluj ale prosím aj svoj spam, ak tento email nevidíš. - updated: Tvoje heslo bolo úspešne zmenené. Teraz si prihlásený/á. - updated_not_active: Tvoje heslo bolo úspešne zmenené. + no_token: Túto stránku nemôžete navštíviť, ak vás sem nepresmeroval e-mail s pokynmi na obnovu hesla. Pokiaľ prichádzate z tohto e-mailu, uistite sa, že ste použili celú adresu URL z e-mailu. + send_instructions: Ak sa vaša emailová adresa nachádza v databáze, o niekoľko minút dostanete e-mail s pokynmi na nastavenie nového hesla. Ak ste ho nedostali, skontrolujte aj priečinok pre spam. + send_paranoid_instructions: Ak sa vaša emailová adresa nachádza v databáze, o niekoľko minút dostanete e-mail s pokynmi na nastavenie nového hesla. Ak ste ho nedostali, skontrolujte aj priečinok pre spam. + updated: Vaše heslo bolo úspešne zmenené. Teraz ste sa prihlásili. + updated_not_active: Vaše heslo bolo úspešne zmenené. registrations: - destroyed: Dovidenia! Tvoj účet bol úspešne zrušený. Dúfame ale, že ťa tu opäť niekedy uvidíme. - signed_up: Vitaj! Tvoja registrácia bola úspešná. - signed_up_but_inactive: Registrácia bola úspešná. Avšak, účet ešte nebol aktivovaný, takže ťa nemožno prihlásiť. - signed_up_but_locked: Registroval/a si sa úspešné. Avšak, tvoj účet je zamknutý, takže ťa nemožno prihlásiť. - signed_up_but_pending: Na tvoj email bola odoslaná správa s odkazom na potvrdenie. Po tom, čo naňho klikneš, bude tvoje uchádzanie posúdené. Budeš informovaný, ak sa tvoja požiadavka schváli. - signed_up_but_unconfirmed: Správa s odkazom na potvrdenie registrácie bola odoslaná na tvoj email. Pre aktváciu účtu, následuj prosím daný odkaz. Takisto ale skontroluj aj svoju spam zložku, pokiaľ sa ti zdá, že si tento email nedostal/a. - update_needs_confirmation: Účet bol úspešne pozmenený, ale ešte potrebujeme overiť tvoju novú emailovú adresu. Pre overenie prosím klikni na link v správe ktorú si dostal/a na email. Takisto ale skontroluj aj svoju spam zložku, ak sa ti zdá, že si tento email nedostal/a. - updated: Tvoj účet bol úspešne aktualizovaný. + destroyed: Dovidenia! Váš účet bol úspešne zrušený. Dúfame ale, že vás tu opäť niekedy uvidíme. + signed_up: Vitajte! Vaša registrácia bola úspešná. + signed_up_but_inactive: Registrácia bola úspešná. Avšak váš účet ešte nebol aktivovaný, takže sa nemôžete prihlásiť. + signed_up_but_locked: Registrácia bola úspešná. Avšak váš účet je zamknutý, takže sa nemôžete prihlásiť. + signed_up_but_pending: Na váš e-mail bola odoslaná správa s odkazom na overenie. Po kliknutí na odkaz vašu prihlášku skontrolujeme. O jej schválení vás budeme informovať. + signed_up_but_unconfirmed: Na váš e-mail bola odoslaná správa s odkazom na overenie. Svoj účet aktivujte kliknutím na odkaz. Ak ste e-mail nedostali, skontrolujte svoj priečinok pre spam. + update_needs_confirmation: Váš účet bol úspešne zmenený, ale ešte potrebujeme overiť vašu novú e-mailovú adresu. Overíte ju kliknutím na potvrdzovací odkaz zaslaný na váš e-mail. Ak ste e-mail nedostali, skontrolujte svoj priečinok pre spam. + updated: Váš účet bol úspešne aktualizovaný. sessions: - already_signed_out: Už si sa úspešne odhlásil/a. - signed_in: Prihlásil/a si sa úspešne. - signed_out: Odhlásil/a si sa úspešne. + already_signed_out: Úspešne ste sa odhlásili. + signed_in: Úspešne ste sa prihlásili. + signed_out: Úspešne ste sa odhlásili. unlocks: - send_instructions: O niekoľko minút obdržíš email s pokynmi, ako nastaviť nové heslo. Prosím, skontroluj ale aj svoju spam zložku, pokiaľ sa ti zdá, že si tento email nedostal/a. - send_paranoid_instructions: Ak tvoj účet existuje, o niekoľko minút obdržíš email s pokynmi ako si ho odomknúť. Prosím, skontroluj ale aj svoju spam zložku, pokiaľ sa ti zdá, že si tento email nedostal/a. - unlocked: Tvoj účet bol úspešne odomknutý. Pre pokračovanie sa prosím prihlás. + send_instructions: O niekoľko minút obdržíte e-mail s pokynmi na odomknutie svojho účtu. Prosíme, skontrolujte si aj zložku spam, ak ste tento e-mail nedostali. + send_paranoid_instructions: Ak váš účet existuje, o niekoľko minút obdržíte e-mail s pokynmi na jeho odomknutie. Prosíme, skontrolujte si aj zložku spam, ak ste tento e-mail nedostali. + unlocked: Váš účet bol úspešne odomknutý. Ak chcete pokračovať, prihláste sa. errors: messages: - already_confirmed: bol už potvrdený, skús sa prihlásiť - confirmation_period_expired: musí byť potvrdený do %{period}, prosím požiadaj o nový - expired: vypŕšal, prosím, vyžiadaj si nový + already_confirmed: bol už potvrdený, skúste sa prihlásiť + confirmation_period_expired: musí byť potvrdený do %{period}, požiadajte o nový + expired: vypršal, vyžiadajte si nový not_found: nenájdený not_locked: nebol zamknutý not_saved: - few: "%{count} chýb zabránilo uloženiu tohto %{resource}:" - many: "%{count} chýb zabránilo uloženiu tohto %{resource}:" - one: '1 chyba zabránila uloženiu tohto %{resource}:' - other: "%{count} chyby zabránili uloženiu tohto %{resource}:" + few: "%{count} chyby zabránili uloženiu tohto parametra %{resource}:" + many: "%{count} chýb zabránilo uloženiu tohto parametra %{resource}:" + one: '1 chyba zabránila uloženiu parametra %{resource}:' + other: "%{count} chýb zabránilo uloženiu tohto parametra %{resource}:" diff --git a/config/locales/devise.sv.yml b/config/locales/devise.sv.yml index 9300493fa0..27d424f618 100644 --- a/config/locales/devise.sv.yml +++ b/config/locales/devise.sv.yml @@ -12,6 +12,7 @@ sv: last_attempt: Du har ytterligare ett försök innan ditt konto är låst. locked: Ditt konto är låst. not_found_in_database: Ogiltigt %{authentication_keys} eller lösenord. + omniauth_user_creation_failure: Fel vid skapande av ett konto för denna identitet. pending: Ditt konto granskas fortfarande. timeout: Din session har avslutats. Vänligen logga in igen för att fortsätta. unauthenticated: Du måste logga in eller registrera dig innan du fortsätter. @@ -74,6 +75,7 @@ sv: title: En av dina säkerhetsnycklar har raderats webauthn_disabled: explanation: Autentisering med säkerhetsnycklar har inaktiverats för ditt konto. + extra: Inloggning är nu möjligt med endast den token som genereras av den parade TOTP-appen. subject: 'Mastodon: Autentisering med säkerhetsnycklar är inaktiverat' title: Säkerhetsnycklar inaktiverade webauthn_enabled: diff --git a/config/locales/doorkeeper.lv.yml b/config/locales/doorkeeper.lv.yml index 0356c22ecb..5aa5daef3f 100644 --- a/config/locales/doorkeeper.lv.yml +++ b/config/locales/doorkeeper.lv.yml @@ -22,12 +22,12 @@ lv: authorize: Autorizēt cancel: Atcelt destroy: Iznīcināt - edit: Rediģēt + edit: Labot submit: Apstiprināt confirmations: destroy: Vai esi pārliecināts? edit: - title: Rediģēt pieteikumu + title: Labot lietotni form: error: Hmm! Pārbaudi, vai tavā veidlapā nav kļūdu help: @@ -72,7 +72,7 @@ lv: revoke: Vai esi pārliecināts? index: authorized_at: Autorizētas %{date} - description_html: Šīs ir lietojumprogrammas, kas var piekļūt tavam kontam, izmantojot API. Ja ir lietojumprogrammas, kuras šeit neatpazīsti, vai lietojumprogramma nedarbojas pareizi, vari atsaukt tām piekļuvi. + description_html: Šīs ir lietotnes, kas var piekļūt Tavam kontam ar API. Ja šeit ir lietotnes, kuras neatpazīsti, vai lietotne darbojas ne tā, kā paredzēts, vari atsaukt tās piekļuvi. last_used_at: Pēdējo reizi lietotas %{date} never_used: Nekad nav lietotas scopes: Atļaujas diff --git a/config/locales/doorkeeper.sk.yml b/config/locales/doorkeeper.sk.yml index 91c9430b30..face9db966 100644 --- a/config/locales/doorkeeper.sk.yml +++ b/config/locales/doorkeeper.sk.yml @@ -5,7 +5,7 @@ sk: doorkeeper/application: name: Názov aplikácie redirect_uri: Presmerovacia URI - scopes: Pôsobnosť + scopes: Povolenia website: Webstránka aplikácie errors: models: @@ -19,85 +19,85 @@ sk: doorkeeper: applications: buttons: - authorize: Autorizuj - cancel: Zruš + authorize: Povoliť + cancel: Zrušiť destroy: Zničiť - edit: Uprav - submit: Pošli + edit: Upraviť + submit: Odoslať confirmations: - destroy: Si si istý/á? + destroy: Naozaj chcete pokračovať? edit: - title: Uprav aplikáciu + title: Upraviť aplikáciu form: - error: No teda! Skontroluj formulár pre prípadné chyby + error: Ups! Skontrolujte formulár pre prípadné chyby help: - native_redirect_uri: Použi %{native_redirect_uri} pre lokálne testy - redirect_uri: Použi jeden riadok pre každú URI - scopes: Oprávnenia oddeľuj medzerami. Nechaj prázdne pre štandardné oprávnenia. + native_redirect_uri: Použite %{native_redirect_uri} pre lokálne testy + redirect_uri: Použite jeden riadok pre každú URI + scopes: Povolenia oddeľujte medzerami. Nechajte prázdne pre štandardné povolenia. index: application: Aplikácia callback_url: Návratová URL - delete: Vymaž + delete: Vymazať empty: Nemáte žiadne aplikácie. name: Názov new: Nová aplikácia - scopes: Oprávnenia - show: Ukáž - title: Tvoje aplikácie + scopes: Povolenia + show: Zobraziť + title: Vaše aplikácie new: title: Nová aplikácia show: - actions: Úkony + actions: Akcie application_id: Kľúč klienta - callback_urls: Návratové URL adresy - scopes: Oprávnenia + callback_urls: Návratové adresy URL + scopes: Povolenia secret: Tajné slovo klienta title: 'Aplikácia: %{name}' authorizations: buttons: - authorize: Over - deny: Zamietni + authorize: Povoliť + deny: Zakázať error: title: Nastala chyba new: - prompt_html: "%{client_name} žiada o povolenie na prístup k vášmu účtu. Ide o aplikáciu tretej strany. Ak jej nedôverujete, nemali by ste ju autorizovať." + prompt_html: "%{client_name} žiada o povolenie na prístup k vášmu účtu. Ide o aplikáciu tretej strany. Ak jej nedôverujete, nemali by ste ju povoliť." review_permissions: Preskúmať povolenia - title: Je potrebná autorizácia + title: Je potrebné schválenie show: - title: Skopíruj tento autorizačný kód a vlož ho do aplikácie. + title: Skopírujte tento overovací kód a vložte ho do aplikácie. authorized_applications: buttons: revoke: Zrušiť oprávnenie confirmations: - revoke: Si si istý? + revoke: Naozaj chcete pokračovať? index: - authorized_at: Autorizované dňa %{date} + authorized_at: Povolené dňa %{date} description_html: Ide o aplikácie, ktoré môžu pristupovať k vášmu účtu pomocou rozhrania API. Ak sa tu nachádzajú aplikácie, ktoré nepoznáte, alebo ak sa niektorá aplikácia správa nesprávne, môžete jej zrušiť prístup. last_used_at: Posledne použitý dňa %{date} never_used: Nikdy nepoužité - scopes: Oprávnenia - superapp: Interný - title: Tvoje povolené aplikácie + scopes: Povolenia + superapp: Interné + title: Vaše povolené aplikácie errors: messages: - access_denied: Prístup zamietnutý. - credential_flow_not_configured: Resource Owner Password Credentials zlyhal lebo Doorkeeper.configure.resource_owner_from_credentials nebol nakonfigurovaný. - invalid_client: Overenie klienta zlyhalo. Neznámy klient, chýbajú údaje o klientovi alebo nepodporovaná metóda overovania. - invalid_grant: Dané oprávnenie je neplatné, vypršané, zrušené, nesúhlasí s presmerovacou URI použitou v autorizačnej požiadavke, alebo bolo vydané pre iný klient. + access_denied: Vlastník zdroja alebo autorizačný server žiadosť zamietol. + credential_flow_not_configured: Protokol poverení vlastníka prostriedkov narazil na chybu z dôvodu nesprávnej konfigurácie Doorkeeper.configure.resource_owner_from_credentials. + invalid_client: Overenie klienta zlyhalo z dôvodu neznámeho klienta, nebolo zahrnuté overenie klienta alebo nie je podporovaná metóda overovania. + invalid_grant: Dané povolenie je neplatné, vypršalo, bolo zrušené, nesúhlasí s presmerovacou URI použitou v autorizačnej požiadavke alebo bolo vydané pre iného klienta. invalid_redirect_uri: Presmerovacia URI je neplatná. invalid_request: missing_param: 'Chýba požadovaný parameter: %{value}.' - request_not_authorized: Žiadosť je potrebné autorizovať. Chýba požadovaný parameter pre autorizáciu žiadosti alebo je neplatný. + request_not_authorized: Žiadosť je potrebné schváliť. Chýba požadovaný parameter pre schválenie žiadosti alebo je neplatný. unknown: V požiadavke chýba požadovaný parameter, obsahuje nepodporovanú hodnotu parametra alebo je inak chybne vytvorená. invalid_resource_owner: Uvedené prihlasovacie údaje sú neplatné alebo nenájdené invalid_scope: Požadovaný rozsah je neplatný, neznámy alebo poškodený. invalid_token: expired: Prístupový token expiroval - revoked: Prístupový token bol odňatý + revoked: Prístupový token bol odvolaný unknown: Prístupový token je neplatný - resource_owner_authenticator_not_configured: Resource Owner zlyhal pretože Doorkeeper.configure.resource_owner_authenticator nebol nakonfigurovaný. - server_error: Nastala neočakávaná chyba na autorizačnom serveri ktorá zabránila vykonať požiadavku. - temporarily_unavailable: Autorizačný server ťa teraz nemôže obslúžiť, pretože prebieha údržba alebo je dočasne preťažený. + resource_owner_authenticator_not_configured: Vyhľadávanie vlastníkov zdrojov zlyhalo, pretože Doorkeeper.configure.resource_owner_authenticator nie je nakonfigurovaný. + server_error: Nastala neočakávaná chyba na autorizačnom serveri, ktorá zabránila vykonať požiadavku. + temporarily_unavailable: Autorizačný server požiadavku teraz nemôže spracovať, pretože prebieha údržba alebo je dočasne preťažený. unauthorized_client: Klient nie je autorizovaný vykonať danú požiadavku týmto spôsobom. unsupported_grant_type: Tento typ oprávnenia nie je podporovaný autorizačným serverom. unsupported_response_type: Overovací server nepodporuje tento druh odpovede. @@ -122,22 +122,22 @@ sk: admin/accounts: Správa účtov admin/all: Všetky administratívne funkcie admin/reports: Správa reportov - all: Plný prístup k tvojmu Mastodon účtu + all: Plný prístup k vášmu Mastodon účtu blocks: Blokovania bookmarks: Záložky conversations: Konverzácie - crypto: Šifrovanie End-to-end - favourites: Obľúbené + crypto: Šifrovanie end-to-end + favourites: Ohviezdičkované filters: Filtre - follow: Sledovanie, stlmenie a blokovanie + follow: Sledovania, stíšenia a blokovania follows: Sledovania lists: Zoznamy media: Mediálne prílohy - mutes: Nevšímané - notifications: Oznámenia - push: Push notifikácie - reports: Reporty - search: Hľadať + mutes: Stíšenia + notifications: Upozornenia + push: Upozornenia push + reports: Hlásenia + search: Vyhľadávanie statuses: Príspevky layouts: admin: @@ -145,51 +145,51 @@ sk: applications: Aplikácie oauth2_provider: Poskytovateľ OAuth2 application: - title: Požadovaná OAuth autorizácia + title: Požadovaná autorizácia OAuth scopes: - admin:read: prezeraj všetky dáta na serveri - admin:read:accounts: prezeraj chúlostivé informácie na všetkých účtoch + admin:read: čítať všetky dáta na serveri + admin:read:accounts: čítať citlivé informácie všetkých účtov admin:read:canonical_email_blocks: čítať citlivé informácie všetkých kanonických e-mailových blokov admin:read:domain_allows: čítať citlivé informácie zo všetkých povolených domén admin:read:domain_blocks: čítať citlivé informácie zo všetkých blokov domén - admin:read:email_domain_blocks: čítať citlivé informácie zo všetkých blokov emailových domén + admin:read:email_domain_blocks: čítať citlivé informácie zo všetkých blokov e-mailových domén admin:read:ip_blocks: čítať citlivé informácie zo všetkých blokov IP - admin:read:reports: čítaj chulostivé informácie o všetkých hláseniach a nahlásených účtoch - admin:write: uprav všetky dáta na serveri - admin:write:accounts: urob moderovacie úkony na účtoch - admin:write:canonical_email_blocks: vykonať akcie moderácie na kanonických emailových blokoch - admin:write:domain_allows: vykonať akcie moderácie na povolených doménach - admin:write:domain_blocks: vykonať akcie moderácie na doménových blokoch - admin:write:email_domain_blocks: vykonať akcie moderácie na blokoch emailových domén - admin:write:ip_blocks: vykonať akcie moderácie na blokoch IP - admin:write:reports: urob moderovacie úkony voči hláseniam - crypto: používať end-to-end šifrovanie - follow: uprav vzťahy svojho účtu - push: dostávaj oboznámenia ohľadom tvojho účtu na obrazovku - read: prezri si všetky dáta ohľadom svojho účetu - read:accounts: prezri si informácie o účte - read:blocks: prezri svoje bloky - read:bookmarks: pozri svoje záložky - read:favourites: zobraziť vaše obľúbené - read:filters: prezri svoje filtrovanie - read:follows: prezri si svoje sledovania - read:lists: prezri si svoje zoznamy - read:mutes: prezri svoje utíšenia - read:notifications: zhliadni svoje oboznámenia - read:reports: prezri svoje reporty - read:search: vyhľadvávaj v rámci seba - read:statuses: zhliadni všetky príspevky - write: upraviť všetky dáta tvojho účtu - write:accounts: uprav svoj profil - write:blocks: blokuj účty a domény - write:bookmarks: pridaj si príspevky k záložkám - write:conversations: stíš a vymaž konverzácie - write:favourites: obľúbené príspevky - write:filters: vytvor roztriedenie - write:follows: následuj ľudí - write:lists: vytvor listy - write:media: nahraj mediálne súbory - write:mutes: stíš diskusie, aj zapojených užívateľov - write:notifications: vyčisti oboznámenia - write:reports: nahlás iných užívateľov - write:statuses: publikuj príspevky + admin:read:reports: čítať citlivé informácie o všetkých hláseniach a nahlásených účtoch + admin:write: upravovať všetky dáta na serveri + admin:write:accounts: vykonávať moderovacie úkony na účtoch + admin:write:canonical_email_blocks: vykonávať moderovacie akcie na kanonických e-mailových blokoch + admin:write:domain_allows: vykonávať moderovacie akcie na povolených doménach + admin:write:domain_blocks: vykonávať moderovacie akcie na doménových blokoch + admin:write:email_domain_blocks: vykonávať moderovacie akcie na blokoch e-mailových domén + admin:write:ip_blocks: vykonávať moderovacie akcie na blokoch IP + admin:write:reports: vykonávať moderovacie akcie voči hláseniam + crypto: používať šifrovanie end-to-end + follow: upravovať vzťahy medzi účtami + push: dostávať vaše upozornenia push + read: čítať všetky údaje vášho účtu + read:accounts: čítať informácie o účtoch + read:blocks: čítať blokovania + read:bookmarks: čítať vaše záložky + read:favourites: čítať vaše ohviezdičkované + read:filters: čítať vaše filtre + read:follows: čítať vaše sledovania + read:lists: čítať vaše zoznamy + read:mutes: čítať vaše stíšenia + read:notifications: čítať vaše upozornenia + read:reports: čítať vaše hlásenia + read:search: vyhľadávať vo vašom mene + read:statuses: čítať všetky príspevky + write: upravovať všetky údaje vášho účtu + write:accounts: upravovať váš profil + write:blocks: blokovať účty a domény + write:bookmarks: pridávať príspevky k záložkám + write:conversations: stíšiť a mazať konverzácie + write:favourites: hviezdičkovať príspevky + write:filters: vytvárať filtre + write:follows: sledovať účty + write:lists: vytvárať zoznamy + write:media: nahrávať mediálne súbory + write:mutes: stíšiť účty a konverzácie + write:notifications: vyčistiť vaše upozornenia + write:reports: nahlasovať ostatných + write:statuses: zverejňovať príspevky diff --git a/config/locales/doorkeeper.tr.yml b/config/locales/doorkeeper.tr.yml index 2dde5f6322..47a15e1b8a 100644 --- a/config/locales/doorkeeper.tr.yml +++ b/config/locales/doorkeeper.tr.yml @@ -15,7 +15,7 @@ tr: fragment_present: parça içeremez. invalid_uri: geçerli bir URL olmalıdır. relative_uri: mutlaka bir URL olmalıdır. - secured_uri: HTTPS/SSL URI olması gerekir. + secured_uri: bir HTTPS/SSL URI olması gerekir. doorkeeper: applications: buttons: @@ -161,7 +161,7 @@ tr: admin:write:domain_allows: alan adı izinleri için denetleme eylemleri gerçekleştirin admin:write:domain_blocks: alan adı engellemeleri için denetleme eylemleri gerçekleştirin admin:write:email_domain_blocks: e-posta alan adı engellemeleri için denetleme eylemleri gerçekleştirin - admin:write:ip_blocks: IP blokları üzerinde moderasyon eylemleri gerçekleştir + admin:write:ip_blocks: ıp blokları üzerinde moderasyon eylemleri gerçekleştir admin:write:reports: raporlarda denetleme eylemleri gerçekleştirin crypto: uçtan uca şifreleme kullan follow: hesap ilişkilerini değiştirin diff --git a/config/locales/doorkeeper.zh-TW.yml b/config/locales/doorkeeper.zh-TW.yml index 8ceaf36f3c..65926dfeef 100644 --- a/config/locales/doorkeeper.zh-TW.yml +++ b/config/locales/doorkeeper.zh-TW.yml @@ -104,7 +104,7 @@ zh-TW: flash: applications: create: - notice: 已建立應用程式。 + notice: 已新增應用程式。 destroy: notice: 已刪除應用程式。 update: @@ -185,9 +185,9 @@ zh-TW: write:bookmarks: 書籤狀態 write:conversations: 靜音及刪除對話 write:favourites: 加到最愛 - write:filters: 建立過濾條件 + write:filters: 新增過濾條件 write:follows: 跟隨其他人 - write:lists: 建立列表 + write:lists: 新增列表 write:media: 上傳媒體檔案 write:mutes: 靜音使用者及對話 write:notifications: 清除您的通知 diff --git a/config/locales/el.yml b/config/locales/el.yml index 12d70df976..1b7dcddc6f 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -1703,8 +1703,6 @@ el: silence: Περιορισμένος λογαριασμός suspend: Λογαριασμός σε αναστολή welcome: - edit_profile_action: Στήσιμο προφίλ - edit_profile_step: Μπορείς να προσαρμόσεις το προφίλ σου ανεβάζοντας μια εικόνα προφίλ, αλλάζοντας το εμφνιζόμενο όνομα και άλλα. Μπορείς να επιλέξεις να αξιολογείς νέους ακόλουθους πριν τους επιτραπεί να σε ακολουθήσουν. explanation: Μερικές συμβουλές για να ξεκινήσεις subject: Καλώς ήρθες στο Mastodon title: Καλώς όρισες, %{name}! diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index ac7e508276..292365ed56 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -1837,8 +1837,6 @@ en-GB: silence: Account limited suspend: Account suspended welcome: - edit_profile_action: Setup profile - edit_profile_step: You can customise your profile by uploading a profile picture, changing your display name and more. You can opt-in to review new followers before they’re allowed to follow you. explanation: Here are some tips to get you started subject: Welcome to Mastodon title: Welcome aboard, %{name}! diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 4e518cd194..9d27dace97 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1759,8 +1759,6 @@ eo: silence: Konto limigita suspend: Konto suspendita welcome: - edit_profile_action: Agordi profilon - edit_profile_step: Vi povas personecigi vian profilon per alŝuti profilbildon, ŝangi vian montronomo kaj pli. explanation: Jen kelkaj konsiloj por helpi vin komenci subject: Bonvenon en Mastodon title: Bonvenon, %{name}! diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 06bacc79d1..398345d8c8 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1726,10 +1726,10 @@ es-AR: keep_pinned_hint: No elimina ninguno de tus mensajes fijados keep_polls: Conservar encuestas keep_polls_hint: No elimina ninguna de tus encuestas - keep_self_bookmark: Conservar mensajes que marcaste como favoritos - keep_self_bookmark_hint: No elimina tus propios mensajes si los marcaste como favoritos - keep_self_fav: Conservar mensajes marcados como favoritos - keep_self_fav_hint: No elimina tus propios mensajes si los marcaste como favoritos + keep_self_bookmark: Conservar mensajes que enviaste a Marcadores + keep_self_bookmark_hint: No elimina tus propios mensajes si los enviaste a Marcadores + keep_self_fav: Conservar mensajes que enviaste a Favoritos + keep_self_fav_hint: No elimina tus propios mensajes si los enviaste a Favoritos min_age: '1209600': 2 semanas '15778476': 6 meses @@ -1842,9 +1842,42 @@ es-AR: silence: Cuenta limitada suspend: Cuenta suspendida welcome: - edit_profile_action: Configurar perfil - edit_profile_step: Podés personalizar tu perfil subiendo un avatar (imagen de perfil), cambiando tu nombre a mostrar y más. Podés optar por revisar a los nuevos seguidores antes de que puedan seguirte. + apps_android_action: Conseguila en Google Play + apps_ios_action: Descargala desde la App Store + apps_step: Descargá nuestras aplicaciones oficiales. + apps_title: Aplicaciones de Mastodon + checklist_subtitle: 'Vamos a iniciarte en esta nueva experiencia social:' + checklist_title: Repaso de bienvenida + edit_profile_action: Personalizar + edit_profile_step: Completá tu perfil para aumentar las posibilidades de interacción. + edit_profile_title: Personalizá tu perfil explanation: Aquí hay algunos consejos para empezar + feature_action: Aprendé más + feature_audience: Mastodon te ofrece la posibilidad única de gestionar tu audiencia sin intermediarios. Mastodon desplegado en tu propia infraestructura te permite seguir a otras cuentas, y que te sigan desde cualquier otro servidor en línea de Mastodon y no estar bajo el control de nadie más, excepto el tuyo. + feature_audience_title: Construí tu audiencia en confianza + feature_control: Vos sabés bien que querés tener en tu línea temporal principal. Nada de algoritmos o publicidades que desperdicien tu tiempo. Seguí cualquier cuenta de cualquier servidor de Mastodon desde la tuya propia y recibí sus mensajes en orden cronológico, haciendo tu espacio de Internet un lugar más personalizado. + feature_control_title: Tené el control de tu propia línea temporal + feature_creativity: Mastodon soporta mensajes con audio, videos e imágenes, descripciones de accesibilidad, encuestas, advertencias de contenido, avatares animados, emojis personalizables, control de recorte de miniaturas, y más; todo para ayudarte a expresarte en línea. Ya sea que estés publicando tu arte, tu música o tu podcast, Mastodon está ahí para vos. + feature_creativity_title: Creatividad sin paralelos + feature_moderation: Mastodon vuelve a poner el poder de decisión en tus manos. Cada servidor crea sus propias reglas y regulaciones, las cuales se aplican localmente y no de arriba hacia abajo como las redes sociales corporativas, volviendo a Mastodon la red social más flexible en respuesta a las necesidades de diferentes grupos de personas. Unite a un servidor con cuyas reglas estés de acuerdo, o montá tu propio servidor. + feature_moderation_title: Moderando como debería ser + follow_action: Seguir + follow_step: Seguir cuentas interesantes es de lo que se trata Mastodon. + follow_title: Personalizá tu línea de tiempo principal + follows_subtitle: Seguí cuentas populares + follows_title: A quién seguir + follows_view_more: Encontrá más cuentas para seguir + hashtags_recent_count: "%{people} cuentas en los últimos %{days} días" + hashtags_subtitle: Explora las tendencias de los últimos 2 días + hashtags_title: Etiquetas en tendencia + hashtags_view_more: Ver más etiquetas en tendencias + post_action: Redactar + post_step: Decile "Hola" al mundo con textos, fotos, videos o encuestas. + post_title: Escribí tu primer mensaje + share_action: Compartir + share_step: Hacé que tus amistades sepan cómo encontrarte en Mastodon. + share_title: Compartí tu perfil de Mastodon + sign_in_action: Iniciá sesión subject: Bienvenido a Mastodon title: "¡Bienvenido a bordo, %{name}!" users: diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 4d2e8ff257..0948e8d434 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -767,7 +767,7 @@ es-MX: disabled: A nadie users: Para los usuarios locales que han iniciado sesión registrations: - moderation_recommandation: Por favor, ¡asegúrate de tener un equipo de moderación adecuado y reactivo antes de abrir los registros a todo el mundo! + moderation_recommandation: "¡Por favor, asegúrate de contar con un equipo de moderación adecuado y activo antes de abrir el registro al público!" preamble: Controla quién puede crear una cuenta en tu servidor. title: Registros registrations_mode: @@ -775,7 +775,7 @@ es-MX: approved: Se requiere aprobación para registrarse none: Nadie puede registrarse open: Cualquiera puede registrarse - warning_hint: Recomendamos el uso de “Se requiere aprobación para registrarse” a menos que estés seguro de que tu equipo de moderación puede manejar el spam y los registros maliciosos en un tiempo razonable. + warning_hint: Recomendamos el uso de la "Aprobación requerida para el registro", a menos de que confíes en que tu equipo de moderación puede manejar el spam y los registros maliciosos en un tiempo razonable. security: authorized_fetch: Requerir autenticación de servidores federados authorized_fetch_hint: Requerir autenticación de servidores federados permite un cumplimiento más estricto tanto de los bloqueos a nivel de usuario como a nivel de servidor. Sin embargo, esto se produce a costa de una penalización en el rendimiento, reduce el alcance de tus respuestas y puede introducir problemas de compatibilidad con algunos servicios federados. Además, esto no impedirá que actores dedicados obtengan tus cuentas y publicaciones públicas. @@ -969,7 +969,7 @@ es-MX: webhook: Webhook admin_mailer: auto_close_registrations: - body: Debido a la falta de moderadores activos, los registros en %{instance} han sido cambiados automáticamente para requerir revisión manual, para evitar que %{instance} se utilice potencialmente como plataforma por malos actores. Puedes volver a cambiarlo para abrir los registros en cualquier momento. + body: Debido al faltante de actividad reciente de moderación, los registros en %{instance} han cambiado automáticamente para requerir la revisión manial, para evitar que %{instance} se utilice como una plataforma para potenciales malos actores. Puedes revertir este cambio en los registros en cualquier momento. subject: Se ha cambiado automáticamente el registro de %{instance} para requerir aprobación new_appeal: actions: @@ -1842,9 +1842,42 @@ es-MX: silence: Cuenta limitada suspend: Cuenta suspendida welcome: - edit_profile_action: Configurar el perfil - edit_profile_step: Puedes personalizar tu perfil subiendo una foto de perfil, cambiando tu nombre de usuario y mucho más. Puedes optar por revisar a los nuevos seguidores antes de que puedan seguirte. + apps_android_action: Consíguela en Google Play + apps_ios_action: Descargar en el App Store + apps_step: Descarga nuestras aplicaciones oficiales. + apps_title: Aplicaciones de Mastodon + checklist_subtitle: 'Comencemos en esta nueva frontera social:' + checklist_title: Lista de bienvenida + edit_profile_action: Personalizar + edit_profile_step: Aumenta tus interacciones con un perfil completo. + edit_profile_title: Personaliza tu perfil explanation: Aquí hay algunos consejos para empezar + feature_action: Leer más + feature_audience: Mastodon te proporciona una posibilidad única de gestionar tu audiencia sin intermediarios. El despliegue de Mastodon en tu propia infraestructura te permite seguir y ser seguido desde cualquier servidor de Mastodon que se encuentre en línea y no está bajo el control de nadie más que tú. + feature_audience_title: Construye tu audiencia con confianza + feature_control: Tú sabes lo que quieres ver en tu página principal. Nada de algoritmos y publicidad para desperdiciar tu tiempo. Sigue a quien quieras a través de cualquier servidor de Mastodon y recibe sus publicaciones en orden cronológico. Haz tu rincón de internet un poco más como tú. + feature_control_title: Mantente en control de tu línea de tiempo + feature_creativity: Mastodon soporta mensajes de audio, vídeo e imágenes, descripciones de accesibilidad, encuestas, advertencias de contenido, avatares animados, emojis personalizados, recortes de miniatura, y más, para ayudarte a expresarte en línea. Ya sea publicando tu arte, tu música o tu podcast, Mastodon está ahí para ti. + feature_creativity_title: Creatividad inigualable + feature_moderation: Mastodon vuelve a poner la toma de decisiones en tus manos. Cada servidor crea sus propias reglas y reglamentos, que se aplican localmente y no globalmente como en redes sociales corporativas, lo que resulta en la mayor flexibilidad para responder a las necesidades de diferentes grupos de personas. Únete a un servidor con las reglas con las que esté sde acuerdo, o aloja el tuyo propio. + feature_moderation_title: La moderación como debería ser + follow_action: Seguir + follow_step: Seguir a personas interesantes es de lo que trata Mastodon. + follow_title: Personaliza tu línea de inicio + follows_subtitle: Seguir cuentas conocidas + follows_title: A quién seguir + follows_view_more: Ver más personas para seguir + hashtags_recent_count: "%{people} personas en los últimos %{days} días" + hashtags_subtitle: Explora las tendencias de los últimos 2 días + hashtags_title: Etiquetas en tendencia + hashtags_view_more: Ver más etiquetas en tendencia + post_action: Redactar + post_step: Di hola al mundo con texto, fotos, vídeos o encuestas. + post_title: Escribe tu primera publicación + share_action: Compartir + share_step: Dile a tus amigos cómo encontrarte en Mastodon. + share_title: Comparte tu perfil de Mastodon + sign_in_action: Regístrate subject: Bienvenido a Mastodon title: Te damos la bienvenida a bordo, %{name}! users: diff --git a/config/locales/es.yml b/config/locales/es.yml index 5204b116e3..946ba1cbeb 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1705,9 +1705,9 @@ es: direct: Directa private: Sólo mostrar a seguidores private_long: Solo mostrar a tus seguidores - public: Público + public: Pública public_long: Todos pueden ver - unlisted: Público, pero no mostrar en la historia federada + unlisted: Pública, pero no mostrar en la historia federada unlisted_long: Todos pueden ver, pero no está listado en las líneas de tiempo públicas statuses_cleanup: enabled: Borrar automáticamente publicaciones antiguas @@ -1842,9 +1842,42 @@ es: silence: Cuenta limitada suspend: Cuenta suspendida welcome: - edit_profile_action: Configurar el perfil - edit_profile_step: Puedes personalizar tu perfil subiendo una foto de perfil, cambiando tu nombre de usuario y mucho más. Puedes optar por revisar a los nuevos seguidores antes de que puedan seguirte. + apps_android_action: Consíguela en Google Play + apps_ios_action: Descargar en la App Store + apps_step: Descarga nuestras aplicaciones oficiales. + apps_title: Aplicaciones para Mastodon + checklist_subtitle: 'Vamos a empezar en esta nueva frontera social:' + checklist_title: Lista de bienvenida + edit_profile_action: Personalizar + edit_profile_step: Aumenta tus interacciones completando tu perfil. + edit_profile_title: Personaliza tu perfil explanation: Aquí hay algunos consejos para empezar + feature_action: Saber más + feature_audience: Mastodon te ofrece una posibilidad única de gestionar tu audiencia sin intermediarios. Mastodon desplegado en tu propia infraestructura te permite seguir y ser seguido desde cualquier otro servidor Mastodon en línea y no está bajo el control de ningún tercero. + feature_audience_title: Construye tu audiencia con confianza + feature_control: Tú sabes lo que quieres ver en tu página principal. Nada de algoritmos y publicidad para desperdiciar tu tiempo. Sigue a quien quieras a través de cualquier servidor de Mastodon y recibe sus publicaciones en orden cronológico. Haz tu rincón de internet un poco más como tú. + feature_control_title: Mantente en control de tu línea de tiempo + feature_creativity: Mastodon soporta mensajes de audio, vídeo e imágenes, descripciones de accesibilidad, encuestas, advertencias de contenido, avatares animados, emojis personalizados, recortes de miniatura, y más, para ayudarte a expresarte en línea. Ya sea publicando tu arte, tu música o tu podcast, Mastodon está ahí para ti. + feature_creativity_title: Creatividad inigualable + feature_moderation: Mastodon vuelve a poner la toma de decisiones en tus manos. Cada servidor crea sus propias reglas y reglamentos, que se aplican localmente y no globalmente como en redes sociales corporativas, lo que resulta en la mayor flexibilidad para responder a las necesidades de diferentes grupos de personas. Únete a un servidor con las reglas con las que esté sde acuerdo, o aloja el tuyo propio. + feature_moderation_title: La moderación como debería ser + follow_action: Seguir + follow_step: Seguir a personas interesantes es de lo que trata Mastodon. + follow_title: Personaliza tu línea de inicio + follows_subtitle: Seguir cuentas conocidas + follows_title: A quién seguir + follows_view_more: Ver más personas para seguir + hashtags_recent_count: "%{people} personas en los últimos %{days} días" + hashtags_subtitle: Explora las tendencias de los últimos 2 días + hashtags_title: Etiquetas en tendencia + hashtags_view_more: Ver más etiquetas en tendencia + post_action: Redactar + post_step: Di hola al mundo con texto, fotos, vídeos o encuestas. + post_title: Escribe tu primera publicación + share_action: Compartir + share_step: Dile a tus amigos cómo encontrarte en Mastodon. + share_title: Comparte tu perfil de Mastodon + sign_in_action: Regístrate subject: Bienvenido a Mastodon title: Te damos la bienvenida a bordo, %{name}! users: diff --git a/config/locales/et.yml b/config/locales/et.yml index 6bdb54a50e..cd944d9c19 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -767,6 +767,7 @@ et: disabled: Mitte kellelegi users: Sisseloginud kohalikele kasutajatele registrations: + moderation_recommandation: Enne registreeringute avamist kõigile veendu, et oleks olemas adekvaatne ja reageerimisvalmis modereerijaskond! preamble: Kes saab serveril konto luua. title: Registreerimised registrations_mode: @@ -774,6 +775,7 @@ et: approved: Kinnitus vajalik konto loomisel none: Keegi ei saa kontoid luua open: Kõik võivad kontoid luua + warning_hint: Soovitame liitumisel kasutada heakskiitmise nõuet, kui just pole kindel, et modereerijaskond suudab õigeaegselt käsitleda rämpsu ja pahatahtlikke liitumisi. security: authorized_fetch: Nõua föderatiivse serveripoolset autoriseerimist authorized_fetch_hint: Föderatiivsete serverite poolse autoriseerimise nõudmine võimaldab nii kasutaja- kui ka serveritasandi blokeeringute rangemat jõustamist. See toob aga kaasa jõudluse vähenemise, vähendab vastuste ulatust ja võib tekitada ühilduvusprobleeme mõne ühendatud teenusega. Lisaks ei takista see teatud kasutajatel sinu avalike postituste ja kontode kättesaamist. @@ -966,6 +968,9 @@ et: title: Veebikonksud webhook: Veebikonks admin_mailer: + auto_close_registrations: + body: Hiljutise vähese modereerimistegevuse tõttu on %{instance} liitumised automaatselt muudetud heakskiitu nõudvaks, et %{instance} ei muutuks võimalike pahategijate tegevusplatvormiks. Registreerumine on võimalik tagasi avatuks muuta igal ajal. + subject: Serveri %{instance} registreeringud on automaatselt muudetud heakskiitu nõudvaks new_appeal: actions: delete_statuses: kustutada postitused @@ -1839,12 +1844,42 @@ et: silence: Konto limiteeritud suspend: Konto kustutatud welcome: - edit_profile_action: Seadista oma profiil - edit_profile_step: |- - Esmalt seadista oma profiil. Saad lisada profiilipildi, muuta ekraaninime, lisada lühikirjelduse ja teha paljut muud. Vaata üle oma konto seaded. Saad ise otsustada, kui nähtav on konto teiste jaoks, mis keeltes postitusi oma ajavoos näha soovid ning kui privaatne peaks konto olema. - - Kui mõni asi arusaamatuks jääb, siis võib vaadata juhendvideot: https://youtu.be/J4ItbTOAw7Q + apps_android_action: Google Play poest + apps_ios_action: Allalaadimine App Store'ist + apps_step: Meie ametlikud rakendused. + apps_title: Mastodoni rakendused + checklist_subtitle: 'Kuidas sel uudsel sotsiaalmeediarindel pihta hakata:' + checklist_title: Millest alustada + edit_profile_action: Isikupärasta + edit_profile_step: Anna oma tegevustele hoogu, luues põhjalik kasutajaprofiil. + edit_profile_title: Isikupärasta oma profiili explanation: Siin on mõned nõuanded, mis aitavad alustada + feature_action: Vaata lisa + feature_audience: Mastodon pakub unikaalset võimalust oma jälgijaskonda hallata ilma vahendajateta. Mastodoni käitamine enda serveris võimaldab jälgida kasutajaid ja olla jälgitav ükskõik millisest Mastodoni serverist võrgus ja see pole kellegi teise poolt kontrollitav. + feature_audience_title: Kogu enesekindlalt jälgijaid + feature_control: Tead ise kõige paremini, mida soovid oma koduvoos näha. Ei aega raiskavaid algoritme ega reklaame. Jälgi ühe kasutajakonto kaudu keda iganes mistahes Mastodoni serveris ja näe postitusi ajalises järjestuses, muutes oma nurgakese Internetist rohkem endale meelepärasemaks. + feature_control_title: Säilita oma ajajoone üle kontroll + feature_creativity: Mastodon toetab audiot, video- ja pildipostitusi, liigipääsetavuse kirjeldusi, küsitlusi, sisuhoiatusi, animeeritud avatare, kohandatud emotikone, pisipiltide lõikeeelistusi ja enamatki, et end võrgus väljendada. Kas avaldad kunsti, muusikat või taskuhäälingusaadet, Mastodon on mõeldud Sinu jaoks. + feature_creativity_title: Võrreldamatu loovus + feature_moderation: Mastodon annab otsustusõiguse tagasi Sinu kätte. Igal serveril on oma reeglid ja regulatsioonid, mida hallatakse kohapeal, mitte nagu ülalt-alla korporatiivses sotsiaalmeedias, võimaldades enim paindlikku vastavust erinevate vajadustega gruppide ja inimeste eelistustele. Liitu sobivate reeglitega serveriga, või käivita oma server. + feature_moderation_title: Modereerimine, nagu see olema peab + follow_action: Jälgi + follow_step: Huvipakkuvate inimeste jälgimine ongi Mastodoni olemuseks. + follow_title: Isikupärasta oma koduvoogu + follows_subtitle: Jälgi teada-tuntud kasutajaid + follows_title: Keda jälgida + follows_view_more: Vaata lähemalt, keda jälgida + hashtags_recent_count: "%{people} inimest viimase %{days} päeva jooksul" + hashtags_subtitle: Avasta, mis viimase 2 päeva jooksul on toimunud + hashtags_title: Populaarsed märksõnad + hashtags_view_more: Vaata teisi trendikaid märksõnu + post_action: Postita + post_step: Tervita maailma teksti, fotode, videote või küsitlustega. + post_title: Tee oma esimene postitus + share_action: Jaga + share_step: Anna sõpradele teada, kuidas Sind Mastodonis leida. + share_title: Jaga oma Mastodoni profiili + sign_in_action: Sisene subject: Tere tulemast Mastodoni title: Tere tulemast, %{name}! users: diff --git a/config/locales/eu.yml b/config/locales/eu.yml index f49456afb2..bd46e4aa88 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -1843,9 +1843,42 @@ eu: silence: Kontu murriztua suspend: Kontu kanporatua welcome: - edit_profile_action: Ezarri profila - edit_profile_step: Pertsonalizatu profila abatar bat igoz, zure pantaila-izena aldatuz eta gehiago. Jarraitzaile berriak onartu aurretik berrikusi nahi badituzu, kontuari giltzarrapoa jarri diezaiokezu. + apps_android_action: Eskuratu Google Play-en + apps_ios_action: Deskargatu App Store-n + apps_step: Deskargatu gure aplikazio ofizialak. + apps_title: Mastodon-en aplikazioak + checklist_subtitle: 'Murgil zaitez sare sozialen aro berri honetan:' + checklist_title: Ongietorrien kontrol-zerrenda + edit_profile_action: Pertsonalizatu + edit_profile_step: Handiagotu elkarreragina profil ulerkor bat sortuz. + edit_profile_title: Pertsonalizatu profila explanation: Hona hasteko aholku batzuk + feature_action: Informazio gehiago + feature_audience: Mastodon-ek hartzaileak kudeatzeko aukera paregabea eskaintzen dizu tartean inor egon gabe. Mastodon zeure azpiegituran inplementatua izanik, lineako beste edozein Mastodon zerbitzarko edonor jarrai dezakezu, baita edonork zeu jarraitu ere. Soilik zeure kontrolpean. + feature_audience_title: Bildu hartzaileak uste osoarekin + feature_control: Aski ondo dakizu zer ikusi nahi duzun hasierako jarioan. Denbora galarazten duten algoritmorik edo iragarkirik gabe. Jarraitu beste Mastodon zerbitzarietako edozein kontu bakarretik eta jaso bere argitalpenak ordena kronologikoan. Zure interneteko txokoa zu bezala izan dadila. + feature_control_title: Egon zure denbora-lerroaren kontrolpean + feature_creativity: Mastodon-ek audioa, bideoa edo irudia duen argitalpenak, erabilerraztasun-azalpenak, inkestak, edukiaren abisuak, abatar animatuak, emoji pertsonalizatuak, miniaturen mozketaren kontrola eta funtzio gehiago onartzen ditu, linean aditzera eman zaitezen laguntzeko. Artea, musika edo podcastak partekatzen badituzu, Mastodon hortxe duzu. + feature_creativity_title: Sormen paregabea + feature_moderation: Mastodon-ek erabakiak hartzeko ahalmena dakar bueltan. Zerbitzari bakoitzak bere arau eta murrizketa propioak sortzen ditu, lokalki indarrean jartzen dira eta ez orokorki korporazioen sare-sozialen gisa. Era honetara, jende talde ezberdinen mesedeak asetzeko malguago bilakatzen da. Batu bertako arauekin ados zauden zerbitzari batera edo ostatatu zeurea. + feature_moderation_title: Moderazioa behar lukeen bezalaxe + follow_action: Jarraitu + follow_step: Jende interesgarria jarraitzean datza Mastodon. + follow_title: Pertsonalizatu hasierako jarioa + follows_subtitle: Jarraitu kontu ospetsuak + follows_title: Nor jarraitu + follows_view_more: Ikusi jarrai dezakezun jende gehiago + hashtags_recent_count: "%{people} pertsona azken %{days} egunetan" + hashtags_subtitle: Arakatu azken 2 egunetan pil-pilean dagoena + hashtags_title: Pil-pilean dauden traolak + hashtags_view_more: Ikusi pil-pilean dauden traol gehiago + post_action: Idatzi + post_step: Agurtu munduari testu, argazki, bideo zein inkesta batekin. + post_title: Idatzi zeure lehen argitalpena + share_action: Partekatu + share_step: Esaiezu lagunei nola aurki zaitzaketen Mastodon-en. + share_title: Partekatu Mastodon profila + sign_in_action: Hasi saioa subject: Ongi etorri Mastodon-era title: Ongi etorri, %{name}! users: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 7fab495af8..5d62f9143e 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -1575,8 +1575,6 @@ fa: silence: حساب محدود شده است suspend: حساب معلق شده است welcome: - edit_profile_action: تنظیم نمایه - edit_profile_step: می‌توانید نمایه‌تان را با بارگذاری تصویر نمایه، تغییر نام نمایشی و بیش از این‌‌ها سفارشی کنید. می‌توانید تعیین کنید که پی‌گیران جدید را پیش‌از این که بتوانند دنبالتان کنند بازبینی کنید. explanation: نکته‌هایی که برای آغاز کار به شما کمک می‌کنند subject: به ماستودون خوش آمدید title: خوش آمدید، کاربر %{name}! diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 4cd255c2f4..bc73e3ee0e 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -772,10 +772,10 @@ fi: title: Rekisteröityminen registrations_mode: modes: - approved: Rekisteröinti vaatii hyväksynnän + approved: Rekisteröityminen vaatii hyväksynnän none: Kukaan ei voi rekisteröityä open: Kaikki voivat rekisteröityä - warning_hint: Suosittelemme käyttämään asetusta “Rekisteröinti vaatii hyväksynnän” ellet ole varma siitä, että moderaattorit ovat valmiina käsittelemään roskapostia ja haittarekisteröitymisiä oikea-aikaisesti. + warning_hint: Suosittelemme käyttämään asetusta ”Rekisteröityminen vaatii hyväksynnän”, ellet ole varma siitä, että moderaattorit ovat valmiina käsittelemään roskapostia ja haittarekisteröitymisiä oikea-aikaisesti. security: authorized_fetch: Vaadi todennus liittoutuvilta palvelimilta authorized_fetch_hint: Todennuksen vaatiminen liittoutuvilta palvelimilta mahdollistaa sekä käyttäjä- että palvelintason estojen tiukemman valvonnan. Tämä tapahtuu kuitenkin suorituskyvyn kustannuksella, vähentää vastauksiesi tavoittavuutta ja voi aiheuttaa yhteensopivuusongelmia joidenkin liittoutuvien palvelujen kanssa. Tämä ei myöskään estä omistautuneita toimijoita hakemasta julkisia julkaisujasi ja tilejäsi. @@ -969,8 +969,8 @@ fi: webhook: Webhook admin_mailer: auto_close_registrations: - body: Viimeaikaisen moderaattoritoiminnan puutteen vuoksi %{instance} rekisteröinnit on vaihdettu automaattisesti manuaaliseen tarkasteluun, jotta %{instance} ei käytetä mahdollisien huonojen toimijoiden alustana. Voit vaihtaa sen takaisin avaamalla rekisteröinnit milloin tahansa. - subject: Rekisteröinnit %{instance} on automaattisesti vaihdettu vaatimaan hyväksyntää + body: Viimeaikaisen moderaattoritoiminnan puutteen vuoksi palvelimen %{instance} rekisteröitymiset on vaihdettu automaattisesti manuaaliseen tarkasteluun, jotta palvelinta %{instance} ei käytetä mahdollisten huonojen toimijoiden alustana. Voit vaihtaa takaisin avoimiin rekisteröitymisiin milloin tahansa. + subject: Rekisteröitymiset palvelimelle %{instance} on automaattisesti vaihdettu vaatimaan hyväksyntää new_appeal: actions: delete_statuses: poistaa hänen julkaisunsa @@ -1842,9 +1842,39 @@ fi: silence: Tiliä rajoitettu suspend: Tili jäädytetty welcome: - edit_profile_action: Määritä profiili - edit_profile_step: Voit mukauttaa profiiliasi muun muassa profiilikuvalla ja uudella näyttönimellä. Voit myös valita, haluatko tarkastaa ja hyväksyä uudet seuraajat itse. + apps_android_action: Hanki Google Playstä + apps_ios_action: Lataa App Storesta + apps_step: Lataa viralliset sovelluksemme. + apps_title: Mastodon-sovellukset + edit_profile_action: Mukauta + edit_profile_title: Mukauta profiiliasi explanation: Näillä vinkeillä pääset alkuun + feature_action: Lue lisää + feature_audience: Mastodon tarjoaa sinulle ainutlaatuisen mahdollisuuden hallita yleisöäsi ilman välikäsiä. Omassa infrastruktuurissasi käytössä oleva Mastodon antaa sinulle mahdollisuuden seurata ja tulla seuratuksi miltä tahansa muulta verkon Mastodon-palvelimelta, ja se on vain sinun hallinnassasi. + feature_audience_title: Rakenna yleisöäsi luottavaisin mielin + feature_control: Tiedät itse parhaiten, mitä haluat nähdä kotisyötteessäsi. Ei algoritmeja eikä mainoksia tuhlaamassa aikaasi. Seuraa yhdellä tilillä ketä tahansa, miltä tahansa Mastodon-palvelimelta, vastaanota heidän julkaisunsa aikajärjestyksessä ja tee omasta internetin nurkastasi hieman enemmän omanlaisesi. + feature_control_title: Pidä aikajanasi hallussasi + feature_creativity: Mastodon tukee ääni-, video- ja kuvajulkaisuja, saavutettavuuskuvauksia, äänestyksiä, sisältövaroituksia, animoituja avattaria, mukautettuja emojeita, pikkukuvien rajauksen hallintaa ja paljon muuta, mikä auttaa ilmaisemaan itseäsi verkossa. Julkaisetpa sitten taidetta, musiikkia tai podcastia, Mastodon on sinua varten. + feature_creativity_title: Luovuutta vertaansa vailla + feature_moderation: Mastodon palauttaa päätöksenteon käsiisi. Jokainen palvelin luo omat sääntönsä ja määräyksensä, joita valvotaan paikallisesti eikä ylhäältä alas kuten kaupallisessa sosiaalisessa mediassa, mikä tekee siitä joustavimman vastaamaan eri ihmisryhmien tarpeisiin. Liity palvelimelle, jonka säännöt sopivat sinulle, tai ylläpidä omaa palvelinta. + feature_moderation_title: Moderointi niin kuin kuuluukin + follow_action: Seuraa + follow_step: Mastodonissa on kyse kiinnostavien ihmisten seuraamisesta. + follow_title: Mukauta kotisyötettäsi + follows_subtitle: Seuraa tunnettuja tilejä + follows_title: Ehdotuksia seurattavaksi + follows_view_more: Näytä lisää seurattavia henkilöitä + hashtags_recent_count: "%{people} henkilöä viimeisenä %{days} päivänä" + hashtags_subtitle: Tutki, mikä on ollut suosittua viimeisenä 2 päivänä + hashtags_title: Suositut aihetunnisteet + hashtags_view_more: Näytä lisää suosittuja aihetunnisteita + post_action: Kirjoita + post_step: Tervehdi maailmaa sanoin, kuvin, videoin ja äänestyksin. + post_title: Tee ensimmäinen julkaisusi + share_action: Jaa + share_step: Kerro ystävillesi, kuinka sinut voi löytää Mastodonista. + share_title: Jaa Mastodon-profiilisi + sign_in_action: Kirjaudu sisään subject: Tervetuloa Mastodoniin title: Tervetuloa mukaan, %{name}! users: diff --git a/config/locales/fo.yml b/config/locales/fo.yml index c7dca591f6..64c26a62f2 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1842,9 +1842,42 @@ fo: silence: Kontoin er avmarkað suspend: Konta ógildað welcome: - edit_profile_action: Set upp vanga - edit_profile_step: Tú kanst tillaga vanga tín við at leggja eina vangamynd inn, broyta vísta navnið hjá tær og meira. Tú kanst velja at eftirkanna nýggjar fylgjarar, áðrenn teir sleppa at fylgja tær. + apps_android_action: Fá hana á Google Play + apps_ios_action: Tak niður á App Store + apps_step: Tak okkara almennu appir niður. + apps_title: Mastodon appir + checklist_subtitle: 'Kom í gongd á hesum nýggja miðli:' + checklist_title: Vælkomukekklisti + edit_profile_action: Ger persónligt + edit_profile_step: Stimbra títt samvirkni við einum fullfíggjaðum vanga. + edit_profile_title: Ger vangan hjá tær persónligan explanation: Her eru nøkur ráð so tú kann koma gott ígongd + feature_action: Lær meira + feature_audience: Mastodon gevur við ein einastandandi høvi at stýra tínar áskoðarar uttan millumfólk. Mastodon á tínum egnu ambætarum gevur tær høvi at fylgja og at blíva fylgd ella fylgdur frá einum og hvørjum Mastodon ambætara á netinum og er bert undir tínum ræði. + feature_audience_title: Uppbygg tína áskoðarafjøld í treysti + feature_control: Tú veitst best, hvat tú vilt síggja á tíni heimarás. Ongar algoritmur ella lýsingar at oyðsla tíðina hjá tær við. Fylg hvønn tú vilt á øllum Mastodon ambætarum umvegis eina kontu og móttak teirra postar í tíðarrað, og ger tín part av internetinum eitt sindur meira sum teg. + feature_control_title: Varðveit ræði á tíni egnu tíðarrás + feature_creativity: Mastodon hevur postar við ljóði, video og myndum, atkomulýsingar, spurnarkanningar, innihaldsávarðingar, livandi avatarar, sergjørd kenslutekn, klipping av smámyndum og annað, sum hjálpir tær at bera teg fram á netinum. Sama um tú útgevur list, tónleik ella poddvarp, Mastodon er har fyri teg. + feature_creativity_title: Makaleys skapan + feature_moderation: Mastodon leggur avgerðirnar aftur í tínar hendur. Hvør ambætari hevur sínar egnu reglur og fyriskipanir, sum vera útinnaðar lokalt og ikki frá í erva og niðureftir sum sosialir miðlar hjá stórfyritøkum. Hetta ger tað til tað smidliga at svara tørvinum hjá ymsum bólkum av fólki. Luttak á einum ambætara við reglum, sum tú er samd ella samdur við, ella hýs tín egna ambætara. + feature_moderation_title: Umsjón, sum hon eigur at vera + follow_action: Fylg + follow_step: At fylgja áhugaverdum fólki er tað, sum Mastodon snýr seg um. + follow_title: Ger tína heimarás persónliga + follows_subtitle: Fylg vælkendar kontur + follows_title: Hvørji tú átti at fylgt + follows_view_more: Sí fleiri fólk at fylgja + hashtags_recent_count: "%{people} fólk seinastu %{days} dagarnar" + hashtags_subtitle: Kanna rákið seinastu 2 dagarnar + hashtags_title: Vælumtókt frámerki + hashtags_view_more: Sí fleiri vælumtókt frámerki + post_action: Skriva + post_step: Sig hey við verðina við teksti, myndum, video ella spurnarkanningum. + post_title: Stovna tín fyrsta post + share_action: Deil + share_step: Lat vinir tínar vita, hvussu tey finna teg á Mastodon. + share_title: Deil tín Mastodon vanga + sign_in_action: Rita inn subject: Vælkomin til Mastodon title: Vælkomin umborð, %{name}! users: diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 381a8f582a..860c591a0a 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -425,7 +425,7 @@ fr-CA: view: Afficher les blocages de domaines email_domain_blocks: add_new: Ajouter - allow_registrations_with_approval: Autoriser les inscriptions avec approbation + allow_registrations_with_approval: Permettre les inscriptions avec l'approuvement attempts_over_week: one: "%{count} tentative au cours de la dernière semaine" other: "%{count} tentatives au cours de la dernière semaine" @@ -767,6 +767,7 @@ fr-CA: disabled: À personne users: Aux utilisateur·rice·s connecté·e·s localement registrations: + moderation_recommandation: Veuillez vous assurer d'avoir une équipe de modération adéquate et réactive avant d'ouvrir les inscriptions à tout le monde! preamble: Affecte qui peut créer un compte sur votre serveur. title: Inscriptions registrations_mode: @@ -774,6 +775,7 @@ fr-CA: approved: Approbation requise pour s’inscrire none: Personne ne peut s’inscrire open: N’importe qui peut s’inscrire + warning_hint: Nous vous recommandons d’utiliser « Approbation requise pour s’inscrire » à moins que vous n’ayez confiance dans la capacité de votre équipe de modération à gérer les messages indésirables et les inscriptions malveillantes suffisamment rapidement. security: authorized_fetch: Exiger une authentification de la part des serveurs fédérés authorized_fetch_hint: Exiger l’authentification des serveurs fédérés permet une application plus stricte des blocages définis par les utilisateurs et le serveur. Cependant, cela entraîne une baisse des performances, réduit la portée de vos réponses et peut poser des problèmes de compatibilité avec certains services fédérés. En outre, cela n’empêchera pas les acteurs déterminés d’aller chercher vos messages et comptes publics. @@ -966,6 +968,9 @@ fr-CA: title: Points d’ancrage web webhook: Point d’ancrage web admin_mailer: + auto_close_registrations: + body: En raison du manque d'activité récente des modérateurs, les inscriptions à %{instance} ont été automatiquement changées pour nécessiter une revue manuelle afin d'éviter que votre instance %{instance} ne soit utilisée comme plate-forme pour des acteurs potentiellement malveillants. Vous pouvez ré-ouvrir les inscriptions à tout moment. + subject: Les inscriptions à %{instance} ont été automatiquement changées pour requérir une approbation new_appeal: actions: delete_statuses: effacer les messages @@ -1837,9 +1842,42 @@ fr-CA: silence: Compte limité suspend: Compte suspendu welcome: - edit_profile_action: Configuration du profil - edit_profile_step: Vous pouvez personnaliser votre profil en téléchargeant une photo de profil, en changant votre nom d'utilisateur, etc. Vous pouvez opter pour le passage en revue de chaque nouvelle demande d'abonnement à chaque fois qu'un utilisateur essaie de s'abonner à votre compte. + apps_android_action: Disponible sur Google Play + apps_ios_action: Télécharger sur l'App Store + apps_step: Téléchargez nos applications officielles. + apps_title: Applications Mastodon + checklist_subtitle: 'Commencez votre aventure sur le web social:' + checklist_title: Premières étapes + edit_profile_action: Personnaliser + edit_profile_step: Améliorez vos interactions avec un profil plus complet. + edit_profile_title: Personnaliser votre profil explanation: Voici quelques conseils pour vous aider à démarrer + feature_action: En savoir plus + feature_audience: Mastodon vous offre une possibilité unique de gérer votre audience sans intermédiaires. Mastodon peut être déployé sur votre propre infrastructure, ce qui vous permet de suivre et d'être suivi depuis n'importe quel autre serveur Mastodon et de n'être contrôlé par personne d'autre que vous. + feature_audience_title: Construisez votre audience en toute confiance + feature_control: Vous savez mieux que quiconque ce que vous voulez voir sur votre fil principal. Personne ne veut d'un algorithme qui décide à vote place ou de publicité qui vous fera perdre votre temps. Suivez n'importe qui, sur n'importe quel serveur Mastodon, depuis votre compte. Recevez les publications du monde entier dans l'ordre chronologique et créez-vous votre chez-vous numérique qui vous ressemble. + feature_control_title: Gardez le contrôle de votre fil + feature_creativity: Mastodon prend en charge les messages audio, vidéo et photo, les descriptions d'accessibilité, les sondages, les avertissements de contenu, les avatars animés, les émojis personnalisés, le contrôle des vignettes et bien plus encore pour vous aider à vous exprimer en ligne. Que vous publiiez votre art, votre musique ou votre podcast, Mastodon est là pour vous. + feature_creativity_title: Créativité inégalée + feature_moderation: Mastodon vous redonne le contrôle. Chaque serveur établit ses propres règles, appliquées localement et non pas de manière verticale comme sur les médias sociaux commerciaux, donnant davantage de souplesse pour répondre aux besoins de différentes communautés. Rejoignez un serveur avec des règles qui vous conviennent, ou bien hébergez le vôtre. + feature_moderation_title: La modération comme elle doit être + follow_action: Suivre + follow_step: Suivre des personnes intéressantes est l'essence de Mastodon. + follow_title: Personnaliser votre fil principal + follows_subtitle: Suivez des comptes populaires + follows_title: Qui suivre + follows_view_more: Voir plus de personnes à suivre + hashtags_recent_count: "%{people} personnes dans les %{days} derniers jours" + hashtags_subtitle: Explorez les tendances depuis les 2 derniers jours + hashtags_title: Hashtags populaires + hashtags_view_more: Voir plus de hashtags populaires + post_action: Rédiger + post_step: Dites bonjour au monde avec du texte, des photos, des vidéos ou des sondages. + post_title: Rédiger votre premier message + share_action: Partager + share_step: Faites savoir à vos ami·e·s comment vous trouver sur Mastodon. + share_title: Partager votre profil Mastodon + sign_in_action: Se connecter subject: Bienvenue sur Mastodon title: Bienvenue à bord, %{name} ! users: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 0d706accf1..46b22cf8b3 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -767,6 +767,7 @@ fr: disabled: À personne users: Aux utilisateur·rice·s connecté·e·s localement registrations: + moderation_recommandation: Veuillez vous assurer d'avoir une équipe de modération adéquate et réactive avant d'ouvrir les inscriptions à tout le monde! preamble: Affecte qui peut créer un compte sur votre serveur. title: Inscriptions registrations_mode: @@ -774,6 +775,7 @@ fr: approved: Approbation requise pour s’inscrire none: Personne ne peut s’inscrire open: N’importe qui peut s’inscrire + warning_hint: Nous vous recommandons d’utiliser « Approbation requise pour s’inscrire » à moins que vous n’ayez confiance dans la capacité de votre équipe de modération à gérer les messages indésirables et les inscriptions malveillantes suffisamment rapidement. security: authorized_fetch: Exiger une authentification de la part des serveurs fédérés authorized_fetch_hint: Exiger l’authentification des serveurs fédérés permet une application plus stricte des blocages définis par les utilisateurs et le serveur. Cependant, cela entraîne une baisse des performances, réduit la portée de vos réponses et peut poser des problèmes de compatibilité avec certains services fédérés. En outre, cela n’empêchera pas les acteurs déterminés d’aller chercher vos messages et comptes publics. @@ -966,6 +968,9 @@ fr: title: Points d’ancrage web webhook: Point d’ancrage web admin_mailer: + auto_close_registrations: + body: En raison du manque d'activité récente des modérateurs, les inscriptions à %{instance} ont été automatiquement changées pour nécessiter une revue manuelle afin d'éviter que votre instance %{instance} ne soit utilisée comme plate-forme pour des acteurs potentiellement malveillants. Vous pouvez ré-ouvrir les inscriptions à tout moment. + subject: Les inscriptions à %{instance} ont été automatiquement changées pour requérir une approbation new_appeal: actions: delete_statuses: effacer les messages @@ -1837,9 +1842,42 @@ fr: silence: Compte limité suspend: Compte suspendu welcome: - edit_profile_action: Configuration du profil - edit_profile_step: Vous pouvez personnaliser votre profil en téléchargeant une photo de profil, en changant votre nom d'utilisateur, etc. Vous pouvez opter pour le passage en revue de chaque nouvelle demande d'abonnement à chaque fois qu'un utilisateur essaie de s'abonner à votre compte. + apps_android_action: Disponible sur Google Play + apps_ios_action: Télécharger sur l'App Store + apps_step: Téléchargez nos applications officielles. + apps_title: Applications Mastodon + checklist_subtitle: 'Commencez votre aventure sur le web social:' + checklist_title: Premières étapes + edit_profile_action: Personnaliser + edit_profile_step: Améliorez vos interactions avec un profil plus complet. + edit_profile_title: Personnaliser votre profil explanation: Voici quelques conseils pour vous aider à démarrer + feature_action: En savoir plus + feature_audience: Mastodon vous offre une possibilité unique de gérer votre audience sans intermédiaires. Mastodon peut être déployé sur votre propre infrastructure, ce qui vous permet de suivre et d'être suivi depuis n'importe quel autre serveur Mastodon et de n'être contrôlé par personne d'autre que vous. + feature_audience_title: Construisez votre audience en toute confiance + feature_control: Vous savez mieux que quiconque ce que vous voulez voir sur votre fil principal. Personne ne veut d'un algorithme qui décide à vote place ou de publicité qui vous fera perdre votre temps. Suivez n'importe qui, sur n'importe quel serveur Mastodon, depuis votre compte. Recevez les publications du monde entier dans l'ordre chronologique et créez-vous votre chez-vous numérique qui vous ressemble. + feature_control_title: Gardez le contrôle de votre fil + feature_creativity: Mastodon prend en charge les messages audio, vidéo et photo, les descriptions d'accessibilité, les sondages, les avertissements de contenu, les avatars animés, les émojis personnalisés, le contrôle des vignettes et bien plus encore pour vous aider à vous exprimer en ligne. Que vous publiiez votre art, votre musique ou votre podcast, Mastodon est là pour vous. + feature_creativity_title: Créativité inégalée + feature_moderation: Mastodon vous redonne le contrôle. Chaque serveur établit ses propres règles, appliquées localement et non pas de manière verticale comme sur les médias sociaux commerciaux, donnant davantage de souplesse pour répondre aux besoins de différentes communautés. Rejoignez un serveur avec des règles qui vous conviennent, ou bien hébergez le vôtre. + feature_moderation_title: La modération comme elle doit être + follow_action: Suivre + follow_step: Suivre des personnes intéressantes est l'essence de Mastodon. + follow_title: Personnaliser votre fil principal + follows_subtitle: Suivez des comptes populaires + follows_title: Qui suivre + follows_view_more: Voir plus de personnes à suivre + hashtags_recent_count: "%{people} personnes dans les %{days} derniers jours" + hashtags_subtitle: Explorez les tendances depuis les 2 derniers jours + hashtags_title: Hashtags populaires + hashtags_view_more: Voir plus de hashtags populaires + post_action: Rédiger + post_step: Dites bonjour au monde avec du texte, des photos, des vidéos ou des sondages. + post_title: Rédiger votre premier message + share_action: Partager + share_step: Faites savoir à vos ami·e·s comment vous trouver sur Mastodon. + share_title: Partager votre profil Mastodon + sign_in_action: Se connecter subject: Bienvenue sur Mastodon title: Bienvenue à bord, %{name} ! users: diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 2fb9f3e4d2..ad2c37e23f 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -1837,9 +1837,28 @@ fy: silence: Account beheind suspend: Account beskoattele welcome: - edit_profile_action: Profyl ynstelle - edit_profile_step: Jo kinne jo profyl oanpasse troch in profylfoto op te laden, jo werjeftenamme oan te passen en mear. Jo kinne it hânmjittich goedkarren fan folgers ynstelle. + apps_android_action: Fia Google Play downloade + apps_ios_action: Fia de App Store downloade + apps_step: Us offisjele apps downloade + apps_title: Mastodon-apps + edit_profile_action: Personalisearje + edit_profile_title: Jo profyl personalisearje explanation: Hjir binne inkelde tips om jo op wei te helpen + feature_action: Mear ynfo + follow_action: Folgje + follows_title: Wa te folgjen + follows_view_more: Mear minsken om te folgjen besjen + hashtags_recent_count: "%{people} minsken yn de ôfrûne %{days} dagen" + hashtags_subtitle: Wat der yn de ôfrûne 2 dagen bard is ferkenne + hashtags_title: Populêre hashtags + hashtags_view_more: Mear populêre hashtags besjen + post_action: Opstelle + post_step: Sis hallo tsjin de wrâld mei tekst, foto’s, fideo’s of peilingen. + post_title: Jo earste berjocht meitsje + share_action: Diele + share_step: Lit jo freonen witte hoe’t jo te finen binne op Mastodon. + share_title: Jo Mastodon-profyl diele + sign_in_action: Oanmelde subject: Wolkom op Mastodon title: Wolkom oan board %{name}! users: diff --git a/config/locales/gd.yml b/config/locales/gd.yml index ede38df0d9..16f046baab 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -505,14 +505,14 @@ gd: by_domain: Àrainn confirm_purge: A bheil thu cinnteach gu bheil thu airson an dàta on àrainn seo a sguabadh às gu buan? content_policies: - comment: Nòta taobh a-staigh + comment: Nòta description_html: "’S urrainn dhut poileasaidhean susbainte a mhìneachadh a thèid a chur an sàs air a h-uile cunntas on àrainn seo ’s a fo-àrainnean-se." limited_federation_mode_description_html: "’S urrainn dhut taghadh an ceadaich thu co-nasgadh leis an àrainn seo gus nach ceadaich." policies: - reject_media: Diùlt meadhanan - reject_reports: Diùlt gearanan - silence: Cuingich - suspend: Cuir à rèim + reject_media: A’ diùltadh meadhanan + reject_reports: A’ diùltadh gearanan + silence: Cuingichte + suspend: À rèim policy: Poileasaidh reason: Adhbhar poblach title: Poileasaidhean susbainte @@ -636,6 +636,7 @@ gd: created_at: Chaidh an gearan a dhèanamh delete_and_resolve: Sguab às na postaichean forwarded: Chaidh a shìneadh air adhart + forwarded_replies_explanation: Tha an gearan seo o chleachdaiche cèin agus mu shusbaint chèin. Chaidh a shìneadh air adhart thugad on as e freagairt do neach-cleachdaidh agad-sa a tha san t-susbaint a tha na cois. forwarded_to: Chaidh a shìneadh air adhart gu %{domain} mark_as_resolved: Cuir comharra gun deach fhuasgladh mark_as_sensitive: Cuir comharra gu bheil e frionasach @@ -782,10 +783,10 @@ gd: title: Thoir air falbh ro-aonta nan cleachdaichean air inneacsadh le einnseanan-luirg mar a’ bhun-roghainn discovery: follow_recommendations: Molaidhean leantainn - preamble: Tha tighinn an uachdar susbainte inntinniche fìor-chudromach airson toiseach-tòiseachaidh an luchd-cleachdaidh ùr nach eil eòlach air duine sam bith air Mastodon, ma dh’fhaoidte. Stiùirich mar a dh’obraicheas gleusan an rannsachaidh air an fhrithealaiche agad. + preamble: Tha tighinn an uachdar susbainte inntinniche fìor-chudromach airson toiseach-tòiseachaidh an luchd-cleachdaidh ùr nach eil eòlach air duine sam bith air Mastodon, ma dh’fhaoidte. Stiùirich mar a dh’obraicheas gleusan an rùrachaidh air an fhrithealaiche agad. profile_directory: Eòlaire nam pròifil public_timelines: Loidhnichean-ama poblach - publish_discovered_servers: Foillsich na frithealaichean a chaidh a lorg + publish_discovered_servers: Foillsich na frithealaichean a chaidh a rùrachadh publish_statistics: Foillsich an stadastaireachd title: Rùrachadh trends: Treandaichean @@ -794,6 +795,7 @@ gd: disabled: Na seall idir users: Dhan luchd-chleachdaidh a clàraich a-steach gu h-ionadail registrations: + moderation_recommandation: Dèan cinnteach gu bheil sgioba maoir deiseil is deònach agad mus fhosgail thu an clàradh dhan a h-uile duine! preamble: Stiùirich cò dh’fhaodas cunntas a chruthachadh air an fhrithealaiche agad. title: Clàraidhean registrations_mode: @@ -801,6 +803,7 @@ gd: approved: Tha aontachadh riatanach airson clàradh none: Chan fhaod neach sam bith clàradh open: "’S urrainn do neach sam bith clàradh" + warning_hint: Mholamaid gun chleachd thu “Tha aontachadh riatanach airson clàradh” mur eil earbsa agad gur urrainn dhan sgioba agad spama agus clàraidhean droch-rùnach a làimhseachadh gu sgiobalta. security: authorized_fetch: Iarr dearbhadh o fhrithealaichean co-naisgte authorized_fetch_hint: Ma dh’iarras tu dearbhadh o fhrithealaichean cho-naisgte, gheibh thu an comas gus bacaidhean èigneachadh nas teinne an dà chuid air ìre an luchd-cleachdaidh ’s an fhrithealaiche. Gidheadh, ceannaichidh tu an comas seo le dèanadas nas miosa is ruigsinn nas lugha nam freagairtean agad agus dh’fhaoidte gun èirich duilgheadasan co-chòrdalachd le cuid a sheirbheisean cho-naisgte. A bharrachd air sin, cha bhac seo an fheadhainn dian o fhaighinn nam postaichean is cunntasan poblach agad. @@ -1001,6 +1004,9 @@ gd: title: Webhooks webhook: Webhook admin_mailer: + auto_close_registrations: + body: Ri linn dìth gnìomhachd nam maor o chionn goirid, dh’atharraich Mastodon modh nan clàraidhean aig %{instance} ach am feum cunntasan ùra aontachadh a làimh leis an amas gun dèid %{instance} a dhìon o chleachdadh air dòighean droch-rùnach. ’S urrainn dhut na clàraidhean fhosgladh a-rithist uair sam bith. + subject: Feumaidh clàradh le %{instance} aontachadh a-nis new_appeal: actions: delete_statuses: sguabadh às nam postaichean aca @@ -1076,6 +1082,14 @@ gd: hint_html: Dìreach aon rud eile! Feumaidh sinn dearbhadh gu bheil thu daonna (ach am fàg sinn an spama aig an doras!). Fuasgail an CAPTCHA gu h-ìosal is briog air “Lean air adhart”. title: Deuchainn tèarainteachd confirmations: + awaiting_review: Chaidh am post-d agad a dhearbhadh! Nì an sgioba aig %{domain} lèirmheas air a’ chlàradh agad a-nis. Gheibh thu post-d nuair a bhios iad air aontachadh ris a’ chunntas agad! + awaiting_review_title: Tha an cunntas agad ’ga sgrùdadh + clicking_this_link: briogadh air a’ cheangal seo + login_link: clàradh a-steach + proceed_to_login_html: "’S urrainn dhut %{login_link} a-nis." + redirect_to_app_html: Bu chòir dhuinn d’ ath-stiùireadh gu aplacaid %{app_name}. Mur an do dh’obraich sin, feuch %{clicking_this_link} no till dhan aplacaid a làimh. + registration_complete: Tha an clàradh agad air %{domain} deiseil a-nis! + welcome_title: Fàilte ort, %{name}! wrong_email_hint: Mur eil an seòladh puist-d seo mar bu chòir, ’s urrainn dhut atharrachadh ann an roghainnean a’ chunntais. delete_account: Sguab às an cunntas delete_account_html: Nam bu mhiann leat an cunntas agad a sguabadh às, nì thu an-seo e. Thèid dearbhadh iarraidh ort. @@ -1409,6 +1423,7 @@ gd: '86400': Latha expires_in_prompt: Chan ann idir generate: Gin ceangal cuiridh + invalid: Chan eil an cuireadh dligheach invited_by: 'Fhuair thu cuireadh o:' max_uses: few: "%{count} cleachdaichean" @@ -1577,7 +1592,7 @@ gd: privacy: Prìobhaideachd privacy_hint_html: Stiùirich na tha thu airson foillseachadh do chàch. Gheibh daoine lorg air pròifilean inntinneach is deagh aplacaidean a’ brabhsadh cò tha daoine eile a’ leantainn ’s a’ faicinn nan aplacaidean a chleachdas iad airson postadh ach dh’fhaoidte gum b’ fheàrr leat seo a chumail falaichte. reach: Ruigse - reach_hint_html: Stiùirich am bu mhiann leat gun lorg ’s gun lean daoine ùra thu gus nach bu mhiann. A bheil thu airson ’s gun nochd na postaichean agad air duilleag an rùrachaidh? No gum faic càch thu am measg nam molaidhean leantainn aca? An gabh thu ri luchd-leantainn ùr sam bith gu fèin-obrachail no an cùm thu fhèin smachd air gach neach fa leth? + reach_hint_html: Stiùirich am bu mhiann leat gun rùraich ’s gun lean daoine ùra thu gus nach bu mhiann. A bheil thu airson ’s gun nochd na postaichean agad air duilleag an rùrachaidh? No gum faic càch thu am measg nam molaidhean leantainn aca? An gabh thu ri luchd-leantainn ùr sam bith gu fèin-obrachail no an cùm thu fhèin smachd air gach neach fa leth? search: Lorg search_hint_html: Stiùirich an dòigh air an dèid do lorg. Am bu mhiann leat gun lorg daoine thu leis na phostaich thu gu poblach? Am bu mhiann leat gun lorg daoine taobh a-muigh Mastodon a’ phròifil agad nuair a bhios iad a lorg an lìn? Thoir an aire nach urrainn dhuinn gealladh le cinnt gun dèid am fiosrachadh poblach agad a dhùnadh a-mach gu tur às gach einnsean-luirg poblach. title: Prìobhaideachd ’s ruigse @@ -1587,6 +1602,9 @@ gd: errors: limit_reached: Ràinig thu crìoch nam freagairtean eadar-dhealaichte unrecognized_emoji: "– chan aithne dhuinn an Emoji seo" + redirects: + prompt: Ma tha earbsa agad sa cheangal seo, briog airson leantainn air adhart. + title: Tha thu a’ fàgail %{instance}. relationships: activity: Gnìomhachd a’ chunntais confirm_follow_selected_followers: A bheil thu cinnteach gu bheil thu airson an luchd-leantainn a thagh thu a leantainn? @@ -1649,6 +1667,7 @@ gd: unknown_browser: Brabhsair nach aithne dhuinn weibo: Weibo current_session: An seisean làithreach + date: Ceann-là description: "%{browser} air %{platform}" explanation: Seo na bhrabhsairean-lìn a tha clàraichte a-staigh sa chunntas Mastodon agad aig an àm seo. ip: IP @@ -1827,16 +1846,27 @@ gd: webauthn: Iuchraichean tèarainteachd user_mailer: appeal_approved: - explanation: Chaidh aontachadh ris an ath-thagradh agad air an rabhadh o %{strike_date} a chuir thu a-null %{appeal_date}. Tha deagh chliù air a’ chunntas agad a-rithist. + action: Roghainnean a’ chunntais + explanation: Chaidh aontachadh ris an ath-thagradh agad air an rabhadh o %{strike_date} a chuir thu a-null %{appeal_date}. Tha an cunntas agad ann an deagh-chor a-rithist. subject: Chaidh aontachadh ris an ath-thagradh agad o %{date} + subtitle: Tha an cunntas agad ann an deagh-chor a-rithist. title: Chaidh aontachadh ri ath-thagradh appeal_rejected: explanation: Chaidh an t-ath-thagradh agad air an rabhadh o %{strike_date} a chuir thu a-null %{appeal_date} a dhiùltadh. subject: Chaidh an t-ath-thagradh agad o %{date} a dhiùltadh + subtitle: Chaidh an t-ath-thagradh agad a dhiùltadh. title: Chaidh ath-thagradh a dhiùltadh backup_ready: + explanation: Dh’iarr thu lethbhreac-glèidhidh slàn dhen chunntas Mastodon agad. + extra: Tha e deis ri luchdadh a-nuas a-nis! subject: Tha an tasg-lann agad deis ri luchdadh a-nuas title: Tasg-lann dhut + failed_2fa: + details: 'Seo mion-fhiosrachadh mun oidhirp air clàradh a-steach:' + explanation: Dh’fheuch cuideigin ri clàradh a-steach dhan chunntas agad ach thug iad seachad dàrna ceum mì-dhligheach dhan dearbhadh. + further_actions_html: Mur e thu fhèin a bh’ ann, mholamaid gun %{action} sa bhad on a chaidh briseadh a-steach dha ma dh’fhaoidte. + subject: Dh’fhàillig dàrna ceum an dearbhaidh + title: Dh’fhàillig dàrna ceum an dearbhaidh suspicious_sign_in: change_password: atharraich thu am facal-faire agad details: 'Seo mion-fhiosrachadh mun chlàradh a-steach:' @@ -1876,9 +1906,42 @@ gd: silence: Cunntas cuingichte suspend: Cunntas à rèim welcome: - edit_profile_action: Suidhich a’ phròifil agad - edit_profile_step: "’S urrainn dhut a’ phròifil agad a ghnàthachadh is tu a’ luchdadh suas dealbh pròifil, ag atharrachadh d’ ainm-taisbeanaidh is a bharrachd. ’S urrainn dhut lèirmheas a dhèanamh air daoine mus fhaod iad ’gad leantainn ma thogras tu." + apps_android_action: Faigh aplacaid air Google Play + apps_ios_action: Luchdaich a-nuas aplacaid on App Store + apps_step: Luchdaich a-nuas na h-aplacaidean oifigeil againn. + apps_title: Aplacaidean Mastodon + checklist_subtitle: 'Seo toiseach-tòiseachaidh dhut air an t-saoghal shòisealta ùr:' + checklist_title: Liosta-chromagan fàilteachaidh + edit_profile_action: Cuir dreach pearsanta air + edit_profile_step: Brosnaich an conaltradh a gheibh thu le pròifil shlàn. + edit_profile_title: Cuir dreach pearsanta air a’ phròifil agad explanation: Seo gliocas no dhà gus tòiseachadh + feature_action: Barrachd fiosrachaidh + feature_audience: Bheir Mastodon comas sònraichte dhut gun stiùirich thu d’ èisteachd gun eadar-mheadhanaich. Ma ruitheas tu Mastodon air a’ bhun-structar agad fhèin, ’s urrainn dhut frithealaiche Mastodon sam bith a leantainn air loidhne ’s an caochladh agus cha bhi smachd aig duine sam bith air ach agad fhèin. + feature_audience_title: Stèidhich d’ èisteachd le misneachd + feature_control: Chan eil duine sam bith nas eòlaiche air na bu mhiann leat fhaicinn air do dhachaigh na thu fhèin. Cha chaith algairim no sanasachd d’ ùine. Lean duine sam bith air frithealaiche Mastodon sam bith on aon chunntas agus faigh na postaichean aca ann an òrdugh na h-ama agus cuir dreach nas pearsanta air an oisean agad-sa dhen eadar-lìon. + feature_control_title: Cùm smachd air an loidhne-ama agad + feature_creativity: Cuiridh Mastodon taic ri postaichean le faidhlichean fuaime, videothan is dealbhan, tuairisgeulan so-ruigsinneachd, cunntasan-bheachd, rabhaidhean susbainte, avataran beòthaichte, emojis gnàthaichte, smachd air bearradh nan dealbhagan is mòran a bharrachd ach an cuir thu do bheachdan an cèill air loidhne. Ge b’ e a bheil thu a’ foillseachadh an obair-ealain, an ceòl no am pod-chraoladh agad, tha Mastodon ri làimh dhut. + feature_creativity_title: Cho cruthachail ’s a ghabhas + feature_moderation: Cuiridh Mastodon na co-dhùnaidhean ’nad làmhan fhèin. Cruthaichidh gach frithealaiche na riaghailtean aige fhèin a thèid a chur an gnìomh gu h-ionadail seach on àirde mar a thachras air meadhanan sòisealta corporra agus mar sin dheth, ’s urrainnear freagairt gu sùbailte do dh’fheumalachdan choimhearsnachdan eadar-dhealaichte. Faigh ballrachd air frithealaiche far a bheil thu ag aontachadh ris na riaghailtean ann no òstaich fear agad fhèin. + feature_moderation_title: Maorsainneachd mar gu chòir + follow_action: Lean + follow_step: Tha leantainn dhaoine inntinneach air cridhe Mhastodon. + follow_title: Cuir dreach pearsanta air do dhachaigh + follows_subtitle: Lean cunntasan cliùiteach + follows_title: Cò a leanas tu + follows_view_more: Seall barrachd dhaoine ri leantainn + hashtags_recent_count: 'Daoine sna %{days} là(ithean) seo chaidh: %{people}' + hashtags_subtitle: Rùraich na tha a’ treandadh san 2 latha seo chaidh + hashtags_title: Tagaichean hais a’ treandadh + hashtags_view_more: Seall barrachd thagaichean hais a’ treandadh + post_action: Sgrìobh + post_step: Cuir an aithne air an t-saoghal le teacsa, dealbhan, videothan no cunntasan-bheachd. + post_title: Cruthaich a’ chiad phost agad + share_action: Co-roinn + share_step: Leig fios dha do charaidean mar a gheibh iad grèim ort air Mastodon. + share_title: Co-roinn a’ phròifil Mastodon agad + sign_in_action: Clàraich a-steach subject: Fàilte gu Mastodon title: Fàilte air bòrd, %{name}! users: @@ -1886,6 +1949,7 @@ gd: go_to_sso_account_settings: Tadhail air roghainnean cunntas solaraiche na dearbh-aithne agad invalid_otp_token: Còd dà-cheumnach mì-dhligheach otp_lost_help_html: Ma chaill thu an t-inntrigeadh dhan dà chuid diubh, ’s urrainn dhut fios a chur gu %{email} + rate_limited: Cus oidhirpean dearbhaidh, feuch ris a-rithist an ceann greis. seamless_external_login: Rinn thu clàradh a-steach le seirbheis on taobh a-muigh, mar sin chan eil roghainnean an fhacail-fhaire ’s a’ phuist-d ri làimh dhut. signed_in_as: 'Chlàraich thu a-steach mar:' verification: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index c3d0f1d99a..a6543005b2 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1842,9 +1842,42 @@ gl: silence: Conta limitada suspend: Conta suspendida welcome: - edit_profile_action: Configurar perfil - edit_profile_step: Podes personalizar o teu perfil subindo unha imaxe de perfil, cambiar o nome público e moito máis. Podes elexir revisar as solicitudes de seguimento recibidas antes de permitirlles que te sigan. + apps_android_action: Descarga desde Google Play + apps_ios_action: Descarga desde App Store + apps_step: Descarga as apps oficiais. + apps_title: Apps de Mastodon + checklist_subtitle: 'Ímoste guiar no comezo nesta nova experiencia social:' + checklist_title: Lista de comprobación + edit_profile_action: Personalizar + edit_profile_step: Aumenta as túas interaccións grazas a un perfil descriptivo. + edit_profile_title: Personaliza o teu perfil explanation: Aquí tes algunhas endereitas para ir aprendendo + feature_action: Saber máis + feature_audience: Mastodon dache a oportunidade de xestionar sen intermediarios as túas relacións. Incluso se usas o teu propio servidor Mastodon poderás seguir e ser seguida desde calquera outro servidor Mastodon conectado á rede e estará baixo o teu control exclusivo. + feature_audience_title: Crea a túa audiencia con tranquilidade + feature_control: Sabes mellor ca ninguén o que queres ver na cronoloxía. Non hai algoritmos nin publicidade facéndoche perder o tempo. Segue cunha soa conta a outras persoas en servidores Mastodon diferentes ao teu, recibirás as publicacións en orde cronolóxica, e farás deste curruchiño de internet un lugar para ti. + feature_control_title: Tes o control da túa cronoloxía + feature_creativity: Mastodon ten soporte para audio, vídeo e imaxes nas publicacións, descricións para mellorar a accesibilidade, enquisas, avisos sobre o contido, avatares animados, emojis personalizados, control sobre o recorte de miniaturas, e moito máis, para axudarche a expresarte en internet. Tanto se publicas o teu arte, música ou podcast, Mastodon está aquí para ti. + feature_creativity_title: Creatividade incomparable + feature_moderation: Mastodon pon nas túas mans a toma de decisións. Cada servidor crea as súas propia regras e normas, que son de cumprimento nel e non impostas como nos medios sociais corporativos, facéndoo máis flexible e respondendo ás necesidades dos diferentes grupos de persoas. Únete a un servidor con normas que compartes, ou instala o teu propio servidor. + feature_moderation_title: A moderación tal como debe ser + follow_action: Seguir + follow_step: Mastodon consiste en seguir a persoas interesantes. + follow_title: Personaliza a túa cronoloxía + follows_subtitle: Sigue estas contas populares + follows_title: A quen seguir + follows_view_more: Ver máis persoas para seguir + hashtags_recent_count: "%{people} persoas nos últimos %{days} días" + hashtags_subtitle: Descubre os temas en voga nos últimos 2 días + hashtags_title: Cancelos en voga + hashtags_view_more: Ver máis cancelos en voga + post_action: Escribir + post_step: Saúda a todo o mundo con texto, fotos, vídeos ou enquisas. + post_title: Escribe a túa primeira publicación + share_action: Compartir + share_step: Dille ás amizades como poden atoparte en Mastodon. + share_title: Comparte o teu perfil en Mastodon + sign_in_action: Acceder subject: Benvida a Mastodon title: Benvida, %{name}! users: diff --git a/config/locales/he.yml b/config/locales/he.yml index 766a653773..59f562c2c9 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1906,9 +1906,42 @@ he: silence: חשבון מוגבל suspend: חשבון מושעה welcome: - edit_profile_action: הגדרת פרופיל - edit_profile_step: תוכל.י להתאים אישית את הפרופיל באמצעות העלאת יצגן (אוואטר), כותרת, שינוי כינוי ועוד. אם תרצה.י לסקור את עוקביך/ייך החדשים לפני שתרשה.י להם לעקוב אחריך/ייך. + apps_android_action: זמין ב־Google Play + apps_ios_action: זמין ב־App Store + apps_step: התקינו את היישומונים הרשמיים. + apps_title: יישומונים של מסטודון + checklist_subtitle: 'נעזור לך לצאת למסע אל האופק החברתי החדש:' + checklist_title: רשימת פריטים לקבלת הפנים + edit_profile_action: התאמה אישית + edit_profile_step: כדאי להשלים את הפרופיל כדי לעודד אחרים ליצירת קשר. + edit_profile_title: התאמה אישית של הפרופיל explanation: הנה כמה טיפים לעזור לך להתחיל + feature_action: מידע נוסף + feature_audience: מסטודון מספקת לך אפשרות ייחודית של ניהול הקהל ללא מתווכים. מסטודון מותקן על שרת משלך יאפשר לך לעקוב ולהעקב מכל שרת מסטודון ברשת בשליטתך הבלעדית. + feature_audience_title: בנו את הקהל שלכםן בבטחה + feature_control: אתםן יודעיםות בדיוק מה תרצו לראות בפיד הבית. אין פה פרסומות ואלגוריתמים שיבזבזו את זמנכם. עקבו אחרי כל משתמשי מסטודון משלל שרתים מתוך חשבון אחד וקבלו את ההודעות שלהםן לפי סדר הפרסום, וכך תצרו לכם את פינת האינטרנט המתאימה לכן אישית. + feature_control_title: השארו בשליטה על ציר הזמן שלכם + feature_creativity: מסטודון תומך בהודעות עם שמע, חוזי ותמונות, עם תאורים למוגבלי ראייה, משאלים, אזהרות תוכן, אווטרים מונפשים, אמוג'י מותאמים אישית, שליטה בחיתוך תמונות מוקטנות ועוד, כדי שתוכלו לבטא את עצמכןם ברשת. בין אם תפרסמו אמנות, מוזיקה או פודקסטים אישיים, מסטודון פה בשבילכם. + feature_creativity_title: יצירתיות ללא פשרות + feature_moderation: מסטודון מחזיר לידיכן את ההחלטות. כל שרת יוצר לעצמו את חוקיו, שנאכפים מקומית ולא "מלמעלה" כמו באתרים מסחריים, מה שהופך אותו לגמיש ביותר בשירות הרצונות והצרכים של קבוצות שונות. הצטרפו לשרת שאתםן מסכימותים עם חוקיו, או הקימו משלכןם. + feature_moderation_title: ניהול דיונים כמו שצריך + follow_action: לעקוב + follow_step: עקיבה אחרי אנשים מעניינים זו מטרתו של מסטודון. + follow_title: התאימו אישית את ציר זמן הבית שלכםן + follows_subtitle: לעקיבה אחרי חלשבונות ידועים + follows_title: אחרי מי לעקוב + follows_view_more: ראו עוד א.נשים לעקוב אחריהן.ם + hashtags_recent_count: "%{people} אנשים ב־%{days} ימים" + hashtags_subtitle: לחקור מהם הנושאים החמים ביומיים האחרונים + hashtags_title: תגיות חמות + hashtags_view_more: צפיה בעוד תגיות שכרגע חוזרות הרבה + post_action: חיבור הודעה + post_step: ברכו לשלום את העולם עם מלל, תמונות, חוזי או משאלים. + post_title: כתבו את הפוסט הראשון שלכםן + share_action: שיתוף + share_step: ספרו לחברים איך למצוא אתכם במסטודון. + share_title: שיתוף פרופיל מסטודון + sign_in_action: התחברות subject: ברוכים הבאים למסטודון title: ברוך/ה הבא/ה, %{name} ! users: diff --git a/config/locales/hr.yml b/config/locales/hr.yml index 4f6cdf480f..c5020f6f9f 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -251,7 +251,6 @@ hr: silence: Račun je ograničen suspend: Račun je suspendiran welcome: - edit_profile_action: Postavi profil subject: Dobro došli na Mastodon users: invalid_otp_token: Nevažeći dvo-faktorski kôd diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 00566514c9..76fef4633a 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1842,9 +1842,42 @@ hu: silence: Lekorlátozott fiók suspend: Felfüggesztett fiók welcome: - edit_profile_action: Készítsd el profilod - edit_profile_step: Testreszabhatod a profilod egy profilkép feltöltésével, a megjelenített neved megváltoztatásával és így tovább. Bekapcsolhatod az új követőid jóváhagyását, mielőtt követhetnek. + apps_android_action: Beszerzés a Google Play-en + apps_ios_action: Letöltés az App Store-ból + apps_step: Hivatalos alkalmazásaink letöltése. + apps_title: Mastodon alkalmazások + checklist_subtitle: 'Indulás a közösségi érintkezés új élvonalába:' + checklist_title: Üdvözlő ellenőrzőlista + edit_profile_action: Személyre szabás + edit_profile_step: Növeld az interakciószámot egy átfogó profillal. + edit_profile_title: Profil testreszabása explanation: Néhány tipp a kezdeti lépésekhez + feature_action: További információk + feature_audience: A Mastodon egyedülálló lehetőséget biztosít arra, hogy közvetítők nélkül kezeld a közönségedet. A saját infrastruktúrádra telepített Mastodon lehetővé teszi, hogy kövess másokat, és ők is tudjanak követni bármely más online Mastodon-kiszolgálóról, és ez ne legyen saját magadon kívül senki más irányítása alatt. + feature_audience_title: Építsd magabiztosan a közönségedet + feature_control: Te tudod legjobban, hogy mit szeretnél látni a kezdőlapodon. Nincsenek algoritmusok vagy reklámok, melyek pazarolnák az idődet. Kövess bárkit, bármelyik Mastodon-kiszolgálón, egyetlen fiókkal, és fogadd a bejegyzéseiket időrendi sorrendben, így a saját ízlésednek tetszővé teheted az internet egy kis szegletét. + feature_control_title: Vedd kézbe az idővonalad feletti irányítást + feature_creativity: A Mastodon támogatja a hangot, a videót és a képeket tartalmazó bejegyzéseket, az akadálymentesítési leírásokat, a szavazásokat, a tartalmi figyelmeztetéseket, az animált profilképeket, az egyéni emodzsikat, a bélyegképek körbevágását és még több mindent, hogy segítsen az online önkifejezésben. Tegyél közzé műalkotásokat, zenét vagy podcastet, a Mastodonra számíthatsz. + feature_creativity_title: Páratlan kreativitás + feature_moderation: A Mastodon visszaadja a döntést a te kezedbe. Minden kiszolgáló saját szabályokkal rendelkezik, melyeket helyben tartatnak be, és nem központilag, mint a céges közösségi médiánál, így a lehető legrugalmasabban lehet válaszolni emberek különböző csoportjainak igényeire. Csatlakozz egy kiszolgálóhoz, melynek egyetértesz a szabályaival, vagy készíts egy sajátot. + feature_moderation_title: Moderálás, ahogy annak lennie kell + follow_action: Követés + follow_step: A Mastodon az érdekes emberek követéséről szól. + follow_title: Saját hírfolyam testreszabása + follows_subtitle: Jól ismert fiókok követése + follows_title: Kit érdemes követni + follows_view_more: További követendő személyek megtekintése + hashtags_recent_count: "%{people} személy az elmúlt %{days} napban" + hashtags_subtitle: Fedezd fel, mi felkapott az elmúlt 2 napban + hashtags_title: Felkapott hashtagek + hashtags_view_more: További felkapott hashtagek megtekintése + post_action: Bejegyzés írása + post_step: Köszöntsd a világot szöveggel, fotókkal, videókkal vagy szavazásokkal. + post_title: Az első bejegyzés létrehozása + share_action: Megosztás + share_step: Tudasd az ismerőseiddel, hogyan találhatnak meg a Mastodonon. + share_title: Oszd meg a Mastodon profilodat + sign_in_action: Bejelentkezés subject: Üdvözöl a Mastodon title: Üdv a fedélzeten, %{name}! users: diff --git a/config/locales/hy.yml b/config/locales/hy.yml index d870f5073c..4125c1110e 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -873,7 +873,6 @@ hy: silence: Հաշիւը սահմանափակուած է suspend: Հաշիւը արգելափակուած է welcome: - edit_profile_action: Կարգաւորել հաշիւը subject: Բարի գալուստ Մաստոդոն title: Բարի գալուստ նաւամատոյց, %{name} users: diff --git a/config/locales/id.yml b/config/locales/id.yml index a32ee8407a..1655b744ff 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -1556,8 +1556,6 @@ id: silence: Akun dibatasi suspend: Akun ditangguhkan welcome: - edit_profile_action: Siapkan profil - edit_profile_step: Anda dapat mengubah profil Anda dengan mengunggah sebuah foto profil, mengubah nama tampilan Anda dan lain-lain. Anda dapat memilih untuk meninjau pengikut baru sebelum mereka diperbolehkan untuk mengikuti Anda. explanation: Beberapa tips sebelum Anda memulai subject: Selamat datang di Mastodon title: Selamat datang, %{name}! diff --git a/config/locales/ie.yml b/config/locales/ie.yml index 55aba94d18..222b82ba80 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -1842,9 +1842,42 @@ ie: silence: Conto limitat suspend: Conto suspendet welcome: - edit_profile_action: Configuration de profil - edit_profile_step: Tu posse personalisar tui profil por cargar un profil-image, changear tui monstrat nómine e plu. Tu posse optar tractar nov sequitores ante que ili es permisset sequer te. + apps_android_action: Obtener it sur Google Play + apps_ios_action: Descargar sur li App Store + apps_step: Descargar nor aplis oficial. + apps_title: Aplis de Mastodon + checklist_subtitle: 'Lass nos auxiliar te comensar sur ti-ci frontiera social:' + checklist_title: Lista de benevenit + edit_profile_action: Personalisar + edit_profile_step: Agranda tui interactiones per un profil detalliat. + edit_profile_title: Personalisar tui profil explanation: Vi quelc suggestiones por que tu mey comensar + feature_action: Aprender plu + feature_audience: Mastodon te da un possibilitá unic de administrar tui audientie sin intervenitores. Mastodon, desplegat che tui propri servitor, permisse que tu sequeye e esseye sequet de quelcunc altri Mastodon-servitores in li internet, e ne es controlat de quicunc quam tu. + feature_audience_title: Agrandar tui audientie in confidentie + feature_control: Tu save max bon ti quel tu vole vider sur tui initial témpor-linea. Null algoritmes o reclames por prodigar tui témpor. Seque quicunc che quelcunc Mastodon-servitor de un singul conto e recive lor postas in órdine cronologic, e fa que tui parte del internet esseye un poc plu quam tu. + feature_control_title: Resta in control de tui propri témpor-linea + feature_creativity: Mastodon permisse postas con audio, video e images, descriptiones de accessibilitá, avises de contenete, animat profil-images, personalisat emojis, control del acurtation de images de previse, a plu, por auxiliar te expresser te. Si tu publica tui art, tui musica, o tui podcast, Mastodon va apoyar te. + feature_creativity_title: Ínparalelat creativitá + feature_moderation: Mastodon retromette li potentie de far decisiones in tui manus. Chascun servitor crea su propri regules, queles es infortiat localmen e ne universalmen quam che social medies corporat, dunc it es li max flexibil pri responder al besones de diferent gruppes de gente. Adhere a un servitor con regules con queles tu concorda, o mantene tui propri. + feature_moderation_title: Moderandi moderation + follow_action: Sequer + follow_step: Sequer interessant gente es to quo importa in Mastodon. + follow_title: Personalisar tui hemal témpor-linea + follows_subtitle: Sequer famosi contos + follows_title: Persones a sequer + follows_view_more: Vider plu persones a sequer + hashtags_recent_count: "%{people} persones in li passat %{days} dies" + hashtags_subtitle: Explorar li postas de tendentie durant li passat 2 dies + hashtags_title: Populari hashtags + hashtags_view_more: Vider plu hashtags in tendentie + post_action: Composir + post_step: Saluta li munde con textu, images, videos o balotationes. + post_title: Crear tui unesim posta + share_action: Compartir + share_step: Informar tui amics qualmen trovar te che Mastodon. + share_title: Partir tui profil Mastodon + sign_in_action: Intrar subject: Benevenit a Mastodon title: Benevenit, %{name}! users: diff --git a/config/locales/io.yml b/config/locales/io.yml index e85641b923..32769effa4 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -1795,8 +1795,6 @@ io: silence: Konto limitizesis suspend: Konto restriktigesis welcome: - edit_profile_action: Facez profilo - edit_profile_step: Vu povas kustumizar vua profilo per adchargar profilimajo, chanjesar vua montronomo e plue. Vu povas selektas kontrolar nova sequanti ante oli permisesas sequar vu. explanation: Subo esas guidilo por helpar vu komencar subject: Bonveno a Mastodon title: Bonveno, %{name}! diff --git a/config/locales/is.yml b/config/locales/is.yml index 771ed2fbf1..df0391bfa3 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -1846,9 +1846,42 @@ is: silence: Notandaaðgangur takmarkaður suspend: Notandaaðgangur í frysti welcome: - edit_profile_action: Setja upp notandasnið - edit_profile_step: Þú getur sérsniðið notandasniðið þitt með því að setja inn auðkennismynd þína, breyta birtingarnafninu þínu og ýmislegt fleira. Þú getur valið að yfirfara nýja fylgjendur áður en þú leyfir þeim að fylgjast með þér. + apps_android_action: Fáðu það á Google Play + apps_ios_action: Sækja í App Store + apps_step: Sæktu opinberu forritin okkar. + apps_title: Mastodon-forrit + checklist_subtitle: 'Komum þér í gang á þessum nýja samfélagsmiðli:' + checklist_title: Til minnis í upphafi + edit_profile_action: Sérsníða + edit_profile_step: Annað fólk er líklegra til að eiga samskipti við þig ef þý setur einhverjar áhugaverðar upplýsingar í notandasniðið þitt. + edit_profile_title: Sérsníddu notandasniðið þitt explanation: Hér eru nokkrar ábendingar til að koma þér í gang + feature_action: Kanna nánar + feature_audience: Mastodon gefur þér einstakt tækifæri til að eiga í samskiptum við áhorfendur þína milliliðalaust. Mastodon-netþjónn sem settur er upp á þínu eigin kerfi er ekki undir neins stjórn nema þinnar og gerir þér kleift að fylgjast með og eiga fylgjendur á hverjum þeim Mastodon-netþjóni sem er tengdur við internetið. + feature_audience_title: Byggðu upp orðspor þitt og áheyrendafjölda + feature_control: Þú veist best hvað þú vilt sjá í heimastreyminu þínu. Engin reiknirit eða auglýsingar að þvælast fyrir. Fylgstu af einum aðgangi með hverjum sem er á milli Mastodon-netþjóna og fáðu færslurnar þeirra í tímaröð, þannig geturðu útbúið þitt eigið lítið horn á internetinu þar sem hlutirnir eru að þínu skapi. + feature_control_title: Hafðu stjórn á þinni eigin tímalínu + feature_creativity: Mastodon styður færslur með hljóði, myndum og myndskeiðum, lýsingum fyrir aukið aðgengi, kannanir, aðvörunum vegna efnis, hreyanlegum auðkennismyndum, sérsniðnum tjáningartáknum, utanskurði smámynda ásamt fleiru; til að hjálpa þér við að tjá þig á netinu. Hvort sem þú sért að gefa út listina þína, tónlist eða hlaðvarp, þá er Mastodon til staðar fyrir þig. + feature_creativity_title: Óviðjafnanleg sköpunargleði + feature_moderation: Mastodon setur ákvarðanatökur aftur í þínar hendur. Hver netþjónn býr til sínar eigin reglur og venjur, sem gilda fyrir þann netþjón en eru ekki boðaðar með valdi að ofan og niður líkt og á samfélagsnetum stórfyrirtækja. Á þennan hátt svarar samfélagsmiðillinn þörfum mismunandi hópa. Taktu þátt á netþjóni með reglum sem þú samþykkir, eða hýstu þinn eigin. + feature_moderation_title: Umsjón með efni eins og slík á að vera + follow_action: Fylgjast með + follow_step: Að fylgjast með áhugaverðu fólki er það sem Mastodon snýst um. + follow_title: Aðlagaðu heimastreymið þitt eftir þínu höfði + follows_subtitle: Fylgstu með vel þekktum notendum + follows_title: Hverjum ætti að fylgjast með + follows_view_more: Skoða fleira fólk til að fylgjast með + hashtags_recent_count: "%{people} manns á síðustu %{days} dögum" + hashtags_subtitle: Skoðaðu hvað sé búið að vera í umræðunni síðustu 2 dagana + hashtags_title: Vinsæl myllumerki + hashtags_view_more: Sjá fleiri vinsæl myllumerki + post_action: Skrifa + post_step: Heilsaðu heiminum með texta, ljósmyndum, myndskeiðum eða könnunum. + post_title: Gerðu fyrstu færsluna þína + share_action: Deila + share_step: Láttu vini þína vita hvernig þeir geta fundið þig á Mastodon. + share_title: Deildu notandasniðinu þínu + sign_in_action: Skrá inn subject: Velkomin í Mastodon title: Velkomin/n um borð, %{name}! users: diff --git a/config/locales/it.yml b/config/locales/it.yml index d85f0359d1..64015bd98d 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1844,9 +1844,42 @@ it: silence: Account limitato suspend: Account sospeso welcome: - edit_profile_action: Configura profilo - edit_profile_step: Puoi personalizzare il tuo profilo caricando un'immagine del profilo, cambiare il tuo nome e altro ancora. Puoi scegliere di esaminare i nuovi seguaci prima che loro siano autorizzati a seguirti. + apps_android_action: Scaricalo da Google Play + apps_ios_action: Scarica dall'App Store + apps_step: Scarica le nostre app ufficiali. + apps_title: App di Mastodon + checklist_subtitle: 'Iniziamo su questa nuova frontiera sociale:' + checklist_title: Lista di controllo di Benvenuto + edit_profile_action: Personalizza + edit_profile_step: Gli altri hanno maggiori probabilità di interagire con te se completi il tuo profilo. + edit_profile_title: Personalizza il tuo profilo explanation: Ecco alcuni suggerimenti per iniziare + feature_action: Scopri di più + feature_audience: Mastodon ti offre una possibilità unica di gestire il tuo pubblico senza intermediari. Mastodon, distribuito sulla tua stessa infrastruttura, ti permette di seguire e di essere seguito da qualsiasi altro server Mastodon online, e non è controllato da nessun altro, eccetto te. + feature_audience_title: Costruisci il tuo pubblico in sicurezza + feature_control: Tu sai cosa sia meglio vedere sul tuo home feed. Nessun algoritmo o annunci che sprechino il tuo tempo. Segui chiunque attraverso qualsiasi server Mastodon da un singolo account e ricevi i loro messaggi in ordine cronologico, e rendi il tuo angolo di internet un po' più come te. + feature_control_title: Rimani in controllo della tua timeline + feature_creativity: Mastodon supporta audio, filmati e post, descrizioni di accessibilità, sondaggi, avvisi di contenuto, avatar animati, emoji personalizzate, controllo del ritaglio delle miniature e altro ancora, per aiutarti a esprimerti online. Che tu stia pubblicando la tua arte, la tua musica o il tuo podcast, Mastodon è lì per te. + feature_creativity_title: Creatività senza precedenti + feature_moderation: Mastodon rimette il processo decisionale nelle tue mani. Ogni server crea le proprie regole che vengono applicate localmente e non dall'alto verso il basso come i social media aziendali, rendendo più flessibile il rispondere alle esigenze di diversi gruppi di persone. Unisciti a un server con regole con cui sei d'accordo o ospita il tuo. + feature_moderation_title: Moderazione come dovrebbe essere + follow_action: Segui + follow_step: Seguire persone interessanti è ciò che fa Mastodon. + follow_title: Personalizza il tuo home feed + follows_subtitle: Segui account ben noti + follows_title: Chi seguire + follows_view_more: Visualizza più persone da seguire + hashtags_recent_count: "%{people} persone negli ultimi %{days} giorni" + hashtags_subtitle: Esplora le tendenze degli ultimi 2 giorni + hashtags_title: Hashtag di tendenza + hashtags_view_more: Visualizza altri hashtag di tendenza + post_action: Scrivi + post_step: Salutate il mondo con testo, foto, video o sondaggi. + post_title: Scrivi il tuo primo post + share_action: Condividi + share_step: Fai sapere ai tuoi amici come trovarti su Mastodon. + share_title: Condividi il tuo profilo Mastodon + sign_in_action: Accedi subject: Benvenuto/a su Mastodon title: Benvenuto a bordo, %{name}! users: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 15e66631f5..ae5203baee 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1810,11 +1810,42 @@ ja: silence: アカウントがサイレンスにされました suspend: アカウントが停止されました welcome: - edit_profile_action: プロフィールを設定 - edit_profile_step: |- - プロフィール画像をアップロードしたり、表示名を変更したりして、プロフィールをカスタマイズできます。 - 新しいフォロワーからフォローリクエストを承認する前に、オプトインで確認できます。 + apps_android_action: Google Play で手に入れよう + apps_ios_action: App Store からダウンロード + apps_step: 公式アプリのダウンロード + apps_title: Mastodon アプリ + checklist_subtitle: 新世代のSNSが始まります + checklist_title: 最初のステップはここから + edit_profile_action: プロフィール設定 + edit_profile_step: ほかのユーザーが親しみやすいように、プロフィールを整えましょう。 + edit_profile_title: プロフィールを設定しましょう explanation: 始めるにあたってのアドバイスです + feature_action: もっと詳しく + feature_audience: Mastodonでは、誰の仲介もなく、あなた自身でオーディエンスの管理を行うことができます。あなたのインフラストラクチャー上にデプロイされたMastodon上でも、ほかのどんなMastodonサーバーのアカウントをフォローすることも、フォローされることもでき、それらはもちろんあなた自身で制御できます。 + feature_audience_title: 自信を持ってオーディエンスを構築 + feature_control: ホームフィードで見たいものは、あなたが一番よく知っています。時間を無駄にするアルゴリズムや広告はありません。ひとつのアカウントからすべてのMastodonサーバーの投稿を時系列で受け取り、インターネットの隅っこをもう少しあなたらしくしましょう。 + feature_control_title: 自分のタイムラインを管理 + feature_creativity: Mastodonでは、自己表現を多様にするため、音声・動画・画像の投稿や、アクセシビリティ用説明、投票・コンテンツ警告・動くアバター・カスタム絵文字・サムネイル切り抜き設定などをサポートしています。アートや音楽、ポッドキャストを投稿したいあなたにもMastodonはピッタリです。 + feature_creativity_title: 比類なきクリエイティビティ + feature_moderation: Mastodonでは意思決定はあなたの手にあります。それぞれのサーバーで適用されるルールや規則を策定できます。これらは、企業運営のソーシャルメディアとは違いサーバー単位でローカルに適用されるため、さまざまなグループのニーズに最も柔軟に対応することができるのです。 + feature_moderation_title: サーバー運営をあるべき姿で + follow_action: フォロー + follow_step: ユーザーをフォローしてみましょう。これがMastodonを楽しむ基本です。 + follow_title: 自分のホームタイムラインを作る + follows_subtitle: 人気アカウントをフォロー + follows_title: フォローを増やしてみませんか? + follows_view_more: フォローするユーザーを探す + hashtags_recent_count: "%{days} 日間で %{people} 人が共有" + hashtags_subtitle: 過去2日間のトレンドを見る + hashtags_title: トレンドのハッシュタグ + hashtags_view_more: トレンドのハッシュタグをもっと見る + post_action: 作成 + post_step: 試しになにか書いてみましょう。写真、ビデオ、アンケートなど、なんでも大丈夫です. + post_title: はじめての投稿 + share_action: 共有 + share_step: Mastodon アカウントをほかの人に紹介しましょう。 + share_title: プロフィールをシェアする + sign_in_action: ログイン subject: Mastodonへようこそ title: ようこそ、%{name}さん! users: diff --git a/config/locales/ka.yml b/config/locales/ka.yml index 1b3d48810e..74b8634600 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -470,7 +470,6 @@ ka: subject: თქვენი არქივი გადმოსაწერად მზადაა title: არქივის მიღება welcome: - edit_profile_action: პროფილის მოწყობა explanation: აქ რამდენიმე რჩევაა დასაწყისისთვის subject: კეთილი იყოს თქვენი მობრძანება მასტოდონში title: კეთილი იყოს თქვენი მობრძანება, %{name}! diff --git a/config/locales/kab.yml b/config/locales/kab.yml index d278c15c93..b25a4e3a1d 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -61,7 +61,7 @@ kab: invite_request_text: Timental n tmerna invited_by: Inced-it-id ip: Tansa IP - joined: Ikcemed deg + joined: Izeddi da seg ass n location: all: Akk local: Adigan @@ -95,6 +95,7 @@ kab: remove_header: Kkes tacacit resend_confirmation: already_confirmed: Amseqdac-agi yettwasentem yakan + send: Ɛawed-iyi-d aseɣwen n usentem reset: Wennez reset_password: Beddel awal uffir resubscribe: Ales ajerred @@ -229,6 +230,7 @@ kab: enable: Rmed enabled: Yermed enabled_msg: Imuji yermed mebla ugur + image_hint: PNG neɣ GIF arma d %{size} list: Tabdart new: title: Timerna n imuji udmawan amaynut @@ -279,6 +281,8 @@ kab: create: Rnu taɣult title: Timerna n taɣult tamaynut n imayl ɣer tebdart taberkant title: Tabdart taberkant n imayl + export_domain_blocks: + no_file: Ulac afaylu yettwafernen follow_recommendations: language: I tutlayt status: Addad @@ -290,6 +294,8 @@ kab: by_domain: Taɣult content_policies: policy: Tasertit + dashboard: + instance_languages_dimension: Tutlayin ifazen delivery: all: Akk clear: Sfeḍ tuccḍiwin n usiweḍ @@ -409,6 +415,7 @@ kab: modes: none: Yiwen·t ur yzmir ad izeddi open: Zemren akk ad jerden + title: Iɣewwaṛen n uqeddac site_uploads: delete: Kkes afaylu yulin software_updates: @@ -421,15 +428,22 @@ kab: language: Tutlayt media: title: Amidya + open: Ldi tasuffeɣt title: Tisuffaɣ n umiḍan trending: Ayen mucaɛen visibility: Abani with_media: S umidya + system_checks: + rules_check: + action: Sefrek ilugan n uqeddac title: Tadbelt trends: allow: Sireg statuses: title: Tisuffaɣ mucaɛen + tags: + dashboard: + tag_languages_dimension: Tutlayin ifazen trending: Ayen mucaɛen warning_presets: add_new: Rnu amaynut @@ -468,29 +482,50 @@ kab: description: prefix_invited_by_user: "@%{name} inced-ik·ikem ad ternuḍ ɣer uqeddac-a n Mastodon!" prefix_sign_up: Zeddi di Maṣṭudun assa! + suffix: S umiḍan, tzemreḍ ad tḍefreḍ imdanen, ad d-tessufɣeḍ tisuffaɣ d wembadal n yiznan akked yiseqdacen n yal aqeddac Mastodon d wayen-nniḍen! + didnt_get_confirmation: Ur d-teṭṭifeḍ ara aseɣwen n usentem ? + dont_have_your_security_key: Ulac ɣur-k·m tasarut-ik·im n tɣellist? forgot_password: Tettud awal-ik uffir? log_in_with: Qqen s login: Qqen logout: Ffeɣ migrate_account: Gujj ɣer umiḍan nniḍen or_log_in_with: Neɣ eqqen s + privacy_policy_agreement_html: Ɣriɣ yerna qebleɣ tasertit n tbaḍnit progress: confirm: Sentem imayl + details: Isalli-inek + review: Tamuɣli-nneɣ + rules: Qbel ilugan providers: cas: CAS saml: SAML register: Jerred registration_closed: "%{instance} ur yeqbil ara imttekkiyen imaynuten" + resend_confirmation: Ɛawed-iyi-d aseɣwen n usentem reset_password: Wennez awal uffir rules: + accept: Qbel back: Tuɣalin + preamble_invited: Uqbel ad tkemmleḍ, ttxil-k·m ẓer ilugan i d-sbedden yimkariyen n %{domain}. + title: Kra n yilugan igejdanen. + title_invited: Tettwaɛerḍeḍ. security: Taɣellist set_new_password: Egr-d awal uffir amaynut + setup: + email_below_hint_html: Ssefqed akaram-inek·inem n uspam neɣ ssuter wayeḍ. Tzemreḍ ad tesseɣtiḍ tansa-inek·inem imayl ma yella ur tṣeḥḥa ara. + email_settings_hint_html: Sit ɣef useɣwen i ak-d-nceyyeε akken ad tesfeqdeḍ %{email}. Ad nerǧu da kan. + link_not_received: Ur k-id-iṣaḥ ara wassaɣ ? + new_confirmation_instructions_sent: Ad d-teṭṭfeḍ imayl amaynut s useɣwen n usentem ssya ɣef kra n ddqayeq! sign_in: preamble_html: Kcem ar %{domain} s inekcam-inek n tuqqna. Ma yella yezga-d umiḍan-ik deg uqeddac-nniḍen, ur tezmireḍ ara ad tkecmeḍ sya. title: Akeččum ɣer %{domain} + sign_up: + preamble: S umiḍan deg uqeddac-a n Mastodon, ad tizmireḍ ad tḍefreḍ win i ak-yehwan deg uẓeṭṭa, anida yebɣu yili umiḍan-nsen. + title: Iyya ad d-nessewjed tiɣawsiwin i %{domain}. status: account_status: Addad n umiḍan + functional: Amiḍan-inek·inem yetteddu s lekmal-is. use_security_key: Seqdec tasarut n teɣlist challenge: confirm: Kemmel @@ -515,6 +550,7 @@ kab: x_months: "%{count}agu" x_seconds: "%{count}tas" deletes: + confirm_password: Sekcem awal-ik·im uffir n tura akken ad tesfeqdeḍ tamagit-ik·im proceed: Kkes amiḍan warning: username_available: Isem-ik·im n useqdac ad yuɣal yella i tikkelt-nniḍen @@ -524,6 +560,9 @@ kab: status: 'Tasuffeɣt #%{id}' title_actions: none: Ɣur-wat + edit_profile: + basic_information: Talɣut tamatut + hint_html: "Mudd udem i wayen ttwalin medden deg umaɣnu-inek azayez ɣer yidis n yiznan-ik. Imdanen niḍen zemren ad k-ḍefren yernu ad gen assaɣ yid-k mi ara tesɛuḍ amaɣnu yeccuṛen ed tugna n umaɣnu." errors: '500': title: Asebter-ayi d arameɣtu @@ -550,6 +589,9 @@ kab: index: delete: Kkes empty: Ur tesɛid ara imzizdigen. + statuses: + one: "%{count} n tsuffeɣt" + other: "%{count} n tsuffaɣ" title: Imzizdigen new: save: Sekles amsizdeg amaynut @@ -590,6 +632,7 @@ kab: '86400': 1 wass expires_in_prompt: Werǧin generate: Slaled aseɣwen n uɛraḍ + invalid: Aneɛruḍ-a ur iṣeḥḥa ara invited_by: 'Tettwaɛraḍeḍ s ɣur:' max_uses: one: 1 uuseqdec @@ -649,6 +692,9 @@ kab: search: Anadi privacy_policy: title: Tasertit tabaḍnit + redirects: + prompt: Ma tumneḍ aseɣwen-a, sit fell-as akken ad tkemmleḍ. + title: Aql-ik·em ad teffɣeḍ seg %{instance}. relationships: activity: Armud n umiḍan followers: Imeḍfaṛen @@ -742,6 +788,7 @@ kab: vote: Dɣeṛ show_more: Ssken-d ugar show_newer: Ssken-d timaynutin + show_older: Ssken-d tiqburin show_thread: Ssken-d lxiḍ title: '%{name} : "%{quote}"' visibilities: @@ -771,6 +818,8 @@ kab: formats: default: "%d %b %Y, %H:%M" month: "%b %Y" + time: "%H:%M" + with_time_zone: "%d %b %Y, %H:%M %Z" two_factor_authentication: add: Rnu disable: Gdel @@ -792,6 +841,15 @@ kab: silence: Amiḍan yesɛa talast suspend: Amiḍan yettwaḥbas welcome: + apps_step: Zdem-d isnasen-nneɣ unṣiben. + apps_title: Isnasen n Mastodon + feature_action: Issin ugar + follow_action: Ḍfeṛ + follows_title: Anwa ara ḍefṛeḍ + follows_view_more: Ssken-d ugar n medden ay tzemred ad tḍefred + post_step: Ini-as azul i umaḍal s uḍris, s tiwlafin, s tividyutin neɣ s tefranin. + share_action: Bḍu + share_step: Init-asen i yimeddukal-nwen amek ara ken-id-afen deg Mastodon. subject: Ansuf ɣer Maṣṭudun title: Ansuf yessek·em, %{name}! users: diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 9528c0950f..1dcbce97eb 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -718,7 +718,6 @@ kk: silence: Аккаунт шектеулі suspend: Аккаунт тоқтатылды welcome: - edit_profile_action: Профиль өңдеу explanation: Мына кеңестерді шолып өтіңіз subject: Mastodon Желісіне қош келдіңіз title: Ортаға қош келдің, %{name}! diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 1e53006cbb..40af97c628 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1,7 +1,7 @@ --- ko: about: - about_mastodon_html: '미래의 소셜 네트워크: 광고 없음, 기업 감시 없음, 윤리적 설계, 탈중앙화! 여러분만의 데이터를 Mastodon으로 소유하세요!' + about_mastodon_html: '미래의 소셜 네트워크: 광고 없음, 기업 감시 없음, 윤리적 설계, 탈중앙화! 여러분만의 데이터를 Mastodon으로 보호하고 누리세요!' contact_missing: 미설정 contact_unavailable: 없음 hosted_on: "%{domain}에서 호스팅 되는 마스토돈" @@ -14,7 +14,7 @@ ko: instance_actor_flash: 이 계정은 서버 자신을 나타내기 위한 가상의 계정이며 개인 사용자가 아닙니다. 이 계정은 연합을 위해 사용되며 정지되지 않아야 합니다. last_active: 최근 활동 link_verified_on: "%{date}에 이 링크의 소유가 확인되었습니다" - nothing_here: 아무 것도 없습니다! + nothing_here: 텅 비어있네요! pin_errors: following: 추천하려는 사람을 팔로우 하고 있어야 합니다 posts: @@ -67,7 +67,7 @@ ko: enable: 동결 해제 enable_sign_in_token_auth: 이메일 토큰 인증 활성화 enabled: 활성 - enabled_msg: "%{username}의 계정을 성공적으로 얼리기 해제하였습니다" + enabled_msg: "%{username}의 동결을 성공적으로 해제 했습니다." followers: 팔로워 follows: 팔로우 header: 헤더 @@ -75,7 +75,7 @@ ko: invite_request_text: 가입하려는 이유 invited_by: 초대자 ip: IP - joined: 가입 + joined: 가입 날짜 location: all: 전체 local: 로컬 @@ -93,7 +93,7 @@ ko: pending: 대기 중 silenced: 제한됨 suspended: 정지 - title: 중재 + title: 관리 moderation_notes: 중재 참고사항 most_recent_activity: 최근 활동 most_recent_ip: 최근 IP @@ -103,7 +103,7 @@ ko: not_subscribed: 구독하지 않음 pending: 심사 대기 perform_full_suspension: 정지 - previous_strikes: 이전의 처벌들 + previous_strikes: 과거 처벌 previous_strikes_description_html: other: 이 계정에는 %{count}번의 처벌이 있었습니다. promote: 승급 @@ -116,7 +116,7 @@ ko: rejected_msg: 성공적으로 %{username}의 가입 신청서를 반려하였습니다 remote_suspension_irreversible: 이 계정의 데이터는 되돌릴 수 없도록 삭제되었습니다. remote_suspension_reversible_hint_html: 이 계정은 계정이 속한 서버에서 정지되었습니다, 그리고 %{date}에 데이터가 완전히 삭제될 것입니다. 그 때까지는 해당 서버에서 계정을 그대로 복구할 수 있습니다. 만약 지금 당장 이 계정의 모든 데이터를 삭제하고 싶다면, 아래에서 실행할 수 있습니다. - remove_avatar: 아바타 지우기 + remove_avatar: 아바타 삭제 remove_header: 헤더 삭제 removed_avatar_msg: 성공적으로 %{username}의 아바타 이미지를 삭제하였습니다 removed_header_msg: 성공적으로 %{username}의 헤더 이미지를 삭제하였습니다 @@ -1812,9 +1812,39 @@ ko: silence: 계정 제한 됨 suspend: 계정 정지 됨 welcome: - edit_profile_action: 프로필 설정 - edit_profile_step: 프로필 사진을 업로드하거나 사람들에게 표시할 이름을 바꾸는 것 등으로 자신의 프로필을 커스텀 할 수 있습니다. 새로운 팔로워를 검토 후에 허용하도록 할 수도 있습니다. + apps_android_action: Google Play에서 다운로드 + apps_ios_action: App Store에서 다운로드 + apps_step: 공식 앱을 다운로드해보세요. + apps_title: Mastodon 앱 + checklist_subtitle: '이 새로운 소셜미디어를 시작해봅시다:' + checklist_title: 환영 체크리스트 + edit_profile_action: 개인 맞춤 + edit_profile_step: 의미있는 프로필을 작성해 상호작용을 늘려보세요. + edit_profile_title: 프로필 꾸미기 explanation: 시작하기 전에 몇가지 팁들을 준비했습니다 + feature_action: 더 알아보기 + feature_audience: 마스토돈은 중개자 없이 청중을 관리할 수 있는 특별한 가능성을 제공합니다. 자체 인프라에 배포된 마스토돈을 사용하면 온라인에 있는 다른 마스토돈 서버에도 팔로우하거나 팔로우할 수 있으며, 본인 외에는 누구의 통제도 받지 않습니다. + feature_control_title: 내 타임라인에 대해 통제권을 유지하세요 + feature_creativity: 마스토돈은 오디오, 비디오, 사진, 접근성 설명(alt), 투표, 콘텐츠 주의 (블라인드), 움직이는 아바타, 커스텀 이모티콘, 썸네일 자르기, 그리고 더 많은 것들을 당신이 온라인에서 당신을 더 잘 드러낼 수 있도록 돕기위해 지원합니다. 당신이 그림이나 음악을 올리던, 팟캐스트 같은것을 진행하던 마스토돈이 함께합니다. + feature_moderation: 마스토돈은 의사 결정권을 사용자에게 돌려줍니다. 각 서버는 기업 소셜 미디어처럼 하향식이 아닌 로컬에서 시행되는 자체 규칙과 규정을 만들 수 있어 다양한 그룹의 요구에 가장 유연하게 대응할 수 있습니다. 동의하는 규칙이 있는 서버에 가입하거나 직접 서버를 호스팅하세요. + feature_moderation_title: 올바른 중재 + follow_action: 팔로우 + follow_step: 흥미로운 사람들을 팔로우하는 것이 마스토돈의 전부입니다. + follow_title: 내게 맞는 홈 피드 꾸미기 + follows_subtitle: 잘 알려진 계정들을 팔로우 + follows_title: 누구를 팔로우 할 지 + follows_view_more: 팔로우 할 사람들 더 보기 + hashtags_recent_count: 최근 %{days}일동안 %{people} 명 + hashtags_subtitle: 최근 2일간 무엇이 유행했는지 둘러보기 + hashtags_title: 유행하는 해시태그 + hashtags_view_more: 유행하는 해시태그 더 보기 + post_action: 작성 + post_step: 글, 사진, 영상, 또는 투표로 세상에 인사해보세요. + post_title: 첫번째 게시물 쓰기 + share_action: 공유 + share_step: 친구에게 마스토돈에서 나를 찾을 수 있는 방법을 알려주세요. + share_title: 마스토돈 프로필을 공유하세요 + sign_in_action: 로그인 subject: 마스토돈에 오신 것을 환영합니다 title: 환영합니다 %{name} 님! users: diff --git a/config/locales/ku.yml b/config/locales/ku.yml index 91ab75ceb0..0c44b7555b 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -1590,8 +1590,6 @@ ku: silence: Ajimêr sînor kiriye suspend: Ajimêr hatiye rawestandin welcome: - edit_profile_action: Profîlê saz bike - edit_profile_step: Tu dikarî bi barkirina wêneyek profîlê, guhertina navê xwe ya xuyangê û bêtir profîla xwe kesane bikî. Berî ku mafê bidî ku te şopînerên nû te bişopînin, tu dikarî binirxînî. explanation: Li vir çend serişte hene ku tu dest pê bike subject: Tu bi xêr hatî Mastodon title: Bi xêr hatî, %{name}! diff --git a/config/locales/lad.yml b/config/locales/lad.yml index bed6b44d39..2293045375 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -1842,9 +1842,26 @@ lad: silence: Kuento limitado suspend: Kuento suspendido welcome: - edit_profile_action: Konfigurasyon de profil - edit_profile_step: Puedes personalizar tu profil kargando una foto de profil, trokando tu nombre de utilizador i muncho mas. Puedes optar por revizar a los muevos suivantes antes de ke puedan segirte. + apps_android_action: Abasha en Google Play + apps_ios_action: Abasha en App Store + apps_step: Abasha muestras aplikasyones ofisyalas. + apps_title: Aplikasyones de Mastodon + edit_profile_action: Personaliza + edit_profile_step: Kompleta tu profil para aumentar tus enteraksyones. + edit_profile_title: Personaliza tu profil explanation: Aki ay algunos konsejos para ampesar + feature_action: Ambezate mas + follow_action: Sige + follow_title: Personaliza tu linya prinsipala + follows_title: A ken segir + hashtags_title: Etiketas en trend + post_action: Eskrive + post_step: Puedes introdusirte al mundo kon teksto, fotos, videos o anketas. + post_title: Eskrive tu primera publikasyon + share_action: Partaja + share_step: Informa a tus amigos komo toparte en Mastodon. + share_title: Partaja tu profil de Mastodon + sign_in_action: Konektate subject: Bienvenido a Mastodon title: Bienvenido, %{name}! users: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 7ffce1a516..62336d89d4 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -1,7 +1,7 @@ --- lt: about: - about_mastodon_html: 'Ateities socialinis tinklas: jokių reklamų, jokių įmonių sekimo, etiškas dizainas ir decentralizacija. Turėk savo duomenis su Mastodon!' + about_mastodon_html: 'Ateities socialinis tinklas: jokių reklamų, jokių įmonių sekimo, etiškas dizainas ir decentralizacija! Turėk savo duomenis su Mastodon.' contact_missing: Nenustatyta contact_unavailable: Nėra hosted_on: Mastodon talpinamas %{domain} @@ -15,11 +15,11 @@ lt: other: Sekėjų following: Seka instance_actor_flash: Ši paskyra yra virtualus veikėjas (-a), naudojamas atstovauti pačiam serveriui, o ne atskiram naudotojui. Tai naudojama federacijos tikslais ir neturėtų būti pristabdyta. - last_active: paskutinis aktyumas + last_active: paskutinį kartą aktyvus link_verified_on: Šios nuorodos nuosavybė buvo patikrinta %{date} - nothing_here: Nieko čia nėra! + nothing_here: Nieko čia nėra. pin_errors: - following: Privalai sekti asmenį, kurį nori patvirtinti. + following: Privalai sekti žmogų, kurį nori patvirtinti. posts: few: Įrašai many: Įrašo @@ -37,39 +37,43 @@ lt: accounts: add_email_domain_block: Blokuoti el. pašto domeną approve: Patvirtinti - approved_msg: Sėkmingai patvirtinta %{username} registracijos paraiška + approved_msg: Sėkmingai patvirtinta %{username} registracijos paraiška. are_you_sure: Ar esi įsitikinęs (-usi)? avatar: Avataras by_domain: Domenas change_email: - changed_msg: El. paštas sėkmingai pakeistas! - current_email: Dabartinis el paštas - label: Pakeisti el pašto adresą - new_email: Naujas el pašto adresas - submit: Pakeisti el pašto adresą - title: Pakeisti el pašto adresą vartotojui %{username} + changed_msg: El. paštas sėkmingai pakeistas. + current_email: Dabartinis el. paštas + label: Keisti el. paštą + new_email: Naujas el. paštas + submit: Keisti el. paštą + title: Keisti el. paštą %{username} change_role: + changed_msg: Vaidmuo sėkmingai pakeistas. label: Keisti vaidmenį no_role: Jokios vaidmenį title: Keisti vaidmenį %{username} confirm: Patvirtinti confirmed: Patvirtinta - confirming: Tvirtinama + confirming: Patvirtinama custom: Pasirinktinis delete: Ištrinti duomenis - deleted: Ištrinti + deleted: Ištrinta demote: Pažeminti - disable: Išjungti + destroyed_msg: "%{username} duomenys dabar laukia eilėje, kad būtų netrukus ištrinti." + disable: Sustabdyti disable_sign_in_token_auth: Išjungti el. pašto prieigos rakto tapatybės nustatymą disable_two_factor_authentication: Išjungti 2FA - disabled: Išjungta + disabled: Pristabdyta display_name: Rodomas vardas domain: Domenas - edit: Keisti - email: El paštas - email_status: El pašto statusas - enable: Įjungti + edit: Redaguoti + email: El. paštas + email_status: El. pašto būsena + enable: Panaikinti sustabdymą + enable_sign_in_token_auth: Įjungti el. pašto prieigos rakto tapatybės nustatymą enabled: Įjungta + enabled_msg: Sėkmingai panaikintas %{username} paskyros sustabdymas. followers: Sekėjai follows: Seka header: Antraštė @@ -80,94 +84,264 @@ lt: joined: Prisijungė location: all: Visi - local: Lokali + local: Vietinis remote: Nuotolinis - title: Lokacija - login_status: Prisijungimo statusas - media_attachments: Prisegti medijos failai - memorialize: Paversti į memorija + title: Vieta + login_status: Prisijungimo būsena + media_attachments: Medijos priedai + memorialize: Paversti į memorialinį + memorialized: Memorializuota + memorialized_msg: Sėkmingai paversta %{username} į memorialinę paskyrą. moderation: active: Aktyvus all: Visi + disabled: Išjungta + pending: Laukiama + silenced: Ribotas suspended: Užrakintas - title: Moderacija - moderation_notes: Medaracijos žinutės - most_recent_activity: Paskutinioji veikla - most_recent_ip: Paskutinis IP - no_limits_imposed: Be limitu - not_subscribed: Ne prenumeruota - perform_full_suspension: Užrakinti + title: Prižiūrėjimas + moderation_notes: Prižiūrėjimo pastabos + most_recent_activity: Naujausia veikla + most_recent_ip: Naujausias IP + no_account_selected: Nebuvo pakeistos jokios paskyros, nes nebuvo pasirinkta nė viena. + no_limits_imposed: Nėra nustatytų ribojimų. + no_role_assigned: Nėra priskirto vaidmens. + not_subscribed: Neužprenumeruota + pending: Laukiama peržiūros + perform_full_suspension: Pristabdyti + previous_strikes: Ankstesni pažeidimai + previous_strikes_description_html: + few: Šioje paskyroje yra %{count} pažeidimai. + many: Šioje paskyroje yra %{count} pažeidimas. + one: Šioje paskyroje yra vienas pažeidimas. + other: Šioje paskyroje yra %{count} pažeidimų. promote: Paaukštinti protocol: Protokolas public: Viešas - push_subscription_expires: PuSH prenumeramivas pasibaigė - redownload: Perkrauti profilį - rejected_msg: Sėkmingai patvirtinta %{username} registracijos paraiška + push_subscription_expires: PuSH prenumerata baigiasi + redownload: Atnaujinti profilį + redownloaded_msg: Sėkmingai atnaujintas %{username} profilis iš kilmės šaltinio. + reject: Atmesti + rejected_msg: Sėkmingai atmesta %{username} registracijos paraiška. remote_suspension_irreversible: Šios paskyros duomenys negrįžtamai ištrinti. - remote_suspension_reversible_hint_html: Paskyra jų serveryje buvo sustabdyta, o duomenys bus visiškai pašalinti %{date}. Iki to laiko nuotolinis serveris gali atkurti šią paskyrą be jokių neigiamų pasekmių. Jei norite iš karto pašalinti visus paskyros duomenis, galite tai padaryti toliau. - remove_avatar: Panaikinti profilio nuotrauką - remove_header: Panaikinti antraštę - removed_header_msg: Sėkmingai pašalintas %{username} antraštės paveikslėlis + remote_suspension_reversible_hint_html: Paskyra jų serveryje buvo pristabdyta, o duomenys bus visiškai pašalinti %{date}. Iki to laiko nuotolinis serveris gali atkurti šią paskyrą be jokių neigiamų pasekmių. Jei nori iš karto pašalinti visus paskyros duomenis, gali tai padaryti toliau. + remove_avatar: Pašalinti avatarą + remove_header: Pašalinti antraštę + removed_avatar_msg: Sėkmingai pašalintas %{username} avataro vaizdas. + removed_header_msg: Sėkmingai pašalintas %{username} antraštės vaizdas. resend_confirmation: - already_confirmed: Šis vartotojas jau patvirtintas - send: Dar kartą išsiųsti patvirtinimo nuorodą - success: Patvirtinimo laiškas sėkmingai išsiųstas! - reset: Iš naujo - reset_password: Atkurti slaptažodį - resubscribe: Per prenumeruoti + already_confirmed: Šis naudotojas jau patvirtintas. + send: Iš naujo siųsti patvirtinimo nuorodą + success: Patvirtinimo nuoroda sėkmingai išsiųsta. + reset: Nustatyti iš naujo + reset_password: Nustatyti iš naujo slaptažodį + resubscribe: Prenumeruoti iš naujo role: Vaidmuo search: Ieškoti - search_same_email_domain: Kiti tą patį el. pašto domeną turintys naudotojai - search_same_ip: Kiti tą patį IP turintys naudotojai - security: Apsauga + search_same_email_domain: Kiti naudotojai su tuo pačiu el. pašto domenu + search_same_ip: Kiti naudotojai su tuo pačiu IP + security: Saugumas security_measures: only_password: Tik slaptažodis password_and_2fa: Slaptažodis ir 2FA - sensitized: Pažymėti kaip jautrią informaciją - shared_inbox_url: Bendroji gautųjų URL + sensitive: Priversti žymėti kaip jautrią + sensitized: Pažymėta kaip jautri + shared_inbox_url: Bendras gautiejų URL show: - created_reports: Parašyti raportai - targeted_reports: Reportuotas kitų - silence: Tyla - silenced: Užtildytas - statuses: Statusai + created_reports: Sukurtos ataskaitos + targeted_reports: Pranešė kiti + silence: Riboti + silenced: Ribotas + statuses: Įrašai + strikes: Ankstesni pažeidimai subscribe: Prenumeruoti - suspended: Užrakintas - suspension_irreversible: Šios paskyros duomenys negrįžtamai ištrinti. Galite atšaukti paskyros sustabdymą, kad ja būtų galima naudotis, tačiau nebus atkurti jokie anksčiau turėti duomenys. - suspension_reversible_hint_html: Paskyra sustabdyta, o duomenys bus visiškai pašalinti %{date}. Iki to laiko paskyrą galima atkurti be jokių neigiamų pasekmių. Jei norite iš karto pašalinti visus paskyros duomenis, galite tai padaryti toliau. - title: Vartotojai - unblock_email: El. pašto adreso atblokavimas - unblocked_email_msg: Sėkmingai atblokuotas %{username} el. pašto adresas - unconfirmed_email: Nepatvirtintas el pašto adresas - undo_silenced: Atšaukti užtildymą - undo_suspension: Atšaukti užrakinimą - unsilenced_msg: Sėkmingai panaikintas %{username} paskyros apribojimas - unsubscribe: Nebeprenumeruoti - unsuspended_msg: Sėkmingai panaikintas %{username} paskyros apribojimas - username: Slapyvardis + suspend: Pristabdyti + suspended: Pristabdyta + suspension_irreversible: Šios paskyros duomenys negrįžtamai ištrinti. Gali atšaukti paskyros pristabdymą, kad ja būtų galima naudotis, bet nebus atkurti jokie anksčiau turėti duomenys. + suspension_reversible_hint_html: Paskyra pristabdyta, o duomenys bus visiškai pašalinti %{date}. Iki to laiko paskyrą galima atkurti be jokių neigiamų pasekmių. Jei nori iš karto pašalinti visus paskyros duomenis, gali tai padaryti toliau. + title: Naudotojai + unblock_email: Atblokuoti el. pašto adresą + unblocked_email_msg: Sėkmingai atblokuotas %{username} el. pašto adresas. + unconfirmed_email: Nepatvirtintas el. pašto adresas. + undo_sensitized: Atšaukti privertimą žymėti kaip jautrią + undo_silenced: Atšaukti ribojimą + undo_suspension: Atšaukti pristabdymą + unsilenced_msg: Sėkmingai atšauktas %{username} paskyros ribojimas. + unsubscribe: Atšaukti prenumeratą + unsuspended_msg: Sėkmingai panaikintas %{username} paskyros pristabdymas. + username: Naudotojo vardas view_domain: Peržiūrėti domeno santrauką warn: Įspėti + web: Žiniatinklis whitelisted: Leidžiama federacijai action_logs: + action_types: + approve_appeal: Patvirtinti apeliaciją + approve_user: Patvirtinti naudotoją + assigned_to_self_report: Priskirti ataskaitą + change_email_user: Keisti el. paštą naudotojui + change_role_user: Keisti naudotojo vaidmenį + confirm_user: Patvirtinti naudotoją + create_account_warning: Kurti įspėjimą + create_announcement: Kurti skelbimą + create_canonical_email_block: Kurti el. pašto bloką + create_custom_emoji: Kurti pasirinktinį jaustuką + create_domain_allow: Kurti domeno leidimą + create_domain_block: Kurti domeno bloką + create_email_domain_block: Kurti el. pašto domeno bloką + create_ip_block: Kurti IP taisyklę + create_unavailable_domain: Kurti nepasiekiamą domeną + create_user_role: Kurti vaidmenį + demote_user: Pažeminti naudotoją + destroy_announcement: Ištrinti skelbimą + destroy_canonical_email_block: Ištrinti el. pašto bloką + destroy_custom_emoji: Ištrinti pasirinktinį jaustuką + destroy_domain_allow: Ištrinti domeno leidimą + destroy_domain_block: Ištrinti domeno bloką + destroy_email_domain_block: Ištrinti el. pašto domeno bloką + destroy_instance: Išvalyti domeną + destroy_ip_block: Ištrinti IP taisyklę + destroy_status: Ištrinti įrašą + destroy_unavailable_domain: Ištrinti nepasiekiamą domeną + destroy_user_role: Sunaikinti vaidmenį + disable_2fa_user: Išjungti 2FA + disable_custom_emoji: Išjungti pasirinktinį jaustuką + disable_sign_in_token_auth_user: Išjungti el. pašto prieigos rakto tapatybės nustatymą naudotojui + disable_user: Išjungti naudotoją + enable_custom_emoji: Įjungti pasirinktinį jaustuką + enable_sign_in_token_auth_user: Įjungti el. pašto prieigos rakto tapatybės nustatymą naudotojui + enable_user: Įjungti naudotoją + memorialize_account: Memorializuoti paskyrą + promote_user: Paaukštinti naudotoją + reject_appeal: Atmesti apeliaciją + reject_user: Atmesti naudotoją + remove_avatar_user: Pašalinti avatarą + reopen_report: Iš naujo atidaryti ataskaitą + resend_user: Iš naujo siųsti patvirtinimo laišką + reset_password_user: Nustatyti iš naujo slaptažodį + resolve_report: Išspręsti ataskaitą + sensitive_account: Priversti žymėti kaip jautrią paskyrai + silence_account: Riboti paskyrą + suspend_account: Pristabdyti paskyrą + unassigned_report: Panaikinti priskyrimą ataskaitą + unblock_email_account: Atblokuoti el. pašto adresą + unsensitive_account: Atšaukti privertimą žymėti kaip jautrią paskyrai + unsilence_account: Atšaukti riboti paskyrą + unsuspend_account: Atšaukti paskyros pristabdymą + update_announcement: Atnaujinti skelbimą + update_custom_emoji: Atnaujinti pasirinktinį jaustuką + update_domain_block: Atnaujinti domeno bloką + update_ip_block: Atnaujinti IP taisyklę + update_status: Atnaujinti įrašą + update_user_role: Atnaujinti vaidmenį + actions: + approve_appeal_html: "%{name} patvirtino prižiūjimo veiksmo apeliaciją iš %{target}" + approve_user_html: "%{name} patvirtino registraciją iš %{target}" + assigned_to_self_report_html: "%{name} paskyrė ataskaitą %{target} saviems" + change_email_user_html: "%{name} pakeitė el. paštą naudotojui %{target}" + change_role_user_html: "%{name} pakeitė vaidmenį %{target}" + confirm_user_html: "%{name} patvirtino el. paštą naudotojui %{target}" + create_account_warning_html: "%{name} išsiuntė įspėjimą %{target}" + create_announcement_html: "%{name} sukūrė naują skelbimą %{target}" + create_canonical_email_block_html: "%{name} užblokavo el. paštą su maišu %{target}" + create_custom_emoji_html: "%{name} įkėlė naują jaustuką %{target}" + create_domain_allow_html: "%{name} leido federaciją su domenu %{target}" + create_domain_block_html: "%{name} užblokavo domeną %{target}" + create_email_domain_block_html: "%{name} užblokavo el. pašto domeną %{target}" + create_ip_block_html: "%{name} sukūrė taisyklę IP %{target}" + create_unavailable_domain_html: "%{name} sustabdė tiekimą į domeną %{target}" + create_user_role_html: "%{name} sukūrė %{target} vaidmenį" + demote_user_html: "%{name} pažemino naudotoją %{target}" + destroy_announcement_html: "%{name} ištrynė skelbimą %{target}" + destroy_canonical_email_block_html: "%{name} atblokavo el. paštą su maišu %{target}" + destroy_custom_emoji_html: "%{name} ištrynė jaustuką %{target}" + destroy_domain_allow_html: "%{name} neleido federacijos su domenu %{target}" + destroy_domain_block_html: "%{name} atblokavo domeną %{target}" + destroy_email_domain_block_html: "%{name} atblokavo el. pašto domeną %{target}" + destroy_instance_html: "%{name} išvalė domeną %{target}" + destroy_ip_block_html: "%{name} ištrynė taisyklę IP %{target}" + destroy_status_html: "%{name} pašalino įrašą %{target}" + destroy_unavailable_domain_html: "%{name} pratęsė tiekimą į domeną %{target}" + destroy_user_role_html: "%{name} ištrynė %{target} vaidmenį" + disable_2fa_user_html: "%{name} išjungė dviejų veiksnių reikalavimą naudotojui %{target}" + disable_custom_emoji_html: "%{name} išjungė jaustuką %{target}" + disable_sign_in_token_auth_user_html: "%{name} išjungė el. pašto prieigos tapatybės nustatymą %{target}" + disable_user_html: "%{name} išjungė prisijungimą naudotojui %{target}" + enable_custom_emoji_html: "%{name} įjungė jaustuką %{target}" + enable_sign_in_token_auth_user_html: "%{name} įjungė el. pašto prieigos tapatybės nustatymą %{target}" + enable_user_html: "%{name} įjungė prisijungimą naudotojui %{target}" + memorialize_account_html: "%{name} pavertė %{target} paskyrą į atminimo puslapį" + promote_user_html: "%{name} paaukštino naudotoją %{target}" + reject_appeal_html: "%{name} atmetė prižiūjimo veiksmo apeliaciją iš %{target}" + reject_user_html: "%{name} atmetė registraciją iš %{target}" + remove_avatar_user_html: "%{name} pašalino %{target} avatarą" + reopen_report_html: "%{name} atidarė ataskaitą %{target}" + resend_user_html: "%{name} iš naujo išsiuntė patvirtinimo el. laišką %{target}" + reset_password_user_html: "%{name} iš naujo nustatė naudotojo slaptažodį %{target}" + resolve_report_html: "%{name} išsprendė ataskaitą %{target}" + sensitive_account_html: "%{name} pažymėjo %{target} mediją kaip jautrią" + silence_account_html: "%{name} apribojo %{target} paskyrą" + suspend_account_html: "%{name} pristabdė %{target} paskyrą" + unassigned_report_html: "%{name} panaikino priskyrimą ataskaitui %{target}" + unblock_email_account_html: "%{name} atblokavo %{target} el. pašto adresą" + unsensitive_account_html: "%{name} panaikino %{target} medijos žymėjimą kaip jautrią" + unsilence_account_html: "%{name} panaikino %{target} paskyros ribojimą" + unsuspend_account_html: "%{name} atšaukė %{target} paskyros pristabdymą" + update_announcement_html: "%{name} atnaujino skelbimą %{target}" + update_custom_emoji_html: "%{name} atnaujino jaustuką %{target}" + update_domain_block_html: "%{name} atnaujino domeno bloką %{target}" + update_ip_block_html: "%{name} pakeitė taisyklę IP %{target}" + update_status_html: "%{name} atnaujino įrašą %{target}" + update_user_role_html: "%{name} pakeitė %{target} vaidmenį" + deleted_account: ištrinta paskyra + empty: Žurnalų nerasta. + filter_by_action: Filtruoti pagal veiksmą + filter_by_user: Filtruoti pagal naudotoją title: Audito žurnalas + announcements: + destroyed_msg: Skelbimas sėkmingai ištrintas. + edit: + title: Redaguoti skelbimą + empty: Skelbimų nerasta. + live: Tiesiogiai + new: + create: Sukurti skelbimą + title: Naujas skelbimas + publish: Skelbti + published_msg: Skelbimas sėkmingai paskelbtas. + scheduled_for: Suplanuota %{time} + scheduled_msg: Skelbimas suplanuotas paskelbti. + title: Skelbimai + unpublish: Panaikinti skelbimą + unpublished_msg: Skelbimas sėkmingai panaikintas. + updated_msg: Skelbimas sėkmingai atnaujintas. + critical_update_pending: Laukiama kritinio naujinimo custom_emojis: + assign_category: Priskirti kategoriją by_domain: Domenas - copied_msg: Sėkmingai sukurta lokali jaustuko kopija + copied_msg: Sėkmingai sukurta vietinė jaustuko kopija. copy: Kopijuoti - copy_failed_msg: Lokali jaustuko kopija negalėjo būti sukurta - created_msg: Jaustukas sukurtas sėkmingai! + copy_failed_msg: Nepavyko sukurti vietinės šios jaustuko kopijos. + create_new_category: Sukurti naują kategoriją + created_msg: Jaustukas sėkmingai sukurtas. delete: Ištrinti destroyed_msg: Jaustukas sėkmingai sunaikintas! disable: Išjungti - disabled_msg: Šis jaustukas sėkmingai išjungtas + disabled: Išjungta + disabled_msg: Sėkmingai išjungtas tas jaustukas. emoji: Jaustukas enable: Įjungti - enabled_msg: Šis jaustukas sėkmingai įjungtas + enabled: Įjungta + enabled_msg: Sėkmingai įjungtas tas jaustukas. + image_hint: PNG arba GIF iki %{size} + list: Sąrašas listed: Įtrauktas į sąrašą new: - title: Pridėti naują jaustuką + title: Pridėti naują pasirinktinį jaustuką + no_emoji_selected: Jaustukos nebuvo pakeistos, nes nebuvo pasirinktos. + not_permitted: Tau neleidžiama atlikti šio veiksmo. overwrite: Perrašyti - shortcode: Trumpas-kodas + shortcode: Trumpas kodas shortcode_hint: Bent du ženklai, tik raidiniai skaitmeniniai ženklai bei akcentai(_) title: Asmeniniai jaustukai unlisted: Neįtrauktas į sąrašą @@ -175,14 +349,58 @@ lt: updated_msg: Jaustukas sėkmingai pakeistas! upload: Įkelti dashboard: + active_users: aktyvūs naudotojai + interactions: sąveikos + media_storage: Medijos saugykla + new_users: nauji naudotojai + opened_reports: atidaryti ataskaitos + pending_appeals_html: + few: "%{count} laukiantys apeliacijos" + many: "%{count} laukiama apeliacija" + one: "%{count} laukiama apeliacija" + other: "%{count} laukiančių apeliacijų" + pending_reports_html: + few: "%{count} laukiami ataskaitos" + many: "%{count} laukiama ataskaita" + one: "%{count} laukiama ataskaita" + other: "%{count} laukiančių ataskaitų" + pending_tags_html: + few: "%{count} laukiantys saitažodžiai" + many: "%{count} laukiama saitažodis" + one: "%{count} laukiama saitažodis" + other: "%{count} laukiančių saitažodžių" + pending_users_html: + few: "%{count} laukiami naudotojai" + many: "%{count} laukiama naudotojas" + one: "%{count} laukiama naudotojas" + other: "%{count} laukiančių naudotojų" + resolved_reports: išspręstos ataskaitos software: Programinė įranga - space: Naudojama atmintis - title: Pagrindinis puslapis + sources: Registracijos šaltiniai + space: Vietos naudojimas + title: Sąvadas + top_languages: Populiariausios aktyvios kalbos + top_servers: Populiariausi aktyvūs serveriai + website: Svetainė + disputes: + appeals: + empty: Apeliacijų nerasta. + title: Apeliacijos + domain_allows: + add_new: Leisti federaciją su domenu + created_msg: Domenas buvo sėkmingai leistas federacijai. + destroyed_msg: Domenas buvo neleistas federacijai. + export: Eksportuoti domain_blocks: add_new: Pridėti naują domeno bloką created_msg: Domeno užblokavimas nagrinėjamas destroyed_msg: Domeno blokas pašalintas domain: Domenas + edit: Redaguoti domeno bloką + existing_domain_block: Tu jau nustatei griežtesnius apribojimus %{name}. + existing_domain_block_html: Tu jau nustatei griežtesnius apribojimus %{name}, pirmiausia turi atblokuoti jį. + export: Eksportuoti + import: Importuoti new: create: Sukurti bloką hint: Domeno blokavimas nesustabdys vartotojų paskyrų sukūrimo duomenų sistemoje, tačiau automatiškai pritaikys atitinkamus moderavimo metodus šioms paskyroms. @@ -606,8 +824,42 @@ lt: silence: Paskyra limituota suspend: Paskyra užrakinta welcome: - edit_profile_action: Nustatyti profilį + apps_android_action: Gauti per Google Play + apps_ios_action: Atsisiųsti per App Store + apps_step: Atsisiųsk oficialias programėles. + apps_title: Mastodon programėlės + checklist_subtitle: 'Pradėkime pažintį su šia nauja socialine sritimi:' + checklist_title: Pasveikinimo sąrašas + edit_profile_action: Suasmeninti + edit_profile_step: Padidink savo sąveiką turint išsamų profilį. + edit_profile_title: Suasmenink savo profilį explanation: Štai keletas patarimų, kaip pradėti + feature_action: Sužinoti daugiau + feature_audience: Mastodon suteikia unikalią galimybę valdyti savo auditoriją be tarpininkų. Tavo infrastruktūroje įdiegtas Mastodon leidžia sekti ir būti sekamam iš bet kurio kito Mastodon serverio internete ir yra kontroliuojamas tik tavęs. + feature_audience_title: Užtikrintai kurk savo auditoriją + feature_control: Tu geriausiai žinai, ką nori matyti savo pagrindiniame sraute. Jokių algoritmų ar reklamų, kurios gaištų tavo laiką. Iš vienos paskyros sek bet kurį asmenį bet kuriame Mastodon serveryje, gauk jo įrašus chronologine tvarka ir padaryk savo interneto kampelį šiek tiek panašesnį į save. + feature_control_title: Kontroliuok savo laiko skalę + feature_creativity: Mastodon palaiko garso, vaizdo įrašus ir paveikslėlių įrašus, prieinamumus aprašymus, apklausas, turinio įspėjimus, animuotus avatarus, pasirinktinius jaustukus, miniatiūrų apkarpymo valdymą ir dar daugiau, kad galėtum išreikšti save internete. Nesvarbu, ar publikuoji savo kūrybą, muziką, ar tinklalaidę, Mastodon tau padės. + feature_creativity_title: Neprilygstamas kūrybiškumas + feature_moderation: Mastodon grąžina sprendimų priėmimą į tavo rankas. Kiekvienas serveris kuria savo taisykles ir nuostatus, kurie yra įgyvendinami vietoje, o ne iš viršaus į apačią, kaip įmonių socialinėje medijoje, todėl ši sistema lanksčiausiai reaguoja į skirtingų žmonių grupių poreikius. Prisijunk prie serverio su taisyklėmis, su kuriomis sutinki, arba talpink savo serverį. + feature_moderation_title: Prižiūrėjimas taip, kaip turėtų būti + follow_action: Sekti + follow_step: Sekti įdomius žmones – tai, kas yra Mastodon. + follow_title: Suasmenink savo pagrindinį srautą + follows_subtitle: Sek gerai žinomas paskyras. + follows_title: Ką sekti + follows_view_more: Peržiūrėti daugiau sekamų žmonių + hashtags_recent_count: "%{people} žmonių per pastarąsias %{days} dienas" + hashtags_subtitle: Naršyk, kas tendencinga per pastarąsias 2 dienas. + hashtags_title: Tendencijos saitažodžiai + hashtags_view_more: Peržiūrėti daugiau tendencingų saitažodžių + post_action: Sukurti + post_step: Sakyk labas pasauliui tekstu, nuotraukomis, vaizdo įrašais arba apklausomis. + post_title: Sukūrk savo pirmąjį įrašą + share_action: Bendrinti + share_step: Leisk draugams sužinoti, kaip tave rasti Mastodon. + share_title: Bendrink savo Mastodon profilį + sign_in_action: Prisijungti subject: Sveiki atvykę į Mastodon title: Sveiki atvykę, %{name}! users: diff --git a/config/locales/lv.yml b/config/locales/lv.yml index dc4c39083c..d6d0f05c50 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -37,7 +37,7 @@ lv: approve: Apstiprināt approved_msg: Veiksmīgi apstiprināts %{username} reģistrēšanās pieteikums are_you_sure: Vai esi pārliecināts? - avatar: Avatars + avatar: Profila attēls by_domain: Domēns change_email: changed_msg: E-pasts veiksmīgi nomainīts! @@ -65,7 +65,7 @@ lv: disabled: Iesaldēts display_name: Parādāmais vārds domain: Domēns - edit: Rediģēt + edit: Labot email: E-pasts email_status: E-pasta statuss enable: Atsaldēt @@ -122,9 +122,9 @@ lv: rejected_msg: Veiksmīgi noraidīts %{username} reģistrēšanās pieteikums remote_suspension_irreversible: Šī konta dati ir neatgriezeniski dzēsti. remote_suspension_reversible_hint_html: Konts ir apturēts viņu serverī, un dati tiks pilnībā noņemti %{date}. Līdz tam attālais serveris var atjaunot šo kontu bez jebkādām negatīvām sekām. Ja vēlaties nekavējoties noņemt visus konta datus, varat to izdarīt tālāk. - remove_avatar: Noņemt avatāru + remove_avatar: Noņemt profila attēlu remove_header: Noņemt galveni - removed_avatar_msg: Veiksmīgi noņemts %{username} avatāra attēls + removed_avatar_msg: Veiksmīgi noņemts %{username} profila attēls removed_header_msg: Veiksmīgi noņemts %{username} galvenes attēls resend_confirmation: already_confirmed: Šis lietotājs jau ir apstiprināts @@ -212,7 +212,7 @@ lv: promote_user: Izceltt Lietotāju reject_appeal: Noraidīt Apelāciju reject_user: Noraidīt lietotāju - remove_avatar_user: Noņemt Avatāru + remove_avatar_user: Noņemt profila attēlu reopen_report: Atkārtoti Atvērt Ziņojumu resend_user: Atkārtoti nosūtīt Apstiprinājuma Pastu reset_password_user: Atiestatīt Paroli @@ -260,7 +260,7 @@ lv: destroy_status_html: "%{name} noņēma ziņu %{target}" destroy_unavailable_domain_html: "%{name} atjaunoja piegādi uz domēnu %{target}" destroy_user_role_html: "%{name} izdzēsa %{target} lomu" - disable_2fa_user_html: "%{name} atspējoja divfaktoru prasības lietotājam %{target}" + disable_2fa_user_html: "%{name} atspējoja divpakāpju prasības lietotājam %{target}" disable_custom_emoji_html: "%{name} atspējoja emocijzīmi %{target}" disable_sign_in_token_auth_user_html: "%{name} atspējoja e-pasta marķiera autentifikāciju %{target}" disable_user_html: "%{name} atspējoja pieteikšanos lietotājam %{target}" @@ -271,7 +271,7 @@ lv: promote_user_html: "%{name} paaugstināja lietotāju %{target}" reject_appeal_html: "%{name} noraidīja moderācijas lēmuma apelāciju no %{target}" reject_user_html: "%{name} noraidīja reģistrēšanos no %{target}" - remove_avatar_user_html: "%{name} noņēma %{target} avatāru" + remove_avatar_user_html: "%{name} noņēma %{target} profila attēlu" reopen_report_html: "%{name} atkārtoti atvēra ziņojumu %{target}" resend_user_html: "%{name} atkārtoti nosūtīja apstiprinājuma e-pastu %{target}" reset_password_user_html: "%{name} atiestatīja paroli lietotājam %{target}" @@ -298,7 +298,7 @@ lv: announcements: destroyed_msg: Paziņojums ir veiksmīgi izdzēsts! edit: - title: Rediģēt paziņojumu + title: Labot paziņojumu empty: Neviens paziņojums netika atrasts. live: Dzīvajā new: @@ -402,7 +402,7 @@ lv: created_msg: Domēna bloķēšana tagad tiek apstrādāta destroyed_msg: Domēna bloķēšana ir atsaukta domain: Domēns - edit: Rediģēt domēna bloķēšanu + edit: Labot domēna aizturēšanu existing_domain_block: Tu jau esi noteicis stingrākus ierobežojumus %{name}. existing_domain_block_html: Tu jau esi noteicis stingrākus ierobežojumus %{name}, vispirms tev jāatbloķē. export: Eksportēt @@ -432,6 +432,7 @@ lv: view: Skatīt domēna bloķēšanu email_domain_blocks: add_new: Pievienot jaunu + allow_registrations_with_approval: Atļaut reģistrāciju ar apstiprināšanu attempts_over_week: one: "%{count} mēģinājums pagājušajā nedēļā" other: "%{count} reģistrēšanās mēģinājumi pagājušajā nedēļā" @@ -467,7 +468,7 @@ lv: title: Importēt bloķētos domēnus no_file: Nav atlasīts neviens fails follow_recommendations: - description_html: "Sekošana rekomendācijām palīdz jaunajiem lietotājiem ātri atrast interesantu saturu. Ja lietotājs nav pietiekami mijiedarbojies ar citiem, lai izveidotu personalizētus ieteikumus, ieteicams izmantot šos kontus. Tie tiek pārrēķināti katru dienu, izmantojot vairākus kontus ar visaugstākajām pēdējā laika saistībām un vislielāko vietējo sekotāju skaitu noteiktā valodā." + description_html: "Sekošanas ieteikumi palīdz jauniem lietotājiem ātri arast saistošu saturu. Kad lietotājs nav pietiekami mijiedarbojies ar citiem, lai veidotos pielāgoti sekošanas iteikumi, tiek ieteikti šie konti. Tie tiek pārskaitļoti ik dienas, izmantojot kontu, kuriem ir augstākās nesenās iesaistīšanās un lielākais vietējo sekotāju skaits norādītajā valodā." language: Valodai status: Statuss suppress: Apspiest sekošanas rekomendāciju @@ -688,7 +689,7 @@ lv: special: Īpašās delete: Dzēst description_html: Izmantojot lietotāju lomas, vari pielāgot, kurām Mastodon funkcijām un apgabaliem var piekļūt tavi lietotāji. - edit: Rediģēt lomu '%{name}' + edit: Labot lomu '%{name}' everyone: Noklusētās atļaujas everyone_full_description_html: Šī ir pamata loma, kas ietekmē visus lietotājus, pat tos, kuriem nav piešķirta loma. Visas pārējās lomas manto atļaujas no šīs. permissions_count: @@ -741,7 +742,7 @@ lv: add_new: Pievienot noteikumu delete: Dzēst description_html: Lai gan lielākā daļa apgalvo, ka ir izlasījuši pakalpojumu sniegšanas noteikumus un piekrīt tiem, parasti cilvēki to izlasa tikai pēc problēmas rašanās. Padariet vienkāršāku sava servera noteikumu uztveršanu, veidojot tos vienkāršā sarakstā pa punktiem. Centieties, lai atsevišķi noteikumi būtu īsi un vienkārši, taču arī nesadaliet tos daudzos atsevišķos vienumos. - edit: Rediģēt noteikumu + edit: Labot nosacījumu empty: Servera noteikumi vēl nav definēti. title: Servera noteikumi settings: @@ -829,7 +830,7 @@ lv: reblogs: Reblogi status_changed: Ziņa mainīta title: Konta ziņas - trending: Populārākie + trending: Aktuāli visibility: Redzamība with_media: Ar multividi strikes: @@ -884,7 +885,7 @@ lv: action: Pārbaudi šeit, lai iegūtu plašāku informāciju message_html: "Tava objektu krātuve ir nepareizi konfigurēta. Tavu lietotāju privātums ir apdraudēts." tags: - review: Pārskatīt statusu + review: Pārskatīt stāvokli updated_msg: Tēmtura iestatījumi ir veiksmīgi atjaunināti title: Administrēšana trends: @@ -894,7 +895,7 @@ lv: links: allow: Atļaut saiti allow_provider: Atļaut publicētāju - description_html: Šīs ir saites, kuras pašlaik bieži koplieto konti, no kuriem tavs serveris redz ziņas. Tas var palīdzēt taviem lietotājiem uzzināt, kas notiek pasaulē. Kamēr tu neapstiprini izdevēju, neviena saite netiek rādīta publiski. Vari arī atļaut vai noraidīt atsevišķas saites. + description_html: Šīs ir saites, kuras pašlaik bieži koplieto konti, no kuriem Tavs serveris redz ziņas. Tas var palīdzēt Taviem lietotājiem uzzināt, kas notiek pasaulē. Neviena saite netiek publiski rādīta, līdz tu apstiprini izdevēju. Tu vari arī atļaut vai noraidīt atsevišķas saites. disallow: Neatļaut saiti disallow_provider: Neatļaut publicētāju no_link_selected: Neviena saite netika mainīta, jo neviena netika atlasīta @@ -902,7 +903,7 @@ lv: no_publisher_selected: Neviens publicētājs netika mainīts, jo neviens netika atlasīts shared_by_over_week: one: Pēdējās nedēļas laikā kopīgoja viena persona - other: Pēdējās nedēļas laikā kopīgoja %{count} personas + other: Pēdējās nedēļas laikā kopīgoja %{count} cilvēki zero: Pēdējās nedēļas laikā kopīgoja %{count} personas title: Populārākās saites usage_comparison: Šodien kopīgots %{today} reizes, salīdzinot ar %{yesterday} vakar @@ -916,10 +917,10 @@ lv: title: Publicētāji rejected: Noraidīts statuses: - allow: Atļaut publicēt + allow: Ļaut veikt ierakstus allow_account: Atļaut autoru - description_html: Šīs ir ziņas, par kurām tavs serveris zina un kuras pašlaik tiek koplietotas un pašlaik ir daudz izlasē. Tas var palīdzēt taviem jaunajiem un atkārtotiem lietotājiem atrast vairāk cilvēku, kam sekot. Neviena ziņa netiek publiski rādīta, kamēr neesi apstiprinājis autoru un autors atļauj savu kontu ieteikt citiem. Vari arī atļaut vai noraidīt atsevišķas ziņas. - disallow: Neatļaut publicēt + description_html: Šie ir ieraksti, par kuriem zina Tavs serveris un kuri pašlaik tiek daudz kopīgoti un pievienoti izlasēm. Tas var palīdzēt jaunajiem lietotājiem un tiem, kuri atgriežas, atrast vairāk cilvēku, kam sekot. Neviens ieraksts netiek publiski rādīts, līdz apstiprināsi autoru un ja autors ļauj savu kontu ieteikt citiem. Tu vari arī atļaut vai noraidīt atsevišķus ierakstus. + disallow: Neļaut veikt ierakstus disallow_account: Neatļaut autoru no_status_selected: Neviena populāra ziņa netika mainīta, jo neviena netika atlasīta not_discoverable: Autors nav izvēlējies būt atklājams @@ -936,7 +937,7 @@ lv: tag_servers_dimension: Populārākie serveri tag_servers_measure: dažādi serveri tag_uses_measure: lietojumi pavisam - description_html: Šīs ir atsauces, kas pašlaik tiek rādītas daudzās ziņās, kuras redz tavs serveris. Tas var palīdzēt taviem lietotājiem uzzināt, par ko cilvēki šobrīd runā visvairāk. Neviena atsauce netiek rādīta publiski, kamēr tu neesi tās apstiprinājis. + description_html: Šie ir tēmturi, kas pašlaik parādās daudzos ierakstos, kurus redz Tavs serveris. Tas var palīdzēt Taviem lietotājiem uzzināt, par ko cilvēki šobrīd runā visvairāk. Neviens tēmturis netiek publiski parādīts, līdz apstiprināsi tos. listable: Var tikt ieteikts no_tag_selected: Neviena atzīme netika mainīta, jo neviena netika atlasīta not_listable: Nevar tikt ieteikts @@ -947,10 +948,10 @@ lv: trendable: Var parādīsies pie tendencēm trending_rank: 'Populārākie #%{rank}' usable: Var tikt lietots - usage_comparison: Šodien lietots %{today} reizes, salīdzinot ar %{yesterday} vakar + usage_comparison: Šodien izmantots %{today} reizes, salīdzinot ar %{yesterday} vakar used_by_over_week: one: Pēdējās nedēļas laikā izmantoja viens cilvēks - other: Pēdējās nedēļas laikā izmantoja %{count} personas + other: Pēdējās nedēļas laikā izmantoja %{count} cilvēki zero: Pēdējās nedēļas laikā izmantoja %{count} personas title: Tendences trending: Populārākie @@ -966,7 +967,7 @@ lv: description_html: Izmantojot tīmekļa aizķeri, Mastodon var nosūtīt jūsu lietojumprogrammai reāllaika paziņojumus par izvēlētajiem notikumiem, lai tava lietojumprogramma varētu automātiski izraisīt reakcijas. disable: Atspējot disabled: Atspējots - edit: Rediģēt galapunktu + edit: Labot galapunktu empty: Tev vēl nav konfigurēts neviens tīmekļa aizķeres galapunkts. enable: Iespējot enabled: Aktīvie @@ -1053,7 +1054,7 @@ lv: auth: apply_for_account: Pieprasīt kontu captcha_confirmation: - help_html: Ja tev ir problēmas ar CAPTCHA risināšanu, vari sazināties ar mums, izmantojot %{email}, un mēs varam tev palīdzēt. + help_html: Ja Tev ir sarežģījumi ar CAPTCHA risināšanu, Tu vari sazināties ar mums e-pasta adresē %{email}, un mēs varēsim Tev palīdzēt. hint_html: Vēl tikai viena lieta! Mums ir jāapstiprina, ka tu esi cilvēks (tas ir tāpēc, lai mēs varētu nepieļaut surogātpasta izsūtīšanu!). Atrisini tālāk norādīto CAPTCHA un noklikšķini uz "Turpināt". title: Drošības pārbaude confirmations: @@ -1065,7 +1066,7 @@ lv: redirect_to_app_html: Tev vajadzētu būt novirzītam uz lietotni %{app_name}. Ja tas nenotika, mēģini %{clicking_this_link} vai manuāli atgriezieties lietotnē. registration_complete: Tava reģistrācija domēnā %{domain} tagad ir pabeigta! welcome_title: Laipni lūdzam, %{name}! - wrong_email_hint: Ja šī e-pasta adrese nav pareiza, varat to mainīt konta iestatījumos. + wrong_email_hint: Ja šī e-pasta adrese nav pareiza, to var mainīt konta iestatījumos. delete_account: Dzēst kontu delete_account_html: Ja vēlies dzēst savu kontu, tu vari turpināt šeit. Tev tiks lūgts apstiprinājums. description: @@ -1076,7 +1077,7 @@ lv: dont_have_your_security_key: Vai tev nav drošības atslēgas? forgot_password: Aizmirsi paroli? invalid_reset_password_token: Paroles atiestatīšanas pilnvara nav derīga, vai tai ir beidzies derīgums. Lūdzu, pieprasi jaunu. - link_to_otp: Ievadi divfaktoru kodu no tālruņa vai atkopšanas kodu + link_to_otp: Jāievada divpakāpju kods no tālruņa vai atkopšanas kods link_to_webauth: Lieto savu drošības atslēgas iekārtu log_in_with: Pieslēgties ar login: Pieteikties @@ -1108,13 +1109,13 @@ lv: security: Drošība set_new_password: Iestatīt jaunu paroli setup: - email_below_hint_html: Pārbaudi savu surogātpasta mapi vai pieprasiet citu. Tu vari labot savu e-pasta adresi, ja tā ir nepareiza. + email_below_hint_html: Pārbaudi savu surogātpasta mapi vai pieprasi vēl vienu! Tu vari labot savu e-pasta adresi, ja tā ir nepareiza. email_settings_hint_html: Noklikšķini uz saites, kuru mēs tev nosūtījām, lai apstiprinātu %{email}. Mēs tepat pagaidīsim. link_not_received: Vai nesaņēmi sati? new_confirmation_instructions_sent: Pēc dažām minūtēm saņemsi jaunu e-pastu ar apstiprinājuma saiti! title: Pārbaudi savu iesūtni sign_in: - preamble_html: Piesakies ar saviem %{domain} akreditācijas datiem. Ja tavs konts ir mitināts citā serverī, tu nevarēsi pieteikties šeit. + preamble_html: Jāpiesakās ar saviem %{domain} piekļuves datiem. Ja Tavs konts tiek mitināts citā serverī, Tu nevarēsi šeit pieteikties. title: Pierakstīties %{domain} sign_up: manual_review: Reģistrācijas domēnā %{domain} manuāli pārbauda mūsu moderatori. Lai palīdzētu mums apstrādāt tavu reģistrāciju, uzraksti mazliet par sevi un to, kāpēc vēlies kontu %{domain}. @@ -1123,7 +1124,7 @@ lv: status: account_status: Konta statuss confirming: Gaida e-pasta apstiprinājuma pabeigšanu. - functional: Tavs konts ir pilnībā darboties spējīgs. + functional: Tavs konts ir pilnā darba kārtībā. pending: Tavu pieteikumu gaida mūsu darbinieku izskatīšana. Tas var aizņemt kādu laiku. Ja tavs pieteikums tiks apstiprināts, tu saņemsi e-pastu. redirecting_to: Tavs konts ir neaktīvs, jo pašlaik tas tiek novirzīts uz %{acct}. self_destruct: Tā kā %{domain} tiek slēgts, tu iegūsi tikai ierobežotu piekļuvi savam kontam. @@ -1164,7 +1165,7 @@ lv: proceed: Dzēst kontu success_msg: Tavs konts tika veiksmīgi dzēsts warning: - before: 'Pirms turpināt, lūdzu, uzmanīgi izlasi šīs piezīmes:' + before: 'Pirms turpināšanas lūgums uzmanīgi izlasīt šīs piezīmes:' caches: Citu serveru kešatmiņā saglabātais saturs var saglabāties data_removal: Tavas ziņas un citi dati tiks neatgriezeniski noņemti email_change_html: Tu vari mainīt savu e-pasta adresi, neizdzēšot savu kontu @@ -1187,7 +1188,7 @@ lv: approve_appeal: Apstiprināt apelāciju associated_report: Saistītais ziņojums created_at: Datēts - description_html: Šīs ir darbības, kas veiktas pret tavu kontu, un brīdinājumi, ko tev ir nosūtījuši %{instance} darbinieki. + description_html: Šīs ir darbības, kas veiktas pret Tavu kontu, un brīdinājumi, kurus Tev ir nosūtījuši %{instance} darbinieki. recipient: Adresēts reject_appeal: Noraidīt apelāciju status: 'Publikācija #%{id}' @@ -1208,7 +1209,7 @@ lv: invalid_domain: nav derīgs domēna nosaukums edit_profile: basic_information: Pamata informācija - hint_html: "Pielāgo to, ko cilvēki redz tavā publiskajā profilā un blakus tavām ziņām. Citas personas, visticamāk, sekos tev un sazināsies ar tevi, ja tev būs aizpildīts profils un profila attēls." + hint_html: "Pielāgo, ko cilvēki redz Tavā publiskajā profilā un blakus Taviem ierakstiem. Ir lielāka iespējamība, ka citi clivēki sekos Tev un mijiedarbosies ar Tevi, ja Tev ir aizpildīts profils un profila attēls." other: Cits errors: '400': Tevis iesniegtais pieprasījums bija nederīgs vai nepareizi izveidots. @@ -1221,7 +1222,7 @@ lv: title: Drošības pārbaude neizdevās '429': Pārāk daudz pieprasījumu '500': - content: Atvaino, bet kaut kas mūsu pusē nogāja greizi. + content: Atvainojamies, bet mūsu pusē kaut kas nogāja greizi. title: Šī lapa nav pareiza '503': Lapu nevarēja apkalpot īslaicīgas servera kļūmes dēļ. noscript_html: Lai izmantotu Mastodon web lietojumu, lūdzu, iespējo JavaScript. Vai arī izmēģini kādu no vietējām lietotnēm Mastodon savai platformai. @@ -1247,7 +1248,7 @@ lv: add_new: Pievienot jaunu errors: limit: Tu jau esi piedāvājis maksimālo tēmturu skaitu - hint_html: "Kas ir piedāvātie tēmturi? Tie ir redzami tavā publiskajā profilā un ļauj cilvēkiem pārlūkot tavas publiskās ziņas tieši zem šiem tēmturiem. Tie ir lielisks līdzeklis radošu darbu vai ilgtermiņa projektu izsekošanai." + hint_html: "Izcel savus vissvarīgākos tēmturus savā profilā! Lielisks rīks, lai izsekotu saviem radošajiem darbiem un ilgtermiņa projektiem, izceltie tēmturi tiek attēloti pamanāmi attēloti Tavā profilā un ļauj ātru piekļuvi saviem ierakstiem." filters: contexts: account: Profili @@ -1260,7 +1261,7 @@ lv: keywords: Atslēgvārdi statuses: Individuālās ziņas statuses_hint_html: Šis filtrs attiecas uz atsevišķām ziņām neatkarīgi no tā, vai tās atbilst tālāk norādītajiem atslēgvārdiem. Pārskatīt vai noņemt ziņas no filtra. - title: Rediģēt filtru + title: Labot atlasi errors: deprecated_api_multiple_keywords: Šos parametrus šajā lietojumprogrammā nevar mainīt, jo tie attiecas uz vairāk nekā vienu filtra atslēgvārdu. Izmanto jaunāku lietojumprogrammu vai tīmekļa saskarni. invalid_context: Nav, vai piegādāts nederīgs konteksts @@ -1330,7 +1331,7 @@ lv: too_large: Fails ir pārāk liels failures: Kļūmes imported: Importēti - mismatched_types_warning: Šķiet, ka šim importam esi izvēlējies nepareizu veidu. Lūdzu, pārbaudi vēlreiz. + mismatched_types_warning: Izskatās, ka varētu būt atlasīts nepareizs veids šai ievietošanai. Lūgums pārbaudīt vēlreiz. modes: merge: Apvienot merge_long: Saglabāt esošos ierakstus un pievienot jaunus @@ -1407,11 +1408,11 @@ lv: limit: Jūs esat sasniedzis maksimālo sarakstu skaitu login_activities: authentication_methods: - otp: divfaktoru autentifikācijas lietotne + otp: divpakāpju autentifikācijas lietotne password: parole sign_in_token: e-pasta drošības kods webauthn: drošības atslēgas - description_html: Ja pamani darbības, kuras tu neatpazīsti, apsver iespēju nomainīt savu paroli un iespējot divfaktoru autentifikāciju. + description_html: Ja pamani darbības, kuras neatpazīsti, jāapsver iespēja nomainīt savu paroli un iespējot divpakāpju autentifikāciju. empty: Nav pieejama autentifikācijas vēsture failed_sign_in_html: Neizdevies pierakstīšanās mēģinājums ar %{method} no %{ip} (%{browser}) successful_sign_in_html: Veiksmīga pierakstīšanās ar %{method} no %{ip} (%{browser}) @@ -1460,7 +1461,7 @@ lv: set_redirect: Iestatīt novirzīšanu warning: backreference_required: Jaunais konts vispirms ir jākonfigurē, lai tas atsauktos uz šo kontu - before: 'Pirms turpināt, lūdzu, uzmanīgi izlasi šīs piezīmes:' + before: 'Pirms turpināšanas lūgums uzmanīgi izlasīt šīs piezīmes:' cooldown: Pēc pārcelšanās ir gaidīšanas periods, kura laikā tu vairs nevarēsi pārvietoties disabled_account: Tavs pašreizējais konts pēc tam nebūs pilnībā lietojams. Tomēr tev būs piekļuve datu eksportēšanai, kā arī atkārtotai aktivizēšanai. followers: Veicot šo darbību, visi sekotāji tiks pārvietoti no pašreizējā konta uz jauno kontu @@ -1508,7 +1509,7 @@ lv: status: subject: "%{name} tikko publicēja" update: - subject: "%{name} rediģējis rakstu" + subject: "%{name} laboja ierakstu" notifications: administration_emails: Administrators e-pasta paziņojumi email_events: E-pasta paziņojumu notikumi @@ -1525,12 +1526,12 @@ lv: trillion: T otp_authentication: code_hint: Lai apstiprinātu, ievadi autentifikācijas lietotnes ģenerēto kodu - description_html: Ja iespējosi divfaktoru autentifikāciju, izmantojot autentifikatora lietotni, lai pieteiktos, tev būs nepieciešams tālrunis, kas ģenerēs ievadāmos marķierus. + description_html: Jā iespējo divpakāpju autentifikāciju ar autentificēšanas lietotni, pieteikšanās laikā būs nepieciešams tālrunis, kurā tiks izveidoti ievadāmie kodi. enable: Iespējot instructions_html: "Skenē šo QR kodu Google Authenticator vai līdzīgā TOTP lietotnē savā tālrunī. No šī brīža šī lietotne ģenerēs marķierus, kas tev būs jāievada, piesakoties." manual_instructions: 'Ja nevari noskenēt QR kodu un tas ir jāievada manuāli, šeit ir noslēpums vienkāršā tekstā:' setup: Iestatīt - wrong_code: Ievadītais kods nebija derīgs! Vai servera laiks un ierīces laiks ir pareizs? + wrong_code: Ievadītais kods bija nederīgs. Vai servera un ierīces laiks ir pareizs? pagination: newer: Jaunāks next: Nākamais @@ -1631,7 +1632,7 @@ lv: weibo: Weibo current_session: Pašreizējā sesija description: "%{browser} uz %{platform}" - explanation: Šīs ir tīmekļa pārlūkprogrammas, kurās pašlaik esi pieteicies savā Mastodon kontā. + explanation: Šie ir tīmekļa pārlūki, kuros šobrīd esi pieteicies savā Mastodon kontā. ip: IP platforms: adobe_air: Adobe Air @@ -1660,7 +1661,7 @@ lv: back: Atgriezties Mastodon delete: Konta dzēšana development: Izstrāde - edit_profile: Rediģēt profilu + edit_profile: Labot profilu export: Datu eksports featured_tags: Piedāvātie tēmturi import: Imports @@ -1672,7 +1673,7 @@ lv: relationships: Sekojamie un sekotāji statuses_cleanup: Automātiska ziņu dzēšana strikes: Moderācijas aizrādījumi - two_factor_authentication: Divfaktoru Aut + two_factor_authentication: Divpakāpju autentifikācija webauthn_authentication: Drošības atslēgas statuses: attached: @@ -1696,7 +1697,7 @@ lv: one: 'saturēja neatļautu tēmturi: %{tags}' other: 'saturēja neatļautus tēmturus: %{tags}' zero: 'neatļauti tēmturi: %{tags}' - edited_at_html: Rediģēts %{date} + edited_at_html: Labots %{date} errors: in_reply_not_found: Šķiet, ka ziņa, uz kuru tu mēģini atbildēt, nepastāv. open_in_web: Atvērt webā @@ -1704,12 +1705,12 @@ lv: pin_errors: direct: Ziņojumus, kas ir redzami tikai minētajiem lietotājiem, nevar piespraust limit: Tu jau esi piespraudis maksimālo ziņu skaitu - ownership: Citas personas ziņu nevar piespraust + ownership: Kāda cita ierakstu nevar piespraust reblog: Izceltu ierakstu nevar piespraust poll: total_people: one: "%{count} persona" - other: "%{count} personas" + other: "%{count} cilvēki" zero: "%{count} personu" total_votes: one: "%{count} balss" @@ -1788,13 +1789,13 @@ lv: two_factor_authentication: add: Pievienot disable: Atspējot 2FA - disabled_success: Divfaktoru autentifikācija veiksmīgi atspējota - edit: Rediģēt - enabled: Divfaktoru autentifikācija ir iespējota - enabled_success: Divfaktoru autentifikācija veiksmīgi iespējota + disabled_success: Divpakāpju autentifikācija veiksmīgi atspējota + edit: Labot + enabled: Divpakāpju autentifikācija ir iespējota + enabled_success: Divpakāpju autentifikācija veiksmīgi iespējota generate_recovery_codes: Ģenerēt atkopšanas kodus lost_recovery_codes: Atkopšanas kodi ļauj atgūt piekļuvi tavam kontam, ja pazaudē tālruni. Ja esi pazaudējis atkopšanas kodus, tu vari tos ģenerēt šeit. Tavi vecie atkopšanas kodi tiks anulēti. - methods: Divfaktoru metodes + methods: Divpakāpju veidi otp: Autentifikātora lietotne recovery_codes: Veidot atkopšanas kodu rezerves kopijas recovery_codes_regenerated: Atkopšanas kodi veiksmīgi atjaunoti @@ -1851,9 +1852,8 @@ lv: silence: Konts ierobežots suspend: Konts apturēts welcome: - edit_profile_action: Iestatīt profilu - edit_profile_step: Tu vari pielāgot savu profilu, augšupielādējot profila attēlu, mainot parādāmo vārdu un citas lietas. Vari izvēlēties pārskatīt jaunus sekotājus, pirms atļauj viņiem tev sekot. explanation: Šeit ir daži padomi, kā sākt darbu + feature_creativity: Mastodon nodrošina skaņas, video un attēlu ierakstus, pieejamības aprakstus, aptaujas, satura brīdinājumus, animētus profila attēlus, pielāgotas emocijzīmes, sīktēlu apgriešanas vadīklas un vēl, lai palīdzētu Tev sevi izpaust tiešsaistē. Vai Tu izplati savu mākslu, mūziku vai aplādes, Mastodon ir šeit ar Tevi. subject: Laipni lūgts Mastodon title: Laipni lūgts uz borta, %{name}! users: @@ -1867,7 +1867,7 @@ lv: extra_instructions_html: Padoms. saite tavā vietnē var būt neredzama. Svarīga daļa ir rel="me", kas novērš uzdošanos vietnēs ar lietotāju ģenerētu saturu. Tu vari pat lapas galvenē izmantot tagu link, nevis a, taču HTML ir jābūt pieejamam, neizpildot JavaScript. here_is_how: Lūk, kā hint_html: "Ikviens var apliecināt savu identitāti Mastodon. Pamatojoties uz atvērtiem tīmekļa standartiem, tagad un uz visiem laikiem bez maksas. Viss, kas tev nepieciešams, ir personīga vietne, pēc kuras cilvēki tevi atpazīst. Kad no sava profila izveidosi saiti uz šo vietni, mēs pārbaudīsim, vai vietne novirza atpakaļ uz tavu profilu, un tajā tiks parādīts vizuāls indikators." - instructions_html: Nokopē un ielīmē tālāk norādīto kodu savas vietnes HTML. Pēc tam pievieno savas vietnes adresi vienā no papildu laukiem savā profilā no cilnes "Rediģēt profilu" un saglabā izmaiņas. + instructions_html: Ievieto starpliktuvē un ielīmē tālāk norādīto kodu savas tīmekļvietnes HTML! Tad pievieno savas tīmekļvietnes adresi vienā no papildu laukiem savā profila cilnē "Labot profilu" un saglabā izmaiņas! verification: Pārbaude verified_links: Tavas verifikācijas saites webauthn_credentials: @@ -1885,5 +1885,5 @@ lv: nickname_hint: Ievadi savas jaunās drošības atslēgas segvārdu not_enabled: Tu vel neesi iespējojis WebAuthn not_supported: Šī pārlūkprogramma neatbalsta drošības atslēgas - otp_required: Lai izmantotu drošības atslēgas, lūdzu, vispirms iespējo divfaktoru autentifikāciju. + otp_required: Lai izmantotu drošības atslēgas, lūgums vispirms iespējot divpakāpju autentifikāciju. registered_on: Reģistrēts %{date} diff --git a/config/locales/ms.yml b/config/locales/ms.yml index e20dfd09e0..1704aed3e0 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -1768,8 +1768,6 @@ ms: silence: Akaun terhad suspend: Akaun digantung welcome: - edit_profile_action: Sediakan profil - edit_profile_step: Anda boleh menyesuaikan profil anda dengan memuat naik gambar profil, menukar nama paparan anda dan banyak lagi. Anda boleh ikut serta untuk menyemak pengikut baharu sebelum mereka dibenarkan mengikuti anda. explanation: Berikut ialah beberapa petua untuk anda bermula subject: Selamat datang kepada Mastodon title: Selamat datang, %{name}! diff --git a/config/locales/my.yml b/config/locales/my.yml index f2c115c17c..a01755b6c4 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -1767,8 +1767,6 @@ my: silence: အကောင့်ကန့်သတ်ထားသည် suspend: အကောင့်ရပ်ဆိုင်းထားသည် welcome: - edit_profile_action: ပရိုဖိုင်ထည့်သွင်းရန် - edit_profile_step: ပရိုဖိုင်ဓာတ်ပုံတစ်ပုံ တင်ခြင်း၊ ဖော်ပြမည့်အမည် ပြောင်းလဲခြင်းနှင့် အခြားအရာများပြုလုပ်ခြင်းတို့ဖြင့် သင့်ပရိုဖိုင်ကို စိတ်ကြိုက်ပြင်ဆင်နိုင်ပါသည်။ စောင့်ကြည့်သူအသစ်များ သင့်ကိုစောင့်ကြည့်ခွင့်မပြုမီ ပြန်လည်သုံးသပ်ရန်အတွက် ဆုံးဖြတ်နိုင်ပါသည်။ explanation: ဤသည်မှာ သင် စတင်အသုံးပြုနိုင်ရန်အတွက် အကြံပြုချက်အချို့ဖြစ်ပါသည် subject: Mastodon မှ လှိုက်လှဲစွာကြိုဆိုပါသည်။ title: "%{name} က ကြိုဆိုပါတယ်။" diff --git a/config/locales/nl.yml b/config/locales/nl.yml index ac49efddf1..8f7cb06b66 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1842,9 +1842,42 @@ nl: silence: Account beperkt suspend: Account opgeschort welcome: - edit_profile_action: Profiel instellen - edit_profile_step: Je kunt jouw profiel aanpassen door een profielfoto te uploaden, jouw weergavenaam aan te passen en meer. Je kunt het handmatig goedkeuren van volgers instellen. + apps_android_action: Via Google Play downloaden + apps_ios_action: Via de App Store downloaden + apps_step: Onze officiële apps downloaden. + apps_title: Mastodon-apps + checklist_subtitle: 'Laten we aan dit nieuwe sociale avontuur beginnen:' + checklist_title: Welkomstchecklist + edit_profile_action: Personaliseren + edit_profile_step: Anderen zullen eerder met je in contact treden als je wat over jezelf vertelt. + edit_profile_title: Je profiel aanpassen explanation: Hier zijn enkele tips om je op weg te helpen + feature_action: Meer informatie + feature_audience: Mastodon biedt je een unieke mogelijkheid om je publiek te beheren zonder tussenpersonen. Mastodon, geïmplementeerd in jouw eigen infrastructuur, stelt je in staat om elke andere Mastodon-server online te volgen en door hen gevolgd te worden, en staat onder controle van niemand, behalve die van jou. + feature_audience_title: Bouw jouw publiek in vertrouwen op + feature_control: Je weet zelf het beste wat je op jouw tijdlijn wilt zien. Geen algoritmen of advertenties om je tijd te verspillen. Volg iedereen op elke Mastodon-server vanaf één account en ontvang hun berichten in chronologische volgorde, en maak jouw hoekje op het internet een beetje meer zoals jezelf. + feature_control_title: Houd controle over je eigen tijdlijn + feature_creativity: Mastodon ondersteunt audio-, video- en fotoberichten, toegankelijkheidsbeschrijvingen, peilingen, inhoudswaarschuwingen, geanimeerde profielfoto's, aangepaste lokale emoji's, controle over het bijwerken van thumbnails en meer, om je te helpen jezelf online uit te drukken. Of je nu jouw kunst, jouw muziek of jouw podcast publiceert, Mastodon staat voor je klaar. + feature_creativity_title: Ongeëvenaarde creativiteit + feature_moderation: Mastodon legt de besluitvorming weer in jouw handen. Elke server creëert diens eigen regels en voorschriften, die lokaal worden gehandhaafd en niet van bovenaf zoals sociale media van bedrijven, waardoor het het meest flexibel is in het reageren op de behoeften van verschillende groepen mensen. Word lid van een server met de regels waarmee je akkoord gaat, of host jouw eigen. + feature_moderation_title: Moderatie zoals het hoort + follow_action: Volgen + follow_step: Op Mastodon draait het helemaal om het volgen van interessante mensen. + follow_title: Personaliseer je starttijdlijn + follows_subtitle: Volg bekende accounts + follows_title: Wie te volgen + follows_view_more: Meer mensen om te volgen bekijken + hashtags_recent_count: "%{people} mensen in de afgelopen %{days} dagen" + hashtags_subtitle: Wat er in de afgelopen 2 dagen is gebeurd verkennen + hashtags_title: Populaire hashtags + hashtags_view_more: Meer populaire hashtags bekijken + post_action: Opstellen + post_step: Zeg hallo tegen de wereld met tekst, foto's, video's of peilingen. + post_title: Je eerste bericht schrijven + share_action: Delen + share_step: Laat je vrienden weten waar je op Mastodon bent te vinden. + share_title: Je Mastodonprofiel delen + sign_in_action: Inloggen subject: Welkom op Mastodon title: Welkom aan boord %{name}! users: diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 52ed45a675..73821e5e28 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -1842,9 +1842,42 @@ nn: silence: Konto avgrensa suspend: Konto utvist welcome: - edit_profile_action: Lag til profil - edit_profile_step: Du kan tilpasse profilen din ved å laste opp et profilbilde, endre visningsnavnet ditt og mer. Du kan velge at nye følgere må godkjennes av deg før de får lov til å følge deg. + apps_android_action: Få det på Google Play + apps_ios_action: Last ned på App Store + apps_step: Last ned dei offisielle appane våre. + apps_title: Mastodon-appar + checklist_subtitle: 'La oss hjelpa deg i gang på denne nye sosiale reisa:' + checklist_title: Kom i gang + edit_profile_action: Tilpass til deg + edit_profile_step: Få fleire samhandlingar ved å fylla ut profilen din. + edit_profile_title: Tilpass profilen din explanation: Her er nokre tips for å koma i gang + feature_action: Lær meir + feature_audience: Mastodon gjev deg eit unikt høve til å styra kven som ser innhaldet ditt, utan mellommenn. Viss du installerer Mastodon på din eigen tenar, kan du fylgja og bli fylgt frå alle andre Mastodon-tenarar på nett, og det er ingen andre enn du som har kontrollen. + feature_audience_title: Få tilhengjarar på ein trygg måte + feature_control: Du veit best kva du vil ha på tidslina di. Her er ingen algoritmar eller reklame som kastar bort tida. Du kan fylgja folk på ein kvar Mastodon-tenar frå brukarkontoen din, få innlegga deira i kronologisk rekkjefylgje, og gjera ditt eige hjørne av internett litt meir ditt. + feature_control_title: Hald kontroll over tidslina di + feature_creativity: På Mastodon kan du laga innlegg med lyd, film og bilete, du kan skildra media for betre tilgjenge, du kan laga avrøystingar, innhaldsåtvaringar og eigne smilefjes, du kan klyppa til småbilete og endå meir for å uttrykkja deg på nettet. Mastodon passar for deg, anten du vil skriva eller leggja ut kunst, musikk eller podkastar. + feature_creativity_title: Ustoppeleg kreativt + feature_moderation: Med Mastodon bestemmer du sjølv. Kvar tenar har sine eigne reglar og retningsliner som blir laga lokalt og ikkje sentralt i eit stort firma, slik det er med andre sosiale nettverk. Det gjer at alle slags grupper kan få ein Mastodon-tenar som passar til dei. Du kan bli med på ein tenar som har reglar du er samd med, eller du kan laga din eigen tenar. + feature_moderation_title: Moderering slik det bør vera + follow_action: Fylg + follow_step: Å fylgja interessante folk er det det handlar om på Mastodon. + follow_title: Tilpass tidslina di + follows_subtitle: Fylg kjende folk + follows_title: Kven du kan fylgja + follows_view_more: Sjå fleire du kan fylgja + hashtags_recent_count: "%{people} folk dei siste %{days} dagane" + hashtags_subtitle: Sjå kva som har vore populært dei siste to dagane + hashtags_title: Populære emneknaggar + hashtags_view_more: Sjå fleire populære emneknaggar + post_action: Skriv + post_step: Sei hei til verda med tekst, bilete, filmar eller meiningsmålingar. + post_title: Skriv ditt fyrste innlegg + share_action: Del + share_step: Fortel venene dine korleis dei finn deg på Mastodon. + share_title: Del Mastodon-profilen din + sign_in_action: Logg inn subject: Velkomen til Mastodon title: Velkomen om bord, %{name}! users: diff --git a/config/locales/no.yml b/config/locales/no.yml index db56a065fa..ba3d40a522 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -966,6 +966,8 @@ title: Webhooks webhook: Webhook admin_mailer: + auto_close_registrations: + subject: Registreringer for %{instance} har blitt automatisk byttet til å kreve godkjenning new_appeal: actions: delete_statuses: å slette sine innlegg @@ -1837,9 +1839,30 @@ silence: Kontoen er begrenset suspend: Kontoen er suspendert welcome: - edit_profile_action: Sett opp profil - edit_profile_step: Du kan tilpasse profilen din ved å laste opp et profilbilde, endre visningsnavnet ditt og mer. Du kan velge at nye følgere må godkjennes av deg før de får lov til å følge deg. + apps_android_action: Få den på Google Play + apps_ios_action: Last ned på App Store + apps_step: Last ned våre offisielle apper. + apps_title: Mastodon-apper + checklist_title: Velkomst-sjekkliste + edit_profile_action: Tilpass + edit_profile_title: Tilpass profilen din explanation: Her er noen tips for å komme i gang + feature_action: Lær mer + feature_moderation_title: Moderering slik det burde være + follow_action: Følg + follow_title: Tilpass tidslinjen din + follows_subtitle: Følg godt kjente kontoer + follows_title: Hvem å følge + follows_view_more: Vis flere personer å følge + hashtags_recent_count: "%{people} personer i de siste %{days} dagene" + hashtags_title: Populære emneknagger + hashtags_view_more: Vis flere populære emneknagger + post_step: Si hallo til verdenen med tekst, bilder, videoer, eller meningsmålinger. + post_title: Lag ditt første innlegg + share_action: Del + share_step: La vennene dine vite hvordan finne deg på Mastodon. + share_title: Del Mastadon-profilen din + sign_in_action: Logg inn subject: Velkommen til Mastodon title: Velkommen ombord, %{name}! users: diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 32b7da6272..9f9f04ba9b 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -965,7 +965,6 @@ oc: silence: Compte limitat suspend: Compte suspendut welcome: - edit_profile_action: Configuracion del perfil explanation: Vaquí qualques astúcias per vos preparar subject: Benvengut a Mastodon title: Vos desirem la benvenguda a bòrd %{name} ! diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 9253f2d020..70e772c4c7 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1906,9 +1906,42 @@ pl: silence: Konto ograniczone suspend: Konto zawieszone welcome: - edit_profile_action: Skonfiguruj profil - edit_profile_step: Możesz dostosować profil wysyłając awatar, zmieniając wyświetlaną nazwę i o wiele więcej. Jeżeli chcesz, możesz również włączyć przeglądanie i ręczne akceptowanie nowych próśb o możliwość obserwacji Twojego profilu. + apps_android_action: Pobierz z Google Play + apps_ios_action: Pobierz z App Store + apps_step: Pobierz oficjalne aplikacje. + apps_title: Aplikacje Mastodon + checklist_subtitle: 'Aby porządnie rozpocząć użytkowanie Mastodona:' + checklist_title: Powitalna lista kontrolna + edit_profile_action: Personalizuj + edit_profile_step: Inni użytkownicy są bardziej skłonni do interakcji z Tobą jeśli posiadasz wypełniony profil. + edit_profile_title: Spersonalizuj swój profil explanation: Kilka wskazówek, które pomogą Ci rozpocząć + feature_action: Dowiedz się więcej + feature_audience: Mastodon zapewnia ci unikalne możliwości docierania do twojego grona odbiorców bez żadnych pośredników. Postawiony na własnej infrastrukturze, Mastodon pozwala ci obserwować i być obserwowanym z dowolnego innego serwera Mastodona. Nikt, poza tobą samym(-ą), nie ma nad tym kontroli. + feature_audience_title: Buduj swoją publiczność z pewnością + feature_control: Sam(a) wiesz najlepiej, co chcesz widzieć na swojej osi czasu. Brak algorytmów i reklam, które marnują twój cenny czas. Obserwuj dowolne osoby z dowolnego serwera Mastodona przy pomocy jednego konta i otrzymuj ich wpisy w kolejności chronologicznej. Każdy zasługuje na własny kąt w internecie. + feature_control_title: Miej kontrolę nad swoją osią czasu + feature_creativity: Mastodon obsługuje wpisy audio, wideo oraz zdjęcia, jak również opisy zdjęć na potrzeby dostępności, ankiety, ostrzeżenia dotyczące treści, animowane awatary, niestandardowe emoji, kontrolę miniatur zdjęć i więcej, aby pomóc Ci wyrażać siebie. Bez względu na to, czy dzielisz się swoją sztuką, muzyką czy podcastem, Mastodon jest dla ciebie. + feature_creativity_title: Niezrównana kreatywność + feature_moderation: Mastodon oddaje w twoje ręce prawo podejmowania decyzji. Każdy serwer tworzy własne zasady i regulacje, które są egzekwowane lokalnie a nie odgórnie jak w przypadku korporacyjnych mediów społecznościowych. Czyni to Mastodona najbardziej elastyczną platformą dla różnych grup ludzi z różnymi potrzebami. Dołącz do serwera, z którego zasadami zgadzasz się najbardziej, lub stwórz swój własny. + feature_moderation_title: Moderacja we właściwy sposób + follow_action: Obserwuj + follow_step: Zarządzasz swoim własnym kanałem. Wypełnij go interesującymi ludźmi. + follow_title: Spersonalizuj swoją stronę główną + follows_subtitle: Obserwuj dobrze znane konta + follows_title: Kogo obserwować + follows_view_more: Zobacz więcej osób do obserwowania + hashtags_recent_count: "%{people} osób w ostatnie %{days} dni" + hashtags_subtitle: Zobacz, co było popularne przez ostatnie 2 dni + hashtags_title: Popularne hashtagi + hashtags_view_more: Zobacz więcej popularnych hashtagów + post_action: Utwórz wpis + post_step: Przywitaj się ze światem. + post_title: Utwórz swój pierwszy post + share_action: Udostępnij + share_step: Poinformuj swoich przyjaciół jak znaleźć cię na Mastodonie. + share_title: Udostępnij swój profil + sign_in_action: Zaloguj się subject: Witaj w Mastodonie title: Witaj na pokładzie, %{name}! users: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 58e734d9eb..a521af185e 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -1837,8 +1837,6 @@ pt-BR: silence: Conta silenciada suspend: Conta banida welcome: - edit_profile_action: Configurar perfil - edit_profile_step: Você pode personalizar seu perfil enviando uma foto de perfil, mudando seu nome de exibição e mais. Você pode optar por revisar novos seguidores antes que eles possam te seguir. explanation: Aqui estão algumas dicas para você começar subject: Boas-vindas ao Mastodon title: Boas vindas, %{name}! diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index ebc7f84f4f..bd635d12b6 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -1842,9 +1842,42 @@ pt-PT: silence: Conta limitada suspend: Conta suspensa welcome: - edit_profile_action: Configurar o perfil - edit_profile_step: Pode personalizar o seu perfil carregando uma imagem de perfil, alterando o nome a exibir, entre outras opções. Pode optar por rever os novos seguidores antes de estes o poderem seguir. + apps_android_action: Baixe no Google Play + apps_ios_action: Baixar na App Store + apps_step: Baixe nossos aplicativos oficiais. + apps_title: Apps Mastodon + checklist_subtitle: 'Vamos começar nesta nova fronteira social:' + checklist_title: Checklist de Boas-vindas + edit_profile_action: Personalizar + edit_profile_step: Aumente suas interações tendo um perfil completo. + edit_profile_title: Personalize seu perfil explanation: Aqui estão algumas dicas para começar + feature_action: Mais informações + feature_audience: Mastodon oferece uma possibilidade única de gerenciar seu público sem intermediários. O Mastodon implantado em sua própria infraestrutura permite que você siga e seja seguido de qualquer outro servidor Mastodon online e não esteja sob o controle de ninguém além do seu. + feature_audience_title: Construa seu público em confiança + feature_control: Você sabe melhor o que deseja ver no feed da sua casa. Sem algoritmos ou anúncios para desperdiçar seu tempo. Siga qualquer pessoa em qualquer servidor Mastodon a partir de uma única conta e receba suas postagens em ordem cronológica, deixando seu canto da internet um pouco mais parecido com você. + feature_control_title: Fique no controle da sua própria linha do tempo + feature_creativity: Mastodon suporta postagens de áudio, vídeo e imagens, descrições de acessibilidade, enquetes, avisos de conteúdo, avatares animados, emojis personalizados, controle de corte de miniaturas e muito mais, para ajudá-lo a se expressar online. Esteja você publicando sua arte, sua música ou seu podcast, o Mastodon está lá para você. + feature_creativity_title: Criatividade inigualável + feature_moderation: Mastodon coloca a tomada de decisões de volta em suas mãos. Cada servidor cria as suas próprias regras e regulamentos, que são aplicados localmente e não de cima para baixo como as redes sociais corporativas, tornando-o mais flexível na resposta às necessidades de diferentes grupos de pessoas. Junte-se a um servidor com as regras com as quais você concorda ou hospede as suas próprias. + feature_moderation_title: Moderando como deve ser + follow_action: Seguir + follow_step: Seguir pessoas interessantes é do que trata Mastodon. + follow_title: Personalize seu feed residencial + follows_subtitle: Siga contas bem conhecidas + follows_title: Quem seguir + follows_view_more: Veja mais pessoas para seguir + hashtags_recent_count: "%{people} pessoas nos últimos %{days} dias" + hashtags_subtitle: Explore o que está em tendência desde os últimos 2 dias + hashtags_title: Trending hashtags + hashtags_view_more: Ver mais hashtags em alta + post_action: Compor + post_step: Diga olá para o mundo com texto, fotos, vídeos ou enquetes. + post_title: Faça a sua primeira publicação + share_action: Compartilhar + share_step: Diga aos seus amigos como te encontrar no Mastodon. + share_title: Compartilhe seu perfil de Mastodon + sign_in_action: Iniciar sessão subject: Bem-vindo ao Mastodon title: Bem-vindo a bordo, %{name}! users: diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 8e4f9e7913..747402bb1e 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -707,7 +707,6 @@ ro: silence: Cont limitat suspend: Cont suspendat welcome: - edit_profile_action: Configurare profil explanation: Iată câteva sfaturi pentru a începe subject: Bine ai venit title: Bine ai venit la bord, %{name}! diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 1c718c95b2..83fbe373a0 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1901,8 +1901,6 @@ ru: silence: На учётную запись наложены ограничения suspend: Учётная запись заблокирована welcome: - edit_profile_action: Настроить профиль - edit_profile_step: Вы можете настроить свой профиль добавляя аватарку, изменяя отображаемое имя и так далее. Вы можете вручную подтверждать подписчиков, перед тем как им будет разрешено подписаться на вас. explanation: Вот несколько советов для новичков subject: Добро пожаловать в Mastodon title: Добро пожаловать на борт, %{name}! diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 33ca7ab1d2..ec16c6027d 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -1091,7 +1091,6 @@ sc: silence: Contu limitadu suspend: Contu suspèndidu welcome: - edit_profile_action: Cunfigura su profilu explanation: Inoghe ddoe at una paja de impòsitos pro cumintzare subject: Ti donamus su benebènnidu a Mastodon title: Ti donamus su benebènnidu, %{name}! diff --git a/config/locales/sco.yml b/config/locales/sco.yml index d5628c01bc..5b452fc6bb 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -1580,8 +1580,6 @@ sco: silence: Accoont limitit suspend: Accoont suspendit welcome: - edit_profile_action: Setup profile - edit_profile_step: Ye kin customize yer profile bi uploadin a profile picture, chyngin yer display nemm an mair. Ye kin opt-in fir tae luik ower new follaers afore they’re allooed tae follae ye. explanation: Here some tips fir tae get ye stertit subject: Welcome tae Mastodon, 'mon in title: Welcome aboord, %{name}! diff --git a/config/locales/si.yml b/config/locales/si.yml index 28488197c5..6afa8f8ef3 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -1433,7 +1433,6 @@ si: silence: ගිණුම සීමා කර ඇත suspend: ගිණුම අත්හිටුවා ඇත welcome: - edit_profile_action: පැතිකඩ පිහිටුවන්න explanation: ඔබ ආරම්භ කිරීමට උපදෙස් කිහිපයක් මෙන්න subject: මාස්ටඩන් වෙත පිළිගනිමු title: නැවට සාදරයෙන් පිළිගනිමු, %{name}! diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 12a6ac1fe8..7d0f799d0c 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -39,14 +39,14 @@ ca: text: Només pots emetre una apel·lació per cada acció defaults: autofollow: Qui es registri a través de la invitació et seguirà automàticament - avatar: PNG, GIF o JPG de com a màxim %{size}. S'escalarà a %{dimensions}px + avatar: WEBP, PNG, GIF o JPG. De com a màxim %{size}. S'escalarà a %{dimensions} px bot: Notifica que aquest compte realitza principalment accions automatitzades i que pot estar no monitorat context: Un o diversos contextos en què s'ha d'aplicar el filtre current_password: Per motius de seguretat, introduïu la contrasenya del compte actual current_username: Per a confirmar, entreu el nom d'usuari del compte actual digest: Només s'envia després d'un llarg període d'inactivitat i només si has rebut algun missatge personal durant la teva absència email: Se t'enviarà un correu electrònic de confirmació - header: PNG, GIF o JPG de com a màxim %{size}. S'escalarà a %{dimensions}px + header: WEBP, PNG, GIF o JPG. De com a màxim %{size}. S'escalarà a %{dimensions} px inbox_url: Copia l'enllaç de la pàgina principal del relay que vols usar irreversible: Els tuts filtrats desapareixeran de manera irreversible, fins i tot si el filtre es retira més tard locale: L'idioma de la interfície d’usuari, els correus i les notificacions push diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index 15cf403cf2..c2df26c124 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -39,12 +39,14 @@ et: text: Otsust on võimalik vaidlustada vaid 1 kord defaults: autofollow: Inimesed, kes loovad konto selle kutse läbi, automaatselt jälgivad sind + avatar: WEBP, PNG, GIF või JPG. Kõige rohkem %{size}. Vähendatakse %{dimensions} pikslini bot: Teavita teisi, et see konto teeb enamjaolt automatiseeritud tegevusi ja ei pruugi olla järelvalve all context: Üks või mitu konteksti, mille vastu see filter peaks rakenduma current_password: Sisesta turvalisuse huvides oma siinse konto salasõna current_username: Kinnitamiseks palun sisesta oma konto kasutajanimi digest: Saadetakse ainult pärast pikka tegevusetuse perioodi ja ainult siis, kui on saadetud otsesõnumeid email: Sulle saadetakse e-posti teel kinnituskiri + header: WEBP, PNG, GIF või JPG. Kõige rohkem %{size}. Vähendatakse %{dimensions} pikslini inbox_url: Kopeeri soovitud vahendaja avalehe URL irreversible: Filtreeritud postitused kaovad taastamatult, isegi kui filter on hiljem eemaldatud locale: Kasutajaliidese, e-kirjade ja tõuketeadete keel diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index 96bf11ef2d..3d79f76e8a 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -192,7 +192,7 @@ fi: honeypot: "%{label} (älä täytä)" inbox_url: Välittäjän postilaatikon URL-osoite irreversible: Pudota piilottamisen sijaan - locale: Kieli + locale: Käyttöliittymän kieli max_uses: Käyttökertoja enintään new_password: Uusi salasana note: Elämäkerta diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index 8cedc3b1d5..5dc5ab2c90 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -39,12 +39,14 @@ fy: text: Jo kinne mar ien kear beswier yntsjinje tsjin in fêststelde oertrêding defaults: autofollow: Minsken dy’t harren fia de útnûging registrearre hawwe, folgje jo automatysk + avatar: WEBP, PNG, GIF of JPG. Maksimaal %{size}. Wurdt ferlytse nei %{dimensions}px bot: Sinjaal nei oare brûkers ta dat dizze account yn haadsaak automatisearre berjochten stjoert en mooglik net kontrolearre wurdt context: Ien of meardere lokaasjes wêr’t it filter aktyf wêze moat current_password: Fier foar feilichheidsredenen it wachtwurd fan jo aktuele account yn current_username: Fier ta befêstiging de brûkersnamme fan jo aktuele account yn digest: Wurdt allinnich nei in lange perioade fan ynaktiviteit ferstjoerd en allinnich wannear’t jo wylst jo ôfwêzigens persoanlike berjochten ûntfongen hawwe email: Jo krije in befêstigings-e-mailberjocht + header: WEBP, PNG, GIF of JPG. Maksimaal %{size}. Wurdt ferlytse nei %{dimensions}px inbox_url: Kopiearje de URL fan de foarside fan de relayserver dy’t jo brûke wolle irreversible: Filtere berjochten ferdwine definityf, sels as it filter letter fuortsmiten wurdt locale: De taal fan de brûkersomjouwing, e-mailberjochten en pushmeldingen diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index 7941ac334d..bd7e44455a 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -39,12 +39,14 @@ gd: text: Chan urrainn dhut ath-thagradh a dhèanamh air rabhadh ach aon turas defaults: autofollow: Leanaidh na daoine a chlàraicheas leis a cuireadh thu gu fèin-obrachail + avatar: WEBP, PNG, GIF or JPG. %{size} air a char as motha. Thèid a sgèileadh sìos gu %{dimensions}px bot: Comharraich do chàch gu bheil an cunntas seo ri gnìomhan fèin-obrachail gu h-àraidh is dh’fhaoidte nach doir duine sam bith sùil air idir context: Na co-theacsaichean air am bi a’ chriathrag an sàs current_password: A chùm tèarainteachd, cuir a-steach facal-faire a’ chunntais làithrich current_username: Airson seo a dhearbhadh, cuir a-steach ainm-cleachdaiche a’ chunntais làithrich digest: Cha dèid seo a chur ach nuair a bhios tu air ùine mhòr gun ghnìomh a ghabhail agus ma fhuair thu teachdaireachd phearsanta fhad ’s a bha thu air falbh email: Thèid post-d dearbhaidh a chur thugad + header: WEBP, PNG, GIF no JPG. %{size} air a char as motha. Thèid a sgèileadh sìos gu %{dimensions}px inbox_url: Dèan lethbhreac dhen URL o phrìomh-dhuilleag an ath-sheachadain a bu mhiann leat cleachdadh irreversible: Thèid postaichean criathraichte à sealladh gu buan fiù ’s ma bheir thu a’ chriathrag air falbh às dèidh làimhe locale: Cànan eadar-aghaidh a’ chleachdaiche, nam post-d ’s nam brathan putaidh @@ -138,7 +140,7 @@ gd: url: Far an dèid na tachartasan a chur labels: account: - discoverable: Brosnaich a’ phròifil is postaichean agad sna h-algairimean luirg + discoverable: Brosnaich a’ phròifil is postaichean agad sna h-algairimean rùrachaidh fields: name: Leubail value: Susbaint diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index eae1ea2179..e7b8e15616 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -39,12 +39,14 @@ ja: text: 一度だけ異議を申し立てることができます defaults: autofollow: 招待から登録した人が自動的にあなたをフォローするようになります + avatar: "%{size}までのWEBP、PNG、GIF、JPGが利用可能です。%{dimensions}pxまで縮小されます" bot: このアカウントは主に自動で動作し、人が見ていない可能性があります context: フィルターを適用する対象 (複数選択可) current_password: 現在のアカウントのパスワードを入力してください current_username: 確認のため、現在のアカウントのユーザー名を入力してください digest: 長期間使用していない場合と不在時に返信を受けた場合のみ送信されます email: 確認のメールが送信されます + header: "%{size}までのWEBP、PNG、GIF、JPGが利用可能です。%{dimensions}pxまで縮小されます" inbox_url: 使用したいリレーサーバーのトップページからURLをコピーします irreversible: フィルターが後で削除されても、除外された投稿は元に戻せなくなります locale: ユーザーインターフェース、メールやプッシュ通知の言語 diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml index c7370aedf6..a9b040b058 100644 --- a/config/locales/simple_form.kab.yml +++ b/config/locales/simple_form.kab.yml @@ -2,6 +2,9 @@ kab: simple_form: hints: + account: + display_name: Isem-ik·im ummid neɣ isem-ik·im n uqeṣṣer. + fields: Asebter-ik·im agejdan, imqimen, leεmer, ayen tebɣiḍ. account_alias: acct: Sekcem isem n umseqdac@domain n umiḍan s wansa itebγiḍ ad gujjeḍ account_migration: @@ -11,6 +14,7 @@ kab: type_html: Fren d acu ara txedmeḍ s %{acct} defaults: autofollow: Imdanen ara ijerrden s usnebgi-inek, ad k-ḍefṛen s wudem awurman + bot: Smekti-d wiyaḍ dakken amiḍan-a ixeddem s wudem amezwer tigawin tiwurmanin yernu ur yezmir ara ad yettwaɛass email: Ad n-teṭṭfeḍ imayl i usentem irreversible: Tisuffaɣ i tessazedgeḍ ad ttwakksent i lebda, ula ma tekkseḍ imsizdeg-nni ar zdat locale: Tutlayt n ugrudem, imaylen d tilγa @@ -18,6 +22,7 @@ kab: setting_display_media_default: Ffer teywalt yettwacreḍ d tanafrit setting_display_media_hide_all: Ffer yal tikkelt akk taywalt setting_display_media_show_all: Ffer yal tikkelt teywalt yettwacreḍ d tanafrit + username: Tzemreḍ ad tesqedceḍ isekkilen, uṭṭunen akked yijerriden n wadda imports: data: Afaylu CSV id yusan seg uqeddac-nniḍen n Maṣṭudun ip_block: @@ -82,6 +87,10 @@ kab: form_admin_settings: site_terms: Tasertit tabaḍnit site_title: Isem n uqeddac + interactions: + must_be_follower: Ssewḥel ilɣa seg wid akked tid ur yellin ara d imeḍfaren-ik·im + must_be_following: Ssewḥel ilɣa seg wid akked tid ur tettḍafareḍ ara + must_be_following_dm: Sewḥel iznan usriden sɣur wid akked tid ur tettḍafareḍ ara invite: comment: Awennit invite_request: diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 5d23a70100..133a225405 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -8,7 +8,7 @@ lv: fields: Tava mājas lapa, vietniekvārdi, vecums, viss, ko vēlies. indexable: Tavas publiskās ziņas var tikt parādītas Mastodon meklēšanas rezultātos. Personas, kuras ir mijiedarbojušās ar tavām ziņām, var tās meklēt neatkarīgi no tā. note: 'Tu vari @minēt citus cilvēkus vai #mirkļbirkas.' - show_collections: Cilvēki varēs pārlūkot tavus sekotājus un kam tu seko. Cilvēki, kuriem seko, redzēs, ka tu seko viņiem neatkarīgi no tā. + show_collections: Cilvēki varēs pārlūkot Tavus sekotājus un sekojamos. Cilvēki, kuriem Tu seko, redzēs, ka Tu seko viņiem neatkarīgi no tā. unlocked: Cilvēki varēs tev sekot, neprasot apstiprinājumu. Noņem atzīmi, ja vēlies pārskatīt sekošanas pieprasījumus un izvēlēties, pieņemt vai noraidīt jaunus sekotājus. account_alias: acct: Norādi konta lietotājvārdu@domēnu, no kura vēlies pārvākties @@ -39,12 +39,14 @@ lv: text: Brīdinājumu var pārsūdzēt tikai vienu reizi defaults: autofollow: Cilvēki, kuri reģistrējas, izmantojot uzaicinājumu, automātiski sekos tev + avatar: WEBP, PNG, GIF vai JPG. Ne vairāk kā %{size}. Tiks samazināts līdz %{dimensions}px bot: Paziņo citiem, ka kontā galvenokārt tiek veiktas automatizētas darbības un tas var netikt uzraudzīts context: Viens vai vairāki konteksti, kur jāpiemēro filtrs current_password: Drošības nolūkos, lūdzu, ievadi pašreizējā konta paroli current_username: Lai apstiprinātu, lūdzu, ievadi pašreizējā konta paroli digest: Sūta tikai pēc ilgstošas neaktivitātes un tikai tad, ja savas prombūtnes laikā neesi saņēmis personiskas ziņas email: Tev tiks nosūtīts apstiprinājuma e-pasts + header: WEBP, PNG, GIF vai JPG. Ne vairāk kā %{size}. Tiks samazināts līdz %{dimensions}px inbox_url: Nokopē URL no tā releja sākumlapas, kuru vēlies izmantot irreversible: Filtrētās ziņas neatgriezeniski pazudīs, pat ja filtrs vēlāk tiks noņemts locale: Lietotāja saskarnes, e-pasta ziņojumu un push paziņojumu valoda @@ -57,7 +59,7 @@ lv: setting_display_media_default: Paslēpt multividi, kas atzīmēta kā sensitīva setting_display_media_hide_all: Vienmēr slēpt multividi setting_display_media_show_all: Vienmēr rādīt multividi - setting_use_blurhash: Gradientu pamatā ir paslēpto vizuālo attēlu krāsas, bet neskaidras visas detaļas + setting_use_blurhash: Pāreju pamatā ir paslēpto uzskatāmo līdzekļu krāsas, bet saturs tiek padarīts neskaidrs setting_use_pending_items: Paslēpt laika skalas atjauninājumus aiz klikšķa, nevis automātiski ritini plūsmu username: Tu vari lietot burtus, ciparus un zemsvītras whole_word: Ja atslēgvārds vai frāze ir tikai burtciparu, tas tiks lietots tikai tad, ja tas atbilst visam vārdam @@ -94,7 +96,7 @@ lv: status_page_url: Tās lapas URL, kurā lietotāji var redzēt šī servera statusu pārtraukuma laikā theme: Tēma, kuru redz apmeklētāji, kuri ir atteikušies, un jaunie lietotāji. thumbnail: Aptuveni 2:1 attēls, kas tiek parādīts kopā ar tava servera informāciju. - timeline_preview: Atteikušies apmeklētāji varēs pārlūkot jaunākās serverī pieejamās publiskās ziņas. + timeline_preview: Atteikušies apmeklētāji varēs pārlūkot jaunākos serverī pieejamos publiskos ierakstus. trendable_by_default: Izlaist aktuālā satura manuālu pārskatīšanu. Atsevišķas preces joprojām var noņemt no tendencēm pēc fakta. trends: Tendences parāda, kuras ziņas, atsauces un ziņu stāsti gūst panākumus tavā serverī. trends_as_landing_page: Šī servera apraksta vietā rādīt aktuālo saturu lietotājiem un apmeklētājiem, kuri ir atteikušies. Nepieciešams iespējot tendences. @@ -174,8 +176,8 @@ lv: text: Paskaidrojiet, kāpēc šis lēmums ir jāatceļ defaults: autofollow: Uzaicini sekot tavam kontam - avatar: Avatars - bot: Šis ir bot konts + avatar: Profila attēls + bot: Šis ir automatizēts konts chosen_languages: Filtrēt valodas confirm_new_password: Apstiprināt jauno paroli confirm_password: Apstiprināt paroli @@ -218,7 +220,7 @@ lv: setting_theme: Vietnes motīvs setting_trends: Parādīt šodienas tendences setting_unfollow_modal: Parādīt apstiprinājuma dialogu pirms pārtraukt kādam sekot - setting_use_blurhash: Rādīt krāsainus gradientus slēptajiem multivides materiāliem + setting_use_blurhash: Rādīt krāsainas pārejas paslēptajiem informācijas nesējiem setting_use_pending_items: Lēnais režīms severity: Smagums sign_in_token_attempt: Drošības kods diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml index 6c47a9deee..a1050c9f91 100644 --- a/config/locales/simple_form.no.yml +++ b/config/locales/simple_form.no.yml @@ -39,12 +39,14 @@ text: Du kan kun anke en advarsel en gang defaults: autofollow: Folk som lager en konto gjennom invitasjonen, vil automatisk følge deg + avatar: WEBP, PNG, GIF eller JPG. Maksimalt %{size}. Vil bli nedskalert til %{dimensions}px bot: Denne kontoen utfører i hovedsak automatiserte handlinger og blir kanskje ikke holdt øye med context: En eller flere sammenhenger der filteret skal gjelde current_password: For sikkerhetsgrunner, vennligst oppgi passordet til den nåværende bruker current_username: For å bekrefte, vennligst skriv inn brukernavnet til den nåværende kontoen digest: Kun sendt etter en lang periode med inaktivitet og bare dersom du har mottatt noen personlige meldinger mens du var borte email: Du vil bli tilsendt en bekreftelses-E-post + header: WEBP, PNG, GIF eller JPG. Maksimalt %{size}. Vil bli nedskalert til %{dimensions}px inbox_url: Kopier URLen fra forsiden til overgangen du vil bruke irreversible: Filtrerte innlegg vil ugjenkallelig forsvinne, selv om filteret senere blir fjernet locale: Språket til brukergrensesnittet, e-mailer og push-varsler diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml index 62e12201ae..3214a722df 100644 --- a/config/locales/simple_form.sr-Latn.yml +++ b/config/locales/simple_form.sr-Latn.yml @@ -39,12 +39,14 @@ sr-Latn: text: Možete podneti samo jednu žalbu na upisan prestup defaults: autofollow: Osobe koje se prijave kroz pozivnice će vas automatski zapratiti + avatar: WEBP, PNG, GIF ili JPG. Najviše %{size}. Biće smanjeno na %{dimensions}px bot: Daje drugima do znanja da ovaj nalog uglavnom vrši automatizovane radnje i možda se ne nadgleda context: Jedan ili više konteksta u kojima treba da se primeni filter current_password: Iz bezbednosnih razloga molimo Vas unesite lozinku trenutnog naloga current_username: Da biste potvrdili, Molimo Vas unesite korisničko ime trenutno aktivnog naloga digest: Šalje se samo posle dužeg perioda neaktivnosti i samo u slučaju da ste primili jednu ili više ličnih poruka tokom Vašeg odsustva email: Biće Vam poslat mejl sa potvrdom + header: WEBP, PNG, GIF ili JPG. Najviše %{size}. Biće smanjeno na %{dimensions}px inbox_url: Kopirajte URL sa naslovne strane releja koji želite koristiti irreversible: Filtrirane obajve će nestati nepovratno, čak i ako je filter kasnije uklonjen locale: Jezik korisničkog okruženja, e-pošte i mobilnih obaveštenja diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index 10434be1e4..9631efc053 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -39,12 +39,14 @@ sr: text: Можете поднети само једну жалбу на уписан преступ defaults: autofollow: Особе које се пријаве кроз позивнице ће вас аутоматски запратити + avatar: WEBP, PNG, GIF или JPG. Највише %{size}. Биће смањено на %{dimensions}px bot: Даје другима до знања да овај налог углавном врши аутоматизоване радње и можда се не надгледа context: Један или више контекста у којима треба да се примени филтер current_password: Из безбедносних разлога молимо Вас унесите лозинку тренутног налога current_username: Да бисте потврдили, Молимо Вас унесите корисничко име тренутно активног налога digest: Шаље се само после дужег периода неактивности и само у случају да сте примили једну или више личних порука током Вашег одсуства email: Биће Вам послат мејл са потврдом + header: WEBP, PNG, GIF или JPG. Највише %{size}. Биће смањено на %{dimensions}px inbox_url: Копирајте URL са насловне стране релеја који желите користити irreversible: Филтриранe обајве ће нестати неповратно, чак и ако је филтер касније уклоњен locale: Језик корисничког окружења, е-поште и мобилних обавештења diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index fcf3788027..02806e711f 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -39,12 +39,14 @@ sv: text: Du kan endast överklaga en varning en gång defaults: autofollow: Användarkonton som skapas genom din inbjudan kommer automatiskt följa dig + avatar: WEBP, PNG, GIF eller JPG. Högst %{size}. Kommer nedskalas till %{dimensions} pixlar bot: Detta konto utför huvudsakligen automatiserade åtgärder och kanske inte övervakas context: Ett eller fler sammanhang där filtret ska tillämpas current_password: Av säkerhetsskäl krävs lösenordet till det nuvarande kontot current_username: Ange det nuvarande kontots användarnamn för att bekräfta digest: Skickas endast efter en lång period av inaktivitet och endast om du har fått några personliga meddelanden i din frånvaro email: Du kommer att få ett bekräftelsemeddelande via e-post + header: WEBP, PNG, GIF eller JPG. Högst %{size}. Kommer nedskalas till %{dimensions} pixlar inbox_url: Kopiera webbadressen från hemsidan av det ombud du vill använda irreversible: Filtrerade inlägg kommer att försvinna oåterkalleligt, även om filter tas bort senare locale: Språket för användargränssnittet, e-postmeddelanden och push-aviseringar diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index 817883941c..ae0a5ea560 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -39,12 +39,14 @@ vi: text: Bạn chỉ có thể khiếu nại mỗi lần một cảnh cáo defaults: autofollow: Những người đăng ký sẽ tự động theo dõi bạn + avatar: WEBP, PNG, GIF hoặc JPG, tối đa %{size}. Sẽ bị nén xuống %{dimensions}px bot: Tài khoản này tự động thực hiện các hành động và không được quản lý bởi người thật context: Chọn một hoặc nhiều nơi mà bộ lọc sẽ áp dụng current_password: Vì mục đích bảo mật, vui lòng nhập mật khẩu của tài khoản hiện tại current_username: Để xác nhận, vui lòng nhập tên người dùng của tài khoản hiện tại digest: Chỉ gửi sau một thời gian dài không hoạt động hoặc khi bạn nhận được tin nhắn (trong thời gian vắng mặt) email: Bạn sẽ được gửi một email xác minh + header: WEBP, PNG, GIF hoặc JPG, tối đa %{size}. Sẽ bị nén xuống %{dimensions}px inbox_url: Sao chép URL của máy chủ mà bạn muốn dùng irreversible: Các tút đã lọc sẽ không thể phục hồi, kể cả sau khi xóa bộ lọc locale: Ngôn ngữ của giao diện, email và thông báo đẩy diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index c83a7be75a..fe938712e3 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -11,9 +11,9 @@ zh-TW: show_collections: 人們將能瀏覽您跟隨中及跟隨者帳號。您所跟隨之人能得知您正在跟隨其帳號。 unlocked: 人們將無需額外請求您的同意便能跟隨您的帳號。取消勾選以審查跟隨請求並選擇是否同意或拒絕新跟隨者。 account_alias: - acct: 指定要移動的帳號的「使用者名稱@網域名稱」 + acct: 指定要移動的帳號之「使用者名稱@網域名稱」 account_migration: - acct: 指定要移動至的帳號的「使用者名稱@網域名稱」 + acct: 指定欲移動至帳號之「使用者名稱@網域名稱」 account_warning_preset: text: 您可使用嘟文語法,例如網址、「#」標籤與提及功能 title: 可選。不會向收件者顯示 @@ -33,7 +33,7 @@ zh-TW: all_day: 當選取時,僅顯示出時間範圍中的日期部分 ends_at: 可選的。公告會於該時間點自動取消發布 scheduled_at: 空白則立即發布公告 - starts_at: 可選的。讓公告於特定時間範圍內顯示 + starts_at: 可選的。使公告於特定時間範圍內顯示 text: 您可以使用嘟文語法,但請小心別讓公告太鴨霸而佔據使用者的整個版面。 appeal: text: 您只能對警示提出一次申訴 @@ -52,7 +52,7 @@ zh-TW: locale: 使用者介面、電子郵件與推播通知的語言 password: 使用至少 8 個字元 phrase: 無論是嘟文的本文或是內容警告都會被過濾 - scopes: 允許讓應用程式存取的 API。 若您選擇最高階範圍,則無須選擇個別項目。 + scopes: 允許使應用程式存取的 API。 若您選擇最高階範圍,則無須選擇個別項目。 setting_aggregate_reblogs: 請勿顯示最近已被轉嘟之嘟文的最新轉嘟(只影響最新收到的嘟文) setting_always_send_emails: 一般情況下若您活躍使用 Mastodon ,我們不會寄送電子郵件通知 setting_default_sensitive: 敏感內容媒體預設隱藏,且按一下即可重新顯示 @@ -119,7 +119,7 @@ zh-TW: text: 說明使用者於此伺服器上需遵守的規則或條款。試著維持各項條款簡短而明瞭。 sessions: otp: 請輸入產生自您手機 App 的兩階段驗證碼,或輸入其中一個備用驗證碼: - webauthn: 如果它是 USB 安全金鑰的話,請確認已正確插入,如有需要請觸擊。 + webauthn: 若它是 USB 安全金鑰,請確認已正確插入,如有需要請觸擊。 settings: indexable: 個人檔案可能出現於 Google、Bing、或其他搜尋引擎。 show_application: 將總是顯示您發嘟文之應用程式 @@ -130,7 +130,7 @@ zh-TW: role: 角色控制使用者有哪些權限 user_role: color: 於整個使用者介面中用於角色的顏色,十六進位格式的 RGB - highlighted: 這會讓角色公開可見 + highlighted: 這會使角色公開可見 name: 角色的公開名稱,如果角色設定為顯示為徽章 permissions_as_keys: 有此角色的使用者將有權存取... position: 某些情況下,衝突的解決方式由更高階的角色決定。某些動作只能由優先程度較低的角色執行 @@ -164,7 +164,7 @@ zh-TW: none: 什麼也不做 sensitive: 敏感内容 silence: 安靜 - suspend: 停權並不可逆的刪除帳號資料 + suspend: 停權並不可逆地刪除帳號資料 warning_preset_id: 使用警告預設 announcement: all_day: 全天活動 diff --git a/config/locales/sk.yml b/config/locales/sk.yml index e93cec19f6..1d8866645c 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -733,7 +733,7 @@ sk: edit_preset: Uprav varovnú predlohu title: Spravuj varovné predlohy webhooks: - delete: Zmazať + delete: Vymaž disable: Vypni disabled: Vypnuté enable: Povoľ @@ -744,6 +744,7 @@ sk: subject: Registrácie na %{instance} boli automaticky prepnuté na vyžadujúce schválenie new_appeal: actions: + delete_statuses: vymazať ich príspevky none: varovanie silence: obmedziť ich účet new_pending_account: @@ -804,6 +805,7 @@ sk: prefix_invited_by_user: "@%{name} ťa pozýva na tento Mastodon server!" prefix_sign_up: Zaregistruj sa na Mastodone už dnes! suffix: S pomocou účtu budeš môcť nasledovať ľudí, posielať príspevky, a vymieňať si správy s užívateľmi na hocijakom Mastodon serveri, ale aj na iných serveroch! + dont_have_your_security_key: Nemáš svoj bezpečnostný kľúč? forgot_password: Zabudnuté heslo? invalid_reset_password_token: Token na obnovu hesla vypršal. Prosím vypítaj si nový. log_in_with: Prihlás sa s @@ -814,6 +816,7 @@ sk: or_log_in_with: Alebo prihlás s progress: confirm: Potvrď email + rules: Súhlas s pravidlami register: Zaregistruj sa registration_closed: "%{instance} neprijíma nových členov" resend_confirmation: Odošli potvrdzovací odkaz znovu @@ -1287,8 +1290,14 @@ sk: silence: Účet bol obmedzený suspend: Tvoj účet bol vylúčený welcome: - edit_profile_action: Nastav profil + apps_title: Mastodon aplikácie + edit_profile_action: Prispôsob explanation: Tu nájdeš nejaké tipy do začiatku + feature_action: Zisti viac + follow_action: Nasleduj + post_title: Vytvor svoj prvý príspevok + share_action: Zdieľaj + sign_in_action: Prihlás sa subject: Vitaj na Mastodone title: Vitaj na palube, %{name}! users: diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 863b3d7249..103e16a1f5 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1906,9 +1906,42 @@ sl: silence: Račun je omejen suspend: Račun je suspendiran welcome: - edit_profile_action: Nastavitve profila - edit_profile_step: Profil lahko prilagodite tako, da naložite sliko profila, spremenite pojavno ime in drugo. Lahko izberete, da želite pregledati nove sledilce, preden jim dovolite sledenje. + apps_android_action: Na voljo v Google Play + apps_ios_action: Prenesi iz trgovine App Store + apps_step: Prenesite naše uradne aplikacije. + apps_title: Programi za Mastodon + checklist_subtitle: 'Naj vas pripravimo na doživetja na tej novi družabni meji:' + checklist_title: Seznam dobrodošlice + edit_profile_action: Poosebite + edit_profile_step: Okrepite svoje interakcije z razumljivim profilom. + edit_profile_title: Prilagodite svoj profil explanation: Tu je nekaj nasvetov za začetek + feature_action: Več o tem + feature_audience: Mastodon zagotavlja enkratno možnost upravljanja s svojim občinstvom brez posrednika. Mastodon na lastni infrastrukturi omogoča sledenje drugih in drugim na in s poljubljnega povezanega strežnika Masodon in je zgolj pod vašim nadzorom. + feature_audience_title: Zaupno razvijajte svoje občinstvo + feature_control: Sami najbolje veste, kaj želite videti v svojem viru. Brez algoritmov ali oglasov, ki bi predstavljali izgubo vašega časa. Sledite komur koli prek poljubnega strežnika Mastodon na enem samem računu in prejmite njihove objave v kronološkem zaporedju ter ustvarite svoj kotiček interneta malce bolj po svoji meri in okusu. + feature_control_title: Ohranite nadzor nad svojo časovnico + feature_creativity: Mastodon podpira zvokovne, video in slikovne objave, opise za dostopnost, ankete, opozorila za vsebino, animirane avatarje, čustvenčke po meri, nadzor na obrezavo oglednih sličic in še veliko drugega. Tako se lahko povsem izrazite na spletu. Najsi želite objaviti svoja likovna dela, glasbo ali podkast, Mastodon vam stoji ob strani. + feature_creativity_title: Edinstvena ustvarjalnost + feature_moderation: Mastodon vrača odločanje v vaše roke. Vsak strežnik ustvari lastna pravila in predpise, ki se uveljavljajo krajevno in ne od zgoraj navzdol, kot to velja za korporacijske družabne medije. Zato je kar se da prilagodljiv pri odzivanju na potrebe različnih skupin ljudi. Pridružite se strežniku s pravili, s katerimi se strinjate, ali gostite lastnega. + feature_moderation_title: Moderiranje, kot bi moralo biti + follow_action: Sledite + follow_step: Sledenje zanimivim osebam je bistvo Mastodona. + follow_title: Poosebite svoj domači vir + follows_subtitle: Sledite dobro znanim računom + follows_title: Komu slediti + follows_view_more: Pokaži več oseb za sledenje + hashtags_recent_count: "%{people} oseb v zadnjih %{days} dneh" + hashtags_subtitle: Raziščite, kaj je v trendu zadnja dva dni + hashtags_title: Ključniki v trendu + hashtags_view_more: Pokaži več ključnikov v trendu + post_action: Sestavi + post_step: Pozdravite cel svet z besedilom, fotografijami, videoposnetki ali anketami. + post_title: Ustvarite svojo prvo objavo + share_action: Delite + share_step: Naj prijatelji izvejo, kako vas najdejo na Mastodonu. + share_title: Delite svoj profil Mastodon z drugimi + sign_in_action: Prijava subject: Dobrodošli na Mastodon title: Dobrodošli, %{name}! users: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index d3d5a262fd..ecf79da51a 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1838,9 +1838,41 @@ sq: silence: Llogari e kufizuar suspend: Llogari e pezulluar welcome: - edit_profile_action: Ujdisje profili - edit_profile_step: Profilin tuaj mund ta përshtatni duke ngarkuar një figurë, duke ndryshuar emrin tuaj në ekran, etj. Mund të zgjidhni të shqyrtoni ndjekës të rinj, para se të jenë lejuar t’ju ndjekin. + apps_android_action: Merreni në Google Play + apps_ios_action: Shkarkojeni nga App Store + apps_step: Shkarkoni aplikacionet tona zyrtare. + apps_title: Aplikacione Mastodon + checklist_subtitle: 'Le t’ju vëmë në udhë drejt këtij horizonti të ri rrjetesh shoqërorë:' + edit_profile_action: Personalizojeni + edit_profile_step: Përforconi ndërveprimet tuaja, duke pasur një profil shterues. + edit_profile_title: Personalizoni profilin tuaj explanation: Ja disa ndihmëza, sa për t’ia filluar + feature_action: Mësoni më tepër + feature_audience: Mastodon-i ju sjell një mundësi unike për administrimin e publikut tuaj pa të tjerë në mes. Mastodon-i i sendërtuar në infrastrukturë tuajën ju lejon të ndiqni dhe të ndiqeni nga cilido shërbyes tjetër Mastodon në internet dhe është nën kontroll vetëm nga ju dhe askush tjetër. + feature_audience_title: Krijoni me vetëbesim publikun tuaj + feature_control: E dini më mirë se kushdo se ç’doni të shihni në prurjen tuaj të kreut. Pa algoritme apo reklama që ju hanë kot kohën. Ndiqni këdo, në çfarëdo shërbyesi Mastodon, që nga një llogari e vetme dhe merrni postimet e tyre në rend kohor dhe bëjeni këndin tuaj të internetit pak më tepër si ju. + feature_control_title: Mbani kontrollin e rrjedhës tuaj kohore + feature_creativity: Mastodon-i mbulon postime audio, video dhe foto, përshkrime për persona me aftësi të kufizuara, pyetësorë, sinjalizime rreth lënde, avatarë të animuar, emoxhi vetjake, kontroll qethjeje miniaturash, etj, për t’ju ndihmuar të shpreheni në internet. Qoftë kur po botoni art tuajin, muzikë tuajën apo podkastin tuaj, Mastodon-i është gati. + feature_creativity_title: Frymë krijuese e pashoqe + feature_moderation: Mastodon-i e rikthen marrjen e vendimeve në duart tuaja. Çdo shërbyes krijon rregullat dhe rregulloren e vet, të cilat vihen në zbatim lokalisht dhe jo nga sipër, si me mediat shoqërore të korporatave, duke e bërë më të zhdërvjellëtin për t’iu përgjigjur nevojave të grupeve të ndryshme të personave. Bëhuni pjesë e një shërbyesi me rregullat e të cilit pajtoheni, ose strehojeni ju vetë një të tillë. + feature_moderation_title: Moderim ashtu si duhet bërë + follow_action: Ndiqeni + follow_step: Ndjekje personash interesantë është ajo çka përbën thelbin e Mastodon-it. + follow_title: Personalizoni prurjen tuaj të kreut + follows_subtitle: Ndiqni llogari të mirënjohura + follows_title: Cilët të ndiqen + follows_view_more: Shihni më tepër vetë për ndjekje + hashtags_recent_count: "%{people} vetë në %{days} ditët e shkuara" + hashtags_subtitle: Eksploroni ç’është në modëë që prej 2 ditëve të fundit + hashtags_title: Hashtag-ë në modë + hashtags_view_more: Shihni më tepër hashtagë në modë + post_action: Hartoni + post_step: Përshëndetni botën me tekst, foto, video, ose pyetësorë. + post_title: Shkruani postimin tuaj të parë + share_action: Ndajeni me të tjerë + share_step: Bëjuni të ditur shokëve si t’ju gjejnë në Mastodon. + share_title: Ndani me të tjerët profilin tuaj Mastodon + sign_in_action: Hyni subject: Mirë se vini te Mastodon-i title: Mirë se vini, %{name}! users: diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 7c7fb390fe..c2f9295f1c 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -781,13 +781,15 @@ sr-Latn: disabled: Nikome users: Prijavljenim lokalnim korisnicima registrations: + moderation_recommandation: Uverite se da imate adekvatan i reaktivan moderatorski tim pre nego što otvorite registraciju za sve! preamble: Kontrolišite ko sme da napravi nalog na Vašem serveru. title: Registracije registrations_mode: modes: - approved: Odobrenje neophodno za registraciju + approved: Neophodno je odobrenje za registraciju none: Niko ne može da se registruje open: Bilo ko može da se registruje + warning_hint: Preporučujemo da koristite „Neophodno je odobrenje za registraciju” osim ako niste sigurni da vaš moderatorski tim može blagovremeno da obradi neželjenu poštu i zlonamerne registracije. security: authorized_fetch: Zahtevaj autentifikaciju sa združenih servera authorized_fetch_hint: Zahtevanje autentifikacije sa združenih servera omogućuje strožiju primenu blokova i na nivou korisnika i na nivou servera. Međutim, ovo dolazi po cenu smanjenja performansi, smanjuje domet vaših odgovora i može dovesti do problema kompatibilnosti sa nekim združenim uslugama. Pored toga, ovo neće sprečiti posvećene aktere da preuzimaju vaše javne objave i naloge. @@ -984,6 +986,9 @@ sr-Latn: title: Veb-presretač webhook: Veb-presretač admin_mailer: + auto_close_registrations: + body: Zbog nedostatka nedavnih aktivnosti moderatora, registracije na %{instance} su automatski prebačene na zahtevanje ručnog pregleda, kako bi se sprečilo da se %{instance} koristi kao platforma za potencijalne loše aktere. Možete ih vratiti na otvorene registracije u bilo kom trenutku. + subject: Registracije za %{instance} su automatski prebačene na zahtevanje odobrenja new_appeal: actions: delete_statuses: obrisati objave korisnika @@ -1059,7 +1064,7 @@ sr-Latn: hint_html: Samo još jedna stvar! Moramo da potvrdimo da ste ljudsko biće (ovo je da bismo sprečili neželjenu poštu!). Rešite CAPTCHA ispod i kliknite na „Nastavi”. title: Bezbedonosna provera confirmations: - awaiting_review: Vaša adresa e-pošte je potvrđena! Osoblje %{domain} sada pregleda vašu registraciju. Dobićete e-poštu ako odobre vaš nalog! + awaiting_review: Vaša adresa e-pošte je potvrđena! Osoblje %{domain} sada pregleda vašu registraciju. Dobićete e-poštu ako odobre vaš nalog! awaiting_review_title: Vaša registracija se pregleda clicking_this_link: klikom na ovu vezu login_link: prijavi se @@ -1128,7 +1133,7 @@ sr-Latn: functional: Vaš nalog je potpuno operativan. pending: Vaš zahtev je na čekanju za pregled od strane našeg osoblja. Ovo može potrajati neko vreme. Primićete imejl poruku ukoliko Vam zahtev bude odobren. redirecting_to: Vaš nalog je neaktivan jer preusmerava na %{acct}. - self_destruct: Pošto se %{domain} zatvara, dobićete samo ograničen pristup svom nalogu. + self_destruct: Pošto se %{domain} zatvara, dobićete samo ograničen pristup svom nalogu. view_strikes: Pogledajte prethodne prestupe upisane na Vaše ime too_fast: Formular je podnet prebrzo, pokušajte ponovo. use_security_key: Koristite sigurnosni ključ @@ -1393,7 +1398,7 @@ sr-Latn: '86400': 1 dan expires_in_prompt: Nikad generate: Generiši - invalid: Ova pozivnica nije važeća + invalid: Ova pozivnica nije važeća invited_by: 'Pozvao Vas je:' max_uses: few: "%{count} korišćenja" @@ -1610,7 +1615,7 @@ sr-Latn: over_total_limit: Prekoračili ste granicu od %{limit} planiranih objava too_soon: Planirani datum mora biti u budućnosti self_destruct: - lead_html: Nažalost, %{domain} se trajno zatvara. Ako ste tamo imali nalog, nećete moći da nastavite da ga koristite, ali i dalje možete da zatražite rezervnu kopiju svojih podataka. + lead_html: Nažalost, %{domain} se trajno zatvara. Ako ste tamo imali nalog, nećete moći da nastavite da ga koristite, ali i dalje možete da zatražite rezervnu kopiju svojih podataka. title: Ovaj server se zatvara sessions: activity: Poslednja aktivnost @@ -1780,8 +1785,8 @@ sr-Latn: does_not_match_previous_name: ne poklapa se sa prethodnim imenom themes: contrast: Veliki kontrast - default: Mastodon (tamno) - mastodon-light: Mastodon (svetlo) + default: Mastodon (tamna) + mastodon-light: Mastodon (svetla) time: formats: default: "%d %b %Y, %H:%M" @@ -1826,7 +1831,7 @@ sr-Latn: title: Izvoz arhive failed_2fa: details: 'Evo detalja o pokušaju prijavljivanja:' - explanation: Neko je pokušao da se prijavi na vaš nalog ali je dao nevažeći drugi faktor autentifikacije. + explanation: Neko je pokušao da se prijavi na vaš nalog ali je dao nevažeći drugi faktor autentifikacije. further_actions_html: Ako to niste bili vi, preporučujemo vam da odmah %{action} jer može biti ugrožena. subject: Neuspeh drugog faktora autentifikacije title: Nije uspeo drugi faktor autentifikacije @@ -1869,9 +1874,42 @@ sr-Latn: silence: Nalog ograničen suspend: Nalog suspendovan welcome: - edit_profile_action: Podesi nalog - edit_profile_step: Možete prilagoditi svoj profil tako što ćete postaviti profilnu sliku, promeniti ime za prikaz i tako dalje. Možete dati saglasnost da pregledate nove pratioce pre nego što im dozvolite da Vas zaprate. + apps_android_action: Nabavite na Google Play + apps_ios_action: Preuzmite sa App Store + apps_step: Preuzmite naše zvanične aplikacije. + apps_title: Mastodon aplikacije + checklist_subtitle: 'Započnimo na ovoj novoj društvenoj granici:' + checklist_title: Koraci dobrodošlice + edit_profile_action: Personalizujte + edit_profile_step: Povećajte svoje interakcije tako što ćete imati sveobuhvatan profil. + edit_profile_title: Personalizujte svoj profil explanation: Evo nekoliko saveta za početak + feature_action: Saznajte više + feature_audience: Mastodon vam pruža jedinstvenu mogućnost upravljanja svojom publikom bez posrednika. Mastodon raspoređen na vašoj sopstvenoj infrastrukturi vam omogućuje da pratite i budete praćeni sa bilo kog drugog Mastodon servera na mreži i nije ni pod čijom kontrolom osim vaše. + feature_audience_title: Izgradite svoju publiku u poverenju + feature_control: Vi najbolje znate šta želite da vidite na svojoj poetnoj stranici. Nema algoritama ili reklama da troše vaše vreme. Pratite bilo koga na bilo kom Mastodon serveru sa jednog naloga i primajte njihove objave hronološkim redosledom i učinite svoj kutak interneta malo sličnijim vama. + feature_control_title: Držite kontrolu nad sopstvenom vremenskom linijom + feature_creativity: Mastodon podržava audio, video i slikovne objave, opise pristupačnosti, ankete, upozorenja o sadržaju, animirane avatare, prilagođene emodžije, kontrolu isecanja sličica i još mnogo toga, kako bi vam pomogao da se izrazite na mreži. Bilo da objavljujete svoju umetnost, muziku ili podkast, Mastodon je tu za vas. + feature_creativity_title: Kreativnost bez premca + feature_moderation: Mastodon vraća donošenje odluka u vaše ruke. Svaki server kreira sopstvena pravila i propise, koji se primenjuju lokalno, a ne odozgo prema dole kao korporativni društveni mediji, što ga čini najfleksibilnijim u odgovaranju na potrebe različitih grupa ljudi. Pridružite se serveru sa pravilima sa kojima se slažete ili hostujte svoja. + feature_moderation_title: Moderacija onakva kakva bi trebalo da bude + follow_action: Pratite + follow_step: Praćenje zanimljivih ljudi je ono o čemu se radi u Mastodon-u. + follow_title: Personalizujte svoju početnu stranicu + follows_subtitle: Pratite dobro poznate naloge + follows_title: Koga pratiti + follows_view_more: Pogledajte još ljudi za praćenje + hashtags_recent_count: "%{people} ljudi u prošlih %{days} dana" + hashtags_subtitle: Istražite šta je u trendu u poslednja 2 dana + hashtags_title: Heš oznake u trendu + hashtags_view_more: Pogledajte još heš oznaka u trendu + post_action: Napišite + post_step: Pozdravite svet tekstom, fotografijama, video zapisima ili anketama. + post_title: Napišite svoju prvu objavu + share_action: Podelite + share_step: Neka vaši prijatelji znaju kako da vas pronađu na Mastodon-u. + share_title: Podelite svoj Mastodon profil + sign_in_action: Prijavite se subject: Dobro došli na Mastodon title: Dobro došli, %{name}! users: diff --git a/config/locales/sr.yml b/config/locales/sr.yml index c5b42e6b9e..19b6b66dd8 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -781,13 +781,15 @@ sr: disabled: Никоме users: Пријављеним локалним корисницима registrations: + moderation_recommandation: Уверите се да имате адекватан и реактиван модераторски тим пре него што отворите регистрацију за све! preamble: Контролишите ко сме да направи налог на Вашем серверу. title: Регистрације registrations_mode: modes: - approved: Одобрење неопходно за регистрацију + approved: Неопходно је одобрење за регистрацију none: Нико не може да се региструје open: Било ко може да се региструје + warning_hint: Препоручујемо да користите „Неопходно је одобрење за регистрацију” осим ако нисте сигурни да ваш модераторски тим може благовремено да обради нежељену пошту и злонамерне регистрације. security: authorized_fetch: Захтевај аутентификацију са здружених сервера authorized_fetch_hint: Захтевање аутентификације са здружених сервера омогућује строжију примену блокова и на нивоу корисника и на нивоу сервера. Међутим, ово долази по цену смањења перформанси, смањује домет ваших одговора и може довести до проблема компатибилности са неким здруженим услугама. Поред тога, ово неће спречити посвећене актере да преузимају ваше јавне објаве и налоге. @@ -984,6 +986,9 @@ sr: title: Веб-пресретач webhook: Веб-пресретач admin_mailer: + auto_close_registrations: + body: Због недостатка недавних активности модератора, регистрације на %{instance} су аутоматски пребачене на захтевање ручног прегледа, како би се спречило да се %{instance} користи као платформа за потенцијалне лоше актере. Можете их вратити на отворене регистрације у било ком тренутку. + subject: Регистрације за %{instance} су аутоматски пребачене на захтевање одобрења new_appeal: actions: delete_statuses: обрисати објаве корисника @@ -1869,9 +1874,42 @@ sr: silence: Налог ограничен suspend: Налог суспендован welcome: - edit_profile_action: Подеси налог - edit_profile_step: Можете прилагодити свој профил тако што ћете поставити профилну слику, променити име за приказ и тако даље. Можете дати сагласност да прегледате нове пратиоце пре него што им дозволите да Вас запрате. + apps_android_action: Набавите на Google Play + apps_ios_action: Преузмите са App Store + apps_step: Преузмите наше званичне апликације. + apps_title: Mastodon апликације + checklist_subtitle: 'Започнимо на овој новој друштвеној граници:' + checklist_title: Кораци добродошлице + edit_profile_action: Персонализујте + edit_profile_step: Повећајте своје интеракције тако што ћете имати свеобухватан профил. + edit_profile_title: Персонализујте свој профил explanation: Ево неколико савета за почетак + feature_action: Сазнајте више + feature_audience: Mastodon вам пружа јединствену могућност управљања својом публиком без посредника. Mastodon распоређен на вашој сопственој инфраструктури вам омогућује да пратите и будете праћени са било ког другог Mastodon сервера на мрежи и није ни под чијом контролом осим ваше. + feature_audience_title: Изградите своју публику у поверењу + feature_control: Ви најбоље знате шта желите да видите на својој поетној страници. Нема алгоритама или реклама да троше ваше време. Пратите било кога на било ком Mastodon серверу са једног налога и примајте њихове објаве хронолошким редоследом и учините свој кутак интернета мало сличнијим вама. + feature_control_title: Држите контролу над сопственом временском линијом + feature_creativity: Mastodon подржава аудио, видео и сликовне објаве, описе приступачности, анкете, упозорења о садржају, анимиране аватаре, прилагођене емоџије, контролу исецања сличица и још много тога, како би вам помогао да се изразите на мрежи. Било да објављујете своју уметност, музику или подкаст, Mastodon је ту за вас. + feature_creativity_title: Креативност без премца + feature_moderation: Mastodon враћа доношење одлука у ваше руке. Сваки сервер креира сопствена правила и прописе, који се примењују локално, а не одозго према доле као корпоративни друштвени медији, што га чини најфлексибилнијим у одговарању на потребе различитих група људи. Придружите се серверу са правилима са којима се слажете или хостујте своја. + feature_moderation_title: Модерација онаква каква би требало да буде + follow_action: Пратите + follow_step: Праћење занимљивих људи је оно о чему се ради у Mastodon-у. + follow_title: Персонализујте своју почетну страницу + follows_subtitle: Пратите добро познате налоге + follows_title: Кога пратити + follows_view_more: Погледајте још људи за праћење + hashtags_recent_count: "%{people} људи у прошлих %{days} дана" + hashtags_subtitle: Истражите шта је у тренду у последња 2 дана + hashtags_title: Хеш ознаке у тренду + hashtags_view_more: Погледајте још хеш ознака у тренду + post_action: Напишите + post_step: Поздравите свет текстом, фотографијама, видео записима или анкетама. + post_title: Напишите своју прву објаву + share_action: Поделите + share_step: Нека ваши пријатељи знају како да вас пронађу на Mastodon-у. + share_title: Поделите свој Mastodon профил + sign_in_action: Пријавите се subject: Добро дошли на Mastodon title: Добро дошли, %{name}! users: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 108c17fc9f..a40808eed6 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -612,6 +612,7 @@ sv: created_at: Anmäld delete_and_resolve: Ta bort inlägg forwarded: Vidarebefordrad + forwarded_replies_explanation: Den här rapporten är från en annans instans användare och handlar om annans instans inlägg. Det har vidarebefordrats till dig eftersom det rapporterade innehållet är som svar till en av dina användare. forwarded_to: Vidarebefordrad till %{domain} mark_as_resolved: Markera som löst mark_as_sensitive: Markera som känslig @@ -766,6 +767,7 @@ sv: disabled: För ingen users: För inloggade lokala användare registrations: + moderation_recommandation: Se till att du har ett tillräckligt och reaktivt modereringsteam innan du öppnar registreringar till alla! preamble: Kontrollera vem som kan skapa ett konto på din server. title: Registreringar registrations_mode: @@ -773,6 +775,7 @@ sv: approved: Godkännande krävs för registrering none: Ingen kan registrera open: Alla kan registrera + warning_hint: Vi rekommenderar att du använder “Godkännande krävs för registrering” om du inte är säker på att ditt moderatorsteam kan hantera skräppost och skadliga registreringar i tid. security: authorized_fetch: Kräv autentisering från federerade servrar authorized_fetch_hint: Att kräva autentisering från federerade servrar möjliggör striktare tillämpning av både blockering på användarnivå och servernivå. Detta sker dock på bekostnad av prestanda, minskar räckvidden på dina svar, och kan införa kompatibilitet problem med vissa federerade tjänster. Dessutom kommer detta inte att hindra dedikerade aktörer från att hämta dina offentliga inlägg och konton. @@ -965,6 +968,9 @@ sv: title: Webhooks webhook: Webhook admin_mailer: + auto_close_registrations: + body: På grund av brist på moderatoraktivitet har registreringar på %{instance} automatiskt bytts till att kräva manuell granskning, för att förhindra att %{instance} används som plattform för potentiella dåliga aktörer. Du kan när som helst byta tillbaka den till öppna registreringar. + subject: Registreringar för %{instance} har automatiskt bytts till att kräva godkännande new_appeal: actions: delete_statuses: att radera deras inlägg @@ -1792,7 +1798,10 @@ sv: subject: Ditt arkiv är klart för nedladdning title: Arkivuttagning failed_2fa: + details: 'Här är detaljerna för inloggningsförsöket:' + explanation: Någon har försökt att logga in på ditt konto men tillhandahållit en ogiltig andra autentiseringsfaktor. further_actions_html: Om detta inte var du, rekommenderar vi att du %{action} omedelbart eftersom ditt konto kan ha äventyrats. + subject: Andra faktorns autentiseringsfel title: Misslyckad tvåfaktorsautentisering suspicious_sign_in: change_password: Ändra ditt lösenord @@ -1833,9 +1842,42 @@ sv: silence: Kontot begränsat suspend: Konto avstängt welcome: - edit_profile_action: Profilinställning - edit_profile_step: Du kan anpassa din profil genom att ladda upp en profilbild, ändra ditt visningsnamn med mera. Du kan välja att granska nya följare innan de får följa dig. + apps_android_action: Ladda ned på Google Play + apps_ios_action: Ladda ner på App Store + apps_step: Ladda ner våra officiella appar. + apps_title: Mastodon-appar + checklist_subtitle: 'Låt oss komma igång med denna nya sociala upplevelse:' + checklist_title: Välkomstchecklista + edit_profile_action: Gör mer personlig + edit_profile_step: Öka din interaktion genom att ha en omfattande profil. + edit_profile_title: Anpassa din profil explanation: Här är några tips för att komma igång + feature_action: Lär dig mer + feature_audience: Mastodon ger dig en unik möjlighet att hantera din publik utan mellanhänder. Mastodon distribueras på din egen infrastruktur gör att du kan följa och följas från någon annan Mastodon-server online och är under ingen kontroll men din. + feature_audience_title: Skapa förtroende hos din publik + feature_control: Du vet bäst vad du vill se i ditt hemflöde. Inga algoritmer eller annonser som slösar din tid. Följ vem som helst på vilken Mastodon-server som helst från ett enda konto, få deras inlägg i kronologisk ordning och gör ditt hörn av internet lite mer du. + feature_control_title: Håll kontroll över din egen tidslinje + feature_creativity: Mastodon stöder ljud-, video- och bildinlägg, tillgänglighetsbeskrivningar, omröstningar, innehållsvarningar, animerade avatarer, anpassade emojis, miniatyrbildskontroll och mer, för att hjälpa dig att uttrycka dig själv online. Oavsett om du publicerar din konst, din musik eller din podcast finns Mastodon där för dig. + feature_creativity_title: Oöverträffad kreativitet + feature_moderation: Mastodon lägger tillbaka beslutsfattandet i dina händer. Varje server skapar sina egna regler och förordningar som tillämpas lokalt istället för toppstyrt som i företagens sociala medier vilket gör det maximalt flexibelt i att tillgodose behoven hos olika grupper av människor. Gå med i en server med de regler du samtycker till eller var värd för din egen. + feature_moderation_title: Moderering som det borde vara + follow_action: Följ + follow_step: Att följa intressanta människor är vad Mastodon handlar om. + follow_title: Anpassa ditt hemflöde + follows_subtitle: Följ välkända konton + follows_title: Rekommenderade profiler + follows_view_more: Visa fler personer att följa + hashtags_recent_count: "%{people} personer under de senaste %{days} dagarna" + hashtags_subtitle: Utforska vad som har trendat de senaste 2 dagarna + hashtags_title: Trendande hashtaggar + hashtags_view_more: Visa fler trendande hashtaggar + post_action: Skriv + post_step: Säg hej till världen med text, foton, videor eller omröstningar. + post_title: Skapa ditt första inlägg + share_action: Dela + share_step: Låt dina vänner veta hur de hittar dig på Mastodon. + share_title: Dela din Mastodon-profil + sign_in_action: Logga in subject: Välkommen till Mastodon title: Välkommen ombord, %{name}! users: diff --git a/config/locales/th.yml b/config/locales/th.yml index b212300220..1b4ce0d6ab 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1810,9 +1810,34 @@ th: silence: จำกัดบัญชีอยู่ suspend: ระงับบัญชีอยู่ welcome: - edit_profile_action: ตั้งค่าโปรไฟล์ - edit_profile_step: คุณสามารถปรับแต่งโปรไฟล์ของคุณได้โดยอัปโหลดรูปภาพโปรไฟล์ เปลี่ยนชื่อที่แสดงของคุณ และอื่น ๆ คุณสามารถเลือกรับการตรวจทานผู้ติดตามใหม่ก่อนที่จะอนุญาตให้เขาติดตามคุณ + apps_android_action: รับแอปใน Google Play + apps_ios_action: ดาวน์โหลดใน App Store + apps_step: ดาวน์โหลดแอปอย่างเป็นทางการของเรา + apps_title: แอป Mastodon + checklist_subtitle: 'มาช่วยให้คุณเริ่มต้นใช้งานพรมแดนทางสังคมใหม่นี้กันเลย:' + checklist_title: รายการตรวจสอบยินดีต้อนรับ + edit_profile_action: ปรับแต่ง + edit_profile_step: เพิ่มการโต้ตอบของคุณโดยการมีโปรไฟล์ที่ครอบคลุม + edit_profile_title: ปรับแต่งโปรไฟล์ของคุณ explanation: นี่คือเคล็ดลับบางส่วนที่จะช่วยให้คุณเริ่มต้นใช้งาน + feature_action: เรียนรู้เพิ่มเติม + follow_action: ติดตาม + follow_step: การติดตามผู้คนที่น่าสนใจคือสิ่งที่ Mastodon ให้ความสำคัญ + follow_title: ปรับแต่งฟีดหน้าแรกของคุณ + follows_subtitle: ติดตามบัญชีที่มีชื่อเสียง + follows_title: ติดตามใครดี + follows_view_more: ดูผู้คนที่จะติดตามเพิ่มเติม + hashtags_recent_count: "%{people} คนใน %{days} วันที่ผ่านมา" + hashtags_subtitle: สำรวจสิ่งที่กำลังนิยมตั้งแต่ 2 วันที่ผ่านมา + hashtags_title: แฮชแท็กที่กำลังนิยม + hashtags_view_more: ดูแฮชแท็กที่กำลังนิยมเพิ่มเติม + post_action: เขียน + post_step: กล่าวสวัสดีชาวโลกด้วยข้อความ, รูปภาพ, วิดีโอ หรือการสำรวจความคิดเห็น + post_title: สร้างโพสต์แรกของคุณ + share_action: แชร์ + share_step: แจ้งให้เพื่อน ๆ ของคุณทราบวิธีค้นหาคุณใน Mastodon + share_title: แชร์โปรไฟล์ Mastodon ของคุณ + sign_in_action: ลงชื่อเข้า subject: ยินดีต้อนรับสู่ Mastodon title: ยินดีต้อนรับ %{name}! users: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 3732e53ab9..58436690ca 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1842,9 +1842,42 @@ tr: silence: Hesap sınırlandırıldı suspend: Hesap askıya alındı welcome: - edit_profile_action: Profil kurulumu - edit_profile_step: Bir profil resmi yükleyerek, ekran adınızı değiştirerek ve daha fazlasını yaparak profilinizi kişiselleştirebilirsiniz. Sizi takip etmelerine izin verilmeden önce yeni takipçileri incelemeyi tercih edebilirsiniz. + apps_android_action: Google Play'den edinin + apps_ios_action: App Store'dan İndirin + apps_step: Resmi uygulamalarımızı indirin. + apps_title: Mastodon uygulamaları + checklist_subtitle: 'Bu yeni sosyal sınırda başlamanızı sağlar:' + checklist_title: Hoşgeldiniz Yapılacaklar Listesi + edit_profile_action: Kişiselleştir + edit_profile_step: Kapsamlı bir profille etkileşimlerinizi arttırın. + edit_profile_title: Profilinizi kişiselleştirin explanation: İşte sana başlangıç için birkaç ipucu + feature_action: Daha fazlası + feature_audience: Mastodon, hedef kitlenizi aracılar olmadan yönetmeniz için size eşsiz bir olanak sağlar. Kendi altyapınızda barındırdığınız Mastodon sunucusu, çevrimiçi olarak başka bir Mastodon sunucusundan takip etmenizi ve takip edilmenizi sağlar ve sizden başka kimsenin kontrolü altında değildir. + feature_audience_title: Kitlenizi güvenle oluşturun + feature_control: Ana akışınızda ne görmek istediğinizi en iyi siz biliyorsunuz. Algoritma veya zamanınızı harcayan reklamlar yok. Tek bir hesapla herhangi bir Mastodon sunucusunda olan bir kimseyi takip edin ve gönderilere zamana göre sıralanmış şekilde erişin. Kendi internet köşenizi biraz daha kendinize benzetin. + feature_control_title: Zaman akışınızın denetimi sizde kalsın + feature_creativity: Mastodon kendinizi çevrimiçi ifade edebilmenize yardımcı olmak için ses, video ve görsel, erişilebilirlik açıklamaları, anketler, içerik uyarıları, hareketli avatarlar, özel emojiler, önizleme resmini kesme denetimi ve daha fazlasını destekliyor. Kendi sanatınızı, müziğinizi veya podcastinizi yayınlıyorsanız Mastodon kullanımınıza açık. + feature_creativity_title: Benzersiz yaratıcılık + feature_moderation: Mastodon karar vermeyi yeniden size bırakıyor. Her sunucu kendi kurallarını ve düzenlemelerini oluşturur. Bu kurallar da kurumsal sosyal medyalar gibi tepeden değil, yerel olarak uygulanıyor; bu da Mastodon'u farklı insan gruplarının ihtiyaçlarına yanıt vermede esnek kılıyor. Kurallarına katıldığınız bir sunucuya katılın veya kendi sunucunuzu barındırın. + feature_moderation_title: Olması gerektiği gibi moderasyon + follow_action: Takip et + follow_step: Kendi akışınızı düzenliyorsunuz. Hadi onu ilginç kullanıcılarla dolduralım. + follow_title: Anasayfa akışınızı kişiselleştirin + follows_subtitle: Tanınmış hesapları takip edin + follows_title: Takip edebileceklerin + follows_view_more: Takip edecek daha fazla kişi görüntüleyin + hashtags_recent_count: "%{days} günde %{people} kişi" + hashtags_subtitle: Son 2 günde öne çıkanları keşfedin + hashtags_title: Öne çıkan etiketler + hashtags_view_more: Daha fazla öne çıkan etiket görüntüleyin + post_action: Oluştur + post_step: Dünyaya metin, fotoğraf, video ve anketlerle merhaba deyin. + post_title: İlk gönderinizi oluşturun + share_action: Paylaş + share_step: Arkadaşlarınıza Mastodon'da size nasıl ulaşabileceklerini söyleyin. + share_title: Mastodon profilinizi paylaşın + sign_in_action: Oturum aç subject: Mastodon'a hoş geldiniz title: Gemiye hoşgeldin, %{name}! users: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 231f0028fd..eb3ca2a4ae 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1906,9 +1906,13 @@ uk: silence: Ообліковий запис обмежено suspend: Обліковий запис призупинено welcome: - edit_profile_action: Налаштувати профіль - edit_profile_step: Ви можете налаштувати свій профіль, завантаживши зображення профілю, змінивши відображуване ім'я та інше. Ви можете включити для перегляду нових підписників до того, як вони матимуть змогу підписатися на вас. + apps_android_action: Завантажити з Google Play + apps_ios_action: Завантажити з App Store + apps_step: Завантажити наші офіційні застосунки. + apps_title: Застосунки Mastodon explanation: Ось кілька порад для початку + feature_action: Докладніше + sign_in_action: Увійти subject: Ласкаво просимо до Mastodon title: Ласкаво просимо, %{name}! users: diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 2afb6aa4c1..3ceaad92ef 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -753,6 +753,7 @@ vi: disabled: Không ai users: Để đăng nhập người cục bộ registrations: + moderation_recommandation: Vui lòng đảm bảo rằng bạn có một đội ngũ kiểm duyệt và phản ứng nhanh trước khi mở đăng ký cho mọi người! preamble: Kiểm soát những ai có thể tạo tài khoản trên máy chủ của bạn. title: Đăng ký registrations_mode: @@ -760,6 +761,7 @@ vi: approved: Yêu cầu phê duyệt để đăng ký none: Không ai có thể đăng ký open: Bất cứ ai cũng có thể đăng ký + warning_hint: Chúng tôi khuyên bạn nên sử dụng "Duyệt đăng ký thủ công" trừ khi bạn tin tưởng đội ngũ kiểm duyệt của mình có thể xử lý kịp thời các đăng ký spam và độc hại. security: authorized_fetch: Yêu cầu xác thực từ các máy chủ liên hợp authorized_fetch_hint: Yêu cầu xác thực từ các máy chủ liên hợp cho phép thực thi chặt chẽ hơn việc chặn cấp độ người dùng và cấp độ máy chủ. Tuy nhiên, điều này phải trả giá bằng một hình phạt về hiệu suất, làm giảm phạm vi tiếp cận của các lượt trả lời của bạn và có thể gây ra các vấn đề về khả năng tương thích với một số dịch vụ được liên hợp. Ngoài ra, điều này sẽ không ngăn cản các tác nhân chuyên dụng tìm nạp các tút và tài khoản công khai của bạn. @@ -1808,9 +1810,42 @@ vi: silence: Tài khoản bị hạn chế suspend: Tài khoản bị vô hiệu hóa welcome: - edit_profile_action: Cài đặt trang hồ sơ - edit_profile_step: Bạn có thể chỉnh sửa trang hồ sơ của mình bằng cách tải lên ảnh đại diện, ảnh bìa, đổi biệt danh và hơn thế nữa. Bạn cũng có thể tự phê duyệt những người theo dõi mới. + apps_android_action: Tải trên Google Play + apps_ios_action: Tải trên App Store + apps_step: Tải ứng dụng chính thức. + apps_title: Ứng dụng Mastodon + checklist_subtitle: 'Hãy bắt đầu trên mạng xã hội mới này:' + checklist_title: Danh sách việc cần làm + edit_profile_action: Cá nhân hoá + edit_profile_step: Tạo sự tương tác bằng một hồ sơ hoàn chỉnh. + edit_profile_title: Tùy biến hồ sơ explanation: Dưới đây là một số mẹo để giúp bạn bắt đầu + feature_action: Tìm hiểu + feature_audience: Mastodon cung cấp cho bạn khả năng độc đáo để quản lý người theo dõi của bạn mà không cần bên trung gian. Mastodon có thể triển khai trên cơ sở hạ tầng của riêng bạn, cho phép bạn theo dõi và được theo dõi từ bất kỳ máy chủ Mastodon nào khác và không nằm dưới sự kiểm soát của ai ngoài bạn. + feature_audience_title: Tạo cộng đồng của riêng bạn + feature_control: Bạn biết rõ nhất những gì bạn muốn xem trên bảng tin. Không có thuật toán hoặc quảng cáo để lãng phí thời gian của bạn. Theo dõi bất kỳ ai trên bất kỳ máy chủ Mastodon nào từ một tài khoản và nhận các tút của họ theo thứ tự thời gian — làm cho góc internet của bạn là của bạn. + feature_control_title: Kiểm soát bảng tin của bạn + feature_creativity: Mastodon hỗ trợ đăng âm thanh, video, hình ảnh, mô tả trợ năng, thăm dò ý kiến, cảnh báo nội dung, hình đại diện Gif, emoji tùy chỉnh, kiểm soát cắt hình thu nhỏ... để giúp bạn thể hiện cá tính. Cho dù bạn đang xuất bản tác phẩm nghệ thuật, âm nhạc hay podcast của mình, Mastodon luôn hợp cho bạn. + feature_creativity_title: Sáng tạo không giới hạn + feature_moderation: Mastodon giành quyền tự quyết về tay bạn. Mỗi máy chủ tạo ra các nội quy của riêng họ, được thực thi nội bộ chứ không phải từ trên xuống như dịch vụ mạng xã hội của Big Tech, giúp linh hoạt trong việc đáp ứng nhu cầu của các nhóm người dùng khác nhau. Tham gia một máy chủ với các quy tắc bạn đồng ý hoặc tự chạy máy chủ của riêng bạn. + feature_moderation_title: Kiểm duyệt đúng nghĩa + follow_action: Theo dõi + follow_step: Theo dõi những người thú vị trên Mastodon. + follow_title: Cá nhân hóa bảng tin của bạn + follows_subtitle: Theo dõi những người thú vị + follows_title: Gợi ý theo dõi + follows_view_more: Xem thêm những người khác + hashtags_recent_count: "%{people} người dùng trong %{days} ngày qua" + hashtags_subtitle: Khám phá xu hướng 2 ngày qua + hashtags_title: Hashtag xu hướng + hashtags_view_more: Xem thêm hashtag xu hướng + post_action: Soạn tút + post_step: Chào cộng đồng bằng lời nói, ảnh hoặc video. + post_title: Đăng tút đầu tiên + share_action: Chia sẻ + share_step: Hãy để bạn bè của bạn biết cách tìm thấy bạn trên Mastodon. + share_title: Chia sẻ hồ sơ Mastodon của bạn + sign_in_action: Đăng nhập subject: Chào mừng đến với Mastodon title: Xin chào %{name}! users: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 93c741915d..6296a4bb7c 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1810,9 +1810,42 @@ zh-CN: silence: 账户被隐藏 suspend: 账号被封禁 welcome: - edit_profile_action: 设置个人资料 - edit_profile_step: 您可以通过上传个人资料图片、更改您的昵称等来自定义您的个人资料。 您可以选择在新关注者关注您之前对其进行审核。 + apps_android_action: 从 Google Play 下载 + apps_ios_action: 从 App Store 下载 + apps_step: 下载我们的官方应用。 + apps_title: Mastodon应用 + checklist_subtitle: 让我们带您开启这片社交新天地: + checklist_title: 欢迎清单 + edit_profile_action: 个性化 + edit_profile_step: 完善个人资料,提升您的互动体验。 + edit_profile_title: 个性化您的个人资料 explanation: 下面是几个小贴士,希望它们能帮到你 + feature_action: 了解更多 + feature_audience: Mastodon为您提供了无需中间商即可管理受众的独特可能。Mastodon可被部署在您自己的基础设施上,允许您关注其它任何Mastodon在线服务器的用户,或被任何其他在线 Mastodon 服务器的用户关注,并且不受您之外的任何人控制。 + feature_audience_title: 放手去建立起您的受众 + feature_control: 您最清楚您想在你自己的主页中看到什么动态。没有算法或广告浪费您的时间。您可以用一个账号关注任何 Mastodon 服务器上的任何人,并按时间顺序获得他们发布的嘟文,让您的互联网的角落更合自己的心意。 + feature_control_title: 掌控自己的时间线 + feature_creativity: Mastodon支持音频、视频和图片、无障碍描述、投票、内容警告, 动画头像、自定义表情包、缩略图裁剪控制等功能,帮助您在网上尽情表达自己。无论您是要发布您的艺术作品、音乐还是播客,Mastodon 都能为您服务。 + feature_creativity_title: 无与伦比的创造力 + feature_moderation: Mastodon将决策权交还给您。每个服务器都会创建自己的规则和条例,并在站点内施行,而不是像企业社交媒体那样居高临下,这使得它可以最灵活地响应不同人群的需求。加入一个您认同其规则的服务器,或托管您自己的服务器。 + feature_moderation_title: 管理,本应如此 + follow_action: 关注 + follow_step: 关注有趣的人,这就是Mastodon的意义所在。 + follow_title: 个性化您的首页动态 + follows_subtitle: 关注知名账户 + follows_title: 推荐关注 + follows_view_more: 查看更多可关注的人 + hashtags_recent_count: 在过去的 %{days} 天中有 %{people} 人 + hashtags_subtitle: 探索过去2天以来的热门内容 + hashtags_title: 热门话题标签 + hashtags_view_more: 查看更多热门话题标签 + post_action: 撰写 + post_step: 向世界打个招呼吧。 + post_title: 发布您的第一条嘟文 + share_action: 分享 + share_step: 让您的朋友知道如何在Mastodon找到你。 + share_title: 分享您的Mastodon个人资料 + sign_in_action: 登录 subject: 欢迎来到 Mastodon title: "%{name},欢迎你的加入!" users: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 62649864c7..0d3e109b19 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1805,8 +1805,6 @@ zh-HK: silence: 賬戶已被限制 suspend: 帳號已停用 welcome: - edit_profile_action: 設定個人資料 - edit_profile_step: 你可以透過上傳頭像、更改顯示名稱等來自訂個人檔案。你可以選擇讓新使用者追蹤你之前先審查他們。 explanation: 下面是幾個小貼士,希望它們能幫到你 subject: 歡迎來到 Mastodon (萬象) title: 歡迎 %{name} 加入! diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index f50f685bb4..d8952edec9 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -148,8 +148,8 @@ zh-TW: subscribe: 訂閱 suspend: 停權 suspended: 已停權 - suspension_irreversible: 已永久刪除此帳號的資料。您可以取消這個帳號的停權狀態,但無法還原已刪除的資料。 - suspension_reversible_hint_html: 這個帳號已被暫停,所有數據將於 %{date} 被刪除。於此之前,您可以完全回復您的帳號。如果您想即時刪除這個帳號的數據,您能於下面進行操作。 + suspension_irreversible: 已永久刪除此帳號的資料。您可以取消這個帳號之停權狀態,但無法還原已刪除的資料。 + suspension_reversible_hint_html: 這個帳號已被停權,所有資料將於 %{date} 被刪除。於此之前,您可以完全回復您的帳號。如果您想即時刪除這個帳號的資料,您能於下面進行操作。 title: 帳號 unblock_email: 解除封鎖電子郵件地址 unblocked_email_msg: 成功解除封鎖 %{username} 的電子郵件地址 @@ -176,7 +176,7 @@ zh-TW: create_account_warning: 新增警告 create_announcement: 新增公告 create_canonical_email_block: 新增 E-mail 封鎖 - create_custom_emoji: 新增自訂顏文字 + create_custom_emoji: 新增自訂 emoji 表情符號 create_domain_allow: 新增允許網域 create_domain_block: 新增網域封鎖 create_email_domain_block: 新增電子郵件網域封鎖 @@ -186,7 +186,7 @@ zh-TW: demote_user: 將用戶降級 destroy_announcement: 刪除公告 destroy_canonical_email_block: 刪除 E-mail 封鎖 - destroy_custom_emoji: 刪除自訂顏文字 + destroy_custom_emoji: 刪除自訂 emoji 表情符號 destroy_domain_allow: 刪除允許網域 destroy_domain_block: 刪除網域封鎖 destroy_email_domain_block: 刪除電子郵件網域封鎖 @@ -196,10 +196,10 @@ zh-TW: destroy_unavailable_domain: 刪除無法存取的網域 destroy_user_role: 移除角色 disable_2fa_user: 停用兩階段驗證 - disable_custom_emoji: 停用自訂顏文字 + disable_custom_emoji: 停用自訂 emoji 表情符號 disable_sign_in_token_auth_user: 停用使用者電子郵件 token 驗證 disable_user: 停用帳號 - enable_custom_emoji: 啓用自訂顏文字 + enable_custom_emoji: 啟用自訂 emoji 表情符號 enable_sign_in_token_auth_user: 啟用使用者電子郵件 token 驗證 enable_user: 啓用帳號 memorialize_account: 設定成追悼帳號 @@ -218,9 +218,9 @@ zh-TW: unblock_email_account: 解除封鎖電子郵件地址 unsensitive_account: 取消將媒體強制標記為敏感內容 unsilence_account: 取消帳號的靜音狀態 - unsuspend_account: 取消帳號的暫停狀態 + unsuspend_account: 取消帳號之停權狀態 update_announcement: 更新公告 - update_custom_emoji: 更新自訂顏文字 + update_custom_emoji: 更新自訂 emoji 表情符號 update_domain_block: 更新網域封鎖 update_ip_block: 更新 IP 規則 update_status: 更新狀態 @@ -235,7 +235,7 @@ zh-TW: create_account_warning_html: "%{name} 已對 %{target} 送出警告" create_announcement_html: "%{name} 已新增公告 %{target}" create_canonical_email_block_html: "%{name} 已封鎖 hash 為 %{target} 的 e-mail" - create_custom_emoji_html: "%{name} 已上傳新自訂表情符號 %{target}" + create_custom_emoji_html: "%{name} 已上傳新自訂 emoji 表情符號 %{target}" create_domain_allow_html: "%{name} 允許 %{target} 網域加入聯邦宇宙" create_domain_block_html: "%{name} 已封鎖網域 %{target}" create_email_domain_block_html: "%{name} 已封鎖電子郵件網域 %{target}" @@ -245,7 +245,7 @@ zh-TW: demote_user_html: "%{name} 將使用者 %{target} 降級" destroy_announcement_html: "%{name} 已刪除公告 %{target}" destroy_canonical_email_block_html: "%{name} 已解除封鎖 hash 為 %{target} 的電子郵件" - destroy_custom_emoji_html: "%{name} 已刪除表情符號 %{target}" + destroy_custom_emoji_html: "%{name} 已刪除 emoji 表情符號 %{target}" destroy_domain_allow_html: "%{name} 不允許與網域 %{target} 加入聯邦宇宙" destroy_domain_block_html: "%{name} 已解除封鎖網域 %{target}" destroy_email_domain_block_html: "%{name} 已解除封鎖電子郵件網域 %{target}" @@ -255,10 +255,10 @@ zh-TW: destroy_unavailable_domain_html: "%{name} 已恢復對網域 %{target} 的發送" destroy_user_role_html: "%{name} 已刪除 %{target} 角色" disable_2fa_user_html: "%{name} 已停用使用者 %{target} 的兩階段驗證 (2FA) " - disable_custom_emoji_html: "%{name} 已停用自訂表情符號 %{target}" + disable_custom_emoji_html: "%{name} 已停用自訂 emoji 表情符號 %{target}" disable_sign_in_token_auth_user_html: "%{name} 已停用 %{target} 之使用者電子郵件 token 驗證" disable_user_html: "%{name} 將使用者 %{target} 設定為禁止登入" - enable_custom_emoji_html: "%{name} 已啟用自訂表情符號 %{target}" + enable_custom_emoji_html: "%{name} 已啟用自訂 emoji 表情符號 %{target}" enable_sign_in_token_auth_user_html: "%{name} 已啟用 %{target} 之使用者電子郵件 token 驗證" enable_user_html: "%{name} 將使用者 %{target} 設定為允許登入" memorialize_account_html: "%{name} 將 %{target} 設定為追悼帳號" @@ -279,7 +279,7 @@ zh-TW: unsilence_account_html: "%{name} 已取消使用者 %{target} 的靜音狀態" unsuspend_account_html: "%{name} 已取消停權 %{target} 的帳號" update_announcement_html: "%{name} 已更新公告 %{target}" - update_custom_emoji_html: "%{name} 已更新自訂表情符號 %{target}" + update_custom_emoji_html: "%{name} 已更新自訂 emoji 表情符號 %{target}" update_domain_block_html: "%{name} 已更新 %{target} 之網域封鎖" update_ip_block_html: "%{name} 已變更 IP %{target} 之規則" update_status_html: "%{name} 已更新 %{target} 的嘟文" @@ -309,37 +309,37 @@ zh-TW: critical_update_pending: 重要更新待升級 custom_emojis: assign_category: 指定分類 - by_domain: 站點 + by_domain: 伺服器 copied_msg: 成功建立 emoji 表情符號之本地備份 copy: 複製 - copy_failed_msg: 無法將表情複製到本地 + copy_failed_msg: 無法將該 emoji 表情符號複製至本地 create_new_category: 建立新分類 - created_msg: 已新增表情符號! + created_msg: 已新增 emoji 表情符號! delete: 刪除 - destroyed_msg: 已刪除表情符號! + destroyed_msg: 已刪除 emoji 表情符號! disable: 停用 disabled: 已停用 - disabled_msg: 已停用該表情符號 - emoji: 表情符號 + disabled_msg: 已停用該 emoji 表情符號 + emoji: emoji 表情符號 enable: 啟用 enabled: 已啟用 - enabled_msg: 已啟用該表情符號 + enabled_msg: 已啟用該 emoji 表情符號 image_hint: 檔案大小最大至 %{size} 之 PNG 或 GIF list: 列表 listed: 已顯示 new: - title: 加入新的自訂表情符號 - no_emoji_selected: 未選取任何 emoji,所以什麼事都沒發生 + title: 新增自訂 emoji 表情符號 + no_emoji_selected: 未選取任何 emoji 表情符號,所以什麼事都沒發生 not_permitted: 您無權執行此操作 overwrite: 覆蓋 - shortcode: 短代碼 - shortcode_hint: 至少 2 個字元,只能使用字母、數字與下劃線 - title: 自訂表情符號 + shortcode: 短碼 + shortcode_hint: 至少 2 個字元,只能使用字母、數字與底線 + title: 自訂 emoji 表情符號 uncategorized: 未分類 unlist: 不公開 unlisted: 已隱藏 - update_failed_msg: 無法更新表情符號 - updated_msg: 已更新表情符號! + update_failed_msg: 無法更新該 emoji 表情符號 + updated_msg: 已更新 emoji 表情符號! upload: 上傳新的表情符號 dashboard: active_users: 活躍使用者 @@ -640,7 +640,7 @@ zh-TW: suspend_html: 停權 @%{acct},將他們的個人檔案與內容標記為無法存取及無法與之互動 close_report: '將檢舉報告 #%{id} 標記為已處理' close_reports_html: 將 所有 對於 @%{acct} 之檢舉報告標記為已處理 - delete_data_html: 於即日起 30 天後刪除 @%{acct}之個人檔案與內容,除非他們於期限前被解除暫停 + delete_data_html: 於即日起 30 天後刪除 @%{acct}之個人檔案與內容,除非他們於期限前被解除停權 preview_preamble_html: "@%{acct} 將收到關於以下內容之警告:" record_strike_html: 紀錄關於 @%{acct}之警示有助於您升級對此帳號未來違規處理 send_email_html: 寄一封警告 e-mail 給 @%{acct} @@ -682,8 +682,8 @@ zh-TW: manage_appeals_description: 允許使用者審閱針對站務動作之申訴 manage_blocks: 管理封鎖 manage_blocks_description: 允許使用者封鎖電子郵件提供者與 IP 位置 - manage_custom_emojis: 管理自訂表情符號 - manage_custom_emojis_description: 允許使用者管理伺服器上的自訂表情符號 + manage_custom_emojis: 管理自訂 emoji 表情符號 + manage_custom_emojis_description: 允許使用者管理伺服器上之自訂 emoji 表情符號 manage_federation: 管理聯邦宇宙 manage_federation_description: 允許使用者封鎖或允許與其他網域的聯邦宇宙,並控制傳遞能力 manage_invites: 管理邀請 @@ -714,7 +714,7 @@ zh-TW: rules: add_new: 新增規則 delete: 刪除 - description_html: 雖然大多數人皆宣稱已閱讀並同意服務條款,通常直到某些問題發生時人們從未讀過。以透過提供條列式規則的方式讓您的伺服器規則可以一目了然。試著維持各項條款簡短而明瞭,但也試著不要將條款切割為許多分開的項目。 + description_html: 雖然大多數人皆宣稱已閱讀並同意服務條款,通常直到某些問題發生時人們從未讀過。以透過提供條列式規則的方式使您的伺服器規則可以一目了然。試著維持各項條款簡短而明瞭,但也試著不要將條款切割為許多分開的項目。 edit: 編輯規則 empty: 未曾定義任何伺服器規則 title: 伺服器規則 @@ -935,7 +935,7 @@ zh-TW: webhooks: add_new: 新增端點 delete: 刪除 - description_html: "Webhook 讓 Mastodon 可以將關於選定的事件的即時通知推送到您自己的應用程式,如此您的應用程式就可以自動觸發反應。" + description_html: "Webhook 使 Mastodon 可以將關於選定的事件的即時通知推送到您自己的應用程式,如此您的應用程式就可以自動觸發反應。" disable: 停用 disabled: 已停用 edit: 編輯端點 @@ -990,15 +990,15 @@ zh-TW: title: 熱門主題標籤 subject: "%{instance} 有待審核之新熱門" aliases: - add_new: 建立別名 - created_msg: 成功建立別名。您可以自舊帳號開始轉移。 + add_new: 新增別名 + created_msg: 成功新增別名。您可以自舊帳號開始轉移。 deleted_msg: 成功移除別名。您將無法再由舊帳號轉移至目前的帳號。 empty: 您目前沒有任何別名。 hint_html: 如果想由其他帳號轉移至此帳號,您能於此處新增別名,稍後系統將容許您將跟隨者由舊帳號轉移至此。此項作業是無害且可復原的帳號的遷移程序需要於舊帳號啟動。 remove: 取消連結別名 appearance: advanced_web_interface: 進階網頁介面 - advanced_web_interface_hint: 進階網頁介面可讓您設定許多不同的欄位來善用螢幕空間,依需要同時查看許多不同的資訊如:首頁、通知、聯邦宇宙時間軸、任意數量的列表與主題標籤。 + advanced_web_interface_hint: 進階網頁介面能使您設定許多不同的欄位來善用螢幕空間,依需要同時查看許多不同的資訊如:首頁、通知、聯邦宇宙時間軸、任意數量的列表與主題標籤。 animations_and_accessibility: 動畫與無障礙設定 confirmation_dialogs: 確認對話框 discovery: 探索 @@ -1016,7 +1016,7 @@ zh-TW: view_profile: 檢視個人檔案 view_status: 檢視嘟文 applications: - created: 已建立應用程式 + created: 已新增應用程式 destroyed: 已刪除應用程式 logout: 登出 regenerate_token: 重新產生存取 token @@ -1091,7 +1091,7 @@ zh-TW: title: 登入 %{domain} sign_up: manual_review: "%{domain} 上的註冊由我們的管理員進行人工審核。為協助我們處理您的註冊,請寫一些關於您自己的資訊以及您欲於 %{domain} 上註冊帳號之原因。" - preamble: 於此 Mastodon 伺服器擁有帳號的話,您將能跟隨聯邦宇宙網路中任何一份子,無論他們的帳號託管於何處。 + preamble: 若於此 Mastodon 伺服器擁有帳號,您將能跟隨聯邦宇宙網路中任何一份子,無論他們的帳號託管於何處。 title: 讓我們一起設定 %{domain} 吧! status: account_status: 帳號狀態 @@ -1349,20 +1349,20 @@ zh-TW: '604800': 1 週後 '86400': 1 天後 expires_in_prompt: 永不過期 - generate: 建立邀請連結 + generate: 產生邀請連結 invalid: 此邀請是無效的 invited_by: 您的邀請人是: max_uses: other: "%{count} 則" max_uses_prompt: 無限制 - prompt: 建立分享連結,邀請他人於本伺服器註冊 + prompt: 產生分享連結,邀請他人於本伺服器註冊 table: expires_at: 失效時間 uses: 已使用次數 title: 邀請使用者 lists: errors: - limit: 您所建立的列表數量已達上限 + limit: 您所建立之列表數量已達上限 login_activities: authentication_methods: otp: 兩階段驗證應用程式 @@ -1407,7 +1407,7 @@ zh-TW: on_cooldown: 您正在處於冷卻(CD)狀態 followers_count: 轉移時的跟隨者 incoming_migrations: 自另一個帳號轉移 - incoming_migrations_html: 要從其他帳號移動到此帳號的話,首先您必須建立帳號別名。 + incoming_migrations_html: 若欲自其他帳號移動至此帳號,首先您必須新增帳號別名。 moved_msg: 您的帳號正被重新導向到 %{acct},您的跟隨者也會同步轉移至該帳號。 not_redirecting: 您的帳號目前尚未重新導向到任何其他帳號。 on_cooldown: 您最近已轉移過您的帳號。此功能將於 %{count} 天後可再度使用。 @@ -1512,11 +1512,11 @@ zh-TW: posting_defaults: 嘟文預設值 public_timelines: 公開時間軸 privacy: - hint_html: "自訂您希望如何讓您的個人檔案及嘟文被發現。藉由啟用一系列 Mastodon 功能以幫助您觸及更廣的受眾。煩請花些時間確認您是否欲啟用這些設定。" + hint_html: "自訂您希望如何使您的個人檔案及嘟文被發現。藉由啟用一系列 Mastodon 功能以幫助您觸及更廣的受眾。煩請花些時間確認您是否欲啟用這些設定。" privacy: 隱私權 privacy_hint_html: 控制您希望向其他人揭露之內容。人們透過瀏覽其他人的跟隨者與其發嘟之應用程式發現有趣的個人檔案與酷炫的 Mastodon 應用程式,但您能選擇將其隱藏。 reach: 觸及 - reach_hint_html: 控制您希望被新使用者探索或跟隨之方式。想讓您的嘟文出現於探索頁面嗎?想讓其他人透過他們的跟隨建議找到您嗎?想自動接受所有新跟隨者嗎?或是想逐一控制跟隨請求嗎? + reach_hint_html: 控制您希望被新使用者探索或跟隨之方式。想使您的嘟文出現於探索頁面嗎?想使其他人透過他們的跟隨建議找到您嗎?想自動接受所有新跟隨者嗎?或是想逐一控制跟隨請求嗎? search: 搜尋 search_hint_html: 控制您希望如何被發現。您想透過您的公開嘟文被人們發現嗎?您想透過網頁搜尋被 Mastodon 以外的人找到您的個人檔案嗎?請注意,公開資訊可能無法全面地被所有搜尋引擎所排除。 title: 隱私權及觸及 @@ -1525,7 +1525,7 @@ zh-TW: reactions: errors: limit_reached: 達到可回應之上限 - unrecognized_emoji: 並非一個可識別的 emoji + unrecognized_emoji: 並非可識別之 emoji 表情符號 redirects: prompt: 若您信任此連結,請點擊以繼續。 title: 您將要離開 %{instance} 。 @@ -1743,7 +1743,7 @@ zh-TW: enabled: 兩階段驗證已啟用 enabled_success: 兩階段驗證已成功啟用 generate_recovery_codes: 產生備用驗證碼 - lost_recovery_codes: 讓您能於遺失手機時,使用備用驗證碼登入。若您已遺失備用驗證碼,可於此產生一批新的,舊有的備用驗證碼將會失效。 + lost_recovery_codes: 使您能於遺失手機時,透過備用驗證碼登入。若您已遺失備用驗證碼,可於此產生一批新的,舊有的備用驗證碼將會失效。 methods: 兩階段驗證 otp: 驗證應用程式 recovery_codes: 備份備用驗證碼 @@ -1812,9 +1812,42 @@ zh-TW: silence: 帳號已被限制 suspend: 帳號己被停權 welcome: - edit_profile_action: 設定個人檔案 - edit_profile_step: 您可以設定您的個人檔案,包括上傳大頭貼、變更顯示名稱等等。您也可以選擇於新的跟隨者跟隨前,先對他們進行審核。 + apps_android_action: 於 Google Play 下載 + apps_ios_action: 於 App Store 下載 + apps_step: 下載官方應用程式。 + apps_title: Mastodon APP + checklist_subtitle: 讓我們協助您於這個嶄新的社交平台上啟程: + checklist_title: 新手任務清單 + edit_profile_action: 個人化設定 + edit_profile_step: 若您完整填寫個人檔案,其他人比較願意與您互動。 + edit_profile_title: 客製化您的個人檔案 explanation: 以下是幾個小技巧,希望它們能幫到您 + feature_action: 了解更多 + feature_audience: Mastodon 為您打開了一扇獨特的門,使您不受平台干擾,自由地管理您的受眾。只需將 Mastodon 部署於您自己的基礎設施上,您便能與線上任何 Mastodon 伺服器互動,而且控制權只在您手中。 + feature_audience_title: 自信地建立您的受眾 + feature_control: 您最清楚自己想於首頁動態看到什麼內容,別讓演算法與廣告浪費您寶貴的時間。自同一帳號跟隨任何 Mastodon 伺服器上的任何一個人,依時間順序接收他們的嘟文,建立屬於自己的網路小角落。 + feature_control_title: 掌控自己的時間軸 + feature_creativity: Mastodon 支援音訊、影片及圖片嘟文、無障礙說明文字、投票、內容警告、動畫大頭貼、自訂 emoji 表情符號、縮圖裁剪控制等等,協助您表達自我。無論是發佈藝術作品、音樂,或是 podcast,Mastodon 將隨時陪伴著您。 + feature_creativity_title: 無與倫比的創意 + feature_moderation: Mastodon 將決策權交還於您。每台伺服器皆能制定自己的規則與管理規範,並於該伺服器上實施。這與社交媒體公司由上而下的規範大不相同,因此能更有彈性地滿足不同群體的需求。您可以加入認同其規則之伺服器,或者自行架設伺服器。 + feature_moderation_title: 管理方式,如您所願 + follow_action: 跟隨 + follow_step: Mastodon 的趣味就是跟隨那些有趣的人們! + follow_title: 客製化您的首頁時間軸 + follows_subtitle: 跟隨家喻戶曉的熱門帳號 + follows_title: 推薦跟隨帳號 + follows_view_more: 檢視更多人以跟隨 + hashtags_recent_count: 於過去 %{days} 天 %{people} 人 + hashtags_subtitle: 探索過去兩天內的熱門主題標籤 + hashtags_title: 熱門主題標籤 + hashtags_view_more: 檢視更多熱門主題標籤 + post_action: 撰寫 + post_step: 透過文字、照片、影片或投票向新世界打聲招呼吧。 + post_title: 撰寫您第一則嘟文 + share_action: 分享 + share_step: 讓您的朋友們知道如何於 Mastodon 找到您。 + share_title: 分享您 Mastodon 個人檔案 + sign_in_action: 登入 subject: 歡迎來到 Mastodon title: "%{name} 誠摯歡迎您的加入!" users: @@ -1839,7 +1872,7 @@ zh-TW: success: 您已成功加入安全金鑰。 delete: 刪除 delete_confirmation: 您確定要移除這把安全金鑰嗎? - description_html: 如果您啟用安全金鑰驗證的話,您將於登入時需要使用其中一把安全金鑰。 + description_html: 若您啟用安全金鑰驗證,您將於登入時需要使用其中一把安全金鑰。 destroy: error: 移除安全金鑰時出現了問題。請再試一次。 success: 您已成功將安全金鑰移除。 From df3798a6fa65208e6d323c6856041b87e4feae19 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 09:49:04 +0100 Subject: [PATCH 132/954] Update dependency eslint-plugin-jsdoc to v48.2.1 (#29544) 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 75a725c4ee..75e6d472e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7374,8 +7374,8 @@ __metadata: linkType: hard "eslint-plugin-jsdoc@npm:^48.0.0": - version: 48.2.0 - resolution: "eslint-plugin-jsdoc@npm:48.2.0" + version: 48.2.1 + resolution: "eslint-plugin-jsdoc@npm:48.2.1" dependencies: "@es-joy/jsdoccomment": "npm:~0.42.0" are-docs-informative: "npm:^0.0.2" @@ -7388,7 +7388,7 @@ __metadata: spdx-expression-parse: "npm:^4.0.0" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/778f979ca40594269d531767ab29fb2a6c448425f8f732708ac5d3b9c61bbeb8504f1490a1057c7740f3e8f8a75d57ff50c766bc40fb1474f195e6f1aed30814 + checksum: 10c0/92237f08b7dadb21f9eda50eda00bf69ac5e0bfcb9d179bf118e096178d7dc4a62b34fd01b3b7b0ba1142ff6e13814cfe2cf9a60c6cfcc879559b6b509d0d4e1 languageName: node linkType: hard From 7b89d6842e49ad9dd2b9018dc41b01db3fef14cb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 09:49:07 +0100 Subject: [PATCH 133/954] Update DefinitelyTyped types (non-major) (#29543) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 75e6d472e4..5112721f08 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3326,11 +3326,11 @@ __metadata: linkType: hard "@types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.2.4": - version: 18.2.19 - resolution: "@types/react-dom@npm:18.2.19" + version: 18.2.21 + resolution: "@types/react-dom@npm:18.2.21" dependencies: "@types/react": "npm:*" - checksum: 10c0/88d7c6daa4659f661d0c97985d9fca492f24b421a34bb614dcd94c343aed7bea121463149e97fb01ecaa693be17b7d1542cf71ddb1705f3889a81eb2639a88aa + checksum: 10c0/a887b4b647071df48173f054854713b68fdacfceeba7fa14f64ba26688d7d43574d7dc88a2a346e28f2e667eeab1b9bdbcad8a54353869835e52638607f61ff5 languageName: node linkType: hard @@ -3456,13 +3456,13 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7": - version: 18.2.63 - resolution: "@types/react@npm:18.2.63" + version: 18.2.64 + resolution: "@types/react@npm:18.2.64" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/53d86727b966a3ba097553b5ef75a1f2bea78bd8c54ebcf6d00bd338000112b208ab30536c8c0a9f5fc61055cc3fbabbc7a23910c55092341602845de4c13714 + checksum: 10c0/ab3ba9597990d08ffd419a5ad28fd22393c7a9a241ae455fb1d5d193d209471aa1909fa7ad016fd8d161eab6d0babba77b013b56a5170bedf78833085b9ee424 languageName: node linkType: hard From 6f8ec6d7f85ed4250d171a7e9df1b3f6134f73d6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 09:50:54 +0100 Subject: [PATCH 134/954] Update dependency test-prof to v1.3.2 (#29528) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 73ddfb4cff..cb76abafcc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -744,7 +744,7 @@ GEM unicode-display_width (>= 1.1.1, < 3) terrapin (1.0.1) climate_control - test-prof (1.3.1) + test-prof (1.3.2) thor (1.3.1) tilt (2.3.0) timeout (0.4.1) From 98ef38e34ebc7f296a818e8cb454219f997529c2 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 11 Mar 2024 04:53:24 -0400 Subject: [PATCH 135/954] Ensure unique values in fabricators (#29515) --- spec/fabrication/fabricators_spec.rb | 6 +++--- spec/fabricators/identity_fabricator.rb | 2 +- spec/fabricators/relay_fabricator.rb | 2 +- spec/fabricators/site_upload_fabricator.rb | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/fabrication/fabricators_spec.rb b/spec/fabrication/fabricators_spec.rb index 53193378c8..2cf45041a4 100644 --- a/spec/fabrication/fabricators_spec.rb +++ b/spec/fabrication/fabricators_spec.rb @@ -6,9 +6,9 @@ Fabrication.manager.load_definitions if Fabrication.manager.empty? Fabrication.manager.schematics.map(&:first).each do |factory_name| describe "The #{factory_name} factory" do - it 'is valid' do - factory = Fabricate(factory_name) - expect(factory).to be_valid + it 'is able to create valid records' do + records = Fabricate.times(2, factory_name) # Create multiple of each to uncover uniqueness issues + expect(records).to all(be_valid) end end end diff --git a/spec/fabricators/identity_fabricator.rb b/spec/fabricators/identity_fabricator.rb index 83655ee839..6e125a4e72 100644 --- a/spec/fabricators/identity_fabricator.rb +++ b/spec/fabricators/identity_fabricator.rb @@ -3,5 +3,5 @@ Fabricator(:identity) do user { Fabricate.build(:user) } provider 'MyString' - uid 'MyString' + uid { sequence(:uid) { |i| "uid_string_#{i}" } } end diff --git a/spec/fabricators/relay_fabricator.rb b/spec/fabricators/relay_fabricator.rb index ad8ba86fcf..07fc6f88c5 100644 --- a/spec/fabricators/relay_fabricator.rb +++ b/spec/fabricators/relay_fabricator.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true Fabricator(:relay) do - inbox_url 'https://example.com/inbox' + inbox_url { sequence(:inbox_url) { |i| "https://example.com/inboxes/#{i}" } } state :idle end diff --git a/spec/fabricators/site_upload_fabricator.rb b/spec/fabricators/site_upload_fabricator.rb index 87553ccb8a..cbe42d3b4c 100644 --- a/spec/fabricators/site_upload_fabricator.rb +++ b/spec/fabricators/site_upload_fabricator.rb @@ -2,5 +2,5 @@ Fabricator(:site_upload) do file { Rails.root.join('spec', 'fabricators', 'assets', 'utah_teapot.png').open } - var 'thumbnail' + var { sequence(:var) { |i| "thumbnail_#{i}" } } end From 5b3a8737d6fa84c91e5158c34170f488df9ad313 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 11 Mar 2024 09:57:07 +0100 Subject: [PATCH 136/954] Add hints for rules (#29539) --- app/controllers/admin/rules_controller.rb | 2 +- app/javascript/mastodon/features/about/index.jsx | 3 ++- app/javascript/styles/mastodon/about.scss | 6 ++++++ app/models/rule.rb | 1 + app/serializers/rest/rule_serializer.rb | 2 +- app/views/admin/rules/edit.html.haml | 3 +++ app/views/admin/rules/index.html.haml | 3 +++ app/views/auth/registrations/rules.html.haml | 1 + config/locales/simple_form.en.yml | 2 ++ db/migrate/20240310123453_add_hint_to_rules.rb | 7 +++++++ db/schema.rb | 3 ++- 11 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20240310123453_add_hint_to_rules.rb diff --git a/app/controllers/admin/rules_controller.rb b/app/controllers/admin/rules_controller.rb index d31aec6ea8..b8def22ba3 100644 --- a/app/controllers/admin/rules_controller.rb +++ b/app/controllers/admin/rules_controller.rb @@ -53,7 +53,7 @@ module Admin end def resource_params - params.require(:rule).permit(:text, :priority) + params.require(:rule).permit(:text, :hint, :priority) end end end diff --git a/app/javascript/mastodon/features/about/index.jsx b/app/javascript/mastodon/features/about/index.jsx index 3287631ed1..5197d338cd 100644 --- a/app/javascript/mastodon/features/about/index.jsx +++ b/app/javascript/mastodon/features/about/index.jsx @@ -170,7 +170,8 @@ class About extends PureComponent {

    {server.get('rules').map(rule => (
  1. - {rule.get('text')} +
    {rule.get('text')}
    + {rule.get('hint').length > 0 && (
    {rule.get('hint')}
    )}
  2. ))}
diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index 0f02563b48..9d23ef41ab 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -53,4 +53,10 @@ $fluid-breakpoint: $maximum-width + 20px; border-bottom: 0; } } + + &__hint { + font-size: 14px; + font-weight: 400; + color: $darker-text-color; + } } diff --git a/app/models/rule.rb b/app/models/rule.rb index 602e5d5874..f28dc2ffeb 100644 --- a/app/models/rule.rb +++ b/app/models/rule.rb @@ -10,6 +10,7 @@ # text :text default(""), not null # created_at :datetime not null # updated_at :datetime not null +# hint :text default(""), not null # class Rule < ApplicationRecord include Discard::Model diff --git a/app/serializers/rest/rule_serializer.rb b/app/serializers/rest/rule_serializer.rb index fc925925a9..9e2bcda15e 100644 --- a/app/serializers/rest/rule_serializer.rb +++ b/app/serializers/rest/rule_serializer.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class REST::RuleSerializer < ActiveModel::Serializer - attributes :id, :text + attributes :id, :text, :hint def id object.id.to_s diff --git a/app/views/admin/rules/edit.html.haml b/app/views/admin/rules/edit.html.haml index ba7e6451a1..77815588d2 100644 --- a/app/views/admin/rules/edit.html.haml +++ b/app/views/admin/rules/edit.html.haml @@ -7,5 +7,8 @@ .fields-group = f.input :text, wrapper: :with_block_label + .fields-group + = f.input :hint, wrapper: :with_block_label + .actions = f.button :button, t('generic.save_changes'), type: :submit diff --git a/app/views/admin/rules/index.html.haml b/app/views/admin/rules/index.html.haml index aa6a4c1b6a..dd15ce03c0 100644 --- a/app/views/admin/rules/index.html.haml +++ b/app/views/admin/rules/index.html.haml @@ -12,6 +12,9 @@ .fields-group = f.input :text, wrapper: :with_block_label + .fields-group + = f.input :hint, wrapper: :with_block_label + .actions = f.button :button, t('admin.rules.add_new'), type: :submit diff --git a/app/views/auth/registrations/rules.html.haml b/app/views/auth/registrations/rules.html.haml index 234f4a601d..3a05ed54f0 100644 --- a/app/views/auth/registrations/rules.html.haml +++ b/app/views/auth/registrations/rules.html.haml @@ -20,6 +20,7 @@ - @rules.each do |rule| %li .rules-list__text= rule.text + .rules-list__hint= rule.hint .stacked-actions - accept_path = @invite_code.present? ? public_invite_url(invite_code: @invite_code, accept: @accept_token) : new_user_registration_path(accept: @accept_token) diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 7ece81290f..4ba6e88f41 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -116,6 +116,7 @@ en: sign_up_requires_approval: New sign-ups will require your approval severity: Choose what will happen with requests from this IP rule: + hint: Optional. Provide more details about the rule text: Describe a rule or requirement for users on this server. Try to keep it short and simple sessions: otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:' @@ -299,6 +300,7 @@ en: patch: Notify on bugfix updates trending_tag: New trend requires review rule: + hint: Additional information text: Rule settings: indexable: Include profile page in search engines diff --git a/db/migrate/20240310123453_add_hint_to_rules.rb b/db/migrate/20240310123453_add_hint_to_rules.rb new file mode 100644 index 0000000000..06822ad96a --- /dev/null +++ b/db/migrate/20240310123453_add_hint_to_rules.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddHintToRules < ActiveRecord::Migration[7.1] + def change + add_column :rules, :hint, :text, null: false, default: '' + end +end diff --git a/db/schema.rb b/db/schema.rb index 97917d0456..b98253a6c1 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_03_04_090449) do +ActiveRecord::Schema[7.1].define(version: 2024_03_10_123453) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -915,6 +915,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_04_090449) do t.text "text", default: "", null: false t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false + t.text "hint", default: "", null: false end create_table "scheduled_statuses", force: :cascade do |t| From 2347ea813e5be2ecf762c8a275373a3e2bea56e8 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 11 Mar 2024 09:57:23 +0100 Subject: [PATCH 137/954] Change dropdown menu icon to not be replaced by close icon when open in web UI (#29532) --- app/javascript/mastodon/components/dropdown_menu.jsx | 3 +-- app/javascript/mastodon/features/ui/index.jsx | 6 ++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/components/dropdown_menu.jsx b/app/javascript/mastodon/components/dropdown_menu.jsx index f6c08dd43b..524dbb927b 100644 --- a/app/javascript/mastodon/components/dropdown_menu.jsx +++ b/app/javascript/mastodon/components/dropdown_menu.jsx @@ -9,7 +9,6 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { supportsPassiveEvents } from 'detect-passive-events'; import Overlay from 'react-overlays/Overlay'; -import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { CircularProgress } from 'mastodon/components/circular_progress'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; @@ -298,7 +297,7 @@ class Dropdown extends PureComponent { }) : ( ({ hasComposingText: state.getIn(['compose', 'text']).trim().length !== 0, hasMediaAttachments: state.getIn(['compose', 'media_attachments']).size > 0, canUploadMore: !state.getIn(['compose', 'media_attachments']).some(x => ['audio', 'video'].includes(x.get('type'))) && state.getIn(['compose', 'media_attachments']).size < 4, - dropdownMenuIsOpen: state.dropdownMenu.openId !== null, firstLaunch: state.getIn(['settings', 'introductionVersion'], 0) < INTRODUCTION_VERSION, username: state.getIn(['accounts', me, 'username']), }); @@ -262,7 +261,6 @@ class UI extends PureComponent { hasMediaAttachments: PropTypes.bool, canUploadMore: PropTypes.bool, intl: PropTypes.object.isRequired, - dropdownMenuIsOpen: PropTypes.bool, layout: PropTypes.string.isRequired, firstLaunch: PropTypes.bool, username: PropTypes.string, @@ -555,7 +553,7 @@ class UI extends PureComponent { render () { const { draggingOver } = this.state; - const { children, isComposing, location, dropdownMenuIsOpen, layout } = this.props; + const { children, isComposing, location, layout } = this.props; const handlers = { help: this.handleHotkeyToggleHelp, @@ -581,7 +579,7 @@ class UI extends PureComponent { return ( -
+
From 6984f94044a313f675891f3b1338afd0e7fe3032 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 10:05:07 +0100 Subject: [PATCH 138/954] Update dependency autoprefixer to v10.4.18 (#29475) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5112721f08..1412e6d606 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4653,11 +4653,11 @@ __metadata: linkType: hard "autoprefixer@npm:^10.4.14": - version: 10.4.17 - resolution: "autoprefixer@npm:10.4.17" + version: 10.4.18 + resolution: "autoprefixer@npm:10.4.18" dependencies: - browserslist: "npm:^4.22.2" - caniuse-lite: "npm:^1.0.30001578" + browserslist: "npm:^4.23.0" + caniuse-lite: "npm:^1.0.30001591" fraction.js: "npm:^4.3.7" normalize-range: "npm:^0.1.2" picocolors: "npm:^1.0.0" @@ -4666,7 +4666,7 @@ __metadata: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 10c0/1d21cc8edb7bf993682094ceed03a32c18f5293f071182a64c2c6defb44bbe91d576ad775d2347469a81997b80cea0bbc4ad3eeb5b12710f9feacf2e6c04bb51 + checksum: 10c0/b6e1c1ba2fc6c09360cdcd75b00ce809c5dbe1ad4c30f0186764609a982aa5563d45965cb9e6a9d195c639a9fb1dcac2594484fc41624050195f626e9add666e languageName: node linkType: hard @@ -5409,10 +5409,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001578, caniuse-lite@npm:^1.0.30001587": - version: 1.0.30001589 - resolution: "caniuse-lite@npm:1.0.30001589" - checksum: 10c0/20debfb949413f603011bc7dacaf050010778bc4f8632c86fafd1bd0c43180c95ae7c31f6c82348f6309e5e221934e327c3607a216e3f09640284acf78cd6d4d +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001591": + version: 1.0.30001591 + resolution: "caniuse-lite@npm:1.0.30001591" + checksum: 10c0/21937d341c3d75994504db21340f65573a1e847a8ab33ee4964ed493994d6552864c494ba144485459abd9c711c75c0708bc9fa19f2bff525bff75ffb0a42c3b languageName: node linkType: hard From b9722dfe2bdb024e5e98b96d2fc5712d6cb5f747 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Mon, 11 Mar 2024 10:13:35 +0100 Subject: [PATCH 139/954] Use the server setting to get the max number of poll options in UI (#29490) --- app/javascript/mastodon/actions/compose.js | 3 ++- .../mastodon/features/compose/components/poll_form.jsx | 5 +++-- app/javascript/mastodon/reducers/compose.js | 6 +++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 6abfd6157e..12bd43f807 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -786,11 +786,12 @@ export function addPollOption(title) { }; } -export function changePollOption(index, title) { +export function changePollOption(index, title, maxOptions) { return { type: COMPOSE_POLL_OPTION_CHANGE, index, title, + maxOptions, }; } diff --git a/app/javascript/mastodon/features/compose/components/poll_form.jsx b/app/javascript/mastodon/features/compose/components/poll_form.jsx index b3566fd6f5..d2adc58cc0 100644 --- a/app/javascript/mastodon/features/compose/components/poll_form.jsx +++ b/app/javascript/mastodon/features/compose/components/poll_form.jsx @@ -58,10 +58,11 @@ const Option = ({ multipleChoice, index, title, autoFocus }) => { const dispatch = useDispatch(); const suggestions = useSelector(state => state.getIn(['compose', 'suggestions'])); const lang = useSelector(state => state.getIn(['compose', 'language'])); + const maxOptions = useSelector(state => state.getIn(['server', 'server', 'configuration', 'polls', 'max_options'])); const handleChange = useCallback(({ target: { value } }) => { - dispatch(changePollOption(index, value)); - }, [dispatch, index]); + dispatch(changePollOption(index, value, maxOptions)); + }, [dispatch, index, maxOptions]); const handleSuggestionsFetchRequested = useCallback(token => { dispatch(fetchComposeSuggestions(token)); diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index f1bc0cbaef..8dc2801857 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -280,12 +280,12 @@ const updateSuggestionTags = (state, token) => { }); }; -const updatePoll = (state, index, value) => state.updateIn(['poll', 'options'], options => { +const updatePoll = (state, index, value, maxOptions) => state.updateIn(['poll', 'options'], options => { const tmp = options.set(index, value).filterNot(x => x.trim().length === 0); if (tmp.size === 0) { return tmp.push('').push(''); - } else if (tmp.size < 4) { + } else if (tmp.size < maxOptions) { return tmp.push(''); } @@ -529,7 +529,7 @@ export default function compose(state = initialState, action) { case COMPOSE_POLL_REMOVE: return state.set('poll', null); case COMPOSE_POLL_OPTION_CHANGE: - return updatePoll(state, action.index, action.title); + return updatePoll(state, action.index, action.title, action.maxOptions); case COMPOSE_POLL_SETTINGS_CHANGE: return state.update('poll', poll => poll.set('expires_in', action.expiresIn).set('multiple', action.isMultiple)); case COMPOSE_LANGUAGE_CHANGE: From a7284690fc595fa7d71528f8cdd67ddf2540a62a Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 11 Mar 2024 05:16:19 -0400 Subject: [PATCH 140/954] Add coverage for admin/metrics base classes, simplify subclass generation (#29527) --- app/lib/admin/metrics/dimension.rb | 18 +++++++-------- app/lib/admin/metrics/measure.rb | 28 ++++++++++++------------ spec/lib/admin/metrics/dimension_spec.rb | 22 +++++++++++++++++++ spec/lib/admin/metrics/measure_spec.rb | 22 +++++++++++++++++++ 4 files changed, 67 insertions(+), 23 deletions(-) create mode 100644 spec/lib/admin/metrics/dimension_spec.rb create mode 100644 spec/lib/admin/metrics/measure_spec.rb diff --git a/app/lib/admin/metrics/dimension.rb b/app/lib/admin/metrics/dimension.rb index e0122a65b5..824cb6d7c1 100644 --- a/app/lib/admin/metrics/dimension.rb +++ b/app/lib/admin/metrics/dimension.rb @@ -2,15 +2,15 @@ class Admin::Metrics::Dimension DIMENSIONS = { - languages: Admin::Metrics::Dimension::LanguagesDimension, - sources: Admin::Metrics::Dimension::SourcesDimension, - servers: Admin::Metrics::Dimension::ServersDimension, - space_usage: Admin::Metrics::Dimension::SpaceUsageDimension, - software_versions: Admin::Metrics::Dimension::SoftwareVersionsDimension, - tag_servers: Admin::Metrics::Dimension::TagServersDimension, - tag_languages: Admin::Metrics::Dimension::TagLanguagesDimension, - instance_accounts: Admin::Metrics::Dimension::InstanceAccountsDimension, - instance_languages: Admin::Metrics::Dimension::InstanceLanguagesDimension, + languages: LanguagesDimension, + sources: SourcesDimension, + servers: ServersDimension, + space_usage: SpaceUsageDimension, + software_versions: SoftwareVersionsDimension, + tag_servers: TagServersDimension, + tag_languages: TagLanguagesDimension, + instance_accounts: InstanceAccountsDimension, + instance_languages: InstanceLanguagesDimension, }.freeze def self.retrieve(dimension_keys, start_at, end_at, limit, params) diff --git a/app/lib/admin/metrics/measure.rb b/app/lib/admin/metrics/measure.rb index fe7e049290..d23162dfab 100644 --- a/app/lib/admin/metrics/measure.rb +++ b/app/lib/admin/metrics/measure.rb @@ -2,20 +2,20 @@ class Admin::Metrics::Measure MEASURES = { - active_users: Admin::Metrics::Measure::ActiveUsersMeasure, - new_users: Admin::Metrics::Measure::NewUsersMeasure, - interactions: Admin::Metrics::Measure::InteractionsMeasure, - opened_reports: Admin::Metrics::Measure::OpenedReportsMeasure, - resolved_reports: Admin::Metrics::Measure::ResolvedReportsMeasure, - tag_accounts: Admin::Metrics::Measure::TagAccountsMeasure, - tag_uses: Admin::Metrics::Measure::TagUsesMeasure, - tag_servers: Admin::Metrics::Measure::TagServersMeasure, - instance_accounts: Admin::Metrics::Measure::InstanceAccountsMeasure, - instance_media_attachments: Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure, - instance_reports: Admin::Metrics::Measure::InstanceReportsMeasure, - instance_statuses: Admin::Metrics::Measure::InstanceStatusesMeasure, - instance_follows: Admin::Metrics::Measure::InstanceFollowsMeasure, - instance_followers: Admin::Metrics::Measure::InstanceFollowersMeasure, + active_users: ActiveUsersMeasure, + new_users: NewUsersMeasure, + interactions: InteractionsMeasure, + opened_reports: OpenedReportsMeasure, + resolved_reports: ResolvedReportsMeasure, + tag_accounts: TagAccountsMeasure, + tag_uses: TagUsesMeasure, + tag_servers: TagServersMeasure, + instance_accounts: InstanceAccountsMeasure, + instance_media_attachments: InstanceMediaAttachmentsMeasure, + instance_reports: InstanceReportsMeasure, + instance_statuses: InstanceStatusesMeasure, + instance_follows: InstanceFollowsMeasure, + instance_followers: InstanceFollowersMeasure, }.freeze def self.retrieve(measure_keys, start_at, end_at, params) diff --git a/spec/lib/admin/metrics/dimension_spec.rb b/spec/lib/admin/metrics/dimension_spec.rb new file mode 100644 index 0000000000..109250b72b --- /dev/null +++ b/spec/lib/admin/metrics/dimension_spec.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Admin::Metrics::Dimension do + describe '.retrieve' do + subject { described_class.retrieve(reports, start_at, end_at, 5, params) } + + let(:start_at) { 2.days.ago } + let(:end_at) { Time.now.utc } + let(:params) { ActionController::Parameters.new({ instance_accounts: [123], instance_languages: ['en'] }) } + let(:reports) { [:instance_accounts, :instance_languages] } + + it 'returns instances of provided classes' do + expect(subject) + .to contain_exactly( + be_a(Admin::Metrics::Dimension::InstanceAccountsDimension), + be_a(Admin::Metrics::Dimension::InstanceLanguagesDimension) + ) + end + end +end diff --git a/spec/lib/admin/metrics/measure_spec.rb b/spec/lib/admin/metrics/measure_spec.rb new file mode 100644 index 0000000000..c9809b0f79 --- /dev/null +++ b/spec/lib/admin/metrics/measure_spec.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Admin::Metrics::Measure do + describe '.retrieve' do + subject { described_class.retrieve(reports, start_at, end_at, params) } + + let(:start_at) { 2.days.ago } + let(:end_at) { Time.now.utc } + let(:params) { ActionController::Parameters.new({ instance_accounts: [123], instance_followers: [123] }) } + let(:reports) { [:instance_accounts, :instance_followers] } + + it 'returns instances of provided classes' do + expect(subject) + .to contain_exactly( + be_a(Admin::Metrics::Measure::InstanceAccountsMeasure), + be_a(Admin::Metrics::Measure::InstanceFollowersMeasure) + ) + end + end +end From 4a6ddbc9c0f01f7160153e33a1a91eb1f2b86028 Mon Sep 17 00:00:00 2001 From: Jeong Arm Date: Mon, 11 Mar 2024 18:28:08 +0900 Subject: [PATCH 141/954] Normalize idna domain before account unblock domain (#29530) --- app/models/concerns/account/interactions.rb | 6 ++- .../concerns/account/interactions_spec.rb | 40 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/app/models/concerns/account/interactions.rb b/app/models/concerns/account/interactions.rb index 5b05c31e03..0ed0dc060b 100644 --- a/app/models/concerns/account/interactions.rb +++ b/app/models/concerns/account/interactions.rb @@ -178,7 +178,7 @@ module Account::Interactions end def unblock_domain!(other_domain) - block = domain_blocks.find_by(domain: other_domain) + block = domain_blocks.find_by(domain: normalized_domain(other_domain)) block&.destroy end @@ -300,4 +300,8 @@ module Account::Interactions domain_blocking_by_domain: Account.domain_blocking_map_by_domain(domains, id), }) end + + def normalized_domain(domain) + TagManager.instance.normalize_domain(domain) + end end diff --git a/spec/models/concerns/account/interactions_spec.rb b/spec/models/concerns/account/interactions_spec.rb index 6fac41e071..3f2c601f38 100644 --- a/spec/models/concerns/account/interactions_spec.rb +++ b/spec/models/concerns/account/interactions_spec.rb @@ -250,6 +250,24 @@ describe Account::Interactions do end end + describe '#block_idna_domain!' do + subject do + [ + account.block_domain!(idna_domain), + account.block_domain!(punycode_domain), + ] + end + + let(:idna_domain) { '대한민국.한국' } + let(:punycode_domain) { 'xn--3e0bs9hfvinn1a.xn--3e0b707e' } + + it 'creates single AccountDomainBlock' do + expect do + expect(subject).to all(be_a AccountDomainBlock) + end.to change { account.domain_blocks.count }.by 1 + end + end + describe '#unfollow!' do subject { account.unfollow!(target_account) } @@ -345,6 +363,28 @@ describe Account::Interactions do end end + describe '#unblock_idna_domain!' do + subject { account.unblock_domain!(punycode_domain) } + + let(:idna_domain) { '대한민국.한국' } + let(:punycode_domain) { 'xn--3e0bs9hfvinn1a.xn--3e0b707e' } + + context 'when blocking the domain' do + it 'returns destroyed AccountDomainBlock' do + account_domain_block = Fabricate(:account_domain_block, domain: idna_domain) + account.domain_blocks << account_domain_block + expect(subject).to be_a AccountDomainBlock + expect(subject).to be_destroyed + end + end + + context 'when unblocking idna domain' do + it 'returns nil' do + expect(subject).to be_nil + end + end + end + describe '#following?' do subject { account.following?(target_account) } From 16c856729bfa400422825b06c843efe7b85c72f8 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 11 Mar 2024 14:35:23 +0100 Subject: [PATCH 142/954] Change icons in navigation panel to be filled when active in web UI (#29537) --- .../features/ui/components/column_link.jsx | 15 ++-- .../follow_requests_column_link.jsx | 55 ------------- .../features/ui/components/list_panel.jsx | 56 +++++-------- .../ui/components/navigation_panel.jsx | 81 +++++++++++++++---- .../components/notifications_counter_icon.js | 13 --- 5 files changed, 96 insertions(+), 124 deletions(-) delete mode 100644 app/javascript/mastodon/features/ui/components/follow_requests_column_link.jsx delete mode 100644 app/javascript/mastodon/features/ui/components/notifications_counter_icon.js diff --git a/app/javascript/mastodon/features/ui/components/column_link.jsx b/app/javascript/mastodon/features/ui/components/column_link.jsx index e58fde48b5..6ef122c07b 100644 --- a/app/javascript/mastodon/features/ui/components/column_link.jsx +++ b/app/javascript/mastodon/features/ui/components/column_link.jsx @@ -1,27 +1,30 @@ import PropTypes from 'prop-types'; import classNames from 'classnames'; -import { NavLink } from 'react-router-dom'; +import { useRouteMatch, NavLink } from 'react-router-dom'; import { Icon } from 'mastodon/components/icon'; -const ColumnLink = ({ icon, iconComponent, text, to, href, method, badge, transparent, ...other }) => { +const ColumnLink = ({ icon, activeIcon, iconComponent, activeIconComponent, text, to, href, method, badge, transparent, ...other }) => { + const match = useRouteMatch(to); const className = classNames('column-link', { 'column-link--transparent': transparent }); const badgeElement = typeof badge !== 'undefined' ? {badge} : null; const iconElement = (typeof icon === 'string' || iconComponent) ? : icon; + const activeIconElement = activeIcon ?? (activeIconComponent ? : iconElement); + const active = match?.isExact; if (href) { return ( - {iconElement} + {active ? activeIconElement : iconElement} {text} {badgeElement} ); } else { return ( - - {iconElement} + + {active ? activeIconElement : iconElement} {text} {badgeElement} @@ -32,6 +35,8 @@ const ColumnLink = ({ icon, iconComponent, text, to, href, method, badge, transp ColumnLink.propTypes = { icon: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired, iconComponent: PropTypes.func, + activeIcon: PropTypes.node, + activeIconComponent: PropTypes.func, text: PropTypes.string.isRequired, to: PropTypes.string, href: PropTypes.string, diff --git a/app/javascript/mastodon/features/ui/components/follow_requests_column_link.jsx b/app/javascript/mastodon/features/ui/components/follow_requests_column_link.jsx deleted file mode 100644 index 4aa0092631..0000000000 --- a/app/javascript/mastodon/features/ui/components/follow_requests_column_link.jsx +++ /dev/null @@ -1,55 +0,0 @@ -import PropTypes from 'prop-types'; -import { Component } from 'react'; - -import { injectIntl, defineMessages } from 'react-intl'; - -import { List as ImmutableList } from 'immutable'; -import { connect } from 'react-redux'; - -import PersonAddIcon from '@/material-icons/400-24px/person_add.svg?react'; -import { fetchFollowRequests } from 'mastodon/actions/accounts'; -import { IconWithBadge } from 'mastodon/components/icon_with_badge'; -import ColumnLink from 'mastodon/features/ui/components/column_link'; - -const messages = defineMessages({ - text: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' }, -}); - -const mapStateToProps = state => ({ - count: state.getIn(['user_lists', 'follow_requests', 'items'], ImmutableList()).size, -}); - -class FollowRequestsColumnLink extends Component { - - static propTypes = { - dispatch: PropTypes.func.isRequired, - count: PropTypes.number.isRequired, - intl: PropTypes.object.isRequired, - }; - - componentDidMount () { - const { dispatch } = this.props; - - dispatch(fetchFollowRequests()); - } - - render () { - const { count, intl } = this.props; - - if (count === 0) { - return null; - } - - return ( - } - text={intl.formatMessage(messages.text)} - /> - ); - } - -} - -export default injectIntl(connect(mapStateToProps)(FollowRequestsColumnLink)); diff --git a/app/javascript/mastodon/features/ui/components/list_panel.jsx b/app/javascript/mastodon/features/ui/components/list_panel.jsx index fec21f14ca..03c8fce9e8 100644 --- a/app/javascript/mastodon/features/ui/components/list_panel.jsx +++ b/app/javascript/mastodon/features/ui/components/list_panel.jsx @@ -1,10 +1,9 @@ -import PropTypes from 'prop-types'; +import { useEffect } from 'react'; import { createSelector } from '@reduxjs/toolkit'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; -import { connect } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; +import ListAltActiveIcon from '@/material-icons/400-24px/list_alt-fill.svg?react'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import { fetchLists } from 'mastodon/actions/lists'; @@ -18,40 +17,25 @@ const getOrderedLists = createSelector([state => state.get('lists')], lists => { return lists.toList().filter(item => !!item).sort((a, b) => a.get('title').localeCompare(b.get('title'))).take(4); }); -const mapStateToProps = state => ({ - lists: getOrderedLists(state), -}); +export const ListPanel = () => { + const dispatch = useDispatch(); + const lists = useSelector(state => getOrderedLists(state)); -class ListPanel extends ImmutablePureComponent { - - static propTypes = { - dispatch: PropTypes.func.isRequired, - lists: ImmutablePropTypes.list, - }; - - componentDidMount () { - const { dispatch } = this.props; + useEffect(() => { dispatch(fetchLists()); + }, [dispatch]); + + if (!lists || lists.isEmpty()) { + return null; } - render () { - const { lists } = this.props; + return ( +
+
- if (!lists || lists.isEmpty()) { - return null; - } - - return ( -
-
- - {lists.map(list => ( - - ))} -
- ); - } - -} - -export default connect(mapStateToProps)(ListPanel); + {lists.map(list => ( + + ))} +
+ ); +}; diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx index 4a56988191..deda3258b9 100644 --- a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx +++ b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx @@ -1,20 +1,33 @@ import PropTypes from 'prop-types'; -import { Component } from 'react'; +import { Component, useEffect } from 'react'; -import { defineMessages, injectIntl } from 'react-intl'; +import { defineMessages, injectIntl, useIntl } from 'react-intl'; import { Link } from 'react-router-dom'; +import { useSelector, useDispatch } from 'react-redux'; + + import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; -import BookmarksIcon from '@/material-icons/400-24px/bookmarks-fill.svg?react'; +import BookmarksActiveIcon from '@/material-icons/400-24px/bookmarks-fill.svg?react'; +import BookmarksIcon from '@/material-icons/400-24px/bookmarks.svg?react'; import ExploreIcon from '@/material-icons/400-24px/explore.svg?react'; -import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react'; +import HomeActiveIcon from '@/material-icons/400-24px/home-fill.svg?react'; +import HomeIcon from '@/material-icons/400-24px/home.svg?react'; +import ListAltActiveIcon from '@/material-icons/400-24px/list_alt-fill.svg?react'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; +import NotificationsActiveIcon from '@/material-icons/400-24px/notifications-fill.svg?react'; +import NotificationsIcon from '@/material-icons/400-24px/notifications.svg?react'; +import PersonAddActiveIcon from '@/material-icons/400-24px/person_add-fill.svg?react'; +import PersonAddIcon from '@/material-icons/400-24px/person_add.svg?react'; import PublicIcon from '@/material-icons/400-24px/public.svg?react'; import SearchIcon from '@/material-icons/400-24px/search.svg?react'; -import SettingsIcon from '@/material-icons/400-24px/settings-fill.svg?react'; -import StarIcon from '@/material-icons/400-24px/star-fill.svg?react'; +import SettingsIcon from '@/material-icons/400-24px/settings.svg?react'; +import StarActiveIcon from '@/material-icons/400-24px/star-fill.svg?react'; +import StarIcon from '@/material-icons/400-24px/star.svg?react'; +import { fetchFollowRequests } from 'mastodon/actions/accounts'; +import { IconWithBadge } from 'mastodon/components/icon_with_badge'; import { WordmarkLogo } from 'mastodon/components/logo'; import { NavigationPortal } from 'mastodon/components/navigation_portal'; import { timelinePreview, trendsEnabled } from 'mastodon/initial_state'; @@ -22,9 +35,7 @@ import { transientSingleColumn } from 'mastodon/is_mobile'; import ColumnLink from './column_link'; import DisabledAccountBanner from './disabled_account_banner'; -import FollowRequestsColumnLink from './follow_requests_column_link'; -import ListPanel from './list_panel'; -import NotificationsCounterIcon from './notifications_counter_icon'; +import { ListPanel } from './list_panel'; import SignInBanner from './sign_in_banner'; const messages = defineMessages({ @@ -42,8 +53,48 @@ const messages = defineMessages({ search: { id: 'navigation_bar.search', defaultMessage: 'Search' }, advancedInterface: { id: 'navigation_bar.advanced_interface', defaultMessage: 'Open in advanced web interface' }, openedInClassicInterface: { id: 'navigation_bar.opened_in_classic_interface', defaultMessage: 'Posts, accounts, and other specific pages are opened by default in the classic web interface.' }, + followRequests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' }, }); +const NotificationsLink = () => { + const count = useSelector(state => state.getIn(['notifications', 'unread'])); + const intl = useIntl(); + + return ( + } + activeIcon={} + text={intl.formatMessage(messages.notifications)} + /> + ); +}; + +const FollowRequestsLink = () => { + const count = useSelector(state => state.getIn(['user_lists', 'follow_requests', 'items'])?.size ?? 0); + const intl = useIntl(); + const dispatch = useDispatch(); + + useEffect(() => { + dispatch(fetchFollowRequests()); + }, [dispatch]); + + if (count === 0) { + return null; + } + + return ( + } + activeIcon={} + text={intl.formatMessage(messages.followRequests)} + /> + ); +}; + class NavigationPanel extends Component { static contextTypes = { @@ -87,9 +138,9 @@ class NavigationPanel extends Component { {signedIn && ( <> - - } text={intl.formatMessage(messages.notifications)} /> - + + + )} @@ -113,9 +164,9 @@ class NavigationPanel extends Component { {signedIn && ( <> - - - + + + diff --git a/app/javascript/mastodon/features/ui/components/notifications_counter_icon.js b/app/javascript/mastodon/features/ui/components/notifications_counter_icon.js deleted file mode 100644 index 7d59d616d8..0000000000 --- a/app/javascript/mastodon/features/ui/components/notifications_counter_icon.js +++ /dev/null @@ -1,13 +0,0 @@ -import { connect } from 'react-redux'; - -import NotificationsIcon from '@/material-icons/400-24px/notifications-fill.svg?react'; -import { IconWithBadge } from 'mastodon/components/icon_with_badge'; - - -const mapStateToProps = state => ({ - count: state.getIn(['notifications', 'unread']), - id: 'bell', - icon: NotificationsIcon, -}); - -export default connect(mapStateToProps)(IconWithBadge); From 19efa1b9f1486ffe95c14582017d9e9ede48d597 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 11 Mar 2024 15:33:48 +0100 Subject: [PATCH 143/954] Change action button to be last on profiles in web UI (#29533) --- .../features/account/components/header.jsx | 14 +++++--------- app/javascript/styles/mastodon/components.scss | 5 +---- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/app/javascript/mastodon/features/account/components/header.jsx b/app/javascript/mastodon/features/account/components/header.jsx index 07ea227c48..c6295d7c4a 100644 --- a/app/javascript/mastodon/features/account/components/header.jsx +++ b/app/javascript/mastodon/features/account/components/header.jsx @@ -22,6 +22,7 @@ import { CopyIconButton } from 'mastodon/components/copy_icon_button'; import { FollowersCounter, FollowingCounter, StatusesCounter } from 'mastodon/components/counters'; import { Icon } from 'mastodon/components/icon'; import { IconButton } from 'mastodon/components/icon_button'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import { ShortNumber } from 'mastodon/components/short_number'; import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container'; import { autoPlayGif, me, domain } from 'mastodon/initial_state'; @@ -289,7 +290,7 @@ class Header extends ImmutablePureComponent { if (me !== account.get('id')) { if (signedIn && !account.get('relationship')) { // Wait until the relationship is loaded - actionBtn = ''; + actionBtn = ; } else if (account.getIn(['relationship', 'requested'])) { actionBtn =
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 5bd11c3500..6d79a843d8 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -7455,10 +7455,7 @@ noscript { .button { flex-shrink: 1; white-space: nowrap; - - @media screen and (max-width: $no-gap-breakpoint) { - min-width: 0; - } + min-width: 80px; } .icon-button { From c10bbf5fe3800f933c33fa19cf23b5ec4fb778ea Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 11 Mar 2024 16:02:21 +0100 Subject: [PATCH 144/954] Add notification policies and notification requests in web UI (#29433) --- .../v1/notifications/requests_controller.rb | 6 +- .../mastodon/actions/notifications.js | 293 ++++++++++++++++++ .../mastodon/components/column_header.jsx | 53 ++-- .../components/column_settings.jsx | 2 +- .../mastodon/features/firehose/index.jsx | 20 +- .../components/column_settings.jsx | 38 +-- .../components/column_settings.tsx | 65 ++-- .../mastodon/features/list_timeline/index.jsx | 55 ++-- .../components/checkbox_with_label.jsx | 31 ++ .../components/column_settings.jsx | 146 +++++---- .../filtered_notifications_banner.jsx | 49 +++ .../components/notification_request.jsx | 65 ++++ .../containers/column_settings_container.js | 9 +- .../containers/filter_bar_container.js | 2 +- .../mastodon/features/notifications/index.jsx | 10 +- .../features/notifications/request.jsx | 144 +++++++++ .../features/notifications/requests.jsx | 85 +++++ .../components/column_settings.jsx | 12 +- app/javascript/mastodon/features/ui/index.jsx | 6 +- .../features/ui/util/async-components.js | 8 + app/javascript/mastodon/locales/en.json | 20 +- app/javascript/mastodon/reducers/index.ts | 4 + .../mastodon/reducers/notification_policy.js | 12 + .../reducers/notification_requests.js | 96 ++++++ .../mastodon/reducers/notifications.js | 2 +- app/javascript/mastodon/utils/numbers.ts | 8 + .../material-icons/400-24px/archive-fill.svg | 1 + .../material-icons/400-24px/archive.svg | 1 + .../styles/mastodon/components.scss | 271 ++++++++++++---- app/javascript/styles/mastodon/forms.scss | 6 + app/models/notification_request.rb | 2 +- config/routes.rb | 2 +- config/routes/api.rb | 2 +- spec/models/notification_policy_spec.rb | 2 +- spec/models/notification_request_spec.rb | 2 +- 35 files changed, 1278 insertions(+), 252 deletions(-) create mode 100644 app/javascript/mastodon/features/notifications/components/checkbox_with_label.jsx create mode 100644 app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx create mode 100644 app/javascript/mastodon/features/notifications/components/notification_request.jsx create mode 100644 app/javascript/mastodon/features/notifications/request.jsx create mode 100644 app/javascript/mastodon/features/notifications/requests.jsx create mode 100644 app/javascript/mastodon/reducers/notification_policy.js create mode 100644 app/javascript/mastodon/reducers/notification_requests.js create mode 100644 app/javascript/material-icons/400-24px/archive-fill.svg create mode 100644 app/javascript/material-icons/400-24px/archive.svg diff --git a/app/controllers/api/v1/notifications/requests_controller.rb b/app/controllers/api/v1/notifications/requests_controller.rb index dbb9871530..35f5d58a81 100644 --- a/app/controllers/api/v1/notifications/requests_controller.rb +++ b/app/controllers/api/v1/notifications/requests_controller.rb @@ -18,6 +18,10 @@ class Api::V1::Notifications::RequestsController < Api::BaseController render json: @requests, each_serializer: REST::NotificationRequestSerializer, relationships: @relationships end + def show + render json: @request, serializer: REST::NotificationRequestSerializer + end + def accept AcceptNotificationRequestService.new.call(@request) render_empty @@ -31,7 +35,7 @@ class Api::V1::Notifications::RequestsController < Api::BaseController private def load_requests - requests = NotificationRequest.where(account: current_account).where(dismissed: truthy_param?(:dismissed)).includes(:last_status, from_account: [:account_stat, :user]).to_a_paginated_by_id( + requests = NotificationRequest.where(account: current_account).where(dismissed: truthy_param?(:dismissed) || false).includes(:last_status, from_account: [:account_stat, :user]).to_a_paginated_by_id( limit_param(DEFAULT_ACCOUNTS_LIMIT), params_slice(:max_id, :since_id, :min_id) ) diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index eafbf42d1b..30b7601d5d 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -44,6 +44,38 @@ export const NOTIFICATIONS_MARK_AS_READ = 'NOTIFICATIONS_MARK_AS_READ'; export const NOTIFICATIONS_SET_BROWSER_SUPPORT = 'NOTIFICATIONS_SET_BROWSER_SUPPORT'; export const NOTIFICATIONS_SET_BROWSER_PERMISSION = 'NOTIFICATIONS_SET_BROWSER_PERMISSION'; +export const NOTIFICATION_POLICY_FETCH_REQUEST = 'NOTIFICATION_POLICY_FETCH_REQUEST'; +export const NOTIFICATION_POLICY_FETCH_SUCCESS = 'NOTIFICATION_POLICY_FETCH_SUCCESS'; +export const NOTIFICATION_POLICY_FETCH_FAIL = 'NOTIFICATION_POLICY_FETCH_FAIL'; + +export const NOTIFICATION_REQUESTS_FETCH_REQUEST = 'NOTIFICATION_REQUESTS_FETCH_REQUEST'; +export const NOTIFICATION_REQUESTS_FETCH_SUCCESS = 'NOTIFICATION_REQUESTS_FETCH_SUCCESS'; +export const NOTIFICATION_REQUESTS_FETCH_FAIL = 'NOTIFICATION_REQUESTS_FETCH_FAIL'; + +export const NOTIFICATION_REQUESTS_EXPAND_REQUEST = 'NOTIFICATION_REQUESTS_EXPAND_REQUEST'; +export const NOTIFICATION_REQUESTS_EXPAND_SUCCESS = 'NOTIFICATION_REQUESTS_EXPAND_SUCCESS'; +export const NOTIFICATION_REQUESTS_EXPAND_FAIL = 'NOTIFICATION_REQUESTS_EXPAND_FAIL'; + +export const NOTIFICATION_REQUEST_FETCH_REQUEST = 'NOTIFICATION_REQUEST_FETCH_REQUEST'; +export const NOTIFICATION_REQUEST_FETCH_SUCCESS = 'NOTIFICATION_REQUEST_FETCH_SUCCESS'; +export const NOTIFICATION_REQUEST_FETCH_FAIL = 'NOTIFICATION_REQUEST_FETCH_FAIL'; + +export const NOTIFICATION_REQUEST_ACCEPT_REQUEST = 'NOTIFICATION_REQUEST_ACCEPT_REQUEST'; +export const NOTIFICATION_REQUEST_ACCEPT_SUCCESS = 'NOTIFICATION_REQUEST_ACCEPT_SUCCESS'; +export const NOTIFICATION_REQUEST_ACCEPT_FAIL = 'NOTIFICATION_REQUEST_ACCEPT_FAIL'; + +export const NOTIFICATION_REQUEST_DISMISS_REQUEST = 'NOTIFICATION_REQUEST_DISMISS_REQUEST'; +export const NOTIFICATION_REQUEST_DISMISS_SUCCESS = 'NOTIFICATION_REQUEST_DISMISS_SUCCESS'; +export const NOTIFICATION_REQUEST_DISMISS_FAIL = 'NOTIFICATION_REQUEST_DISMISS_FAIL'; + +export const NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST = 'NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST'; +export const NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS = 'NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS'; +export const NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL = 'NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL'; + +export const NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST = 'NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST'; +export const NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS = 'NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS'; +export const NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL = 'NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL'; + defineMessages({ mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' }, group: { id: 'notifications.group', defaultMessage: '{count} notifications' }, @@ -313,3 +345,264 @@ export function setBrowserPermission (value) { value, }; } + +export const fetchNotificationPolicy = () => (dispatch, getState) => { + dispatch(fetchNotificationPolicyRequest()); + + api(getState).get('/api/v1/notifications/policy').then(({ data }) => { + dispatch(fetchNotificationPolicySuccess(data)); + }).catch(err => { + dispatch(fetchNotificationPolicyFail(err)); + }); +}; + +export const fetchNotificationPolicyRequest = () => ({ + type: NOTIFICATION_POLICY_FETCH_REQUEST, +}); + +export const fetchNotificationPolicySuccess = policy => ({ + type: NOTIFICATION_POLICY_FETCH_SUCCESS, + policy, +}); + +export const fetchNotificationPolicyFail = error => ({ + type: NOTIFICATION_POLICY_FETCH_FAIL, + error, +}); + +export const updateNotificationsPolicy = params => (dispatch, getState) => { + dispatch(fetchNotificationPolicyRequest()); + + api(getState).put('/api/v1/notifications/policy', params).then(({ data }) => { + dispatch(fetchNotificationPolicySuccess(data)); + }).catch(err => { + dispatch(fetchNotificationPolicyFail(err)); + }); +}; + +export const fetchNotificationRequests = () => (dispatch, getState) => { + const params = {}; + + if (getState().getIn(['notificationRequests', 'isLoading'])) { + return; + } + + if (getState().getIn(['notificationRequests', 'items'])?.size > 0) { + params.since_id = getState().getIn(['notificationRequests', 'items', 0, 'id']); + } + + dispatch(fetchNotificationRequestsRequest()); + + api(getState).get('/api/v1/notifications/requests', { params }).then(response => { + const next = getLinks(response).refs.find(link => link.rel === 'next'); + dispatch(importFetchedAccounts(response.data.map(x => x.account))); + dispatch(fetchNotificationRequestsSuccess(response.data, next ? next.uri : null)); + }).catch(err => { + dispatch(fetchNotificationRequestsFail(err)); + }); +}; + +export const fetchNotificationRequestsRequest = () => ({ + type: NOTIFICATION_REQUESTS_FETCH_REQUEST, +}); + +export const fetchNotificationRequestsSuccess = (requests, next) => ({ + type: NOTIFICATION_REQUESTS_FETCH_SUCCESS, + requests, + next, +}); + +export const fetchNotificationRequestsFail = error => ({ + type: NOTIFICATION_REQUESTS_FETCH_FAIL, + error, +}); + +export const expandNotificationRequests = () => (dispatch, getState) => { + const url = getState().getIn(['notificationRequests', 'next']); + + if (!url || getState().getIn(['notificationRequests', 'isLoading'])) { + return; + } + + dispatch(expandNotificationRequestsRequest()); + + api(getState).get(url).then(response => { + const next = getLinks(response).refs.find(link => link.rel === 'next'); + dispatch(importFetchedAccounts(response.data.map(x => x.account))); + dispatch(expandNotificationRequestsSuccess(response.data, next?.uri)); + }).catch(err => { + dispatch(expandNotificationRequestsFail(err)); + }); +}; + +export const expandNotificationRequestsRequest = () => ({ + type: NOTIFICATION_REQUESTS_EXPAND_REQUEST, +}); + +export const expandNotificationRequestsSuccess = (requests, next) => ({ + type: NOTIFICATION_REQUESTS_EXPAND_SUCCESS, + requests, + next, +}); + +export const expandNotificationRequestsFail = error => ({ + type: NOTIFICATION_REQUESTS_EXPAND_FAIL, + error, +}); + +export const fetchNotificationRequest = id => (dispatch, getState) => { + const current = getState().getIn(['notificationRequests', 'current']); + + if (current.getIn(['item', 'id']) === id || current.get('isLoading')) { + return; + } + + dispatch(fetchNotificationRequestRequest(id)); + + api(getState).get(`/api/v1/notifications/requests/${id}`).then(({ data }) => { + dispatch(fetchNotificationRequestSuccess(data)); + }).catch(err => { + dispatch(fetchNotificationRequestFail(id, err)); + }); +}; + +export const fetchNotificationRequestRequest = id => ({ + type: NOTIFICATION_REQUEST_FETCH_REQUEST, + id, +}); + +export const fetchNotificationRequestSuccess = request => ({ + type: NOTIFICATION_REQUEST_FETCH_SUCCESS, + request, +}); + +export const fetchNotificationRequestFail = (id, error) => ({ + type: NOTIFICATION_REQUEST_FETCH_FAIL, + id, + error, +}); + +export const acceptNotificationRequest = id => (dispatch, getState) => { + dispatch(acceptNotificationRequestRequest(id)); + + api(getState).post(`/api/v1/notifications/requests/${id}/accept`).then(() => { + dispatch(acceptNotificationRequestSuccess(id)); + }).catch(err => { + dispatch(acceptNotificationRequestFail(id, err)); + }); +}; + +export const acceptNotificationRequestRequest = id => ({ + type: NOTIFICATION_REQUEST_ACCEPT_REQUEST, + id, +}); + +export const acceptNotificationRequestSuccess = id => ({ + type: NOTIFICATION_REQUEST_ACCEPT_SUCCESS, + id, +}); + +export const acceptNotificationRequestFail = (id, error) => ({ + type: NOTIFICATION_REQUEST_ACCEPT_FAIL, + id, + error, +}); + +export const dismissNotificationRequest = id => (dispatch, getState) => { + dispatch(dismissNotificationRequestRequest(id)); + + api(getState).post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{ + dispatch(dismissNotificationRequestSuccess(id)); + }).catch(err => { + dispatch(dismissNotificationRequestFail(id, err)); + }); +}; + +export const dismissNotificationRequestRequest = id => ({ + type: NOTIFICATION_REQUEST_DISMISS_REQUEST, + id, +}); + +export const dismissNotificationRequestSuccess = id => ({ + type: NOTIFICATION_REQUEST_DISMISS_SUCCESS, + id, +}); + +export const dismissNotificationRequestFail = (id, error) => ({ + type: NOTIFICATION_REQUEST_DISMISS_FAIL, + id, + error, +}); + +export const fetchNotificationsForRequest = accountId => (dispatch, getState) => { + const current = getState().getIn(['notificationRequests', 'current']); + const params = { account_id: accountId }; + + if (current.getIn(['item', 'account']) === accountId) { + if (current.getIn(['notifications', 'isLoading'])) { + return; + } + + if (current.getIn(['notifications', 'items'])?.size > 0) { + params.since_id = current.getIn(['notifications', 'items', 0, 'id']); + } + } + + dispatch(fetchNotificationsForRequestRequest()); + + api(getState).get('/api/v1/notifications', { params }).then(response => { + const next = getLinks(response).refs.find(link => link.rel === 'next'); + dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status))); + dispatch(fetchNotificationsForRequestSuccess(response.data, next?.uri)); + }).catch(err => { + dispatch(fetchNotificationsForRequestFail(err)); + }); +}; + +export const fetchNotificationsForRequestRequest = () => ({ + type: NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST, +}); + +export const fetchNotificationsForRequestSuccess = (notifications, next) => ({ + type: NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS, + notifications, + next, +}); + +export const fetchNotificationsForRequestFail = (error) => ({ + type: NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL, + error, +}); + +export const expandNotificationsForRequest = () => (dispatch, getState) => { + const url = getState().getIn(['notificationRequests', 'current', 'notifications', 'next']); + + if (!url || getState().getIn(['notificationRequests', 'current', 'notifications', 'isLoading'])) { + return; + } + + dispatch(expandNotificationsForRequestRequest()); + + api(getState).get(url).then(response => { + const next = getLinks(response).refs.find(link => link.rel === 'next'); + dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status))); + dispatch(expandNotificationsForRequestSuccess(response.data, next?.uri)); + }).catch(err => { + dispatch(expandNotificationsForRequestFail(err)); + }); +}; + +export const expandNotificationsForRequestRequest = () => ({ + type: NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST, +}); + +export const expandNotificationsForRequestSuccess = (notifications, next) => ({ + type: NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS, + notifications, + next, +}); + +export const expandNotificationsForRequestFail = (error) => ({ + type: NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL, + error, +}); diff --git a/app/javascript/mastodon/components/column_header.jsx b/app/javascript/mastodon/components/column_header.jsx index 901888e750..8b7dcebc67 100644 --- a/app/javascript/mastodon/components/column_header.jsx +++ b/app/javascript/mastodon/components/column_header.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent, useCallback } from 'react'; -import { FormattedMessage, injectIntl, defineMessages } from 'react-intl'; +import { FormattedMessage, injectIntl, defineMessages, useIntl } from 'react-intl'; import classNames from 'classnames'; import { withRouter } from 'react-router-dom'; @@ -11,7 +11,7 @@ import ArrowBackIcon from '@/material-icons/400-24px/arrow_back.svg?react'; import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react'; import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; import CloseIcon from '@/material-icons/400-24px/close.svg?react'; -import TuneIcon from '@/material-icons/400-24px/tune.svg?react'; +import SettingsIcon from '@/material-icons/400-24px/settings.svg?react'; import { Icon } from 'mastodon/components/icon'; import { ButtonInTabsBar, useColumnsContext } from 'mastodon/features/ui/util/columns_context'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; @@ -23,10 +23,12 @@ const messages = defineMessages({ hide: { id: 'column_header.hide_settings', defaultMessage: 'Hide settings' }, moveLeft: { id: 'column_header.moveLeft_settings', defaultMessage: 'Move column to the left' }, moveRight: { id: 'column_header.moveRight_settings', defaultMessage: 'Move column to the right' }, + back: { id: 'column_back_button.label', defaultMessage: 'Back' }, }); -const BackButton = ({ pinned, show }) => { +const BackButton = ({ pinned, show, onlyIcon }) => { const history = useAppHistory(); + const intl = useIntl(); const { multiColumn } = useColumnsContext(); const handleBackClick = useCallback(() => { @@ -39,18 +41,20 @@ const BackButton = ({ pinned, show }) => { const showButton = history && !pinned && ((multiColumn && history.location?.state?.fromMastodon) || show); - if(!showButton) return null; - - return (); + if (!showButton) return null; + return ( + + ); }; BackButton.propTypes = { pinned: PropTypes.bool, show: PropTypes.bool, + onlyIcon: PropTypes.bool, }; class ColumnHeader extends PureComponent { @@ -145,27 +149,31 @@ class ColumnHeader extends PureComponent { } if (multiColumn && pinned) { - pinButton = ; + pinButton = ; moveButtons = ( -
+
); } else if (multiColumn && this.props.onPin) { - pinButton = ; + pinButton = ; } - backButton = ; + backButton = ; const collapsedContent = [ extraContent, ]; if (multiColumn) { - collapsedContent.push(pinButton); - collapsedContent.push(moveButtons); + collapsedContent.push( +
+ {pinButton} + {moveButtons} +
+ ); } if (this.context.identity.signedIn && (children || (multiColumn && this.props.onPin))) { @@ -177,7 +185,7 @@ class ColumnHeader extends PureComponent { onClick={this.handleToggleClick} > - + {collapseIssues && } @@ -190,16 +198,19 @@ class ColumnHeader extends PureComponent {

{hasTitle && ( - + <> + {backButton} + + + )} {!hasTitle && backButton}
- {hasTitle && backButton} {extraButton} {collapseButton}
diff --git a/app/javascript/mastodon/features/community_timeline/components/column_settings.jsx b/app/javascript/mastodon/features/community_timeline/components/column_settings.jsx index 69959c1760..15381b589d 100644 --- a/app/javascript/mastodon/features/community_timeline/components/column_settings.jsx +++ b/app/javascript/mastodon/features/community_timeline/components/column_settings.jsx @@ -20,7 +20,7 @@ class ColumnSettings extends PureComponent { const { settings, onChange } = this.props; return ( -
+
} />
diff --git a/app/javascript/mastodon/features/firehose/index.jsx b/app/javascript/mastodon/features/firehose/index.jsx index 6355efbfe0..c65fe48eac 100644 --- a/app/javascript/mastodon/features/firehose/index.jsx +++ b/app/javascript/mastodon/features/firehose/index.jsx @@ -42,15 +42,17 @@ const ColumnSettings = () => { ); return ( -
-
- } - /> -
+
+
+
+ } + /> +
+
); }; diff --git a/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.jsx b/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.jsx index c60de4c518..3412e5d1bd 100644 --- a/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.jsx +++ b/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.jsx @@ -107,28 +107,28 @@ class ColumnSettings extends PureComponent { const { settings, onChange } = this.props; return ( -
-
-
- +
+
+
+ } /> - - - +
+ + + + + +
-
- {this.state.open && ( -
- {this.modeSelect('any')} - {this.modeSelect('all')} - {this.modeSelect('none')} -
- )} - -
- } /> -
+ {this.state.open && ( +
+ {this.modeSelect('any')} + {this.modeSelect('all')} + {this.modeSelect('none')} +
+ )} +
); } diff --git a/app/javascript/mastodon/features/home_timeline/components/column_settings.tsx b/app/javascript/mastodon/features/home_timeline/components/column_settings.tsx index ca09d46c7e..3f0525fe57 100644 --- a/app/javascript/mastodon/features/home_timeline/components/column_settings.tsx +++ b/app/javascript/mastodon/features/home_timeline/components/column_settings.tsx @@ -24,43 +24,36 @@ export const ColumnSettings: React.FC = () => { ); return ( -
- - - +
+
+
+ + } + /> -
- - } - /> -
- -
- - } - /> -
+ + } + /> +
+
); }; diff --git a/app/javascript/mastodon/features/list_timeline/index.jsx b/app/javascript/mastodon/features/list_timeline/index.jsx index 24bf122fac..f640e503c2 100644 --- a/app/javascript/mastodon/features/list_timeline/index.jsx +++ b/app/javascript/mastodon/features/list_timeline/index.jsx @@ -193,35 +193,38 @@ class ListTimeline extends PureComponent { pinned={pinned} multiColumn={multiColumn} > -
- +
+
+ - -
+ + -
- - -
- - { replies_policy !== undefined && ( -
- - - -
- { ['none', 'list', 'followed'].map(policy => ( - - ))} +
+
+ +
-
- )} + + + {replies_policy !== undefined && ( +
+

+ +
+ { ['none', 'list', 'followed'].map(policy => ( + + ))} +
+
+ )} +
{ + const handleChange = useCallback(({ target }) => { + onChange(target.checked); + }, [onChange]); + + return ( + + ); +}; + +CheckboxWithLabel.propTypes = { + checked: PropTypes.bool, + disabled: PropTypes.bool, + children: PropTypes.children, + onChange: PropTypes.func, +}; diff --git a/app/javascript/mastodon/features/notifications/components/column_settings.jsx b/app/javascript/mastodon/features/notifications/components/column_settings.jsx index 09154f257a..2a9425b82b 100644 --- a/app/javascript/mastodon/features/notifications/components/column_settings.jsx +++ b/app/javascript/mastodon/features/notifications/components/column_settings.jsx @@ -7,6 +7,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'mastodon/permissions'; +import { CheckboxWithLabel } from './checkbox_with_label'; import ClearColumnButton from './clear_column_button'; import GrantPermissionButton from './grant_permission_button'; import SettingToggle from './setting_toggle'; @@ -26,18 +27,34 @@ export default class ColumnSettings extends PureComponent { alertsEnabled: PropTypes.bool, browserSupport: PropTypes.bool, browserPermission: PropTypes.string, + notificationPolicy: ImmutablePropTypes.map, + onChangePolicy: PropTypes.func.isRequired, }; onPushChange = (path, checked) => { this.props.onChange(['push', ...path], checked); }; + handleFilterNotFollowing = checked => { + this.props.onChangePolicy('filter_not_following', checked); + }; + + handleFilterNotFollowers = checked => { + this.props.onChangePolicy('filter_not_followers', checked); + }; + + handleFilterNewAccounts = checked => { + this.props.onChangePolicy('filter_new_accounts', checked); + }; + + handleFilterPrivateMentions = checked => { + this.props.onChangePolicy('filter_private_mentions', checked); + }; + render () { - const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission } = this.props; + const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission, notificationPolicy } = this.props; const unreadMarkersShowStr = ; - const filterBarShowStr = ; - const filterAdvancedStr = ; const alertStr = ; const showStr = ; const soundStr = ; @@ -46,48 +63,59 @@ export default class ColumnSettings extends PureComponent { const pushStr = showPushSettings && ; return ( -
+
{alertsEnabled && browserSupport && browserPermission === 'denied' && ( -
- -
+ )} {alertsEnabled && browserSupport && browserPermission === 'default' && ( -
- - - -
+ + + )} -
+
-
+ -
- +
+

+ +
+ + + + + + + + + + + + + + + + + + + +
+
+ +
+

- +

-
+ -
- - - - -
- - -
-
- -
- +
+

@@ -95,10 +123,10 @@ export default class ColumnSettings extends PureComponent {
-
+ -
- +
+

@@ -106,10 +134,10 @@ export default class ColumnSettings extends PureComponent {
-
+ -
- +
+

@@ -117,10 +145,10 @@ export default class ColumnSettings extends PureComponent {
-
+ -
- +
+

@@ -128,10 +156,10 @@ export default class ColumnSettings extends PureComponent {
-
+ -
- +
+

@@ -139,10 +167,10 @@ export default class ColumnSettings extends PureComponent {
-
+ -
- +
+

@@ -150,10 +178,10 @@ export default class ColumnSettings extends PureComponent {
-
+ -
- +
+

@@ -161,10 +189,10 @@ export default class ColumnSettings extends PureComponent {
-
+ -
- +
+

@@ -172,11 +200,11 @@ export default class ColumnSettings extends PureComponent {
-
+ {((this.context.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) && ( -
- +
+

@@ -184,12 +212,12 @@ export default class ColumnSettings extends PureComponent {
-
+ )} {((this.context.identity.permissions & PERMISSION_MANAGE_REPORTS) === PERMISSION_MANAGE_REPORTS) && ( -
- +
+

@@ -197,7 +225,7 @@ export default class ColumnSettings extends PureComponent {
-
+ )}
); diff --git a/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx b/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx new file mode 100644 index 0000000000..dddb9d6412 --- /dev/null +++ b/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx @@ -0,0 +1,49 @@ +import { useEffect } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { Link } from 'react-router-dom'; + +import { useDispatch, useSelector } from 'react-redux'; + + +import ArchiveIcon from '@/material-icons/400-24px/archive.svg?react'; +import { fetchNotificationPolicy } from 'mastodon/actions/notifications'; +import { Icon } from 'mastodon/components/icon'; +import { toCappedNumber } from 'mastodon/utils/numbers'; + +export const FilteredNotificationsBanner = () => { + const dispatch = useDispatch(); + const policy = useSelector(state => state.get('notificationPolicy')); + + useEffect(() => { + dispatch(fetchNotificationPolicy()); + + const interval = setInterval(() => { + dispatch(fetchNotificationPolicy()); + }, 120000); + + return () => { + clearInterval(interval); + }; + }, [dispatch]); + + if (policy === null || policy.getIn(['summary', 'pending_notifications_count']) * 1 === 0) { + return null; + } + + return ( + + + +
+ + +
+ +
+ {toCappedNumber(policy.getIn(['summary', 'pending_notifications_count']))} +
+ + ); +}; diff --git a/app/javascript/mastodon/features/notifications/components/notification_request.jsx b/app/javascript/mastodon/features/notifications/components/notification_request.jsx new file mode 100644 index 0000000000..e24124ca6a --- /dev/null +++ b/app/javascript/mastodon/features/notifications/components/notification_request.jsx @@ -0,0 +1,65 @@ +import PropTypes from 'prop-types'; +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { Link } from 'react-router-dom'; + +import { useSelector, useDispatch } from 'react-redux'; + +import DoneIcon from '@/material-icons/400-24px/done.svg?react'; +import VolumeOffIcon from '@/material-icons/400-24px/volume_off.svg?react'; +import { acceptNotificationRequest, dismissNotificationRequest } from 'mastodon/actions/notifications'; +import { Avatar } from 'mastodon/components/avatar'; +import { IconButton } from 'mastodon/components/icon_button'; +import { makeGetAccount } from 'mastodon/selectors'; +import { toCappedNumber } from 'mastodon/utils/numbers'; + +const getAccount = makeGetAccount(); + +const messages = defineMessages({ + accept: { id: 'notification_requests.accept', defaultMessage: 'Accept' }, + dismiss: { id: 'notification_requests.dismiss', defaultMessage: 'Dismiss' }, +}); + +export const NotificationRequest = ({ id, accountId, notificationsCount }) => { + const dispatch = useDispatch(); + const account = useSelector(state => getAccount(state, accountId)); + const intl = useIntl(); + + const handleDismiss = useCallback(() => { + dispatch(dismissNotificationRequest(id)); + }, [dispatch, id]); + + const handleAccept = useCallback(() => { + dispatch(acceptNotificationRequest(id)); + }, [dispatch, id]); + + return ( +
+ + + +
+
+ + {toCappedNumber(notificationsCount)} +
+ + @{account?.get('acct')} +
+ + +
+ + +
+
+ ); +}; + +NotificationRequest.propTypes = { + id: PropTypes.string.isRequired, + accountId: PropTypes.string.isRequired, + notificationsCount: PropTypes.string.isRequired, +}; diff --git a/app/javascript/mastodon/features/notifications/containers/column_settings_container.js b/app/javascript/mastodon/features/notifications/containers/column_settings_container.js index 1e62ed9a5a..de266160f8 100644 --- a/app/javascript/mastodon/features/notifications/containers/column_settings_container.js +++ b/app/javascript/mastodon/features/notifications/containers/column_settings_container.js @@ -4,7 +4,7 @@ import { connect } from 'react-redux'; import { showAlert } from '../../../actions/alerts'; import { openModal } from '../../../actions/modal'; -import { setFilter, clearNotifications, requestBrowserPermission } from '../../../actions/notifications'; +import { setFilter, clearNotifications, requestBrowserPermission, updateNotificationsPolicy } from '../../../actions/notifications'; import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications'; import { changeSetting } from '../../../actions/settings'; import ColumnSettings from '../components/column_settings'; @@ -21,6 +21,7 @@ const mapStateToProps = state => ({ alertsEnabled: state.getIn(['settings', 'notifications', 'alerts']).includes(true), browserSupport: state.getIn(['notifications', 'browserSupport']), browserPermission: state.getIn(['notifications', 'browserPermission']), + notificationPolicy: state.get('notificationPolicy'), }); const mapDispatchToProps = (dispatch, { intl }) => ({ @@ -73,6 +74,12 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ dispatch(requestBrowserPermission()); }, + onChangePolicy (param, checked) { + dispatch(updateNotificationsPolicy({ + [param]: checked, + })); + }, + }); export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(ColumnSettings)); diff --git a/app/javascript/mastodon/features/notifications/containers/filter_bar_container.js b/app/javascript/mastodon/features/notifications/containers/filter_bar_container.js index 4e0184cef3..e448cd26ad 100644 --- a/app/javascript/mastodon/features/notifications/containers/filter_bar_container.js +++ b/app/javascript/mastodon/features/notifications/containers/filter_bar_container.js @@ -5,7 +5,7 @@ import FilterBar from '../components/filter_bar'; const makeMapStateToProps = state => ({ selectedFilter: state.getIn(['settings', 'notifications', 'quickFilter', 'active']), - advancedMode: state.getIn(['settings', 'notifications', 'quickFilter', 'advanced']), + advancedMode: false, }); const mapDispatchToProps = (dispatch) => ({ diff --git a/app/javascript/mastodon/features/notifications/index.jsx b/app/javascript/mastodon/features/notifications/index.jsx index 30c63ed32a..e062957ff8 100644 --- a/app/javascript/mastodon/features/notifications/index.jsx +++ b/app/javascript/mastodon/features/notifications/index.jsx @@ -33,6 +33,7 @@ import ColumnHeader from '../../components/column_header'; import { LoadGap } from '../../components/load_gap'; import ScrollableList from '../../components/scrollable_list'; +import { FilteredNotificationsBanner } from './components/filtered_notifications_banner'; import NotificationsPermissionBanner from './components/notifications_permission_banner'; import ColumnSettingsContainer from './containers/column_settings_container'; import FilterBarContainer from './containers/filter_bar_container'; @@ -65,7 +66,6 @@ const getNotifications = createSelector([ }); const mapStateToProps = state => ({ - showFilterBar: state.getIn(['settings', 'notifications', 'quickFilter', 'show']), notifications: getNotifications(state), isLoading: state.getIn(['notifications', 'isLoading'], 0) > 0, isUnread: state.getIn(['notifications', 'unread']) > 0 || state.getIn(['notifications', 'pendingItems']).size > 0, @@ -85,7 +85,6 @@ class Notifications extends PureComponent { static propTypes = { columnId: PropTypes.string, notifications: ImmutablePropTypes.list.isRequired, - showFilterBar: PropTypes.bool.isRequired, dispatch: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, isLoading: PropTypes.bool, @@ -188,14 +187,14 @@ class Notifications extends PureComponent { }; render () { - const { intl, notifications, isLoading, isUnread, columnId, multiColumn, hasMore, numPending, showFilterBar, lastReadId, canMarkAsRead, needsNotificationPermission } = this.props; + const { intl, notifications, isLoading, isUnread, columnId, multiColumn, hasMore, numPending, lastReadId, canMarkAsRead, needsNotificationPermission } = this.props; const pinned = !!columnId; const emptyMessage = ; const { signedIn } = this.context.identity; let scrollableContent = null; - const filterBarContainer = (signedIn && showFilterBar) + const filterBarContainer = signedIn ? () : null; @@ -285,6 +284,9 @@ class Notifications extends PureComponent { {filterBarContainer} + + + {scrollContainer} diff --git a/app/javascript/mastodon/features/notifications/request.jsx b/app/javascript/mastodon/features/notifications/request.jsx new file mode 100644 index 0000000000..5977a6ce96 --- /dev/null +++ b/app/javascript/mastodon/features/notifications/request.jsx @@ -0,0 +1,144 @@ +import PropTypes from 'prop-types'; +import { useRef, useCallback, useEffect } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { Helmet } from 'react-helmet'; + +import { useSelector, useDispatch } from 'react-redux'; + +import ArchiveIcon from '@/material-icons/400-24px/archive.svg?react'; +import DoneIcon from '@/material-icons/400-24px/done.svg?react'; +import VolumeOffIcon from '@/material-icons/400-24px/volume_off.svg?react'; +import { fetchNotificationRequest, fetchNotificationsForRequest, expandNotificationsForRequest, acceptNotificationRequest, dismissNotificationRequest } from 'mastodon/actions/notifications'; +import Column from 'mastodon/components/column'; +import ColumnHeader from 'mastodon/components/column_header'; +import { IconButton } from 'mastodon/components/icon_button'; +import ScrollableList from 'mastodon/components/scrollable_list'; + +import NotificationContainer from './containers/notification_container'; + +const messages = defineMessages({ + title: { id: 'notification_requests.notifications_from', defaultMessage: 'Notifications from {name}' }, + accept: { id: 'notification_requests.accept', defaultMessage: 'Accept' }, + dismiss: { id: 'notification_requests.dismiss', defaultMessage: 'Dismiss' }, +}); + +const selectChild = (ref, index, alignTop) => { + const container = ref.current.node; + const element = container.querySelector(`article:nth-of-type(${index + 1}) .focusable`); + + if (element) { + if (alignTop && container.scrollTop > element.offsetTop) { + element.scrollIntoView(true); + } else if (!alignTop && container.scrollTop + container.clientHeight < element.offsetTop + element.offsetHeight) { + element.scrollIntoView(false); + } + + element.focus(); + } +}; + +export const NotificationRequest = ({ multiColumn, params: { id } }) => { + const columnRef = useRef(); + const intl = useIntl(); + const dispatch = useDispatch(); + const notificationRequest = useSelector(state => state.getIn(['notificationRequests', 'current', 'item', 'id']) === id ? state.getIn(['notificationRequests', 'current', 'item']) : null); + const accountId = notificationRequest?.get('account'); + const account = useSelector(state => state.getIn(['accounts', accountId])); + const notifications = useSelector(state => state.getIn(['notificationRequests', 'current', 'notifications', 'items'])); + const isLoading = useSelector(state => state.getIn(['notificationRequests', 'current', 'notifications', 'isLoading'])); + const hasMore = useSelector(state => !!state.getIn(['notificationRequests', 'current', 'notifications', 'next'])); + const removed = useSelector(state => state.getIn(['notificationRequests', 'current', 'removed'])); + + const handleHeaderClick = useCallback(() => { + columnRef.current?.scrollTop(); + }, [columnRef]); + + const handleLoadMore = useCallback(() => { + dispatch(expandNotificationsForRequest()); + }, [dispatch]); + + const handleDismiss = useCallback(() => { + dispatch(dismissNotificationRequest(id)); + }, [dispatch, id]); + + const handleAccept = useCallback(() => { + dispatch(acceptNotificationRequest(id)); + }, [dispatch, id]); + + const handleMoveUp = useCallback(id => { + const elementIndex = notifications.findIndex(item => item !== null && item.get('id') === id) - 1; + selectChild(columnRef, elementIndex, true); + }, [columnRef, notifications]); + + const handleMoveDown = useCallback(id => { + const elementIndex = notifications.findIndex(item => item !== null && item.get('id') === id) + 1; + selectChild(columnRef, elementIndex, false); + }, [columnRef, notifications]); + + useEffect(() => { + dispatch(fetchNotificationRequest(id)); + }, [dispatch, id]); + + useEffect(() => { + if (accountId) { + dispatch(fetchNotificationsForRequest(accountId)); + } + }, [dispatch, accountId]); + + const columnTitle = intl.formatMessage(messages.title, { name: account?.get('display_name') }); + + return ( + + + + + + )} + /> + + + {notifications.map(item => ( + item && + ))} + + + + {columnTitle} + + + + ); +}; + +NotificationRequest.propTypes = { + multiColumn: PropTypes.bool, + params: PropTypes.shape({ + id: PropTypes.string.isRequired, + }), +}; + +export default NotificationRequest; diff --git a/app/javascript/mastodon/features/notifications/requests.jsx b/app/javascript/mastodon/features/notifications/requests.jsx new file mode 100644 index 0000000000..46e3c428a6 --- /dev/null +++ b/app/javascript/mastodon/features/notifications/requests.jsx @@ -0,0 +1,85 @@ +import PropTypes from 'prop-types'; +import { useRef, useCallback, useEffect } from 'react'; + +import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; + +import { Helmet } from 'react-helmet'; + +import { useSelector, useDispatch } from 'react-redux'; + +import ArchiveIcon from '@/material-icons/400-24px/archive.svg?react'; +import { fetchNotificationRequests, expandNotificationRequests } from 'mastodon/actions/notifications'; +import Column from 'mastodon/components/column'; +import ColumnHeader from 'mastodon/components/column_header'; +import ScrollableList from 'mastodon/components/scrollable_list'; + +import { NotificationRequest } from './components/notification_request'; + +const messages = defineMessages({ + title: { id: 'notification_requests.title', defaultMessage: 'Filtered notifications' }, +}); + +export const NotificationRequests = ({ multiColumn }) => { + const columnRef = useRef(); + const intl = useIntl(); + const dispatch = useDispatch(); + const isLoading = useSelector(state => state.getIn(['notificationRequests', 'isLoading'])); + const notificationRequests = useSelector(state => state.getIn(['notificationRequests', 'items'])); + const hasMore = useSelector(state => !!state.getIn(['notificationRequests', 'next'])); + + const handleHeaderClick = useCallback(() => { + columnRef.current?.scrollTop(); + }, [columnRef]); + + const handleLoadMore = useCallback(() => { + dispatch(expandNotificationRequests()); + }, [dispatch]); + + useEffect(() => { + dispatch(fetchNotificationRequests()); + }, [dispatch]); + + return ( + + + + } + > + {notificationRequests.map(request => ( + + ))} + + + + {intl.formatMessage(messages.title)} + + + + ); +}; + +NotificationRequests.propTypes = { + multiColumn: PropTypes.bool, +}; + +export default NotificationRequests; diff --git a/app/javascript/mastodon/features/public_timeline/components/column_settings.jsx b/app/javascript/mastodon/features/public_timeline/components/column_settings.jsx index 1ceec1ba66..c865f1bb02 100644 --- a/app/javascript/mastodon/features/public_timeline/components/column_settings.jsx +++ b/app/javascript/mastodon/features/public_timeline/components/column_settings.jsx @@ -20,11 +20,13 @@ class ColumnSettings extends PureComponent { const { settings, onChange } = this.props; return ( -
-
- } /> - } /> -
+
+
+
+ } /> + } /> +
+
); } diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index da554f684f..34c5dd3025 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -48,6 +48,8 @@ import { DirectTimeline, HashtagTimeline, Notifications, + NotificationRequests, + NotificationRequest, FollowRequests, FavouritedStatuses, BookmarkedStatuses, @@ -203,7 +205,9 @@ class SwitchingColumnsArea extends PureComponent { - + + + diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js index 7b968204be..de9b6b4010 100644 --- a/app/javascript/mastodon/features/ui/util/async-components.js +++ b/app/javascript/mastodon/features/ui/util/async-components.js @@ -189,3 +189,11 @@ export function About () { export function PrivacyPolicy () { return import(/*webpackChunkName: "features/privacy_policy" */'../../privacy_policy'); } + +export function NotificationRequests () { + return import(/*webpackChunkName: "features/notifications/requests" */'../../notifications/requests'); +} + +export function NotificationRequest () { + return import(/*webpackChunkName: "features/notifications/request" */'../../notifications/request'); +} diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 342b4c6e25..aed3a3a600 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -241,6 +241,7 @@ "empty_column.list": "There is nothing in this list yet. When members of this list publish new posts, they will appear here.", "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.notification_requests": "All clear! There is nothing here. When you receive new notifications, they will appear here according to your settings.", "empty_column.notifications": "You don't have any notifications yet. When other people interact with you, you will see it here.", "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Use an existing category or create a new one", "filter_modal.select_filter.title": "Filter this post", "filter_modal.title.status": "Filter a post", + "filtered_notifications_banner.pending_requests": "Notifications from {count, plural, =0 {no} one {one person} other {# people}} you may know", + "filtered_notifications_banner.title": "Filtered notifications", "firehose.all": "All", "firehose.local": "This server", "firehose.remote": "Other servers", @@ -314,7 +317,6 @@ "hashtag.follow": "Follow hashtag", "hashtag.unfollow": "Unfollow hashtag", "hashtags.and_other": "…and {count, plural, other {# more}}", - "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Show boosts", "home.column_settings.show_replies": "Show replies", "home.hide_announcements": "Hide announcements", @@ -440,15 +442,16 @@ "notification.reblog": "{name} boosted your post", "notification.status": "{name} just posted", "notification.update": "{name} edited a post", + "notification_requests.accept": "Accept", + "notification_requests.dismiss": "Dismiss", + "notification_requests.notifications_from": "Notifications from {name}", + "notification_requests.title": "Filtered notifications", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favorites:", - "notifications.column_settings.filter_bar.advanced": "Display all categories", - "notifications.column_settings.filter_bar.category": "Quick filter bar", - "notifications.column_settings.filter_bar.show_bar": "Show filter bar", "notifications.column_settings.follow": "New followers:", "notifications.column_settings.follow_request": "New follow requests:", "notifications.column_settings.mention": "Mentions:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.policy.filter_new_accounts.hint": "Created within the past {days, plural, one {one day} other {# days}}", + "notifications.policy.filter_new_accounts_title": "New accounts", + "notifications.policy.filter_not_followers_hint": "Including people who have been following you fewer than {days, plural, one {one day} other {# days}}", + "notifications.policy.filter_not_followers_title": "People not following you", + "notifications.policy.filter_not_following_hint": "Until you manually approve them", + "notifications.policy.filter_not_following_title": "People you don't follow", + "notifications.policy.filter_private_mentions_hint": "Filtered unless it's in reply to your own mention or if you follow the sender", + "notifications.policy.filter_private_mentions_title": "Unsolicited private mentions", + "notifications.policy.title": "Filter out notifications from…", "notifications_permission_banner.enable": "Enable desktop notifications", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "Never miss a thing", diff --git a/app/javascript/mastodon/reducers/index.ts b/app/javascript/mastodon/reducers/index.ts index ecef633873..51a76d191e 100644 --- a/app/javascript/mastodon/reducers/index.ts +++ b/app/javascript/mastodon/reducers/index.ts @@ -27,6 +27,8 @@ import media_attachments from './media_attachments'; import meta from './meta'; import { modalReducer } from './modal'; import mutes from './mutes'; +import { notificationPolicyReducer } from './notification_policy'; +import { notificationRequestsReducer } from './notification_requests'; import notifications from './notifications'; import picture_in_picture from './picture_in_picture'; import polls from './polls'; @@ -84,6 +86,8 @@ const reducers = { history, tags, followed_tags, + notificationPolicy: notificationPolicyReducer, + notificationRequests: notificationRequestsReducer, }; // We want the root state to be an ImmutableRecord, which is an object with a defined list of keys, diff --git a/app/javascript/mastodon/reducers/notification_policy.js b/app/javascript/mastodon/reducers/notification_policy.js new file mode 100644 index 0000000000..8edb4d12a1 --- /dev/null +++ b/app/javascript/mastodon/reducers/notification_policy.js @@ -0,0 +1,12 @@ +import { fromJS } from 'immutable'; + +import { NOTIFICATION_POLICY_FETCH_SUCCESS } from 'mastodon/actions/notifications'; + +export const notificationPolicyReducer = (state = null, action) => { + switch(action.type) { + case NOTIFICATION_POLICY_FETCH_SUCCESS: + return fromJS(action.policy); + default: + return state; + } +}; diff --git a/app/javascript/mastodon/reducers/notification_requests.js b/app/javascript/mastodon/reducers/notification_requests.js new file mode 100644 index 0000000000..4247062a58 --- /dev/null +++ b/app/javascript/mastodon/reducers/notification_requests.js @@ -0,0 +1,96 @@ +import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable'; + +import { + NOTIFICATION_REQUESTS_EXPAND_REQUEST, + NOTIFICATION_REQUESTS_EXPAND_SUCCESS, + NOTIFICATION_REQUESTS_EXPAND_FAIL, + NOTIFICATION_REQUESTS_FETCH_REQUEST, + NOTIFICATION_REQUESTS_FETCH_SUCCESS, + NOTIFICATION_REQUESTS_FETCH_FAIL, + NOTIFICATION_REQUEST_FETCH_REQUEST, + NOTIFICATION_REQUEST_FETCH_SUCCESS, + NOTIFICATION_REQUEST_FETCH_FAIL, + NOTIFICATION_REQUEST_ACCEPT_REQUEST, + NOTIFICATION_REQUEST_DISMISS_REQUEST, + NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST, + NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS, + NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL, + NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST, + NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS, + NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL, +} from 'mastodon/actions/notifications'; + +import { notificationToMap } from './notifications'; + +const initialState = ImmutableMap({ + items: ImmutableList(), + isLoading: false, + next: null, + current: ImmutableMap({ + isLoading: false, + item: null, + removed: false, + notifications: ImmutableMap({ + items: ImmutableList(), + isLoading: false, + next: null, + }), + }), +}); + +const normalizeRequest = request => fromJS({ + ...request, + account: request.account.id, +}); + +const removeRequest = (state, id) => { + if (state.getIn(['current', 'item', 'id']) === id) { + state = state.setIn(['current', 'removed'], true); + } + + return state.update('items', list => list.filterNot(item => item.get('id') === id)); +}; + +export const notificationRequestsReducer = (state = initialState, action) => { + switch(action.type) { + case NOTIFICATION_REQUESTS_FETCH_SUCCESS: + return state.withMutations(map => { + map.update('items', list => ImmutableList(action.requests.map(normalizeRequest)).concat(list)); + map.set('isLoading', false); + map.update('next', next => next ?? action.next); + }); + case NOTIFICATION_REQUESTS_EXPAND_SUCCESS: + return state.withMutations(map => { + map.update('items', list => list.concat(ImmutableList(action.requests.map(normalizeRequest)))); + map.set('isLoading', false); + map.set('next', action.next); + }); + case NOTIFICATION_REQUESTS_EXPAND_REQUEST: + case NOTIFICATION_REQUESTS_FETCH_REQUEST: + return state.set('isLoading', true); + case NOTIFICATION_REQUESTS_EXPAND_FAIL: + case NOTIFICATION_REQUESTS_FETCH_FAIL: + return state.set('isLoading', false); + case NOTIFICATION_REQUEST_ACCEPT_REQUEST: + case NOTIFICATION_REQUEST_DISMISS_REQUEST: + return removeRequest(state, action.id); + case NOTIFICATION_REQUEST_FETCH_REQUEST: + return state.set('current', initialState.get('current').set('isLoading', true)); + case NOTIFICATION_REQUEST_FETCH_SUCCESS: + return state.update('current', map => map.set('isLoading', false).set('item', normalizeRequest(action.request))); + case NOTIFICATION_REQUEST_FETCH_FAIL: + return state.update('current', map => map.set('isLoading', false)); + case NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST: + case NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST: + return state.setIn(['current', 'notifications', 'isLoading'], true); + case NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS: + return state.updateIn(['current', 'notifications'], map => map.set('isLoading', false).update('items', list => ImmutableList(action.notifications.map(notificationToMap)).concat(list)).update('next', next => next ?? action.next)); + case NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS: + return state.updateIn(['current', 'notifications'], map => map.set('isLoading', false).update('items', list => list.concat(ImmutableList(action.notifications.map(notificationToMap)))).set('next', action.next)); + case NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL: + case NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL: + return state.setIn(['current', 'notifications', 'isLoading'], false); + default: + return state; + } +}; diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js index 2ca301b19a..b1c80b3d4f 100644 --- a/app/javascript/mastodon/reducers/notifications.js +++ b/app/javascript/mastodon/reducers/notifications.js @@ -48,7 +48,7 @@ const initialState = ImmutableMap({ browserPermission: 'default', }); -const notificationToMap = notification => ImmutableMap({ +export const notificationToMap = notification => ImmutableMap({ id: notification.id, type: notification.type, account: notification.account.id, diff --git a/app/javascript/mastodon/utils/numbers.ts b/app/javascript/mastodon/utils/numbers.ts index 0a73061f69..ee2dabf566 100644 --- a/app/javascript/mastodon/utils/numbers.ts +++ b/app/javascript/mastodon/utils/numbers.ts @@ -69,3 +69,11 @@ export function pluralReady( export function roundTo10(num: number): number { return Math.round(num * 0.1) / 0.1; } + +export function toCappedNumber(num: string): string { + if (parseInt(num) > 99) { + return '99+'; + } else { + return num; + } +} diff --git a/app/javascript/material-icons/400-24px/archive-fill.svg b/app/javascript/material-icons/400-24px/archive-fill.svg new file mode 100644 index 0000000000..bb604288f5 --- /dev/null +++ b/app/javascript/material-icons/400-24px/archive-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/archive.svg b/app/javascript/material-icons/400-24px/archive.svg new file mode 100644 index 0000000000..6b72fca4ee --- /dev/null +++ b/app/javascript/material-icons/400-24px/archive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 6d79a843d8..faa775ec4b 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3289,12 +3289,13 @@ $ui-header-height: 55px; border: 0; border-bottom: 1px solid lighten($ui-base-color, 8%); text-align: unset; - padding: 15px; + padding: 13px; margin: 0; z-index: 3; outline: 0; display: flex; align-items: center; + gap: 5px; &:hover { text-decoration: underline; @@ -3304,6 +3305,7 @@ $ui-header-height: 55px; .column-header__back-button { display: flex; align-items: center; + gap: 5px; background: $ui-base-color; border: 0; font-family: inherit; @@ -3311,23 +3313,19 @@ $ui-header-height: 55px; cursor: pointer; white-space: nowrap; font-size: 16px; - padding: 0 5px 0 0; + padding: 13px; z-index: 3; &:hover { text-decoration: underline; } - &:last-child { - padding: 0 15px 0 0; + &.compact { + padding-inline-end: 5px; + flex: 0 0 auto; } } -.column-back-button__icon { - display: inline-block; - margin-inline-end: 5px; -} - .react-toggle { display: inline-block; position: relative; @@ -4013,7 +4011,7 @@ a.status-card { z-index: 2; outline: 0; - & > button { + &__title { display: flex; align-items: center; gap: 5px; @@ -4035,8 +4033,18 @@ a.status-card { } } - & > .column-header__back-button { + .column-header__back-button + &__title { + padding-inline-start: 0; + } + + .column-header__back-button { + flex: 1; color: $highlight-text-color; + + &.compact { + flex: 0 0 auto; + color: $primary-text-color; + } } &.active { @@ -4050,6 +4058,18 @@ a.status-card { &:active { outline: 0; } + + &__advanced-buttons { + display: flex; + justify-content: space-between; + align-items: center; + padding: 16px; + padding-top: 0; + + &:first-child { + padding-top: 16px; + } + } } .column-header__buttons { @@ -4136,7 +4156,6 @@ a.status-card { .column-header__collapsible-inner { background: $ui-base-color; - padding: 15px; } .column-header__setting-btn { @@ -4158,20 +4177,8 @@ a.status-card { } .column-header__setting-arrows { - float: right; - - .column-header__setting-btn { - padding: 5px; - - &:first-child { - padding-inline-end: 7px; - } - - &:last-child { - padding-inline-start: 7px; - margin-inline-start: 5px; - } - } + display: flex; + align-items: center; } .text-btn { @@ -4408,24 +4415,56 @@ a.status-card { text-align: center; } -.column-settings__outer { - background: lighten($ui-base-color, 8%); - padding: 15px; -} +.column-settings { + display: flex; + flex-direction: column; -.column-settings__section { - color: $darker-text-color; - cursor: default; - display: block; - font-weight: 500; - margin-bottom: 10px; -} + &__section { + // FIXME: Legacy + color: $darker-text-color; + cursor: default; + display: block; + font-weight: 500; + } -.column-settings__row--with-margin { - margin-bottom: 15px; + .column-header__links { + margin: 0; + } + + section { + padding: 16px; + border-bottom: 1px solid lighten($ui-base-color, 8%); + + &:last-child { + border-bottom: 0; + } + } + + h3 { + font-size: 16px; + line-height: 24px; + letter-spacing: 0.5px; + font-weight: 500; + color: $primary-text-color; + margin-bottom: 16px; + } + + &__row { + display: flex; + flex-direction: column; + gap: 12px; + } + + .app-form__toggle { + &__toggle > div { + border: 0; + } + } } .column-settings__hashtags { + margin-top: 15px; + .column-settings__row { margin-bottom: 15px; } @@ -4549,16 +4588,13 @@ a.status-card { } .setting-toggle { - display: block; - line-height: 24px; + display: flex; + align-items: center; + gap: 8px; } .setting-toggle__label { color: $darker-text-color; - display: inline-block; - margin-bottom: 14px; - margin-inline-start: 8px; - vertical-align: middle; } .limited-account-hint { @@ -6949,29 +6985,33 @@ a.status-card { background: $ui-base-color; &__column { - padding: 10px 15px; - padding-bottom: 0; + display: flex; + flex-direction: column; + gap: 15px; + padding: 15px; } .radio-button { - display: block; + display: flex; } } .column-settings__row .radio-button { - display: block; + display: flex; } .radio-button { font-size: 14px; position: relative; - display: inline-block; - padding: 6px 0; + display: inline-flex; + align-items: center; line-height: 18px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; + gap: 10px; + color: $secondary-text-color; input[type='radio'], input[type='checkbox'] { @@ -6979,21 +7019,29 @@ a.status-card { } &__input { - display: inline-block; + display: block; position: relative; - border: 1px solid $ui-primary-color; + border: 2px solid $secondary-text-color; box-sizing: border-box; width: 18px; height: 18px; flex: 0 0 auto; - margin-inline-end: 10px; - top: -1px; border-radius: 50%; - vertical-align: middle; &.checked { - border-color: lighten($ui-highlight-color, 4%); - background: lighten($ui-highlight-color, 4%); + border-color: $secondary-text-color; + + &::before { + position: absolute; + left: 2px; + top: 2px; + content: ''; + display: block; + border-radius: 50%; + width: 10px; + height: 10px; + background: $secondary-text-color; + } } } } @@ -9588,3 +9636,110 @@ noscript { } } } + +.filtered-notifications-banner { + display: flex; + align-items: center; + background: $ui-base-color; + border-bottom: 1px solid lighten($ui-base-color, 8%); + padding: 15px; + gap: 15px; + color: $darker-text-color; + text-decoration: none; + + &:hover, + &:active, + &:focus { + color: $secondary-text-color; + + .filtered-notifications-banner__badge { + background: $secondary-text-color; + } + } + + .icon { + width: 24px; + height: 24px; + } + + &__text { + flex: 1 1 auto; + font-style: 14px; + line-height: 20px; + + strong { + font-size: 16px; + line-height: 24px; + display: block; + } + } + + &__badge { + background: $darker-text-color; + color: $ui-base-color; + border-radius: 100px; + padding: 2px 8px; + font-weight: 500; + font-size: 11px; + line-height: 16px; + } +} + +.notification-request { + display: flex; + align-items: center; + gap: 16px; + padding: 15px; + border-bottom: 1px solid lighten($ui-base-color, 8%); + + &__link { + display: flex; + align-items: center; + gap: 12px; + flex: 1 1 auto; + text-decoration: none; + color: inherit; + overflow: hidden; + + .account__avatar { + flex-shrink: 0; + } + } + + &__name { + flex: 1 1 auto; + color: $darker-text-color; + font-style: 14px; + line-height: 20px; + overflow: hidden; + text-overflow: ellipsis; + + &__display-name { + display: flex; + align-items: center; + gap: 6px; + font-size: 16px; + letter-spacing: 0.5px; + line-height: 24px; + color: $secondary-text-color; + } + + .filtered-notifications-banner__badge { + background-color: $highlight-text-color; + border-radius: 4px; + padding: 1px 6px; + } + } + + &__actions { + display: flex; + align-items: center; + gap: 8px; + + .icon-button { + border-radius: 4px; + border: 1px solid lighten($ui-base-color, 8%); + padding: 5px; + } + } +} diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 3ac5c3df95..f6ec44fb53 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -1313,6 +1313,12 @@ code { font-weight: 600; } + .hint { + display: block; + font-size: 14px; + color: $darker-text-color; + } + .recommended { position: absolute; margin: 0 4px; diff --git a/app/models/notification_request.rb b/app/models/notification_request.rb index 7ae7e46d1b..6901b3985b 100644 --- a/app/models/notification_request.rb +++ b/app/models/notification_request.rb @@ -48,6 +48,6 @@ class NotificationRequest < ApplicationRecord private def prepare_notifications_count - self.notifications_count = Notification.where(account: account, from_account: from_account).limit(MAX_MEANINGFUL_COUNT).count + self.notifications_count = Notification.where(account: account, from_account: from_account, filtered: true).limit(MAX_MEANINGFUL_COUNT).count end end diff --git a/config/routes.rb b/config/routes.rb index 51c10a14f6..2ec7494969 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -27,7 +27,7 @@ Rails.application.routes.draw do /public/remote /conversations /lists/(*any) - /notifications + /notifications/(*any) /favourites /bookmarks /pinned diff --git a/config/routes/api.rb b/config/routes/api.rb index 18a247e9fd..07340a6340 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -151,7 +151,7 @@ namespace :api, format: false do end namespace :notifications do - resources :requests, only: :index do + resources :requests, only: [:index, :show] do member do post :accept post :dismiss diff --git a/spec/models/notification_policy_spec.rb b/spec/models/notification_policy_spec.rb index bbfa548cf4..cfd8e85eda 100644 --- a/spec/models/notification_policy_spec.rb +++ b/spec/models/notification_policy_spec.rb @@ -9,7 +9,7 @@ RSpec.describe NotificationPolicy do let(:sender) { Fabricate(:account) } before do - Fabricate.times(2, :notification, account: subject.account, activity: Fabricate(:status, account: sender)) + Fabricate.times(2, :notification, account: subject.account, activity: Fabricate(:status, account: sender), filtered: true) Fabricate(:notification_request, account: subject.account, from_account: sender) subject.summarize! end diff --git a/spec/models/notification_request_spec.rb b/spec/models/notification_request_spec.rb index f4613aaede..07bbc3e0a8 100644 --- a/spec/models/notification_request_spec.rb +++ b/spec/models/notification_request_spec.rb @@ -10,7 +10,7 @@ RSpec.describe NotificationRequest do context 'when there are remaining notifications' do before do - Fabricate(:notification, account: subject.account, activity: Fabricate(:status, account: subject.from_account)) + Fabricate(:notification, account: subject.account, activity: Fabricate(:status, account: subject.from_account), filtered: true) subject.reconsider_existence! end From a38e4241851b71a979200e0090b014d13aae2908 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 11 Mar 2024 11:14:55 -0400 Subject: [PATCH 145/954] Use unchanging github links in docs/comments (#29545) --- .eslintrc.js | 4 ++-- Dockerfile | 2 +- config/initializers/open_redirects.rb | 11 ++++------- lib/mastodon/migration_helpers.rb | 3 ++- spec/config/initializers/rack/attack_spec.rb | 2 +- spec/controllers/.rubocop.yml | 4 ++-- 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index bd818c3ce4..502b9cefed 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -123,7 +123,7 @@ module.exports = defineConfig({ 'react/react-in-jsx-scope': 'off', // not needed with new JSX transform 'react/self-closing-comp': 'error', - // recommended values found in https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/src/index.js + // recommended values found in https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/v6.8.0/src/index.js#L46 'jsx-a11y/accessible-emoji': 'warn', 'jsx-a11y/click-events-have-key-events': 'off', 'jsx-a11y/label-has-associated-control': 'off', @@ -176,7 +176,7 @@ module.exports = defineConfig({ }, ], - // See https://github.com/import-js/eslint-plugin-import/blob/main/config/recommended.js + // See https://github.com/import-js/eslint-plugin-import/blob/v2.29.1/config/recommended.js 'import/extensions': [ 'error', 'always', diff --git a/Dockerfile b/Dockerfile index 119c266b89..facd9b8aa0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,7 +29,7 @@ ARG MASTODON_VERSION_METADATA="" # See: https://docs.joinmastodon.org/admin/config/#rails_serve_static_files ARG RAILS_SERVE_STATIC_FILES="true" # Allow to use YJIT compiler -# See: https://github.com/ruby/ruby/blob/master/doc/yjit/yjit.md +# See: https://github.com/ruby/ruby/blob/v3_2_3/doc/yjit/yjit.md ARG RUBY_YJIT_ENABLE="1" # Timezone used by the Docker container and runtime, change with [--build-arg TZ=Europe/Berlin] ARG TZ="Etc/UTC" diff --git a/config/initializers/open_redirects.rb b/config/initializers/open_redirects.rb index c953a990c6..1c5a66e07d 100644 --- a/config/initializers/open_redirects.rb +++ b/config/initializers/open_redirects.rb @@ -1,10 +1,7 @@ # frozen_string_literal: true -# TODO -# Starting with Rails 7.0, the framework default here is to set this true. -# However, we have a location in devise that redirects where we don't have an -# easy ability to override the method or set a config option, and where the -# redirect does not supply this option itself. -# https://github.com/heartcombo/devise/blob/v4.9.2/app/controllers/devise/confirmations_controller.rb#L28 -# Once a solution is found, this line can be removed. +# TODO: Starting with Rails 7.0, the framework default is true for this setting. +# This location in devise redirects and we can't hook in or override: +# https://github.com/heartcombo/devise/blob/v4.9.3/app/controllers/devise/confirmations_controller.rb#L28 +# When solution is found, this setting can go back to default. Rails.application.config.action_controller.raise_on_open_redirects = false diff --git a/lib/mastodon/migration_helpers.rb b/lib/mastodon/migration_helpers.rb index a713f42d41..9997e42523 100644 --- a/lib/mastodon/migration_helpers.rb +++ b/lib/mastodon/migration_helpers.rb @@ -743,7 +743,8 @@ into similar problems in the future (e.g. when new tables are created). private - # https://github.com/rails/rails/blob/v5.2.0/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb#L678-L684 + # Private method copied from: + # https://github.com/rails/rails/blob/v7.1.3.2/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb#L974-L980 def extract_foreign_key_action(specifier) case specifier when 'c'; :cascade diff --git a/spec/config/initializers/rack/attack_spec.rb b/spec/config/initializers/rack/attack_spec.rb index c9ce9e27d0..e25b7dfde9 100644 --- a/spec/config/initializers/rack/attack_spec.rb +++ b/spec/config/initializers/rack/attack_spec.rb @@ -13,7 +13,7 @@ describe Rack::Attack, type: :request do # to avoid crossing period boundaries. # The code Rack::Attack uses to set periods is the following: - # https://github.com/rack/rack-attack/blob/v6.6.1/lib/rack/attack/cache.rb#L64-L66 + # https://github.com/rack/rack-attack/blob/v6.7.0/lib/rack/attack/cache.rb#L70-L72 # So we want to minimize `Time.now.to_i % period` travel_to Time.zone.at(counter_prefix * period.seconds) diff --git a/spec/controllers/.rubocop.yml b/spec/controllers/.rubocop.yml index 525479be81..51d7c23de1 100644 --- a/spec/controllers/.rubocop.yml +++ b/spec/controllers/.rubocop.yml @@ -1,6 +1,6 @@ inherit_from: ../../.rubocop.yml -# Anonymous controllers in specs cannot access described_class -# https://github.com/rubocop/rubocop-rspec/blob/master/lib/rubocop/cop/rspec/described_class.rb#L36-L39 +# Anonymous controllers in specs cannot access `described_class`, explanation: +# https://github.com/rubocop/rubocop-rspec/blob/v2.26.1/lib/rubocop/cop/rspec/described_class.rb#L36-L56 RSpec/DescribedClass: SkipBlocks: true From 24319836de6046fb2985ec1a24c30ad7d47584d7 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 11 Mar 2024 11:46:25 -0400 Subject: [PATCH 146/954] Convert request-based setup into factory setup in push/subscriptions request spec (#29489) --- .../api/v1/push/subscriptions_spec.rb | 90 ++++++++++++------- 1 file changed, 56 insertions(+), 34 deletions(-) diff --git a/spec/requests/api/v1/push/subscriptions_spec.rb b/spec/requests/api/v1/push/subscriptions_spec.rb index d699fd1e08..700250ee2a 100644 --- a/spec/requests/api/v1/push/subscriptions_spec.rb +++ b/spec/requests/api/v1/push/subscriptions_spec.rb @@ -37,66 +37,88 @@ describe 'API V1 Push Subscriptions' do let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } describe 'POST /api/v1/push/subscription' do - before do - post '/api/v1/push/subscription', params: create_payload, headers: headers - end + subject { post '/api/v1/push/subscription', params: create_payload, headers: headers } - it 'saves push subscriptions' do - push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]) + it 'saves push subscriptions and returns expected JSON' do + subject - expect(push_subscription.endpoint).to eq(create_payload[:subscription][:endpoint]) - expect(push_subscription.key_p256dh).to eq(create_payload[:subscription][:keys][:p256dh]) - expect(push_subscription.key_auth).to eq(create_payload[:subscription][:keys][:auth]) - expect(push_subscription.user_id).to eq user.id - expect(push_subscription.access_token_id).to eq token.id - end + expect(endpoint_push_subscription) + .to have_attributes( + endpoint: eq(create_payload[:subscription][:endpoint]), + key_p256dh: eq(create_payload[:subscription][:keys][:p256dh]), + key_auth: eq(create_payload[:subscription][:keys][:auth]), + user_id: eq(user.id), + access_token_id: eq(token.id) + ) - it 'replaces old subscription on repeat calls' do - post '/api/v1/push/subscription', params: create_payload, headers: headers - - expect(Web::PushSubscription.where(endpoint: create_payload[:subscription][:endpoint]).count).to eq 1 - end - - it 'returns the expected JSON' do expect(body_as_json.with_indifferent_access) .to include( { endpoint: create_payload[:subscription][:endpoint], alerts: {}, policy: 'all' } ) end + + it 'replaces old subscription on repeat calls' do + 2.times { subject } + + expect(endpoint_push_subscriptions.count) + .to eq(1) + end end describe 'PUT /api/v1/push/subscription' do - before do - post '/api/v1/push/subscription', params: create_payload, headers: headers - put '/api/v1/push/subscription', params: alerts_payload, headers: headers - end + subject { put '/api/v1/push/subscription', params: alerts_payload, headers: headers } - it 'changes alert settings' do - push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]) + before { create_subscription_with_token } - expect(push_subscription.data['policy']).to eq(alerts_payload[:data][:policy]) + it 'changes data policy and alert settings and returns expected JSON' do + expect { subject } + .to change { endpoint_push_subscription.reload.data } + .from(nil) + .to(include('policy' => alerts_payload[:data][:policy])) %w(follow follow_request favourite reblog mention poll status).each do |type| - expect(push_subscription.data['alerts'][type]).to eq(alerts_payload[:data][:alerts][type.to_sym].to_s) + expect(endpoint_push_subscription.data['alerts']).to include( + type.to_s => eq(alerts_payload[:data][:alerts][type.to_sym].to_s) + ) end - end - it 'returns the expected JSON' do expect(body_as_json.with_indifferent_access) .to include( - { endpoint: create_payload[:subscription][:endpoint], alerts: alerts_payload[:data][:alerts], policy: alerts_payload[:data][:policy] } + endpoint: create_payload[:subscription][:endpoint], + alerts: alerts_payload[:data][:alerts], + policy: alerts_payload[:data][:policy] ) end end describe 'DELETE /api/v1/push/subscription' do - before do - post '/api/v1/push/subscription', params: create_payload, headers: headers - delete '/api/v1/push/subscription', headers: headers - end + subject { delete '/api/v1/push/subscription', headers: headers } + + before { create_subscription_with_token } it 'removes the subscription' do - expect(Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint])).to be_nil + expect { subject } + .to change { endpoint_push_subscription }.to(nil) end end + + private + + def endpoint_push_subscriptions + Web::PushSubscription.where( + endpoint: create_payload[:subscription][:endpoint] + ) + end + + def endpoint_push_subscription + endpoint_push_subscriptions.first + end + + def create_subscription_with_token + Fabricate( + :web_push_subscription, + endpoint: create_payload[:subscription][:endpoint], + access_token_id: token.id + ) + end end From 216cea1e277530d39eefddbfccb519d2eca72b8b Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 12 Mar 2024 04:38:32 -0400 Subject: [PATCH 147/954] Fix incorrect frequency value in `FriendsOfFriendsSource` data (#29550) --- .../friends_of_friends_source.rb | 12 +++++--- .../friends_of_friends_source_spec.rb | 30 +++++++++++++++---- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/app/models/account_suggestions/friends_of_friends_source.rb b/app/models/account_suggestions/friends_of_friends_source.rb index 0c95d21a3e..b4f549bf31 100644 --- a/app/models/account_suggestions/friends_of_friends_source.rb +++ b/app/models/account_suggestions/friends_of_friends_source.rb @@ -2,15 +2,19 @@ class AccountSuggestions::FriendsOfFriendsSource < AccountSuggestions::Source def get(account, limit: DEFAULT_LIMIT) + source_query(account, limit: limit) + .map { |id, _frequency, _followers_count| [id, key] } + end + + def source_query(account, limit: DEFAULT_LIMIT) first_degree = account.following.where.not(hide_collections: true).select(:id).reorder(nil) base_account_scope(account) .joins(:account_stat) - .where(id: Follow.where(account_id: first_degree).select(:target_account_id)) + .joins(:passive_relationships).where(passive_relationships: { account_id: first_degree }) .group('accounts.id, account_stats.id') - .reorder('frequency DESC, followers_count DESC') + .reorder(frequency: :desc, followers_count: :desc) .limit(limit) - .pluck(Arel.sql('accounts.id, COUNT(*) AS frequency')) - .map { |id, _frequency| [id, key] } + .pluck(Arel.sql('accounts.id, COUNT(*) AS frequency, followers_count')) end private diff --git a/spec/models/account_suggestions/friends_of_friends_source_spec.rb b/spec/models/account_suggestions/friends_of_friends_source_spec.rb index 56a974add5..d7915985f8 100644 --- a/spec/models/account_suggestions/friends_of_friends_source_spec.rb +++ b/spec/models/account_suggestions/friends_of_friends_source_spec.rb @@ -11,9 +11,9 @@ RSpec.describe AccountSuggestions::FriendsOfFriendsSource do let!(:eve) { Fabricate(:account, discoverable: true, hide_collections: false) } let!(:mallory) { Fabricate(:account, discoverable: false, hide_collections: false) } let!(:eugen) { Fabricate(:account, discoverable: true, hide_collections: false) } + let!(:neil) { Fabricate(:account, discoverable: true, hide_collections: false) } let!(:john) { Fabricate(:account, discoverable: true, hide_collections: false) } let!(:jerk) { Fabricate(:account, discoverable: true, hide_collections: false) } - let!(:neil) { Fabricate(:account, discoverable: true, hide_collections: false) } let!(:larry) { Fabricate(:account, discoverable: true, hide_collections: false) } context 'with follows and blocks' do @@ -70,13 +70,31 @@ RSpec.describe AccountSuggestions::FriendsOfFriendsSource do end it 'returns eligible accounts in the expected order' do - expect(subject.get(bob)).to eq [ - [eugen.id, :friends_of_friends], # followed by 2 friends, 3 followers total - [john.id, :friends_of_friends], # followed by 2 friends, 2 followers total - [neil.id, :friends_of_friends], # followed by 1 friend, 2 followers total - [jerk.id, :friends_of_friends], # followed by 1 friend, 1 follower total + expect(subject.get(bob)).to eq expected_results + end + + it 'contains correct underlying source data' do + expect(source_query_values) + .to contain_exactly( + [eugen.id, 2, 3], # Followed by 2 friends of bob (eve, mallory), 3 followers total (breaks tie) + [john.id, 2, 2], # Followed by 2 friends of bob (eve, mallory), 2 followers total + [neil.id, 1, 2], # Followed by 1 friends of bob (mallory), 2 followers total (breaks tie) + [jerk.id, 1, 1] # Followed by 1 friends of bob (eve), 1 followers total + ) + end + + def expected_results + [ + [eugen.id, :friends_of_friends], + [john.id, :friends_of_friends], + [neil.id, :friends_of_friends], + [jerk.id, :friends_of_friends], ] end + + def source_query_values + subject.source_query(bob).to_a + end end end end From dc36b961aa1bb293c5f78cd8382033d9e143c4f5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 10:03:51 +0100 Subject: [PATCH 148/954] New Crowdin Translations (automated) (#29554) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/an.json | 4 --- app/javascript/mastodon/locales/ar.json | 4 --- app/javascript/mastodon/locales/ast.json | 4 --- app/javascript/mastodon/locales/be.json | 4 --- app/javascript/mastodon/locales/bg.json | 6 ++--- app/javascript/mastodon/locales/bn.json | 3 --- app/javascript/mastodon/locales/br.json | 5 +--- app/javascript/mastodon/locales/ca.json | 20 ++++++++++++--- app/javascript/mastodon/locales/ckb.json | 4 --- app/javascript/mastodon/locales/co.json | 3 --- app/javascript/mastodon/locales/cs.json | 4 --- app/javascript/mastodon/locales/cy.json | 4 --- app/javascript/mastodon/locales/da.json | 19 +++++++++++--- app/javascript/mastodon/locales/de.json | 20 ++++++++++++--- app/javascript/mastodon/locales/el.json | 4 --- app/javascript/mastodon/locales/en-GB.json | 4 --- app/javascript/mastodon/locales/eo.json | 4 --- app/javascript/mastodon/locales/es-AR.json | 20 ++++++++++++--- app/javascript/mastodon/locales/es-MX.json | 20 ++++++++++++--- app/javascript/mastodon/locales/es.json | 20 ++++++++++++--- app/javascript/mastodon/locales/et.json | 4 --- app/javascript/mastodon/locales/eu.json | 20 ++++++++++++--- app/javascript/mastodon/locales/fa.json | 4 --- app/javascript/mastodon/locales/fi.json | 4 --- app/javascript/mastodon/locales/fo.json | 20 ++++++++++++--- app/javascript/mastodon/locales/fr-CA.json | 4 --- app/javascript/mastodon/locales/fr.json | 4 --- app/javascript/mastodon/locales/fy.json | 4 --- app/javascript/mastodon/locales/ga.json | 4 --- app/javascript/mastodon/locales/gd.json | 4 --- app/javascript/mastodon/locales/gl.json | 4 --- app/javascript/mastodon/locales/he.json | 20 ++++++++++++--- app/javascript/mastodon/locales/hi.json | 3 --- app/javascript/mastodon/locales/hr.json | 3 --- app/javascript/mastodon/locales/hu.json | 20 ++++++++++++--- app/javascript/mastodon/locales/hy.json | 4 --- app/javascript/mastodon/locales/ia.json | 1 - app/javascript/mastodon/locales/id.json | 4 --- app/javascript/mastodon/locales/ie.json | 4 --- app/javascript/mastodon/locales/io.json | 4 --- app/javascript/mastodon/locales/is.json | 20 ++++++++++++--- app/javascript/mastodon/locales/it.json | 20 ++++++++++++--- app/javascript/mastodon/locales/ja.json | 4 --- app/javascript/mastodon/locales/ka.json | 1 - app/javascript/mastodon/locales/kab.json | 3 --- app/javascript/mastodon/locales/kk.json | 3 --- app/javascript/mastodon/locales/ko.json | 19 ++++++++++---- app/javascript/mastodon/locales/ku.json | 4 --- app/javascript/mastodon/locales/kw.json | 3 --- app/javascript/mastodon/locales/lad.json | 9 ++++--- app/javascript/mastodon/locales/lt.json | 4 --- app/javascript/mastodon/locales/lv.json | 4 --- app/javascript/mastodon/locales/mk.json | 1 - app/javascript/mastodon/locales/ml.json | 2 -- app/javascript/mastodon/locales/mr.json | 1 - app/javascript/mastodon/locales/ms.json | 4 --- app/javascript/mastodon/locales/my.json | 4 --- app/javascript/mastodon/locales/nl.json | 20 ++++++++++++--- app/javascript/mastodon/locales/nn.json | 4 --- app/javascript/mastodon/locales/no.json | 4 --- app/javascript/mastodon/locales/oc.json | 4 --- app/javascript/mastodon/locales/pa.json | 1 - app/javascript/mastodon/locales/pl.json | 20 ++++++++++++--- app/javascript/mastodon/locales/pt-BR.json | 4 --- app/javascript/mastodon/locales/pt-PT.json | 17 ++++++++++--- app/javascript/mastodon/locales/ro.json | 4 --- app/javascript/mastodon/locales/ru.json | 4 --- app/javascript/mastodon/locales/sa.json | 4 --- app/javascript/mastodon/locales/sc.json | 3 --- app/javascript/mastodon/locales/sco.json | 4 --- app/javascript/mastodon/locales/si.json | 4 --- app/javascript/mastodon/locales/sk.json | 4 --- app/javascript/mastodon/locales/sl.json | 17 ++++++++++--- app/javascript/mastodon/locales/sq.json | 4 --- app/javascript/mastodon/locales/sr-Latn.json | 4 --- app/javascript/mastodon/locales/sr.json | 4 --- app/javascript/mastodon/locales/sv.json | 7 +++--- app/javascript/mastodon/locales/ta.json | 3 --- app/javascript/mastodon/locales/te.json | 3 --- app/javascript/mastodon/locales/th.json | 18 +++++++++++--- app/javascript/mastodon/locales/tr.json | 4 --- app/javascript/mastodon/locales/tt.json | 1 - app/javascript/mastodon/locales/uk.json | 9 ++++--- app/javascript/mastodon/locales/ur.json | 2 -- app/javascript/mastodon/locales/uz.json | 1 - app/javascript/mastodon/locales/vi.json | 4 --- app/javascript/mastodon/locales/zh-CN.json | 20 ++++++++++++--- app/javascript/mastodon/locales/zh-HK.json | 4 --- app/javascript/mastodon/locales/zh-TW.json | 26 ++++++++++++++------ config/locales/doorkeeper.zh-TW.yml | 2 +- config/locales/lt.yml | 8 +++--- config/locales/lv.yml | 2 +- config/locales/simple_form.bg.yml | 2 ++ config/locales/simple_form.br.yml | 1 + config/locales/simple_form.ca.yml | 2 ++ config/locales/simple_form.cy.yml | 2 ++ config/locales/simple_form.da.yml | 2 ++ config/locales/simple_form.de.yml | 2 ++ config/locales/simple_form.es-AR.yml | 2 ++ config/locales/simple_form.es-MX.yml | 2 ++ config/locales/simple_form.es.yml | 2 ++ config/locales/simple_form.eu.yml | 2 ++ config/locales/simple_form.fo.yml | 2 ++ config/locales/simple_form.fy.yml | 2 ++ config/locales/simple_form.gd.yml | 2 ++ config/locales/simple_form.gl.yml | 2 ++ config/locales/simple_form.he.yml | 2 ++ config/locales/simple_form.hu.yml | 2 ++ config/locales/simple_form.is.yml | 2 ++ config/locales/simple_form.it.yml | 2 ++ config/locales/simple_form.ko.yml | 2 ++ config/locales/simple_form.lad.yml | 1 + config/locales/simple_form.lt.yml | 3 +++ config/locales/simple_form.nl.yml | 2 ++ config/locales/simple_form.nn.yml | 2 ++ config/locales/simple_form.pl.yml | 2 ++ config/locales/simple_form.pt-PT.yml | 2 ++ config/locales/simple_form.sl.yml | 2 ++ config/locales/simple_form.sq.yml | 2 ++ config/locales/simple_form.sr-Latn.yml | 1 + config/locales/simple_form.sr.yml | 1 + config/locales/simple_form.sv.yml | 1 + config/locales/simple_form.th.yml | 2 ++ config/locales/simple_form.uk.yml | 2 ++ config/locales/simple_form.vi.yml | 2 ++ config/locales/simple_form.zh-CN.yml | 2 ++ config/locales/simple_form.zh-TW.yml | 6 +++-- config/locales/zh-TW.yml | 2 +- 128 files changed, 404 insertions(+), 333 deletions(-) diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json index e9d609a1ce..bf3a1a43a9 100644 --- a/app/javascript/mastodon/locales/an.json +++ b/app/javascript/mastodon/locales/an.json @@ -253,7 +253,6 @@ "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "hashtag.follow": "Seguir etiqueta", "hashtag.unfollow": "Deixar de seguir etiqueta", - "home.column_settings.basic": "Basico", "home.column_settings.show_reblogs": "Amostrar retutz", "home.column_settings.show_replies": "Amostrar respuestas", "home.hide_announcements": "Amagar anuncios", @@ -363,9 +362,6 @@ "notifications.column_settings.admin.report": "Nuevos informes:", "notifications.column_settings.admin.sign_up": "Nuevos rechistros:", "notifications.column_settings.alert": "Notificacions d'escritorio", - "notifications.column_settings.filter_bar.advanced": "Amostrar totas las categorías", - "notifications.column_settings.filter_bar.category": "Barra de filtrau rapido", - "notifications.column_settings.filter_bar.show_bar": "Amostrar barra de filtros", "notifications.column_settings.follow": "Nuevos seguidores:", "notifications.column_settings.follow_request": "Nuevas solicitutz de seguimiento:", "notifications.column_settings.mention": "Mencions:", diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 914c15ad95..38653b4a34 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -314,7 +314,6 @@ "hashtag.follow": "اتبع الوسم", "hashtag.unfollow": "ألغِ متابعة الوسم", "hashtags.and_other": "…و {count, plural, zero {} one {# واحد آخر} two {# اثنان آخران} few {# آخرون} many {# آخَرًا}other {# آخرون}}", - "home.column_settings.basic": "الأساسية", "home.column_settings.show_reblogs": "اعرض المعاد نشرها", "home.column_settings.show_replies": "اعرض الردود", "home.hide_announcements": "إخفاء الإعلانات", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "التسجيلات الجديدة:", "notifications.column_settings.alert": "إشعارات سطح المكتب", "notifications.column_settings.favourite": "المفضلة:", - "notifications.column_settings.filter_bar.advanced": "اعرض كافة الفئات", - "notifications.column_settings.filter_bar.category": "شريط الفلترة السريعة", - "notifications.column_settings.filter_bar.show_bar": "إظهار شريط التصفية", "notifications.column_settings.follow": "متابعُون جُدُد:", "notifications.column_settings.follow_request": "الطلبات الجديد لِمتابَعتك:", "notifications.column_settings.mention": "الإشارات:", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 8e69d434b4..76fa44202d 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -221,7 +221,6 @@ "hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}", "hashtag.follow": "Siguir a la etiqueta", "hashtag.unfollow": "Dexar de siguir a la etiqueta", - "home.column_settings.basic": "Configuración básica", "home.column_settings.show_reblogs": "Amosar los artículos compartíos", "home.column_settings.show_replies": "Amosar les rempuestes", "home.pending_critical_update.body": "¡Anueva'l sirvidor de Mastodon namás que puedas!", @@ -311,9 +310,6 @@ "notifications.clear": "Borrar los avisos", "notifications.column_settings.admin.report": "Informes nuevos:", "notifications.column_settings.admin.sign_up": "Rexistros nuevos:", - "notifications.column_settings.filter_bar.advanced": "Amosar toles categoríes", - "notifications.column_settings.filter_bar.category": "Barra de peñera rápida", - "notifications.column_settings.filter_bar.show_bar": "Amosar la barra de peñera", "notifications.column_settings.follow": "Siguidores nuevos:", "notifications.column_settings.follow_request": "Solicitúes de siguimientu nueves:", "notifications.column_settings.mention": "Menciones:", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index c0b744fbaf..bbe21f0569 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -314,7 +314,6 @@ "hashtag.follow": "Падпісацца на хэштэг", "hashtag.unfollow": "Адпісацца ад хэштэга", "hashtags.and_other": "…і яшчэ {count, plural, other {#}}", - "home.column_settings.basic": "Асноўныя", "home.column_settings.show_reblogs": "Паказаць пашырэнні", "home.column_settings.show_replies": "Паказваць адказы", "home.hide_announcements": "Схаваць аб'явы", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Новыя ўваходы:", "notifications.column_settings.alert": "Апавяшчэнні на працоўным стале", "notifications.column_settings.favourite": "Упадабанае:", - "notifications.column_settings.filter_bar.advanced": "Паказваць усе катэгорыі", - "notifications.column_settings.filter_bar.category": "Панэль хуткай фільтрацыі", - "notifications.column_settings.filter_bar.show_bar": "Паказваць панэль фільтрацыі", "notifications.column_settings.follow": "Новыя падпісчыкі:", "notifications.column_settings.follow_request": "Новыя запыты на падпіску:", "notifications.column_settings.mention": "Згадванні:", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 93823496b7..ab3eda9cd3 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -314,7 +314,6 @@ "hashtag.follow": "Следване на хаштаг", "hashtag.unfollow": "Спиране на следване на хаштаг", "hashtags.and_other": "…и {count, plural, other {# още}}", - "home.column_settings.basic": "Основно", "home.column_settings.show_reblogs": "Показване на подсилванията", "home.column_settings.show_replies": "Показване на отговорите", "home.hide_announcements": "Скриване на оповестяванията", @@ -440,15 +439,13 @@ "notification.reblog": "{name} подсили ваша публикация", "notification.status": "{name} току-що публикува", "notification.update": "{name} промени публикация", + "notification_requests.notifications_from": "Известия от {name}", "notifications.clear": "Изчистване на известията", "notifications.clear_confirmation": "Наистина ли искате да изчистите завинаги всичките си известия?", "notifications.column_settings.admin.report": "Нови доклади:", "notifications.column_settings.admin.sign_up": "Нови регистрации:", "notifications.column_settings.alert": "Известия на работния плот", "notifications.column_settings.favourite": "Любими:", - "notifications.column_settings.filter_bar.advanced": "Показване на всички категории", - "notifications.column_settings.filter_bar.category": "Лента за бърз филтър", - "notifications.column_settings.filter_bar.show_bar": "Показване на лентата с филтри", "notifications.column_settings.follow": "Нови последователи:", "notifications.column_settings.follow_request": "Нови заявки за последване:", "notifications.column_settings.mention": "Споменавания:", @@ -474,6 +471,7 @@ "notifications.permission_denied": "Известията на работния плот не са налични поради предварително отказана заявка за разрешение в браузъра", "notifications.permission_denied_alert": "Известията на работния плот не могат да се включат, тъй като разрешението на браузъра е отказвано преди", "notifications.permission_required": "Известията на работния плот ги няма, щото няма дадено нужното позволение.", + "notifications.policy.filter_new_accounts_title": "Нови акаунти", "notifications_permission_banner.enable": "Включване на известията на работния плот", "notifications_permission_banner.how_to_control": "За да получавате известия, когато Mastodon не е отворен, включете известията на работния плот. Може да управлявате точно кои видове взаимодействия пораждат известия на работния плот чрез бутона {icon} по-горе, след като бъдат включени.", "notifications_permission_banner.title": "Никога не пропускайте нищо", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index 508caa2f42..85f1598889 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -248,7 +248,6 @@ "hashtag.column_settings.tag_mode.any": "এর ভেতরে যেকোনোটা", "hashtag.column_settings.tag_mode.none": "এগুলোর একটাও না", "hashtag.column_settings.tag_toggle": "আরো ট্যাগ এই কলামে যুক্ত করতে", - "home.column_settings.basic": "সাধারণ", "home.column_settings.show_reblogs": "সমর্থনগুলো দেখান", "home.column_settings.show_replies": "মতামত দেখান", "home.hide_announcements": "ঘোষণা লুকান", @@ -338,8 +337,6 @@ "notifications.clear_confirmation": "আপনি কি নির্চিত প্রজ্ঞাপনগুলো মুছে ফেলতে চান ?", "notifications.column_settings.alert": "কম্পিউটারে প্রজ্ঞাপনগুলি", "notifications.column_settings.favourite": "পছন্দসমূহ:", - "notifications.column_settings.filter_bar.advanced": "সব শ্রেণীগুলো দেখানো", - "notifications.column_settings.filter_bar.category": "সংক্ষিপ্ত ছাঁকনি অংশ", "notifications.column_settings.follow": "নতুন অনুসরণকারীরা:", "notifications.column_settings.follow_request": "অনুসরণের অনুরোধগুলি:", "notifications.column_settings.mention": "প্রজ্ঞাপনগুলো:", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index 3b376ac470..9e0979641e 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -289,7 +289,6 @@ "hashtag.follow": "Heuliañ ar ger-klik", "hashtag.unfollow": "Paouez heuliañ an hashtag", "hashtags.and_other": "…{count, plural, one {hag # all} other {ha # all}}", - "home.column_settings.basic": "Diazez", "home.column_settings.show_reblogs": "Diskouez ar skignadennoù", "home.column_settings.show_replies": "Diskouez ar respontoù", "home.hide_announcements": "Kuzhat ar c'hemennoù", @@ -410,9 +409,6 @@ "notifications.column_settings.admin.sign_up": "Enskrivadurioù nevez :", "notifications.column_settings.alert": "Kemennoù war ar burev", "notifications.column_settings.favourite": "Muiañ-karet:", - "notifications.column_settings.filter_bar.advanced": "Skrammañ an-holl rummadoù", - "notifications.column_settings.filter_bar.category": "Barrenn siloù prim", - "notifications.column_settings.filter_bar.show_bar": "Diskouezh barrenn siloù", "notifications.column_settings.follow": "Heulierien nevez:", "notifications.column_settings.follow_request": "Pedadoù heuliañ nevez :", "notifications.column_settings.mention": "Menegoù:", @@ -438,6 +434,7 @@ "notifications.permission_denied": "Kemennoù war ar burev n'int ket hegerz rak pedadenn aotren ar merdeer a zo bet nullet araok", "notifications.permission_denied_alert": "Kemennoù wa ar burev na c'hellont ket bezañ lezelet, rak aotre ar merdeer a zo bet nac'het a-raok", "notifications.permission_required": "Kemennoù war ar burev n'int ket hegerz abalamour d'an aotre rekis n'eo ket bet roet.", + "notifications.policy.filter_new_accounts_title": "Kontoù nevez", "notifications_permission_banner.enable": "Lezel kemennoù war ar burev", "notifications_permission_banner.how_to_control": "Evit reseviñ kemennoù pa ne vez ket digoret Mastodon, lezelit kemennoù war ar burev. Gallout a rit kontrollañ peseurt eskemmoù a c'henel kemennoù war ar burev gant ar {icon} nozelenn a-us kentre ma'z int lezelet.", "notifications_permission_banner.title": "Na vankit netra morse", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 2345424728..0c237ccda0 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -241,6 +241,7 @@ "empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres facin nous tuts, apareixeran aquí.", "empty_column.lists": "Encara no tens cap llista. Quan en facis una, apareixerà aquí.", "empty_column.mutes": "Encara no has silenciat cap usuari.", + "empty_column.notification_requests": "Tot net, ja no hi ha res aquí! Quan rebeu notificacions noves, segons la vostra configuració, apareixeran aquí.", "empty_column.notifications": "Encara no tens notificacions. Quan altre gent interactuï amb tu, les veuràs aquí.", "empty_column.public": "Aquí no hi ha res! Escriu públicament alguna cosa o segueix manualment usuaris d'altres servidors per omplir-ho", "error.unexpected_crash.explanation": "A causa d'un error en el nostre codi o d'un problema de compatibilitat amb el navegador, aquesta pàgina no s'ha pogut mostrar correctament.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Usa una categoria existent o crea'n una de nova", "filter_modal.select_filter.title": "Filtra aquest tut", "filter_modal.title.status": "Filtra un tut", + "filtered_notifications_banner.pending_requests": "Notificacions de {count, plural, =0 {no} one {una persona} other {# persones}} que potser coneixeu", + "filtered_notifications_banner.title": "Notificacions filtrades", "firehose.all": "Tots", "firehose.local": "Aquest servidor", "firehose.remote": "Altres servidors", @@ -314,7 +317,6 @@ "hashtag.follow": "Segueix l'etiqueta", "hashtag.unfollow": "Deixa de seguir l'etiqueta", "hashtags.and_other": "…i {count, plural, other {# més}}", - "home.column_settings.basic": "Bàsic", "home.column_settings.show_reblogs": "Mostra els impulsos", "home.column_settings.show_replies": "Mostra les respostes", "home.hide_announcements": "Amaga els anuncis", @@ -440,15 +442,16 @@ "notification.reblog": "{name} t'ha impulsat", "notification.status": "{name} acaba de publicar", "notification.update": "{name} ha editat un tut", + "notification_requests.accept": "Accepta", + "notification_requests.dismiss": "Ignora", + "notification_requests.notifications_from": "Notificacions de {name}", + "notification_requests.title": "Notificacions filtrades", "notifications.clear": "Esborra les notificacions", "notifications.clear_confirmation": "Segur que vols esborrar permanentment totes les teves notificacions?", "notifications.column_settings.admin.report": "Nous informes:", "notifications.column_settings.admin.sign_up": "Registres nous:", "notifications.column_settings.alert": "Notificacions d'escriptori", "notifications.column_settings.favourite": "Favorits:", - "notifications.column_settings.filter_bar.advanced": "Mostra totes les categories", - "notifications.column_settings.filter_bar.category": "Barra ràpida de filtres", - "notifications.column_settings.filter_bar.show_bar": "Mostra la barra de filtres", "notifications.column_settings.follow": "Nous seguidors:", "notifications.column_settings.follow_request": "Noves sol·licituds de seguiment:", "notifications.column_settings.mention": "Mencions:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "Les notificacions d’escriptori no estan disponibles perquè prèviament s’ha denegat el permís al navegador", "notifications.permission_denied_alert": "No es poden activar les notificacions de l'escriptori perquè abans s'ha denegat el permís del navegador", "notifications.permission_required": "Les notificacions d'escriptori no estan disponibles perquè el permís requerit no ha estat concedit.", + "notifications.policy.filter_new_accounts.hint": "Creat durant els passats {days, plural, one {un dia} other {# dies}}", + "notifications.policy.filter_new_accounts_title": "Comptes nous", + "notifications.policy.filter_not_followers_hint": "Incloent les persones que us segueixen fa menys de {days, plural, one {un dia} other {# dies}}", + "notifications.policy.filter_not_followers_title": "Persones que no us segueixen", + "notifications.policy.filter_not_following_hint": "Fins que no ho aproveu de forma manual", + "notifications.policy.filter_not_following_title": "Persones que no seguiu", + "notifications.policy.filter_private_mentions_hint": "Filtra-ho excepte si és en resposta a una menció vostra o si seguiu el remitent", + "notifications.policy.filter_private_mentions_title": "Mencions privades no sol·licitades", + "notifications.policy.title": "Filtra les notificacions de…", "notifications_permission_banner.enable": "Activa les notificacions d’escriptori", "notifications_permission_banner.how_to_control": "Per a rebre notificacions quan Mastodon no és obert cal activar les notificacions d’escriptori. Pots controlar amb precisió quins tipus d’interaccions generen notificacions d’escriptori després d’activar el botó {icon} de dalt.", "notifications_permission_banner.title": "No et perdis mai res", diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json index 62195b72dc..a78a45c8de 100644 --- a/app/javascript/mastodon/locales/ckb.json +++ b/app/javascript/mastodon/locales/ckb.json @@ -300,7 +300,6 @@ "hashtag.counter_by_accounts": "{count, plural, one {{counter} participant} other {{counter} participants}}", "hashtag.follow": "شوێنکەوتنی هاشتاگ", "hashtag.unfollow": "شوێن نەکەوتنی هاشتاگ", - "home.column_settings.basic": "بنەڕەتی", "home.column_settings.show_reblogs": "پیشاندانی بەهێزکردن", "home.column_settings.show_replies": "وەڵامدانەوەکان پیشان بدە", "home.hide_announcements": "شاردنەوەی راگەیەنراوەکان", @@ -412,9 +411,6 @@ "notifications.column_settings.admin.report": "ڕاپۆرتە نوێیەکان:", "notifications.column_settings.admin.sign_up": "چوونەژوورەوەی نوێ:", "notifications.column_settings.alert": "ئاگانامەکانی پیشانگەرر ڕومێزی", - "notifications.column_settings.filter_bar.advanced": "هەموو پۆلەکان پیشان بدە", - "notifications.column_settings.filter_bar.category": "شریتی پاڵێوەری خێرا", - "notifications.column_settings.filter_bar.show_bar": "نیشاندانی شریتی پاڵافتن", "notifications.column_settings.follow": "شوێنکەوتوانی نوێ:", "notifications.column_settings.follow_request": "شوینکەوتنی داواکاری نوێ:", "notifications.column_settings.mention": "ئاماژەکان:", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 9d0b0306c8..e547382a7c 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -167,7 +167,6 @@ "hashtag.column_settings.tag_mode.any": "Unu di quessi", "hashtag.column_settings.tag_mode.none": "Nisunu di quessi", "hashtag.column_settings.tag_toggle": "Inchjude tag addiziunali per sta colonna", - "home.column_settings.basic": "Bàsichi", "home.column_settings.show_reblogs": "Vede e spartere", "home.column_settings.show_replies": "Vede e risposte", "home.hide_announcements": "Piattà annunzii", @@ -258,8 +257,6 @@ "notifications.clear": "Purgà e nutificazione", "notifications.clear_confirmation": "Site sicuru·a che vulete toglie tutte ste nutificazione?", "notifications.column_settings.alert": "Nutificazione nant'à l'urdinatore", - "notifications.column_settings.filter_bar.advanced": "Affissà tutte e categurie", - "notifications.column_settings.filter_bar.category": "Barra di ricerca pronta", "notifications.column_settings.follow": "Abbunati novi:", "notifications.column_settings.follow_request": "Nove dumande d'abbunamentu:", "notifications.column_settings.mention": "Minzione:", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 00b27e0521..5beb06d9b2 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -314,7 +314,6 @@ "hashtag.follow": "Sledovat hashtag", "hashtag.unfollow": "Přestat sledovat hashtag", "hashtags.and_other": "…a {count, plural, one {# další} few {# další} other {# dalších}}", - "home.column_settings.basic": "Základní", "home.column_settings.show_reblogs": "Zobrazit boosty", "home.column_settings.show_replies": "Zobrazit odpovědi", "home.hide_announcements": "Skrýt oznámení", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Nové registrace:", "notifications.column_settings.alert": "Oznámení na počítači", "notifications.column_settings.favourite": "Oblíbené:", - "notifications.column_settings.filter_bar.advanced": "Zobrazit všechny kategorie", - "notifications.column_settings.filter_bar.category": "Panel rychlého filtrování", - "notifications.column_settings.filter_bar.show_bar": "Zobrazit panel filtrů", "notifications.column_settings.follow": "Noví sledující:", "notifications.column_settings.follow_request": "Nové žádosti o sledování:", "notifications.column_settings.mention": "Zmínky:", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 0c1472dcad..583660b283 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -314,7 +314,6 @@ "hashtag.follow": "Dilyn hashnod", "hashtag.unfollow": "Dad-ddilyn hashnod", "hashtags.and_other": "…a {count, plural, other {# more}}", - "home.column_settings.basic": "Syml", "home.column_settings.show_reblogs": "Dangos hybiau", "home.column_settings.show_replies": "Dangos atebion", "home.hide_announcements": "Cuddio cyhoeddiadau", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Cofrestriadau newydd:", "notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith", "notifications.column_settings.favourite": "Ffefrynnau:", - "notifications.column_settings.filter_bar.advanced": "Dangos pob categori", - "notifications.column_settings.filter_bar.category": "Bar hidlo cyflym", - "notifications.column_settings.filter_bar.show_bar": "Dangos y bar hidlo", "notifications.column_settings.follow": "Dilynwyr newydd:", "notifications.column_settings.follow_request": "Ceisiadau dilyn newydd:", "notifications.column_settings.mention": "Crybwylliadau:", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index b9ef82bf0c..ddc0440abc 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -241,6 +241,7 @@ "empty_column.list": "Der er ikke noget på denne liste endnu. Når medlemmer af listen udgiver nye indlæg vil de fremgå hér.", "empty_column.lists": "Du har endnu ingen lister. Når du opretter én, vil den fremgå hér.", "empty_column.mutes": "Du har endnu ikke skjult (muted) nogle brugere.", + "empty_column.notification_requests": "Alt er klar! Der er intet her. Når der modtages nye notifikationer, fremgår de her jf. dine indstillinger.", "empty_column.notifications": "Du har endnu ingen notifikationer. Når andre interagerer med dig, vil det fremgå hér.", "empty_column.public": "Der er intet hér! Skriv noget offentligt eller følg manuelt brugere fra andre servere for at se indhold", "error.unexpected_crash.explanation": "Grundet en fejl i vores kode, eller en browser-kompatibilitetsfejl, kunne siden ikke vises korrekt.", @@ -271,6 +272,7 @@ "filter_modal.select_filter.subtitle": "Vælg en eksisterende kategori eller opret en ny", "filter_modal.select_filter.title": "Filtrér dette indlæg", "filter_modal.title.status": "Filtrér et indlæg", + "filtered_notifications_banner.title": "Filtrerede notifikationer", "firehose.all": "Alle", "firehose.local": "Denne server", "firehose.remote": "Andre servere", @@ -314,7 +316,6 @@ "hashtag.follow": "Følg hashtag", "hashtag.unfollow": "Stop med at følge hashtag", "hashtags.and_other": "…og {count, plural, one {}other {# flere}}", - "home.column_settings.basic": "Grundlæggende", "home.column_settings.show_reblogs": "Vis boosts", "home.column_settings.show_replies": "Vis svar", "home.hide_announcements": "Skjul bekendtgørelser", @@ -440,15 +441,16 @@ "notification.reblog": "{name} boostede dit indlæg", "notification.status": "{name} har netop postet", "notification.update": "{name} redigerede et indlæg", + "notification_requests.accept": "Acceptér", + "notification_requests.dismiss": "Afvis", + "notification_requests.notifications_from": "Notifikationer fra {name}", + "notification_requests.title": "Filtrerede notifikationer", "notifications.clear": "Ryd notifikationer", "notifications.clear_confirmation": "Er du sikker på, at du vil rydde alle dine notifikationer permanent?", "notifications.column_settings.admin.report": "Nye anmeldelser:", "notifications.column_settings.admin.sign_up": "Nye tilmeldinger:", "notifications.column_settings.alert": "Computernotifikationer", "notifications.column_settings.favourite": "Favoritter:", - "notifications.column_settings.filter_bar.advanced": "Vis alle kategorier", - "notifications.column_settings.filter_bar.category": "Hurtigfilterbjælke", - "notifications.column_settings.filter_bar.show_bar": "Vis filterbjælke", "notifications.column_settings.follow": "Nye følgere:", "notifications.column_settings.follow_request": "Nye følgeanmodninger:", "notifications.column_settings.mention": "Omtaler:", @@ -474,6 +476,15 @@ "notifications.permission_denied": "Computernotifikationer er utilgængelige grundet tidligere afvist browsertilladelsesanmodning", "notifications.permission_denied_alert": "Computernotifikationer kan ikke aktiveres, da browsertilladelse tidligere blev nægtet", "notifications.permission_required": "Computernotifikationer er utilgængelige, da den krævede tilladelse ikke er tildelt.", + "notifications.policy.filter_new_accounts.hint": "Oprettet indenfor {days, plural, one {den seneste dag} other {de seneste # dage}}", + "notifications.policy.filter_new_accounts_title": "Ny konti", + "notifications.policy.filter_not_followers_hint": "Inklusiv personer, som har fulgt dig {days, plural, one {mindre end én dag} other {færre end # dage}}", + "notifications.policy.filter_not_followers_title": "Folk, som ikke følger dig", + "notifications.policy.filter_not_following_hint": "Indtil de manuelt godkendes", + "notifications.policy.filter_not_following_title": "Folk, du ikke følger", + "notifications.policy.filter_private_mentions_hint": "Filtreret, medmindre det er i svar på egen omtale, eller hvis afsenderen følges", + "notifications.policy.filter_private_mentions_title": "Uopfordrede private omtaler", + "notifications.policy.title": "Bortfiltrér notifikationer fra…", "notifications_permission_banner.enable": "Aktivér computernotifikationer", "notifications_permission_banner.how_to_control": "Aktivér computernotifikationer for at få besked, når Mastodon ikke er åben. Når de er aktiveret, kan man via knappen {icon} ovenfor præcist styre, hvilke typer af interaktioner, som genererer computernotifikationer.", "notifications_permission_banner.title": "Gå aldrig glip af noget", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 3700b5d91d..70537cdb05 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -241,6 +241,7 @@ "empty_column.list": "Diese Liste ist derzeit leer. Wenn Konten auf dieser Liste neue Beiträge veröffentlichen, werden sie hier erscheinen.", "empty_column.lists": "Du hast noch keine Listen. Sobald du eine anlegst, wird sie hier erscheinen.", "empty_column.mutes": "Du hast keine Profile stummgeschaltet.", + "empty_column.notification_requests": "Alles klar! Hier gibt es nichts. Wenn Sie neue Mitteilungen erhalten, werden diese entsprechend Ihren Einstellungen hier angezeigt.", "empty_column.notifications": "Du hast noch keine Benachrichtigungen. Sobald andere Personen mit dir interagieren, wirst du hier darüber informiert.", "empty_column.public": "Hier ist nichts zu sehen! Schreibe etwas öffentlich oder folge Profilen von anderen Servern, um die Timeline aufzufüllen", "error.unexpected_crash.explanation": "Wegen eines Fehlers in unserem Code oder aufgrund einer Browser-Inkompatibilität kann diese Seite nicht korrekt angezeigt werden.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Einem vorhandenen Filter hinzufügen oder einen neuen erstellen", "filter_modal.select_filter.title": "Diesen Beitrag filtern", "filter_modal.title.status": "Beitrag per Filter ausblenden", + "filtered_notifications_banner.pending_requests": "Benachrichtigungen von {count, plural, =0 {keinem Profil, das du möglicherweise kennst} one {einem Profil, das du möglicherweise kennst} other {# Profilen, die du möglicherweise kennst}}", + "filtered_notifications_banner.title": "Gefilterte Benachrichtigungen", "firehose.all": "Alles", "firehose.local": "Dieser Server", "firehose.remote": "Andere Server", @@ -314,7 +317,6 @@ "hashtag.follow": "Hashtag folgen", "hashtag.unfollow": "Hashtag entfolgen", "hashtags.and_other": "… und {count, plural, one{# weiterer} other {# weitere}}", - "home.column_settings.basic": "Allgemein", "home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen", "home.column_settings.show_replies": "Antworten anzeigen", "home.hide_announcements": "Ankündigungen ausblenden", @@ -440,15 +442,16 @@ "notification.reblog": "{name} teilte deinen Beitrag", "notification.status": "{name} hat gerade etwas gepostet", "notification.update": "{name} bearbeitete einen Beitrag", + "notification_requests.accept": "Akzeptieren", + "notification_requests.dismiss": "Ablehnen", + "notification_requests.notifications_from": "Benachrichtigungen von {name}", + "notification_requests.title": "Gefilterte Benachrichtigungen", "notifications.clear": "Benachrichtigungen löschen", "notifications.clear_confirmation": "Möchtest du wirklich alle Benachrichtigungen für immer löschen?", "notifications.column_settings.admin.report": "Neue Meldungen:", "notifications.column_settings.admin.sign_up": "Neue Registrierungen:", "notifications.column_settings.alert": "Desktop-Benachrichtigungen", "notifications.column_settings.favourite": "Favoriten:", - "notifications.column_settings.filter_bar.advanced": "Alle Filterkategorien anzeigen", - "notifications.column_settings.filter_bar.category": "Filterleiste:", - "notifications.column_settings.filter_bar.show_bar": "Filterleiste anzeigen", "notifications.column_settings.follow": "Neue Follower:", "notifications.column_settings.follow_request": "Neue Follower-Anfragen:", "notifications.column_settings.mention": "Erwähnungen:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "Desktop-Benachrichtigungen können aufgrund einer zuvor verweigerten Berechtigung nicht aktiviert werden", "notifications.permission_denied_alert": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Browser-Berechtigung zuvor verweigert wurde", "notifications.permission_required": "Desktop-Benachrichtigungen sind nicht verfügbar, da die erforderliche Berechtigung nicht erteilt wurde.", + "notifications.policy.filter_new_accounts.hint": "Innerhalb {days, plural, one {des letzten Tages} other {der letzten # Tagen}} erstellt", + "notifications.policy.filter_new_accounts_title": "Neuen Konten", + "notifications.policy.filter_not_followers_hint": "Einschließlich Profilen, die dir seit weniger als {days, plural, one {einem Tag} other {# Tagen}} folgen", + "notifications.policy.filter_not_followers_title": "Profilen, die mir nicht folgen", + "notifications.policy.filter_not_following_hint": "Solange du sie nicht manuell akzeptierst", + "notifications.policy.filter_not_following_title": "Profilen, denen ich nicht folge", + "notifications.policy.filter_private_mentions_hint": "Solange sie keine Antwort auf deine Erwähnung ist oder du dem Profil nicht folgst", + "notifications.policy.filter_private_mentions_title": "Unerwünschten privaten Erwähnungen", + "notifications.policy.title": "Benachrichtigungen herausfiltern von …", "notifications_permission_banner.enable": "Aktiviere Desktop-Benachrichtigungen", "notifications_permission_banner.how_to_control": "Um Benachrichtigungen zu erhalten, wenn Mastodon nicht geöffnet ist, aktiviere die Desktop-Benachrichtigungen. Du kannst genau bestimmen, welche Arten von Interaktionen Desktop-Benachrichtigungen über die {icon} -Taste erzeugen, sobald diese aktiviert sind.", "notifications_permission_banner.title": "Nichts verpassen", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index a5ed320831..5d1f03b090 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -289,7 +289,6 @@ "hashtag.column_settings.tag_toggle": "Προσθήκη επιπλέον ταμπελών για την κολώνα", "hashtag.follow": "Παρακολούθηση ετικέτας", "hashtag.unfollow": "Διακοπή παρακολούθησης ετικέτας", - "home.column_settings.basic": "Βασικές ρυθμίσεις", "home.column_settings.show_reblogs": "Εμφάνιση προωθήσεων", "home.column_settings.show_replies": "Εμφάνιση απαντήσεων", "home.hide_announcements": "Απόκρυψη ανακοινώσεων", @@ -411,9 +410,6 @@ "notifications.column_settings.admin.sign_up": "Νέες εγγραφές:", "notifications.column_settings.alert": "Ειδοποιήσεις επιφάνειας εργασίας", "notifications.column_settings.favourite": "Αγαπημένα:", - "notifications.column_settings.filter_bar.advanced": "Εμφάνιση όλων των κατηγοριών", - "notifications.column_settings.filter_bar.category": "Μπάρα γρήγορου φίλτρου", - "notifications.column_settings.filter_bar.show_bar": "Εμφάνιση μπάρας φίλτρου", "notifications.column_settings.follow": "Νέοι ακόλουθοι:", "notifications.column_settings.follow_request": "Νέο αίτημα ακολούθησης:", "notifications.column_settings.mention": "Επισημάνσεις:", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index 6232207af2..e88209625f 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -308,7 +308,6 @@ "hashtag.follow": "Follow hashtag", "hashtag.unfollow": "Unfollow hashtag", "hashtags.and_other": "…and {count, plural, one {one more} other {# more}}", - "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Show boosts", "home.column_settings.show_replies": "Show replies", "home.hide_announcements": "Hide announcements", @@ -440,9 +439,6 @@ "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", - "notifications.column_settings.filter_bar.advanced": "Display all categories", - "notifications.column_settings.filter_bar.category": "Quick filter bar", - "notifications.column_settings.filter_bar.show_bar": "Show filter bar", "notifications.column_settings.follow": "New followers:", "notifications.column_settings.follow_request": "New follow requests:", "notifications.column_settings.mention": "Mentions:", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 911502d85f..5d2dc61135 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -295,7 +295,6 @@ "hashtag.follow": "Sekvi la kradvorton", "hashtag.unfollow": "Ne plu sekvi la kradvorton", "hashtags.and_other": "…kaj {count, plural,other {# pli}}", - "home.column_settings.basic": "Bazaj agordoj", "home.column_settings.show_reblogs": "Montri diskonigojn", "home.column_settings.show_replies": "Montri respondojn", "home.hide_announcements": "Kaŝi la anoncojn", @@ -427,9 +426,6 @@ "notifications.column_settings.admin.sign_up": "Novaj registriĝoj:", "notifications.column_settings.alert": "Sciigoj de la retumilo", "notifications.column_settings.favourite": "Stelumoj:", - "notifications.column_settings.filter_bar.advanced": "Montri ĉiujn kategoriojn", - "notifications.column_settings.filter_bar.category": "Rapida filtra breto", - "notifications.column_settings.filter_bar.show_bar": "Montri la breton de filtrilo", "notifications.column_settings.follow": "Novaj sekvantoj:", "notifications.column_settings.follow_request": "Novaj petoj de sekvado:", "notifications.column_settings.mention": "Mencioj:", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index ead3355589..48d4580056 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -241,6 +241,7 @@ "empty_column.list": "Todavía no hay nada en esta lista. Cuando miembros de esta lista envíen nuevos mensaje, se mostrarán acá.", "empty_column.lists": "Todavía no tenés ninguna lista. Cuando creés una, se mostrará acá.", "empty_column.mutes": "Todavía no silenciaste a ningún usuario.", + "empty_column.notification_requests": "¡Todo limpio! No hay nada acá. Cuando recibás nuevas notificaciones, aparecerán acá, acorde a tu configuración.", "empty_column.notifications": "Todavía no tenés ninguna notificación. Cuando otras cuentas interactúen con vos, vas a ver la notificación acá.", "empty_column.public": "¡Naranja! Escribí algo públicamente, o seguí usuarios manualmente de otros servidores para ir llenando esta línea temporal", "error.unexpected_crash.explanation": "Debido a un error en nuestro código o a un problema de compatibilidad con el navegador web, esta página no se pudo mostrar correctamente.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.title": "Filtrar este mensaje", "filter_modal.title.status": "Filtrar un mensaje", + "filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {ninguna cuenta} one {una cuenta} other {# cuentas}} que podrías conocer", + "filtered_notifications_banner.title": "Notificaciones filtradas", "firehose.all": "Todos", "firehose.local": "Este servidor", "firehose.remote": "Otros servidores", @@ -314,7 +317,6 @@ "hashtag.follow": "Seguir etiqueta", "hashtag.unfollow": "Dejar de seguir etiqueta", "hashtags.and_other": "…y {count, plural, other {# más}}", - "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar adhesiones", "home.column_settings.show_replies": "Mostrar respuestas", "home.hide_announcements": "Ocultar anuncios", @@ -440,15 +442,16 @@ "notification.reblog": "{name} adhirió a tu mensaje", "notification.status": "{name} acaba de enviar un mensaje", "notification.update": "{name} editó un mensaje", + "notification_requests.accept": "Aceptar", + "notification_requests.dismiss": "Descartar", + "notification_requests.notifications_from": "Notificaciones de {name}", + "notification_requests.title": "Notificaciones filtradas", "notifications.clear": "Limpiar notificaciones", "notifications.clear_confirmation": "¿Estás seguro que querés limpiar todas tus notificaciones permanentemente?", "notifications.column_settings.admin.report": "Nuevas denuncias:", "notifications.column_settings.admin.sign_up": "Nuevos registros:", "notifications.column_settings.alert": "Notificaciones de escritorio", "notifications.column_settings.favourite": "Favoritos:", - "notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías", - "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", - "notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtros", "notifications.column_settings.follow": "Nuevos seguidores:", "notifications.column_settings.follow_request": "Nuevas solicitudes de seguimiento:", "notifications.column_settings.mention": "Menciones:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "Las notificaciones de escritorio no están disponibles, debido a una solicitud de permiso del navegador web previamente denegada", "notifications.permission_denied_alert": "No se pueden habilitar las notificaciones de escritorio, ya que el permiso del navegador fue denegado antes", "notifications.permission_required": "Las notificaciones de escritorio no están disponibles porque no se concedió el permiso requerido.", + "notifications.policy.filter_new_accounts.hint": "Creada hace {days, plural, one {un día} other {# días}}", + "notifications.policy.filter_new_accounts_title": "Nuevas cuentas", + "notifications.policy.filter_not_followers_hint": "Incluyendo cuentas que te han estado siguiendo menos de {days, plural, one {un día} other {# días}}", + "notifications.policy.filter_not_followers_title": "Cuentas que no te siguen", + "notifications.policy.filter_not_following_hint": "Hasta que las aprobés manualmente", + "notifications.policy.filter_not_following_title": "Cuentas que no seguís", + "notifications.policy.filter_private_mentions_hint": "Filtradas, a menos que sea en respuesta a tu propia mención o si seguís al remitente", + "notifications.policy.filter_private_mentions_title": "Menciones privadas no solicitadas", + "notifications.policy.title": "Filtrar notificaciones de…", "notifications_permission_banner.enable": "Habilitar notificaciones de escritorio", "notifications_permission_banner.how_to_control": "Para recibir notificaciones cuando Mastodon no está abierto, habilitá las notificaciones de escritorio. Podés controlar con precisión qué tipos de interacciones generan notificaciones de escritorio a través del botón {icon} de arriba, una vez que estén habilitadas.", "notifications_permission_banner.title": "No te pierdas nada", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index ba54843236..b1a7757081 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -241,6 +241,7 @@ "empty_column.list": "No hay nada en esta lista aún. Cuando miembros de esta lista publiquen nuevos estatus, estos aparecerán qui.", "empty_column.lists": "No tienes ninguna lista. cuando crees una, se mostrará aquí.", "empty_column.mutes": "Aún no has silenciado a ningún usuario.", + "empty_column.notification_requests": "¡Todo limpio! No hay nada aquí. Cuando recibas nuevas notificaciones, aparecerán aquí conforme a tu configuración.", "empty_column.notifications": "No tienes ninguna notificación aún. Interactúa con otros para empezar una conversación.", "empty_column.public": "¡No hay nada aquí! Escribe algo públicamente, o sigue usuarios de otras instancias manualmente para llenarlo", "error.unexpected_crash.explanation": "Debido a un error en nuestro código o a un problema de compatibilidad con el navegador, esta página no se ha podido mostrar correctamente.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.title": "Filtrar esta publicación", "filter_modal.title.status": "Filtrar una publicación", + "filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", + "filtered_notifications_banner.title": "Notificaciones filtradas", "firehose.all": "Todas", "firehose.local": "Este servidor", "firehose.remote": "Otros servidores", @@ -314,7 +317,6 @@ "hashtag.follow": "Seguir etiqueta", "hashtag.unfollow": "Dejar de seguir etiqueta", "hashtags.and_other": "…y {count, plural, other {# más}}", - "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar retoots", "home.column_settings.show_replies": "Mostrar respuestas", "home.hide_announcements": "Ocultar anuncios", @@ -440,15 +442,16 @@ "notification.reblog": "{name} ha retooteado tu estado", "notification.status": "{name} acaba de publicar", "notification.update": "{name} editó una publicación", + "notification_requests.accept": "Aceptar", + "notification_requests.dismiss": "Descartar", + "notification_requests.notifications_from": "Notificaciones de {name}", + "notification_requests.title": "Notificaciones filtradas", "notifications.clear": "Limpiar notificaciones", "notifications.clear_confirmation": "¿Seguro de querer borrar permanentemente todas tus notificaciones?", "notifications.column_settings.admin.report": "Nuevas denuncias:", "notifications.column_settings.admin.sign_up": "Registros nuevos:", "notifications.column_settings.alert": "Notificaciones de escritorio", "notifications.column_settings.favourite": "Favoritos:", - "notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías", - "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", - "notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtros", "notifications.column_settings.follow": "Nuevos seguidores:", "notifications.column_settings.follow_request": "Nuevas solicitudes de seguimiento:", "notifications.column_settings.mention": "Menciones:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "No se pueden habilitar las notificaciones de escritorio ya que se denegó el permiso.", "notifications.permission_denied_alert": "No se pueden habilitar las notificaciones de escritorio, ya que el permiso del navegador fue denegado anteriormente", "notifications.permission_required": "Las notificaciones de escritorio no están disponibles porque no se ha concedido el permiso requerido.", + "notifications.policy.filter_new_accounts.hint": "Creadas durante {days, plural, one {el último día} other {los últimos # días}}", + "notifications.policy.filter_new_accounts_title": "Cuentas nuevas", + "notifications.policy.filter_not_followers_hint": "Incluyendo personas que te han estado siguiendo desde hace menos de {days, plural, one {un día} other {# días}}", + "notifications.policy.filter_not_followers_title": "Personas que no te siguen", + "notifications.policy.filter_not_following_hint": "Hasta que las apruebes manualmente", + "notifications.policy.filter_not_following_title": "Personas que no sigues", + "notifications.policy.filter_private_mentions_hint": "Filtrada, a menos que sea en respuesta a tu propia mención, o si sigues al remitente", + "notifications.policy.filter_private_mentions_title": "Menciones privadas no solicitadas", + "notifications.policy.title": "Filtrar notificaciones de…", "notifications_permission_banner.enable": "Habilitar notificaciones de escritorio", "notifications_permission_banner.how_to_control": "Para recibir notificaciones cuando Mastodon no esté abierto, habilite las notificaciones de escritorio. Puedes controlar con precisión qué tipos de interacciones generan notificaciones de escritorio a través del botón {icon} de arriba una vez que estén habilitadas.", "notifications_permission_banner.title": "Nunca te pierdas nada", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index b4cc241814..d7f54a3e2a 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -241,6 +241,7 @@ "empty_column.list": "No hay nada en esta lista aún. Cuando miembros de esta lista publiquen nuevos estatus, estos aparecerán qui.", "empty_column.lists": "No tienes ninguna lista. cuando crees una, se mostrará aquí.", "empty_column.mutes": "Aún no has silenciado a ningún usuario.", + "empty_column.notification_requests": "¡Todo limpio! No hay nada aquí. Cuando recibas nuevas notificaciones, aparecerán aquí conforme a tu configuración.", "empty_column.notifications": "No tienes ninguna notificación aún. Interactúa con otros para empezar una conversación.", "empty_column.public": "¡No hay nada aquí! Escribe algo públicamente, o sigue usuarios de otras instancias manualmente para llenarlo", "error.unexpected_crash.explanation": "Debido a un error en nuestro código o a un problema de compatibilidad con el navegador, esta página no se ha podido mostrar correctamente.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.title": "Filtrar esta publicación", "filter_modal.title.status": "Filtrar una publicación", + "filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", + "filtered_notifications_banner.title": "Notificaciones filtradas", "firehose.all": "Todas", "firehose.local": "Este servidor", "firehose.remote": "Otros servidores", @@ -314,7 +317,6 @@ "hashtag.follow": "Seguir etiqueta", "hashtag.unfollow": "Dejar de seguir etiqueta", "hashtags.and_other": "…y {count, plural, other {# más}}", - "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar impulsos", "home.column_settings.show_replies": "Mostrar respuestas", "home.hide_announcements": "Ocultar anuncios", @@ -440,15 +442,16 @@ "notification.reblog": "{name} ha impulsado tu publicación", "notification.status": "{name} acaba de publicar", "notification.update": "{name} editó una publicación", + "notification_requests.accept": "Aceptar", + "notification_requests.dismiss": "Descartar", + "notification_requests.notifications_from": "Notificaciones de {name}", + "notification_requests.title": "Notificaciones filtradas", "notifications.clear": "Limpiar notificaciones", "notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?", "notifications.column_settings.admin.report": "Nuevos informes:", "notifications.column_settings.admin.sign_up": "Nuevos registros:", "notifications.column_settings.alert": "Notificaciones de escritorio", "notifications.column_settings.favourite": "Favoritos:", - "notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías", - "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", - "notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtros", "notifications.column_settings.follow": "Nuevos seguidores:", "notifications.column_settings.follow_request": "Nuevas solicitudes de seguimiento:", "notifications.column_settings.mention": "Menciones:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "No se pueden habilitar las notificaciones de escritorio ya que se denegó el permiso.", "notifications.permission_denied_alert": "No se pueden habilitar las notificaciones de escritorio, ya que el permiso del navegador fue denegado anteriormente", "notifications.permission_required": "Las notificaciones de escritorio no están disponibles porque no se ha concedido el permiso requerido.", + "notifications.policy.filter_new_accounts.hint": "Creadas durante {days, plural, one {el último día} other {los últimos # días}}", + "notifications.policy.filter_new_accounts_title": "Cuentas nuevas", + "notifications.policy.filter_not_followers_hint": "Incluyendo personas que te han estado siguiendo desde hace menos de {days, plural, one {un día} other {# días}}", + "notifications.policy.filter_not_followers_title": "Personas que no te siguen", + "notifications.policy.filter_not_following_hint": "Hasta que las apruebes manualmente", + "notifications.policy.filter_not_following_title": "Personas que no sigues", + "notifications.policy.filter_private_mentions_hint": "Filtrada, a menos que sea en respuesta a tu propia mención, o si sigues al remitente", + "notifications.policy.filter_private_mentions_title": "Menciones privadas no solicitadas", + "notifications.policy.title": "Filtrar notificaciones de…", "notifications_permission_banner.enable": "Habilitar notificaciones de escritorio", "notifications_permission_banner.how_to_control": "Para recibir notificaciones cuando Mastodon no esté abierto, habilite las notificaciones de escritorio. Puedes controlar con precisión qué tipos de interacciones generan notificaciones de escritorio a través del botón {icon} de arriba una vez que estén habilitadas.", "notifications_permission_banner.title": "Nunca te pierdas nada", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index be0c262c32..2759c96a10 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -314,7 +314,6 @@ "hashtag.follow": "Jälgi silti", "hashtag.unfollow": "Lõpeta sildi jälgimine", "hashtags.and_other": "…ja {count, plural, one {}other {# veel}}", - "home.column_settings.basic": "Peamine", "home.column_settings.show_reblogs": "Näita jagamisi", "home.column_settings.show_replies": "Näita vastuseid", "home.hide_announcements": "Peida teadaanded", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Uued kasutajad:", "notifications.column_settings.alert": "Töölauateated", "notifications.column_settings.favourite": "Lemmikud:", - "notifications.column_settings.filter_bar.advanced": "Kuva kõik kategooriad", - "notifications.column_settings.filter_bar.category": "Kiirfiltri riba", - "notifications.column_settings.filter_bar.show_bar": "Näita filtririba", "notifications.column_settings.follow": "Uued jälgijad:", "notifications.column_settings.follow_request": "Uued jälgimistaotlused:", "notifications.column_settings.mention": "Mainimised:", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index c21fa1d204..4af5aaaaf5 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -241,6 +241,7 @@ "empty_column.list": "Ez dago ezer zerrenda honetan. Zerrenda honetako kideek bidalketa berriak argitaratzean, hemen agertuko dira.", "empty_column.lists": "Ez duzu zerrendarik oraindik. Baten bat sortzen duzunean hemen agertuko da.", "empty_column.mutes": "Ez duzu erabiltzailerik mututu oraindik.", + "empty_column.notification_requests": "Garbi-garbi! Ezertxo ere ez hemen. Jakinarazpenak jasotzen dituzunean, hemen agertuko dira zure ezarpenen arabera.", "empty_column.notifications": "Ez duzu jakinarazpenik oraindik. Jarri besteekin harremanetan elkarrizketa abiatzeko.", "empty_column.public": "Ez dago ezer hemen! Idatzi zerbait publikoki edo jarraitu eskuz beste zerbitzari batzuetako erabiltzaileei hau betetzen joateko", "error.unexpected_crash.explanation": "Gure kodean arazoren bat dela eta, edo nabigatzailearekin bateragarritasun arazoren bat dela eta, orri hau ezin izan da ongi bistaratu.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Hautatu lehendik dagoen kategoria bat edo sortu berria", "filter_modal.select_filter.title": "Iragazi bidalketa hau", "filter_modal.title.status": "Iragazi bidalketa bat", + "filtered_notifications_banner.pending_requests": "Ezagutu {count, plural, =0 {dezakezun inoren} one {dezakezun pertsona baten} other {ditzakezun # pertsonen}} jakinarazpenak", + "filtered_notifications_banner.title": "Iragazitako jakinarazpenak", "firehose.all": "Guztiak", "firehose.local": "Zerbitzari hau", "firehose.remote": "Beste zerbitzariak", @@ -314,7 +317,6 @@ "hashtag.follow": "Jarraitu traolari", "hashtag.unfollow": "Utzi traola jarraitzeari", "hashtags.and_other": "…eta {count, plural, one {}other {# gehiago}}", - "home.column_settings.basic": "Oinarrizkoa", "home.column_settings.show_reblogs": "Erakutsi bultzadak", "home.column_settings.show_replies": "Erakutsi erantzunak", "home.hide_announcements": "Ezkutatu iragarpenak", @@ -440,15 +442,16 @@ "notification.reblog": "{name}(e)k bultzada eman dio zure bidalketari", "notification.status": "{name} erabiltzaileak bidalketa egin berri du", "notification.update": "{name} erabiltzaileak bidalketa bat editatu du", + "notification_requests.accept": "Onartu", + "notification_requests.dismiss": "Baztertu", + "notification_requests.notifications_from": "{name} erabiltzailearen jakinarazpenak", + "notification_requests.title": "Iragazitako jakinarazpenak", "notifications.clear": "Garbitu jakinarazpenak", "notifications.clear_confirmation": "Ziur zure jakinarazpen guztiak behin betirako garbitu nahi dituzula?", "notifications.column_settings.admin.report": "Txosten berriak:", "notifications.column_settings.admin.sign_up": "Izen-emate berriak:", "notifications.column_settings.alert": "Mahaigaineko jakinarazpenak", "notifications.column_settings.favourite": "Gogokoak:", - "notifications.column_settings.filter_bar.advanced": "Erakutsi kategoria guztiak", - "notifications.column_settings.filter_bar.category": "Iragazki azkarraren barra", - "notifications.column_settings.filter_bar.show_bar": "Erakutsi iragazki-barra", "notifications.column_settings.follow": "Jarraitzaile berriak:", "notifications.column_settings.follow_request": "Jarraitzeko eskaera berriak:", "notifications.column_settings.mention": "Aipamenak:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "Mahaigaineko jakinarazpenak ez daude erabilgarri, nabigatzaileari baimen eskaera ukatu zitzaiolako", "notifications.permission_denied_alert": "Mahaigaineko jakinarazpenak ezin dira gaitu, nabigatzaileari baimena ukatu zitzaiolako", "notifications.permission_required": "Mahaigaineko jakinarazpenak ez daude erabilgarri, horretarako behar den baimena ez delako eman.", + "notifications.policy.filter_new_accounts.hint": "Azken {days, plural, one {egunean} other {# egunetan}} sortua", + "notifications.policy.filter_new_accounts_title": "Kontu berriak", + "notifications.policy.filter_not_followers_hint": "{days, plural, one {Egun batez} other {# egunez}} baino gutxiago jarraitu zaituen jendea barne", + "notifications.policy.filter_not_followers_title": "Jarraitzen ez zaituen jendea", + "notifications.policy.filter_not_following_hint": "Eskuz onartzen dituzun arte", + "notifications.policy.filter_not_following_title": "Jarraitzen ez duzun jendea", + "notifications.policy.filter_private_mentions_hint": "Iragazita, baldin eta zure aipamenaren erantzuna bada edo bidaltzailea jarraitzen baduzu", + "notifications.policy.filter_private_mentions_title": "Eskatu gabeko aipamen pribatuak", + "notifications.policy.title": "Ez iragazi hemengo jakinarazpenak…", "notifications_permission_banner.enable": "Gaitu mahaigaineko jakinarazpenak", "notifications_permission_banner.how_to_control": "Mastodon irekita ez dagoenean jakinarazpenak jasotzeko, gaitu mahaigaineko jakinarazpenak. Mahaigaineko jakinarazpenak ze elkarrekintzak eragingo dituzten zehazki kontrolatu dezakezu goiko {icon} botoia erabiliz, gaituta daudenean.", "notifications_permission_banner.title": "Ez galdu ezer inoiz", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 9029ba3cb5..9e6128b873 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -314,7 +314,6 @@ "hashtag.follow": "پی‌گرفتن برچسب", "hashtag.unfollow": "پی‌نگرفتن برچسب", "hashtags.and_other": "…و {count, plural, other {# بیش‌تر}}", - "home.column_settings.basic": "پایه‌ای", "home.column_settings.show_reblogs": "نمایش تقویت‌ها", "home.column_settings.show_replies": "نمایش پاسخ‌ها", "home.hide_announcements": "نهفتن اعلامیه‌ها", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "ثبت نام‌های جدید:", "notifications.column_settings.alert": "آگاهی‌های میزکار", "notifications.column_settings.favourite": "برگزیده‌ها:", - "notifications.column_settings.filter_bar.advanced": "نمایش همۀ دسته‌ها", - "notifications.column_settings.filter_bar.category": "نوار پالایش سریع", - "notifications.column_settings.filter_bar.show_bar": "نمایش نوار پالایه", "notifications.column_settings.follow": "پی‌گیرندگان جدید:", "notifications.column_settings.follow_request": "درخواست‌های جدید پی‌گیری:", "notifications.column_settings.mention": "اشاره‌ها:", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 7588b084fd..3f964a7101 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -314,7 +314,6 @@ "hashtag.follow": "Seuraa aihetunnistetta", "hashtag.unfollow": "Lopeta aihetunnisteen seuraaminen", "hashtags.and_other": "…ja {count, plural, other {# lisää}}", - "home.column_settings.basic": "Perusasetukset", "home.column_settings.show_reblogs": "Näytä tehostukset", "home.column_settings.show_replies": "Näytä vastaukset", "home.hide_announcements": "Piilota tiedotteet", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Uudet rekisteröitymiset:", "notifications.column_settings.alert": "Työpöytäilmoitukset", "notifications.column_settings.favourite": "Suosikit:", - "notifications.column_settings.filter_bar.advanced": "Näytä kaikki luokat", - "notifications.column_settings.filter_bar.category": "Pikasuodatuspalkki", - "notifications.column_settings.filter_bar.show_bar": "Näytä suodatinpalkki", "notifications.column_settings.follow": "Uudet seuraajat:", "notifications.column_settings.follow_request": "Uudet seuraamispyynnöt:", "notifications.column_settings.mention": "Maininnat:", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 13e49eb314..67b323e2cf 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -241,6 +241,7 @@ "empty_column.list": "Einki er í hesum listanum enn. Tá limir í hesum listanum posta nýggjar postar, so síggjast teir her.", "empty_column.lists": "Tú hevur ongar goymdar listar enn. Tá tú gert ein lista, so sært tú hann her.", "empty_column.mutes": "Tú hevur enn ikki doyvt nakran brúkara.", + "empty_column.notification_requests": "Alt er klárt! Her er einki. Tá tú fært nýggjar fráboðanir, síggjast tær her sambært tínum stillingum.", "empty_column.notifications": "Tú hevur ongar fráboðanir enn. Tá onnur samskifta við teg, so sær tú fráboðaninar her.", "empty_column.public": "Einki er her! Skriva okkurt alment ella fylg brúkarum frá øðrum ambætarum fyri at fylla tilfar í", "error.unexpected_crash.explanation": "Orsakað av einum feili í okkara kotu ella orsakað av at kagin hjá tær ikki er sambæriligur við skipanina, so bar ikki til at vísa hesa síðuna rætt.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Brúka ein verandi bólk ella skapa ein nýggjan", "filter_modal.select_filter.title": "Filtrera hendan postin", "filter_modal.title.status": "Filtrera ein post", + "filtered_notifications_banner.pending_requests": "Fráboðanir frá {count, plural, =0 {ongum} one {einum persóni} other {# persónum}}, sum tú møguliga kennir", + "filtered_notifications_banner.title": "Sáldaðar fráboðanir", "firehose.all": "Allar", "firehose.local": "Hesin ambætarin", "firehose.remote": "Aðrir ambætarar", @@ -314,7 +317,6 @@ "hashtag.follow": "Fylg frámerki", "hashtag.unfollow": "Gevst at fylgja frámerki", "hashtags.and_other": "…og {count, plural, other {# afturat}}", - "home.column_settings.basic": "Grundleggjandi", "home.column_settings.show_reblogs": "Vís lyft", "home.column_settings.show_replies": "Vís svar", "home.hide_announcements": "Fjal kunngerðir", @@ -440,15 +442,16 @@ "notification.reblog": "{name} lyfti tín post", "notification.status": "{name} hevur júst postað", "notification.update": "{name} rættaði ein post", + "notification_requests.accept": "Góðtak", + "notification_requests.dismiss": "Avvís", + "notification_requests.notifications_from": "Fráboðanir frá {name}", + "notification_requests.title": "Sáldaðar fráboðanir", "notifications.clear": "Rudda fráboðanir", "notifications.clear_confirmation": "Ert tú vís/ur í, at tú vilt strika allar tínar fráboðanir?", "notifications.column_settings.admin.report": "Nýggjar fráboðanir:", "notifications.column_settings.admin.sign_up": "Nýggjar tilmeldingar:", "notifications.column_settings.alert": "Skriviborðsfráboðanir", "notifications.column_settings.favourite": "Dámdir postar:", - "notifications.column_settings.filter_bar.advanced": "Vís allar bólkar", - "notifications.column_settings.filter_bar.category": "Skjótfilturbjálki", - "notifications.column_settings.filter_bar.show_bar": "Vís filturbjálka", "notifications.column_settings.follow": "Nýggir fylgjarar:", "notifications.column_settings.follow_request": "Nýggjar umbønir um at fylgja:", "notifications.column_settings.mention": "Umrøður:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "Skriviborðsfráboðanir eru ikki tøkar tí at ein kaga-umbøn áður bleiv noktað", "notifications.permission_denied_alert": "Tað ber ikki til at sláa skriviborðsfráboðanir til, tí at kagarættindi áður eru noktaði", "notifications.permission_required": "Skriviborðsfráboðanir eru ikki tøkar, tí at neyðugu rættindini eru ikki latin.", + "notifications.policy.filter_new_accounts.hint": "Stovnaðar {days, plural, one {seinasta dagin} other {seinastu # dagarnar}}", + "notifications.policy.filter_new_accounts_title": "Nýggjar kontur", + "notifications.policy.filter_not_followers_hint": "Íroknað fólk, sum hava fylgt tær styttri enn {days, plural, one {ein dag} other {# dagar}}", + "notifications.policy.filter_not_followers_title": "Fólk, sum ikki fylgja tær", + "notifications.policy.filter_not_following_hint": "Til tú góðkennir tey manuelt", + "notifications.policy.filter_not_following_title": "Fólk, sum tú ikki fylgir", + "notifications.policy.filter_private_mentions_hint": "Sáldaði, uttan so at tað er í svari til tínar egnu nevningar ella um tú fylgir sendaranum", + "notifications.policy.filter_private_mentions_title": "Óbidnar privatar umrøður", + "notifications.policy.title": "Sálda burtur fráboðanir frá…", "notifications_permission_banner.enable": "Ger skriviborðsfráboðanir virknar", "notifications_permission_banner.how_to_control": "Ger skriviborðsfráboðanir virknar fyri at móttaka fráboðanir, tá Mastodon ikki er opið. Tá tær eru gjørdar virknar, kanst tú stýra, hvørji sløg av samvirkni geva skriviborðsfráboðanir. Hetta umvegis {icon} knøttin omanfyri.", "notifications_permission_banner.title": "Miss einki", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index fc969b02f4..8aff0b5afe 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -314,7 +314,6 @@ "hashtag.follow": "Suivre ce hashtag", "hashtag.unfollow": "Ne plus suivre ce hashtag", "hashtags.and_other": "…et {count, plural, other {# de plus}}", - "home.column_settings.basic": "Basique", "home.column_settings.show_reblogs": "Afficher boosts", "home.column_settings.show_replies": "Afficher réponses", "home.hide_announcements": "Masquer les annonces", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Nouvelles inscriptions:", "notifications.column_settings.alert": "Notifications navigateur", "notifications.column_settings.favourite": "Favoris:", - "notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories", - "notifications.column_settings.filter_bar.category": "Barre de filtrage rapide", - "notifications.column_settings.filter_bar.show_bar": "Afficher la barre de filtre", "notifications.column_settings.follow": "Nouveaux⋅elles abonné⋅e⋅s:", "notifications.column_settings.follow_request": "Nouvelles demandes d’abonnement:", "notifications.column_settings.mention": "Mentions:", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 8396679d06..223878f6f9 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -314,7 +314,6 @@ "hashtag.follow": "Suivre le hashtag", "hashtag.unfollow": "Ne plus suivre le hashtag", "hashtags.and_other": "…et {count, plural, other {# de plus}}", - "home.column_settings.basic": "Basique", "home.column_settings.show_reblogs": "Afficher les partages", "home.column_settings.show_replies": "Afficher les réponses", "home.hide_announcements": "Masquer les annonces", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Nouvelles inscriptions :", "notifications.column_settings.alert": "Notifications du navigateur", "notifications.column_settings.favourite": "Favoris :", - "notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories", - "notifications.column_settings.filter_bar.category": "Barre de filtrage rapide", - "notifications.column_settings.filter_bar.show_bar": "Afficher la barre de filtre", "notifications.column_settings.follow": "Nouveaux·elles abonné·e·s :", "notifications.column_settings.follow_request": "Nouvelles demandes d’abonnement :", "notifications.column_settings.mention": "Mentions :", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index bc4fecb93d..5757f2cde7 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -314,7 +314,6 @@ "hashtag.follow": "Hashtag folgje", "hashtag.unfollow": "Hashtag ûntfolgje", "hashtags.and_other": "…en {count, plural, one {}other {# mear}}", - "home.column_settings.basic": "Algemien", "home.column_settings.show_reblogs": "Boosts toane", "home.column_settings.show_replies": "Reaksjes toane", "home.hide_announcements": "Meidielingen ferstopje", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Nije registraasjes:", "notifications.column_settings.alert": "Desktopmeldingen", "notifications.column_settings.favourite": "Favoriten:", - "notifications.column_settings.filter_bar.advanced": "Alle kategoryen toane", - "notifications.column_settings.filter_bar.category": "Flugge filterbalke", - "notifications.column_settings.filter_bar.show_bar": "Filterbalke toane", "notifications.column_settings.follow": "Nije folgers:", "notifications.column_settings.follow_request": "Nij folchfersyk:", "notifications.column_settings.mention": "Fermeldingen:", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index a708088fbb..44af2fb4f6 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -249,7 +249,6 @@ "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "hashtag.follow": "Lean haischlib", "hashtag.unfollow": "Ná lean haischlib", - "home.column_settings.basic": "Bunúsach", "home.column_settings.show_reblogs": "Taispeáin moltaí", "home.column_settings.show_replies": "Taispeán freagraí", "home.hide_announcements": "Cuir fógraí i bhfolach", @@ -349,9 +348,6 @@ "notifications.clear": "Glan fógraí", "notifications.column_settings.admin.report": "Tuairiscí nua:", "notifications.column_settings.alert": "Fógraí deisce", - "notifications.column_settings.filter_bar.advanced": "Taispeáin na catagóirí go léir", - "notifications.column_settings.filter_bar.category": "Barra scagaire tapa", - "notifications.column_settings.filter_bar.show_bar": "Taispeáin barra scagaire", "notifications.column_settings.follow": "Leantóirí nua:", "notifications.column_settings.follow_request": "Iarratais leanúnaí nua:", "notifications.column_settings.mention": "Tráchtanna:", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index f4d12d6337..ae190a51b0 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -314,7 +314,6 @@ "hashtag.follow": "Lean an taga hais", "hashtag.unfollow": "Na lean an taga hais tuilleadh", "hashtags.and_other": "…agus {count, plural, one {# eile} two {# eile} few {# eile} other {# eile}}", - "home.column_settings.basic": "Bunasach", "home.column_settings.show_reblogs": "Seall na brosnachaidhean", "home.column_settings.show_replies": "Seall na freagairtean", "home.hide_announcements": "Falaich na brathan-fios", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Clàraidhean ùra:", "notifications.column_settings.alert": "Brathan deasga", "notifications.column_settings.favourite": "Annsachdan:", - "notifications.column_settings.filter_bar.advanced": "Seall a h-uile roinn-seòrsa", - "notifications.column_settings.filter_bar.category": "Bàr-criathraidh luath", - "notifications.column_settings.filter_bar.show_bar": "Seall am bàr-criathraidh", "notifications.column_settings.follow": "Luchd-leantainn ùr:", "notifications.column_settings.follow_request": "Iarrtasan leantainn ùra:", "notifications.column_settings.mention": "Iomraidhean:", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 91b6870be7..52e0ee6f6d 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -314,7 +314,6 @@ "hashtag.follow": "Seguir cancelo", "hashtag.unfollow": "Deixar de seguir cancelo", "hashtags.and_other": "…e {count, plural, one {}other {# máis}}", - "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Amosar compartidos", "home.column_settings.show_replies": "Amosar respostas", "home.hide_announcements": "Agochar anuncios", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Novas usuarias:", "notifications.column_settings.alert": "Notificacións de escritorio", "notifications.column_settings.favourite": "Favoritas:", - "notifications.column_settings.filter_bar.advanced": "Amosar todas as categorías", - "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", - "notifications.column_settings.filter_bar.show_bar": "Amosar barra de filtros", "notifications.column_settings.follow": "Novas seguidoras:", "notifications.column_settings.follow_request": "Novas peticións de seguimento:", "notifications.column_settings.mention": "Mencións:", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 2eef70f0fe..dcbc30308c 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -241,6 +241,7 @@ "empty_column.list": "אין עדיין פריטים ברשימה. כאשר חברים ברשימה הזאת יפרסמו הודעות חדשות, הן יופיעו פה.", "empty_column.lists": "אין לך שום רשימות עדיין. לכשיהיו, הן תופענה כאן.", "empty_column.mutes": "עוד לא השתקת שום משתמש.", + "empty_column.notification_requests": "בום! אין פה כלום. כשיווצרו עוד התראות, הן יופיעו כאן על בסיס ההעדפות שלך.", "empty_column.notifications": "אין התראות עדיין. יאללה, הגיע הזמן להתחיל להתערבב.", "empty_column.public": "אין פה כלום! כדי למלא את הטור הזה אפשר לכתוב משהו, או להתחיל לעקוב אחרי אנשים מקהילות אחרות", "error.unexpected_crash.explanation": "עקב תקלה בקוד שלנו או בעיית תאימות דפדפן, לא ניתן להציג דף זה כראוי.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "שימוש בקטגורייה קיימת או יצירת אחת חדשה", "filter_modal.select_filter.title": "סינון ההודעה הזו", "filter_modal.title.status": "סנן הודעה", + "filtered_notifications_banner.pending_requests": "{count, plural,=0 {אין התראות ממשתמשים ה}one {התראה אחת ממישהו/מישהי ה}other {יש # התראות ממשתמשים }}מוכרים לך", + "filtered_notifications_banner.title": "התראות מסוננות", "firehose.all": "הכל", "firehose.local": "שרת זה", "firehose.remote": "שרתים אחרים", @@ -314,7 +317,6 @@ "hashtag.follow": "לעקוב אחרי תגית", "hashtag.unfollow": "להפסיק לעקוב אחרי תגית", "hashtags.and_other": "…{count, plural,other {ועוד #}}", - "home.column_settings.basic": "למתחילים", "home.column_settings.show_reblogs": "הצגת הדהודים", "home.column_settings.show_replies": "הצגת תגובות", "home.hide_announcements": "הסתר הכרזות", @@ -440,15 +442,16 @@ "notification.reblog": "הודעתך הודהדה על ידי {name}", "notification.status": "{name} הרגע פרסמו", "notification.update": "{name} ערכו הודעה", + "notification_requests.accept": "לקבל", + "notification_requests.dismiss": "לבטל", + "notification_requests.notifications_from": "התראות מ־ {name}", + "notification_requests.title": "התראות מסוננות", "notifications.clear": "הסרת התראות", "notifications.clear_confirmation": "להסיר את כל ההתראות לצמיתות ? ", "notifications.column_settings.admin.report": "דו\"חות חדשים", "notifications.column_settings.admin.sign_up": "הרשמות חדשות:", "notifications.column_settings.alert": "התראות לשולחן העבודה", "notifications.column_settings.favourite": "חיבובים:", - "notifications.column_settings.filter_bar.advanced": "הצג את כל הקטגוריות", - "notifications.column_settings.filter_bar.category": "שורת סינון מהיר", - "notifications.column_settings.filter_bar.show_bar": "הצג שורת סינון", "notifications.column_settings.follow": "עוקבים חדשים:", "notifications.column_settings.follow_request": "בקשות מעקב חדשות:", "notifications.column_settings.mention": "פניות:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "לא ניתן להציג התראות מסך כיוון כיוון שהרשאות דפדפן נשללו בעבר", "notifications.permission_denied_alert": "לא ניתן לאפשר נוטיפיקציות מסך שכן הדפדפן סורב הרשאה בעבר", "notifications.permission_required": "לא ניתן לאפשר נוטיפיקציות מסך כיוון שהרשאה דרושה לא ניתנה.", + "notifications.policy.filter_new_accounts.hint": "נוצר {days, plural,one {ביום האחרון} two {ביומיים האחרונים} other {ב־# הימים האחרונים}}", + "notifications.policy.filter_new_accounts_title": "חשבונות חדשים", + "notifications.policy.filter_not_followers_hint": "כולל משתמשים שעקבו אחריך פחות מ{days, plural,one {יום} two {יומיים} other {־# ימים}}", + "notifications.policy.filter_not_followers_title": "משתמשים שלא עוקבות.ים אחריך", + "notifications.policy.filter_not_following_hint": "עד שיאושרו ידנית על ידיך", + "notifications.policy.filter_not_following_title": "משתמשים שאינך עוקב(ת) אחריהםן", + "notifications.policy.filter_private_mentions_hint": "מסונן אלא אם זו תשובה למינשון שלך או אם אתם עוקבים אחרי העונה", + "notifications.policy.filter_private_mentions_title": "מינשונים בפרטי שלא הוזמנו", + "notifications.policy.title": "להסתיר התראות מ…", "notifications_permission_banner.enable": "לאפשר נוטיפיקציות מסך", "notifications_permission_banner.how_to_control": "כדי לקבל התראות גם כאשר מסטודון סגור יש לאפשר התראות מסך. ניתן לשלוט בדיוק איזה סוג של אינטראקציות יביא להתראות מסך דרך כפתור ה- {icon} מרגע שהן מאופשרות.", "notifications_permission_banner.title": "לעולם אל תחמיץ דבר", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index f88fe19569..edab89a84a 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -277,7 +277,6 @@ "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "hashtag.follow": "हैशटैग को फॉलो करें", "hashtag.unfollow": "हैशटैग को उनफ़ोल्लोव करें", - "home.column_settings.basic": "बुनियादी", "home.column_settings.show_reblogs": "बूस्ट दिखाए", "home.column_settings.show_replies": "जवाबों को दिखाए", "home.hide_announcements": "घोषणाएँ छिपाएँ", @@ -376,8 +375,6 @@ "notifications.clear": "सूचनाएं हटाए", "notifications.column_settings.admin.report": "नई रिपोर्ट:", "notifications.column_settings.favourite": "पसंदीदा:", - "notifications.column_settings.filter_bar.advanced": "सभी श्रेणियाँ दिखाएं", - "notifications.column_settings.filter_bar.category": "फ़िल्टर बार", "notifications.column_settings.follow": "नए फ़ॉलोअर्स", "notifications.column_settings.mention": "उल्लेख:", "notifications.column_settings.poll": "चुनाव परिणाम", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 9fe15f5a2d..45d1b53268 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -261,7 +261,6 @@ "hashtag.column_settings.tag_toggle": "Uključi dodatne oznake za ovaj stupac", "hashtag.follow": "Prati hashtag", "hashtag.unfollow": "Prestani pratiti hashtag", - "home.column_settings.basic": "Osnovno", "home.column_settings.show_reblogs": "Pokaži boostove", "home.column_settings.show_replies": "Pokaži odgovore", "home.hide_announcements": "Sakrij najave", @@ -358,8 +357,6 @@ "notifications.clear": "Očisti obavijesti", "notifications.clear_confirmation": "Želite li zaista trajno očistiti sve Vaše obavijesti?", "notifications.column_settings.alert": "Obavijesti radne površine", - "notifications.column_settings.filter_bar.advanced": "Prikaži sve kategorije", - "notifications.column_settings.filter_bar.category": "Brza traka filtera", "notifications.column_settings.follow": "Novi pratitelji:", "notifications.column_settings.follow_request": "Novi zahtjevi za praćenje:", "notifications.column_settings.mention": "Spominjanja:", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index f499e08f6d..5dd0e7aee5 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -241,6 +241,7 @@ "empty_column.list": "A lista jelenleg üres. Ha a listatagok bejegyzést tesznek közzé, itt fog megjelenni.", "empty_column.lists": "Még nincs egyetlen listád sem. Ha létrehozol egyet, itt fog megjelenni.", "empty_column.mutes": "Még egy felhasználót sem némítottál le.", + "empty_column.notification_requests": "Minden tiszta! Itt nincs semmi. Ha új értesítéseket kapsz, azok itt jelennek meg a beállításoknak megfelelően.", "empty_column.notifications": "Jelenleg még nincsenek értesítéseid. Ha mások kapcsolatba lépnek veled, ezek itt lesznek láthatóak.", "empty_column.public": "Jelenleg itt nincs semmi! Írj valamit nyilvánosan vagy kövess más kiszolgálón levő felhasználókat, hogy megtöltsd.", "error.unexpected_crash.explanation": "Egy kód- vagy böngészőkompatibilitási hiba miatt ez az oldal nem jeleníthető meg helyesen.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Válassz egy meglévő kategóriát, vagy hozz létre egy újat", "filter_modal.select_filter.title": "E bejegyzés szűrése", "filter_modal.title.status": "Egy bejegyzés szűrése", + "filtered_notifications_banner.pending_requests": "Értesítések {count, plural, =0 {0 személytől} one {egy feltehetőleg ismert személytől} other {# feltehetőleg ismert személytől}}", + "filtered_notifications_banner.title": "Szűrt értesítések", "firehose.all": "Összes", "firehose.local": "Ez a kiszolgáló", "firehose.remote": "Egyéb kiszolgálók", @@ -314,7 +317,6 @@ "hashtag.follow": "Hashtag követése", "hashtag.unfollow": "Hashtag követésének megszüntetése", "hashtags.and_other": "…és {count, plural, other {# további}}", - "home.column_settings.basic": "Általános", "home.column_settings.show_reblogs": "Megtolások megjelenítése", "home.column_settings.show_replies": "Válaszok megjelenítése", "home.hide_announcements": "Közlemények elrejtése", @@ -440,15 +442,16 @@ "notification.reblog": "{name} megtolta a bejegyzésedet", "notification.status": "{name} bejegyzést tett közzé", "notification.update": "{name} szerkesztett egy bejegyzést", + "notification_requests.accept": "Elfogadás", + "notification_requests.dismiss": "Elvetés", + "notification_requests.notifications_from": "{name} értesítései", + "notification_requests.title": "Szűrt értesítések", "notifications.clear": "Értesítések törlése", "notifications.clear_confirmation": "Biztos, hogy véglegesen törölni akarod az összes értesítésed?", "notifications.column_settings.admin.report": "Új jelentések:", "notifications.column_settings.admin.sign_up": "Új regisztrálók:", "notifications.column_settings.alert": "Asztali értesítések", "notifications.column_settings.favourite": "Kedvencek:", - "notifications.column_settings.filter_bar.advanced": "Minden kategória megjelenítése", - "notifications.column_settings.filter_bar.category": "Gyorsszűrő sáv", - "notifications.column_settings.filter_bar.show_bar": "Szűrősáv megjelenítése", "notifications.column_settings.follow": "Új követők:", "notifications.column_settings.follow_request": "Új követési kérelmek:", "notifications.column_settings.mention": "Megemlítések:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "Az asztali értesítések nem érhetők el a korábban elutasított böngészőengedély-kérelem miatt", "notifications.permission_denied_alert": "Az asztali értesítések nem engedélyezhetők a korábban elutasított böngésző engedély miatt", "notifications.permission_required": "Az asztali értesítések nem érhetőek el, mivel a szükséges engedély nem lett megadva.", + "notifications.policy.filter_new_accounts.hint": "Az elmúlt {days, plural, one {napban} other {# napban}} létrehozva", + "notifications.policy.filter_new_accounts_title": "Új fiókok", + "notifications.policy.filter_not_followers_hint": "Beleértve azokat, akik kevesebb mint {days, plural, one {egy napja} other {# napja}} követnek", + "notifications.policy.filter_not_followers_title": "Olyan emberek, akik nem követnek", + "notifications.policy.filter_not_following_hint": "Amíg kézileg jóvá nem hagyod őket", + "notifications.policy.filter_not_following_title": "Nem követett emberek", + "notifications.policy.filter_private_mentions_hint": "Kiszűrve, hacsak nem a saját említésedre válaszol, vagy ha nem követed a feladót", + "notifications.policy.filter_private_mentions_title": "Kéretlen személyes említések", + "notifications.policy.title": "Feladó értesítéseinek kiszűrése…", "notifications_permission_banner.enable": "Asztali értesítések engedélyezése", "notifications_permission_banner.how_to_control": "Ahhoz, hogy értesítéseket kapj akkor, amikor a Mastodon nincs megnyitva, engedélyezd az asztali értesítéseket. Pontosan be tudod állítani, hogy milyen interakciókról értesülj a fenti {icon} gombon keresztül, ha egyszer már engedélyezted őket.", "notifications_permission_banner.title": "Soha ne mulassz el semmit", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 6ddcfcdb21..67a7aa49ff 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -235,7 +235,6 @@ "hashtag.column_settings.tag_toggle": "Ներառել լրացուցիչ պիտակները այս սիւնակում ", "hashtag.follow": "Հետեւել պիտակին", "hashtag.unfollow": "Չհետեւել պիտակին", - "home.column_settings.basic": "Հիմնական", "home.column_settings.show_reblogs": "Ցուցադրել տարածածները", "home.column_settings.show_replies": "Ցուցադրել պատասխանները", "home.hide_announcements": "Թաքցնել յայտարարութիւնները", @@ -345,9 +344,6 @@ "notifications.column_settings.admin.sign_up": "Նոր գրանցումներ՝", "notifications.column_settings.alert": "Աշխատատիրոյթի ծանուցումներ", "notifications.column_settings.favourite": "Հաւանածներ՝", - "notifications.column_settings.filter_bar.advanced": "Ցուցադրել բոլոր կատեգորիաները", - "notifications.column_settings.filter_bar.category": "Արագ զտման վահանակ", - "notifications.column_settings.filter_bar.show_bar": "Ցոյց տալ զտման պանելը", "notifications.column_settings.follow": "Նոր հետեւողներ՝", "notifications.column_settings.follow_request": "Նոր հետեւելու հայցեր:", "notifications.column_settings.mention": "Նշումներ՝", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 31c9ef7394..a935bf1112 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -297,7 +297,6 @@ "notifications.clear": "Rader notificationes", "notifications.column_settings.alert": "Notificationes de scriptorio", "notifications.column_settings.favourite": "Favoritos:", - "notifications.column_settings.filter_bar.advanced": "Monstrar tote le categorias", "notifications.column_settings.follow": "Nove sequitores:", "notifications.column_settings.mention": "Mentiones:", "notifications.column_settings.poll": "Resultatos del inquesta:", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 88e99a7086..9b841a08bb 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -270,7 +270,6 @@ "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "hashtag.follow": "Ikuti tagar", "hashtag.unfollow": "Batalkan pengikutan tagar", - "home.column_settings.basic": "Dasar", "home.column_settings.show_reblogs": "Tampilkan boost", "home.column_settings.show_replies": "Tampilkan balasan", "home.hide_announcements": "Sembunyikan pengumuman", @@ -381,9 +380,6 @@ "notifications.column_settings.admin.report": "Laporan baru:", "notifications.column_settings.admin.sign_up": "Pendaftaran baru:", "notifications.column_settings.alert": "Notifikasi desktop", - "notifications.column_settings.filter_bar.advanced": "Tampilkan semua kategori", - "notifications.column_settings.filter_bar.category": "Bilah penyaring cepat", - "notifications.column_settings.filter_bar.show_bar": "Tampilkan bilah filter", "notifications.column_settings.follow": "Pengikut baru:", "notifications.column_settings.follow_request": "Permintaan mengikuti baru:", "notifications.column_settings.mention": "Balasan:", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index 7bd938c1bf..1f60b42400 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -314,7 +314,6 @@ "hashtag.follow": "Sequer hashtag", "hashtag.unfollow": "Dessequer hashtag", "hashtags.and_other": "…e {count, plural, other {# in plu}}", - "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Monstrar boosts", "home.column_settings.show_replies": "Monstrar responses", "home.hide_announcements": "Celar proclamationes", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Nov registrationes:", "notifications.column_settings.alert": "Notificationes sur li computator", "notifications.column_settings.favourite": "Favorites:", - "notifications.column_settings.filter_bar.advanced": "Monstrar omni categories", - "notifications.column_settings.filter_bar.category": "Rapid filtre-barre", - "notifications.column_settings.filter_bar.show_bar": "Monstrar filtre-barre", "notifications.column_settings.follow": "Nov sequitores:", "notifications.column_settings.follow_request": "Nov petitiones de sequer:", "notifications.column_settings.mention": "Mentiones:", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index c468f689ab..235b6b92af 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -292,7 +292,6 @@ "hashtag.follow": "Sequez hashtago", "hashtag.unfollow": "Desequez hashtago", "hashtags.and_other": "…e {count, plural, one {# plusa}other {# plusa}}", - "home.column_settings.basic": "Simpla", "home.column_settings.show_reblogs": "Montrar repeti", "home.column_settings.show_replies": "Montrar respondi", "home.hide_announcements": "Celez anunci", @@ -424,9 +423,6 @@ "notifications.column_settings.admin.sign_up": "Nova registranti:", "notifications.column_settings.alert": "Desktopavizi", "notifications.column_settings.favourite": "Favoriziti:", - "notifications.column_settings.filter_bar.advanced": "Montrez omna kategorii", - "notifications.column_settings.filter_bar.category": "Rapidfiltrobaro", - "notifications.column_settings.filter_bar.show_bar": "Montrez filtrobaro", "notifications.column_settings.follow": "Nova sequanti:", "notifications.column_settings.follow_request": "Nova sequodemandi:", "notifications.column_settings.mention": "Mencioni:", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 1f42180159..2310325b7c 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -241,6 +241,7 @@ "empty_column.list": "Það er ennþá ekki neitt á þessum lista. Þegar meðlimir á listanum senda inn nýjar færslur, munu þær birtast hér.", "empty_column.lists": "Þú ert ennþá ekki með neina lista. Þegar þú býrð til einhvern lista, munu hann birtast hér.", "empty_column.mutes": "Þú hefur ekki þaggað niður í neinum notendum ennþá.", + "empty_column.notification_requests": "Allt hreint! Það er ekkert hér. Þegar þú færð nýjar tilkynningar, munu þær birtast hér í samræmi við stillingarnar þínar.", "empty_column.notifications": "Þú ert ekki ennþá með neinar tilkynningar. Vertu í samskiptum við aðra til að umræður fari af stað.", "empty_column.public": "Það er ekkert hér! Skrifaðu eitthvað opinberlega, eða fylgstu með notendum á öðrum netþjónum til að fylla upp í þetta", "error.unexpected_crash.explanation": "Vegna villu í kóðanum okkar eða samhæfnivandamála í vafra er ekki hægt að birta þessa síðu svo vel sé.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Notaðu fyrirliggjandi flokk eða útbúðu nýjan", "filter_modal.select_filter.title": "Sía þessa færslu", "filter_modal.title.status": "Sía færslu", + "filtered_notifications_banner.pending_requests": "Tilkynningar frá {count, plural, =0 {engum} one {einum aðila} other {# aðilum}} sem þú gætir þekkt", + "filtered_notifications_banner.title": "Síaðar tilkynningar", "firehose.all": "Allt", "firehose.local": "þessum netþjóni", "firehose.remote": "öðrum netþjónum", @@ -314,7 +317,6 @@ "hashtag.follow": "Fylgjast með myllumerki", "hashtag.unfollow": "Hætta að fylgjast með myllumerki", "hashtags.and_other": "…og {count, plural, other {# til viðbótar}}", - "home.column_settings.basic": "Einfalt", "home.column_settings.show_reblogs": "Sýna endurbirtingar", "home.column_settings.show_replies": "Birta svör", "home.hide_announcements": "Fela auglýsingar", @@ -440,15 +442,16 @@ "notification.reblog": "{name} endurbirti færsluna þína", "notification.status": "{name} sendi inn rétt í þessu", "notification.update": "{name} breytti færslu", + "notification_requests.accept": "Samþykkja", + "notification_requests.dismiss": "Afgreiða", + "notification_requests.notifications_from": "Tilkynningar frá {name}", + "notification_requests.title": "Síaðar tilkynningar", "notifications.clear": "Hreinsa tilkynningar", "notifications.clear_confirmation": "Ertu viss um að þú viljir endanlega eyða öllum tilkynningunum þínum?", "notifications.column_settings.admin.report": "Nýjar kærur:", "notifications.column_settings.admin.sign_up": "Nýjar skráningar:", "notifications.column_settings.alert": "Tilkynningar á skjáborði", "notifications.column_settings.favourite": "Eftirlæti:", - "notifications.column_settings.filter_bar.advanced": "Birta alla flokka", - "notifications.column_settings.filter_bar.category": "Skyndisíustika", - "notifications.column_settings.filter_bar.show_bar": "Birta síustikuna", "notifications.column_settings.follow": "Nýir fylgjendur:", "notifications.column_settings.follow_request": "Nýjar beiðnir um að fylgjast með:", "notifications.column_settings.mention": "Tilvísanir:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "Tilkynningar á skjáborði eru ekki aðgengilegar megna áður hafnaðra beiðna fyrir vafra", "notifications.permission_denied_alert": "Ekki var hægt að virkja tilkynningar á skjáborði, þar sem heimildum fyrir vafra var áður hafnað", "notifications.permission_required": "Tilkynningar á skjáborði eru ekki aðgengilegar þar sem nauðsynlegar heimildir hafa ekki verið veittar.", + "notifications.policy.filter_new_accounts.hint": "Útbúið {days, plural, one {síðasta daginn} other {síðustu # daga}}", + "notifications.policy.filter_new_accounts_title": "Nýir notendur", + "notifications.policy.filter_not_followers_hint": "Þar með talið fólk sem hefur fylgst með þér í minna en {days, plural, one {einn dag} other {# daga}}", + "notifications.policy.filter_not_followers_title": "Fólk sem fylgist ekki með þér", + "notifications.policy.filter_not_following_hint": "Þar til þú samþykkir viðkomandi handvirkt", + "notifications.policy.filter_not_following_title": "Fólk sem þú fylgist ekki með", + "notifications.policy.filter_private_mentions_hint": "Síað nema það sé í svari við einhverju þar sem þú minntist á viðkomandi eða ef þú fylgist með sendandanum", + "notifications.policy.filter_private_mentions_title": "Óumbeðið einkaspjall", + "notifications.policy.title": "Sía út tilkynningar frá…", "notifications_permission_banner.enable": "Virkja tilkynningar á skjáborði", "notifications_permission_banner.how_to_control": "Til að taka á móti tilkynningum þegar Mastodon er ekki opið, skaltu virkja tilkynningar á skjáborði. Þegar þær eru orðnar virkar geturðu stýrt nákvæmlega hverskonar atvik framleiða tilkynningar með því að nota {icon}-hnappinn hér fyrir ofan.", "notifications_permission_banner.title": "Aldrei missa af neinu", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 9e68216a33..303abd4982 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -241,6 +241,7 @@ "empty_column.list": "Non c'è ancora nulla in questa lista. Quando i membri di questa lista pubblicheranno dei nuovi post, appariranno qui.", "empty_column.lists": "Non hai ancora alcuna lista. Quando ne creerai una, apparirà qui.", "empty_column.mutes": "Non hai ancora silenziato alcun utente.", + "empty_column.notification_requests": "Tutto chiaro! Non c'è niente qui. Quando ricevi nuove notifiche, verranno visualizzate qui in base alle tue impostazioni.", "empty_column.notifications": "Non hai ancora nessuna notifica. Quando altre persone interagiranno con te, le vedrai qui.", "empty_column.public": "Non c'è nulla qui! Scrivi qualcosa pubblicamente o segui manualmente gli utenti dagli altri server per riempire questo spazio", "error.unexpected_crash.explanation": "A causa di un bug nel nostro codice o di un problema di compatibilità del browser, non è stato possibile visualizzare correttamente questa pagina.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Usa una categoria esistente o creane una nuova", "filter_modal.select_filter.title": "Filtra questo post", "filter_modal.title.status": "Filtra un post", + "filtered_notifications_banner.pending_requests": "Notifiche da {count, plural, =0 {nessuna persona} one {una persona} other {# persone}} che potresti conoscere", + "filtered_notifications_banner.title": "Notifiche filtrate", "firehose.all": "Tutto", "firehose.local": "Questo server", "firehose.remote": "Altri server", @@ -314,7 +317,6 @@ "hashtag.follow": "Segui l'hashtag", "hashtag.unfollow": "Smetti di seguire l'hashtag", "hashtags.and_other": "…e {count, plural, other {# in più}}", - "home.column_settings.basic": "Base", "home.column_settings.show_reblogs": "Mostra reblog", "home.column_settings.show_replies": "Mostra risposte", "home.hide_announcements": "Nascondi annunci", @@ -440,15 +442,16 @@ "notification.reblog": "{name} ha rebloggato il tuo post", "notification.status": "{name} ha appena pubblicato un post", "notification.update": "{name} ha modificato un post", + "notification_requests.accept": "Accetta", + "notification_requests.dismiss": "Ignora", + "notification_requests.notifications_from": "Notifiche da {name}", + "notification_requests.title": "Notifiche filtrate", "notifications.clear": "Cancella le notifiche", "notifications.clear_confirmation": "Sei sicuro di voler cancellare permanentemente tutte le tue notifiche?", "notifications.column_settings.admin.report": "Nuove segnalazioni:", "notifications.column_settings.admin.sign_up": "Nuove iscrizioni:", "notifications.column_settings.alert": "Notifiche desktop", "notifications.column_settings.favourite": "Preferiti:", - "notifications.column_settings.filter_bar.advanced": "Mostra tutte le categorie", - "notifications.column_settings.filter_bar.category": "Barra rapida del filtro", - "notifications.column_settings.filter_bar.show_bar": "Mostra la barra del filtro", "notifications.column_settings.follow": "Nuovi seguaci:", "notifications.column_settings.follow_request": "Nuove richieste di seguirti:", "notifications.column_settings.mention": "Menzioni:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "Notifiche desktop non disponibili a causa della precedentemente negata richiesta di autorizzazioni del browser", "notifications.permission_denied_alert": "Impossibile abilitare le notifiche desktop, poiché l'autorizzazione del browser è stata precedentemente negata", "notifications.permission_required": "Notifiche destkop non disponibili poiché l'autorizzazione richiesta non è stata concessa.", + "notifications.policy.filter_new_accounts.hint": "Creato {days, plural, one {un giorno} other {# giorni}} fa", + "notifications.policy.filter_new_accounts_title": "Nuovi account", + "notifications.policy.filter_not_followers_hint": "Incluse le persone che ti seguono da meno di {days, plural, one {un giorno} other {# giorni}}", + "notifications.policy.filter_not_followers_title": "Persone che non ti seguono", + "notifications.policy.filter_not_following_hint": "Fino a quando non le approvi manualmente", + "notifications.policy.filter_not_following_title": "Persone che non segui", + "notifications.policy.filter_private_mentions_hint": "Filtrate, a meno che non sia in risposta alla tua menzione o se segui il mittente", + "notifications.policy.filter_private_mentions_title": "Menzioni private indesiderate", + "notifications.policy.title": "Filtra le notifiche da…", "notifications_permission_banner.enable": "Abilita le notifiche desktop", "notifications_permission_banner.how_to_control": "Per ricevere le notifiche quando Mastodon non è aperto, abilita le notifiche desktop. Puoi controllare precisamente quali tipi di interazioni generano le notifiche destkop, tramite il pulsante {icon} sopra, una volta abilitate.", "notifications_permission_banner.title": "Non perderti mai nulla", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 27ed9816a7..872293b230 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -314,7 +314,6 @@ "hashtag.follow": "ハッシュタグをフォローする", "hashtag.unfollow": "ハッシュタグのフォローを解除", "hashtags.and_other": "ほか{count, plural, other {#個}}", - "home.column_settings.basic": "基本設定", "home.column_settings.show_reblogs": "ブースト表示", "home.column_settings.show_replies": "返信表示", "home.hide_announcements": "お知らせを隠す", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "新規登録:", "notifications.column_settings.alert": "デスクトップ通知", "notifications.column_settings.favourite": "お気に入り:", - "notifications.column_settings.filter_bar.advanced": "すべてのカテゴリを表示", - "notifications.column_settings.filter_bar.category": "クイックフィルターバー:", - "notifications.column_settings.filter_bar.show_bar": "フィルターバーを表示", "notifications.column_settings.follow": "新しいフォロワー:", "notifications.column_settings.follow_request": "新しいフォローリクエスト:", "notifications.column_settings.mention": "返信:", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index 8628cb38a2..964a764a93 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -114,7 +114,6 @@ "follow_request.reject": "უარყოფა", "getting_started.heading": "დაწყება", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", - "home.column_settings.basic": "ძირითადი", "home.column_settings.show_reblogs": "ბუსტების ჩვენება", "home.column_settings.show_replies": "პასუხების ჩვენება", "keyboard_shortcuts.back": "უკან გადასასვლელად", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 94f620491f..4ffae68bd0 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -242,7 +242,6 @@ "hashtag.counter_by_uses_today": "{count, plural, one {{counter} n tsuffeɣt} other {{counter} n tsuffaɣ}} assa", "hashtag.follow": "Ḍfeṛ ahacṭag", "hashtags.and_other": "…d {count, plural, one {}other {# nniḍen}}", - "home.column_settings.basic": "Igejdanen", "home.column_settings.show_reblogs": "Ssken-d beṭṭu", "home.column_settings.show_replies": "Ssken-d tiririyin", "home.hide_announcements": "Ffer ulɣuyen", @@ -355,8 +354,6 @@ "notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk tilɣa-inek·em i lebda?", "notifications.column_settings.alert": "Tilɣa n tnarit", "notifications.column_settings.favourite": "Imenyafen:", - "notifications.column_settings.filter_bar.advanced": "Ssken-d meṛṛa tiggayin", - "notifications.column_settings.filter_bar.category": "Iri n usizdeg uzrib", "notifications.column_settings.follow": "Imeḍfaṛen imaynuten:", "notifications.column_settings.follow_request": "Isuturen imaynuten n teḍfeṛt:", "notifications.column_settings.mention": "Abdar:", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index 1f6cc78a57..f71c10f916 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -181,7 +181,6 @@ "hashtag.column_settings.tag_mode.any": "Осылардың біреуін", "hashtag.column_settings.tag_mode.none": "Бұлардың ешқайсысын", "hashtag.column_settings.tag_toggle": "Осы бағанға қосымша тегтерді қосыңыз", - "home.column_settings.basic": "Негізгі", "home.column_settings.show_reblogs": "Бөлісулерді көрсету", "home.column_settings.show_replies": "Жауаптарды көрсету", "home.hide_announcements": "Анонстарды жасыр", @@ -263,8 +262,6 @@ "notifications.clear": "Ескертпелерді тазарт", "notifications.clear_confirmation": "Шынымен барлық ескертпелерді өшіресіз бе?", "notifications.column_settings.alert": "Үстел ескертпелері", - "notifications.column_settings.filter_bar.advanced": "Барлық категорияны көрсет", - "notifications.column_settings.filter_bar.category": "Жедел сүзгі", "notifications.column_settings.follow": "Жаңа оқырмандар:", "notifications.column_settings.follow_request": "Жазылуға жаңа сұранымдар:", "notifications.column_settings.mention": "Аталымдар:", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index d9192e5c61..7dd7636089 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -271,10 +271,12 @@ "filter_modal.select_filter.subtitle": "기존의 카테고리를 사용하거나 새로 하나를 만듧니다", "filter_modal.select_filter.title": "이 게시물을 필터", "filter_modal.title.status": "게시물 필터", + "filtered_notifications_banner.pending_requests": "알 수도 있는 {count, plural, =0 {0명} one {한 명} other {# 명}}의 사람들로부터의 알림", + "filtered_notifications_banner.title": "걸러진 알림", "firehose.all": "모두", "firehose.local": "이 서버", "firehose.remote": "다른 서버", - "follow_request.authorize": "허가", + "follow_request.authorize": "승인", "follow_request.reject": "거부", "follow_requests.unlocked_explanation": "귀하의 계정이 잠긴 계정이 아닐지라도, {domain} 스태프는 이 계정들의 팔로우 요청을 수동으로 처리해 주시면 좋겠다고 생각했습니다.", "follow_suggestions.curated_suggestion": "스태프의 추천", @@ -314,7 +316,6 @@ "hashtag.follow": "팔로우", "hashtag.unfollow": "팔로우 해제", "hashtags.and_other": "…그리고 {count, plural,other {#개 더}}", - "home.column_settings.basic": "기본", "home.column_settings.show_reblogs": "부스트 표시", "home.column_settings.show_replies": "답글 표시", "home.hide_announcements": "공지사항 숨기기", @@ -440,15 +441,16 @@ "notification.reblog": "{name} 님이 부스트했습니다", "notification.status": "{name} 님이 방금 게시물을 올렸습니다", "notification.update": "{name} 님이 게시물을 수정했습니다", + "notification_requests.accept": "수락", + "notification_requests.dismiss": "지우기", + "notification_requests.notifications_from": "{name} 님으로부터의 알림", + "notification_requests.title": "걸러진 알림", "notifications.clear": "알림 비우기", "notifications.clear_confirmation": "정말로 알림을 삭제하시겠습니까?", "notifications.column_settings.admin.report": "새 신고:", "notifications.column_settings.admin.sign_up": "새로운 가입:", "notifications.column_settings.alert": "데스크탑 알림", "notifications.column_settings.favourite": "좋아요:", - "notifications.column_settings.filter_bar.advanced": "모든 범주 표시하기", - "notifications.column_settings.filter_bar.category": "빠른 필터 막대", - "notifications.column_settings.filter_bar.show_bar": "필터 막대 보이기", "notifications.column_settings.follow": "새 팔로워:", "notifications.column_settings.follow_request": "새 팔로우 요청:", "notifications.column_settings.mention": "멘션:", @@ -474,6 +476,13 @@ "notifications.permission_denied": "권한이 거부되었기 때문에 데스크탑 알림을 활성화할 수 없음", "notifications.permission_denied_alert": "이전에 브라우저 권한이 거부되었기 때문에, 데스크탑 알림이 활성화 될 수 없습니다.", "notifications.permission_required": "필요한 권한이 승인되지 않아 데스크탑 알림을 사용할 수 없습니다.", + "notifications.policy.filter_new_accounts.hint": "{days, plural, one {하루} other {#일}} 안에 만들어진", + "notifications.policy.filter_new_accounts_title": "새 계정", + "notifications.policy.filter_not_followers_title": "나를 팔로우하지 않는 사람들", + "notifications.policy.filter_not_following_hint": "내가 수동으로 승인하기 전까지", + "notifications.policy.filter_not_following_title": "내가 팔로우하지 않는 사람들", + "notifications.policy.filter_private_mentions_title": "청하지 않은 개인적인 멘션", + "notifications.policy.title": "알림을 거를 사람들…", "notifications_permission_banner.enable": "데스크탑 알림 활성화", "notifications_permission_banner.how_to_control": "마스토돈이 열려 있지 않을 때에도 알림을 받으려면, 데스크탑 알림을 활성화 하세요. 당신은 어떤 종류의 반응이 데스크탑 알림을 발생할 지를 {icon} 버튼을 통해 세세하게 설정할 수 있습니다.", "notifications_permission_banner.title": "아무것도 놓치지 마세요", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index 4a0fd671db..a106101081 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -258,7 +258,6 @@ "hashtag.column_settings.tag_toggle": "Ji bo vê stûnê hin pêvekan tevlî bike", "hashtag.follow": "Hashtagê bişopîne", "hashtag.unfollow": "Hashtagê neşopîne", - "home.column_settings.basic": "Bingehîn", "home.column_settings.show_reblogs": "Bilindkirinan nîşan bike", "home.column_settings.show_replies": "Bersivan nîşan bide", "home.hide_announcements": "Reklaman veşêre", @@ -370,9 +369,6 @@ "notifications.column_settings.admin.report": "Ragihandinên nû:", "notifications.column_settings.admin.sign_up": "Tomarkirinên nû:", "notifications.column_settings.alert": "Agahdariyên sermaseyê", - "notifications.column_settings.filter_bar.advanced": "Hemû beşan nîşan bide", - "notifications.column_settings.filter_bar.category": "Şivika parzûna bilêz", - "notifications.column_settings.filter_bar.show_bar": "Darika parzûnê nîşan bide", "notifications.column_settings.follow": "Şopînerên nû:", "notifications.column_settings.follow_request": "Daxwazên şopandinê nû:", "notifications.column_settings.mention": "Qalkirin:", diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json index e42f50aeff..f9c70db53e 100644 --- a/app/javascript/mastodon/locales/kw.json +++ b/app/javascript/mastodon/locales/kw.json @@ -166,7 +166,6 @@ "hashtag.column_settings.tag_mode.any": "Pynag a'n re ma", "hashtag.column_settings.tag_mode.none": "Travyth a'n re ma", "hashtag.column_settings.tag_toggle": "Yssynsi taggys ynwedhek rag an goloven ma", - "home.column_settings.basic": "Selyek", "home.column_settings.show_reblogs": "Diskwedhes kenerthow", "home.column_settings.show_replies": "Diskwedhes gorthebow", "home.hide_announcements": "Kudha deklaryansow", @@ -257,8 +256,6 @@ "notifications.clear": "Dilea gwarnyansow", "notifications.clear_confirmation": "Owgh hwi sur a vynnes dilea agas gwarnyansow oll yn fast?", "notifications.column_settings.alert": "Gwarnyansow pennskrin", - "notifications.column_settings.filter_bar.advanced": "Displetya rummow oll", - "notifications.column_settings.filter_bar.category": "Barr sidhla skav", "notifications.column_settings.follow": "Holyoryon nowydh:", "notifications.column_settings.follow_request": "Govynnow holya nowydh:", "notifications.column_settings.mention": "Menegow:", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index 91540d58ca..de84becca3 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -271,6 +271,7 @@ "filter_modal.select_filter.subtitle": "Kulanea una kategoria egzistente o kriya mueva", "filter_modal.select_filter.title": "Filtra esta publikasyon", "filter_modal.title.status": "Filtra una publikasyon", + "filtered_notifications_banner.title": "Avizos filtrados", "firehose.all": "Todo", "firehose.local": "Este sirvidor", "firehose.remote": "Otros sirvidores", @@ -314,7 +315,6 @@ "hashtag.follow": "Sige etiketa", "hashtag.unfollow": "Desige etiketa", "hashtags.and_other": "…i {count, plural, one {}other {# mas}}", - "home.column_settings.basic": "Opsyones bazikas", "home.column_settings.show_reblogs": "Amostra repartajasyones", "home.column_settings.show_replies": "Amostra repuestas", "home.hide_announcements": "Eskonde pregones", @@ -440,15 +440,15 @@ "notification.reblog": "{name} repartajo tu publikasyon", "notification.status": "{name} publiko algo", "notification.update": "{name} edito una publikasyon", + "notification_requests.accept": "Acheta", + "notification_requests.dismiss": "Kita", + "notification_requests.title": "Avizos filtrados", "notifications.clear": "Efasa avizos", "notifications.clear_confirmation": "Estas siguro ke keres permanentemente efasar todos tus avizos?", "notifications.column_settings.admin.report": "Muveos raportos:", "notifications.column_settings.admin.sign_up": "Muevas enrejistrasyones:", "notifications.column_settings.alert": "Avizos de ensimameza", "notifications.column_settings.favourite": "Te plazen:", - "notifications.column_settings.filter_bar.advanced": "Amostra todas las kategorias", - "notifications.column_settings.filter_bar.category": "Vara de filtrado rapido", - "notifications.column_settings.filter_bar.show_bar": "Amostra vara de filtros", "notifications.column_settings.follow": "Muevos suivantes:", "notifications.column_settings.follow_request": "Muevas solisitudes de segimiento:", "notifications.column_settings.mention": "Enmentaduras:", @@ -474,6 +474,7 @@ "notifications.permission_denied": "Avizos de ensimameza no estan desponivles porke ya se tiene refuzado el permiso", "notifications.permission_denied_alert": "\"No se pueden kapasitar los avizos de ensimameza, porke ya se tiene refuzado el permiso de navigador", "notifications.permission_required": "Avizos de ensimameza no estan desponivles porke los nesesarios permisos no tienen sido risividos.", + "notifications.policy.filter_new_accounts_title": "Muevos kuentos", "notifications_permission_banner.enable": "Kapasita avizos de ensimameza", "notifications_permission_banner.how_to_control": "Para risivir avizos kuando Mastodon no esta avierto, kapasita avizos de ensimameza. Puedes kontrolar presizamente kualos tipos de enteraksiones djeneren avizos de ensimameza kon el boton {icon} arriva kuando esten kapasitadas.", "notifications_permission_banner.title": "Nunkua te piedres niente", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 8b757484ce..6963c43a3a 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -314,7 +314,6 @@ "hashtag.follow": "Sekti saitažodį", "hashtag.unfollow": "Nebesekti saitažodį", "hashtags.and_other": "…ir {count, plural, one {# daugiau} few {# daugiau} many {# daugiau}other {# daugiau}}", - "home.column_settings.basic": "Paprastas", "home.column_settings.show_reblogs": "Rodyti pakėlimus", "home.column_settings.show_replies": "Rodyti atsakymus", "home.hide_announcements": "Slėpti skelbimus", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Naujos registracijos:", "notifications.column_settings.alert": "Darbalaukio pranešimai", "notifications.column_settings.favourite": "Mėgstami:", - "notifications.column_settings.filter_bar.advanced": "Rodyti visas kategorijas", - "notifications.column_settings.filter_bar.category": "Spartaus filtro juosta", - "notifications.column_settings.filter_bar.show_bar": "Rodyti filtro juostą", "notifications.column_settings.follow": "Nauji sekėjai:", "notifications.column_settings.follow_request": "Nauji sekimo prašymai:", "notifications.column_settings.mention": "Paminėjimai:", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 8044e78923..47f10d94c1 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -306,7 +306,6 @@ "hashtag.follow": "Sekot tēmturim", "hashtag.unfollow": "Pārstāt sekot tēmturim", "hashtags.and_other": "..un {count, plural, other {# vairāk}}", - "home.column_settings.basic": "Pamata", "home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus", "home.column_settings.show_replies": "Rādīt atbildes", "home.hide_announcements": "Slēpt paziņojumus", @@ -438,9 +437,6 @@ "notifications.column_settings.admin.sign_up": "Jaunas pierakstīšanās:", "notifications.column_settings.alert": "Darbvirsmas paziņojumi", "notifications.column_settings.favourite": "Izlase:", - "notifications.column_settings.filter_bar.advanced": "Rādīt visas kategorijas", - "notifications.column_settings.filter_bar.category": "Ātro filtru josla", - "notifications.column_settings.filter_bar.show_bar": "Rādīt filtru joslu", "notifications.column_settings.follow": "Jauni sekotāji:", "notifications.column_settings.follow_request": "Jauni sekošanas pieprasījumi:", "notifications.column_settings.mention": "Pieminēšanas:", diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json index f7080842b7..cd30e29493 100644 --- a/app/javascript/mastodon/locales/mk.json +++ b/app/javascript/mastodon/locales/mk.json @@ -137,7 +137,6 @@ "hashtag.column_settings.tag_mode.any": "Било кои", "hashtag.column_settings.tag_mode.none": "Никои", "hashtag.column_settings.tag_toggle": "Стави додатни тагови за оваа колона", - "home.column_settings.basic": "Основно", "home.column_settings.show_reblogs": "Прикажи бустирања", "home.column_settings.show_replies": "Прикажи одговори", "intervals.full.days": "{number, plural, one {# ден} other {# дена}}", diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json index 0059dd333b..6f1ec3c117 100644 --- a/app/javascript/mastodon/locales/ml.json +++ b/app/javascript/mastodon/locales/ml.json @@ -181,7 +181,6 @@ "hashtag.column_settings.tag_mode.any": "ഇവയിലേതെങ്കിലും", "hashtag.column_settings.tag_mode.none": "ഇതിലൊന്നുമല്ല", "hashtag.column_settings.tag_toggle": "ഈ എഴുത്തുപംക്തിക്ക് കൂടുതൽ ഉപനാമങ്ങൾ ചേർക്കുക", - "home.column_settings.basic": "അടിസ്ഥാനം", "home.column_settings.show_reblogs": "ബൂസ്റ്റുകൾ കാണിക്കുക", "home.column_settings.show_replies": "മറുപടികൾ കാണിക്കുക", "home.hide_announcements": "പ്രഖ്യാപനങ്ങൾ മറയ്‌ക്കുക", @@ -255,7 +254,6 @@ "notifications.clear": "അറിയിപ്പ് മായ്ക്കുക", "notifications.clear_confirmation": "നിങ്ങളുടെ എല്ലാ അറിയിപ്പുകളും ശാശ്വതമായി മായ്‌ക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", "notifications.column_settings.alert": "ഡെസ്ക്ടോപ്പ് അറിയിപ്പുകൾ", - "notifications.column_settings.filter_bar.advanced": "എല്ലാ വിഭാഗങ്ങളും പ്രദർശിപ്പിക്കുക", "notifications.column_settings.follow": "പുതിയ പിന്തുടരുന്നവർ:", "notifications.column_settings.follow_request": "പുതിയ പിന്തുടരൽ അഭ്യർത്ഥനകൾ:", "notifications.column_settings.mention": "സൂചനകൾ:", diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json index 20231f0bbf..0cd5e7ef78 100644 --- a/app/javascript/mastodon/locales/mr.json +++ b/app/javascript/mastodon/locales/mr.json @@ -122,7 +122,6 @@ "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "hashtag.follow": "हॅशटॅग फॉलो करा", "hashtag.unfollow": "हॅशटॅग अनफॉलो करा", - "home.column_settings.basic": "मूळ", "home.column_settings.show_reblogs": "बूस्ट दाखवा", "home.column_settings.show_replies": "उत्तरे दाखवा", "home.hide_announcements": "घोषणा लपवा", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 3d6ba920c9..20bd248c3a 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -311,7 +311,6 @@ "hashtag.follow": "Ikuti hashtag", "hashtag.unfollow": "Nyahikut tanda pagar", "hashtags.and_other": "…dan {count, plural, other {# more}}", - "home.column_settings.basic": "Asas", "home.column_settings.show_reblogs": "Tunjukkan galakan", "home.column_settings.show_replies": "Tunjukkan balasan", "home.hide_announcements": "Sembunyikan pengumuman", @@ -443,9 +442,6 @@ "notifications.column_settings.admin.sign_up": "Pendaftaran baru:", "notifications.column_settings.alert": "Pemberitahuan atas meja", "notifications.column_settings.favourite": "Kegemaran:", - "notifications.column_settings.filter_bar.advanced": "Papar semua kategori", - "notifications.column_settings.filter_bar.category": "Bar penapis pantas", - "notifications.column_settings.filter_bar.show_bar": "Paparkan bar penapis", "notifications.column_settings.follow": "Pengikut baharu:", "notifications.column_settings.follow_request": "Permintaan ikutan baharu:", "notifications.column_settings.mention": "Sebutan:", diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json index 0d5985b1ce..1b129aaa0f 100644 --- a/app/javascript/mastodon/locales/my.json +++ b/app/javascript/mastodon/locales/my.json @@ -292,7 +292,6 @@ "hashtag.follow": "Hashtag ကို စောင့်ကြည့်မယ်", "hashtag.unfollow": "Hashtag ကို မစောင့်ကြည့်ပါ", "hashtags.and_other": "{count, plural, other {# more}} နှင့်", - "home.column_settings.basic": "အခြေခံ", "home.column_settings.show_reblogs": "Boost များကို ပြပါ", "home.column_settings.show_replies": "ပြန်စာများကို ပြပါ", "home.hide_announcements": "ကြေညာချက်များကို ဖျောက်ပါ", @@ -424,9 +423,6 @@ "notifications.column_settings.admin.sign_up": "အကောင့်အသစ်များ -", "notifications.column_settings.alert": "Desktop သတိပေးချက်များ", "notifications.column_settings.favourite": "Favorites:", - "notifications.column_settings.filter_bar.advanced": "ခေါင်းစဥ်အားလုံးများကိုဖော်ပြပါ", - "notifications.column_settings.filter_bar.category": "အမြန်စစ်ထုတ်မှုဘား", - "notifications.column_settings.filter_bar.show_bar": "စစ်ထုတ်မှုဘားကို ပြပါ", "notifications.column_settings.follow": "စောင့်ကြည့်သူအသစ်များ -", "notifications.column_settings.follow_request": "စောင့်ကြည့်ရန် တောင်းဆိုမှုအသစ်များ -", "notifications.column_settings.mention": "ဖော်ပြချက်များ -", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index a8d42e5ff6..da5c4d8643 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -241,6 +241,7 @@ "empty_column.list": "Er is nog niks te zien in deze lijst. Wanneer lijstleden nieuwe berichten plaatsen, zijn deze hier te zien.", "empty_column.lists": "Je hebt nog geen lijsten. Wanneer je er een aanmaakt, zal dat hier verschijnen.", "empty_column.mutes": "Jij hebt nog geen gebruikers genegeerd.", + "empty_column.notification_requests": "Helemaal leeg! Er is hier niets. Wanneer je nieuwe meldingen ontvangt, verschijnen deze hier volgens jouw instellingen.", "empty_column.notifications": "Je hebt nog geen meldingen. Begin met iemand een gesprek.", "empty_column.public": "Er is hier helemaal niks! Plaatst een openbaar bericht of volg mensen van andere servers om het te vullen", "error.unexpected_crash.explanation": "Als gevolg van een bug in onze broncode of als gevolg van een compatibiliteitsprobleem met jouw webbrowser, kan deze pagina niet goed worden weergegeven.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Een bestaande categorie gebruiken of een nieuwe aanmaken", "filter_modal.select_filter.title": "Dit bericht filteren", "filter_modal.title.status": "Een bericht filteren", + "filtered_notifications_banner.pending_requests": "Meldingen van {count, plural, =0 {no} one {één persoon} other {# mensen}} die je misschien kent", + "filtered_notifications_banner.title": "Gefilterde meldingen", "firehose.all": "Alles", "firehose.local": "Deze server", "firehose.remote": "Andere servers", @@ -314,7 +317,6 @@ "hashtag.follow": "Hashtag volgen", "hashtag.unfollow": "Hashtag ontvolgen", "hashtags.and_other": "…en {count, plural, one {}other {# meer}}", - "home.column_settings.basic": "Algemeen", "home.column_settings.show_reblogs": "Boosts tonen", "home.column_settings.show_replies": "Reacties tonen", "home.hide_announcements": "Mededelingen verbergen", @@ -440,15 +442,16 @@ "notification.reblog": "{name} boostte jouw bericht", "notification.status": "{name} heeft zojuist een bericht geplaatst", "notification.update": "{name} heeft een bericht bewerkt", + "notification_requests.accept": "Accepteren", + "notification_requests.dismiss": "Afwijzen", + "notification_requests.notifications_from": "Meldingen van {name}", + "notification_requests.title": "Gefilterde meldingen", "notifications.clear": "Meldingen verwijderen", "notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?", "notifications.column_settings.admin.report": "Nieuwe rapportages:", "notifications.column_settings.admin.sign_up": "Nieuwe registraties:", "notifications.column_settings.alert": "Desktopmeldingen", "notifications.column_settings.favourite": "Favorieten:", - "notifications.column_settings.filter_bar.advanced": "Alle categorieën tonen", - "notifications.column_settings.filter_bar.category": "Snelle filterbalk", - "notifications.column_settings.filter_bar.show_bar": "Filterbalk tonen", "notifications.column_settings.follow": "Nieuwe volgers:", "notifications.column_settings.follow_request": "Nieuw volgverzoek:", "notifications.column_settings.mention": "Vermeldingen:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "Desktopmeldingen zijn niet beschikbaar omdat een eerdere browsertoestemming werd geweigerd", "notifications.permission_denied_alert": "Desktopmeldingen kunnen niet worden ingeschakeld, omdat een eerdere browsertoestemming werd geweigerd", "notifications.permission_required": "Desktopmeldingen zijn niet beschikbaar omdat de benodigde toestemming niet is verleend.", + "notifications.policy.filter_new_accounts.hint": "In de afgelopen {days, plural, one {24 uur} other {# dagen}} geregistreerd", + "notifications.policy.filter_new_accounts_title": "Nieuwe accounts", + "notifications.policy.filter_not_followers_hint": "Inclusief mensen die jou korter dan {days, plural, one {24 uur} other {# dagen}} volgen", + "notifications.policy.filter_not_followers_title": "Mensen die jou niet volgen", + "notifications.policy.filter_not_following_hint": "Totdat je ze handmatig goedkeurt", + "notifications.policy.filter_not_following_title": "Mensen die jij niet volgt", + "notifications.policy.filter_private_mentions_hint": "Onzichtbaar tenzij het een antwoord is op een privébericht van jou of wanneer je de afzender volgt", + "notifications.policy.filter_private_mentions_title": "Ongevraagde privéberichten", + "notifications.policy.title": "Meldingen verbergen van…", "notifications_permission_banner.enable": "Desktopmeldingen inschakelen", "notifications_permission_banner.how_to_control": "Om meldingen te ontvangen wanneer Mastodon niet open staat. Je kunt precies bepalen welke soort interacties wel of geen desktopmeldingen geven via de bovenstaande {icon} knop.", "notifications_permission_banner.title": "Mis nooit meer iets", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 3cc537f54f..b8a0512b8c 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -314,7 +314,6 @@ "hashtag.follow": "Fylg emneknagg", "hashtag.unfollow": "Slutt å fylgje emneknaggen", "hashtags.and_other": "…og {count, plural, one {}other {# fleire}}", - "home.column_settings.basic": "Grunnleggjande", "home.column_settings.show_reblogs": "Vis framhevingar", "home.column_settings.show_replies": "Vis svar", "home.hide_announcements": "Skjul kunngjeringar", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Nyleg registrerte:", "notifications.column_settings.alert": "Skrivebordsvarsel", "notifications.column_settings.favourite": "Favorittar:", - "notifications.column_settings.filter_bar.advanced": "Vis alle kategoriar", - "notifications.column_settings.filter_bar.category": "Snarfilterlinje", - "notifications.column_settings.filter_bar.show_bar": "Vis filterlinja", "notifications.column_settings.follow": "Nye fylgjarar:", "notifications.column_settings.follow_request": "Ny fylgjarførespurnader:", "notifications.column_settings.mention": "Omtalar:", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index a172fc69f4..14e33e9f18 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -304,7 +304,6 @@ "hashtag.follow": "Følg emneknagg", "hashtag.unfollow": "Slutt å følge emneknagg", "hashtags.and_other": "…og {count, plural, one{en til} other {# til}}", - "home.column_settings.basic": "Enkelt", "home.column_settings.show_reblogs": "Vis fremhevinger", "home.column_settings.show_replies": "Vis svar", "home.hide_announcements": "Skjul kunngjøring", @@ -436,9 +435,6 @@ "notifications.column_settings.admin.sign_up": "Nye registreringer:", "notifications.column_settings.alert": "Skrivebordsvarslinger", "notifications.column_settings.favourite": "Favoritter:", - "notifications.column_settings.filter_bar.advanced": "Vis alle kategorier", - "notifications.column_settings.filter_bar.category": "Hurtigfiltreringslinje", - "notifications.column_settings.filter_bar.show_bar": "Vis filterlinjen", "notifications.column_settings.follow": "Nye følgere:", "notifications.column_settings.follow_request": "Nye følgerforespørsler:", "notifications.column_settings.mention": "Nevnt:", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 5e122064fc..09276b3b32 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -262,7 +262,6 @@ "hashtag.follow": "Sègre l’etiqueta", "hashtag.unfollow": "Quitar de sègre l’etiqueta", "hashtags.and_other": "…e {count, plural, one {}other {# de mai}}", - "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Mostrar los partatges", "home.column_settings.show_replies": "Mostrar las responsas", "home.hide_announcements": "Rescondre las anóncias", @@ -379,9 +378,6 @@ "notifications.column_settings.admin.sign_up": "Nòus inscrits :", "notifications.column_settings.alert": "Notificacions localas", "notifications.column_settings.favourite": "Favorits :", - "notifications.column_settings.filter_bar.advanced": "Mostrar totas las categorias", - "notifications.column_settings.filter_bar.category": "Barra de recèrca rapida", - "notifications.column_settings.filter_bar.show_bar": "Afichar la barra de filtres", "notifications.column_settings.follow": "Nòus seguidors :", "notifications.column_settings.follow_request": "Novèla demanda d’abonament :", "notifications.column_settings.mention": "Mencions :", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index ee47c1872d..69360184fc 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -153,7 +153,6 @@ "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "hashtag.follow": "ਹੈਸ਼ਟੈਗ ਨੂੰ ਫ਼ਾਲੋ ਕਰੋ", "hashtag.unfollow": "ਹੈਸ਼ਟੈਗ ਨੂੰ ਅਣ-ਫ਼ਾਲੋ ਕਰੋ", - "home.column_settings.basic": "ਆਮ", "home.pending_critical_update.link": "ਅੱਪਡੇਟ ਵੇਖੋ", "interaction_modal.title.follow": "{name} ਨੂੰ ਫ਼ਾਲੋ ਕਰੋ", "keyboard_shortcuts.back": "ਪਿੱਛੇ ਜਾਓ", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 01b88eacdc..51f705b692 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -241,6 +241,7 @@ "empty_column.list": "Nie ma nic na tej liście. Kiedy członkowie listy dodadzą nowe wpisy, pojawia się one tutaj.", "empty_column.lists": "Nie masz żadnych list. Kiedy utworzysz jedną, pojawi się tutaj.", "empty_column.mutes": "Nie wyciszyłeś(-aś) jeszcze żadnego użytkownika.", + "empty_column.notification_requests": "To wszystko – kiedy otrzymasz nowe powiadomienia, pokażą się tutaj zgodnie z twoimi ustawieniami.", "empty_column.notifications": "Nie masz żadnych powiadomień. Rozpocznij interakcje z innymi użytkownikami.", "empty_column.public": "Tu nic nie ma! Napisz coś publicznie, lub dodaj ludzi z innych serwerów, aby to wyświetlić", "error.unexpected_crash.explanation": "W związku z błędem w naszym kodzie lub braku kompatybilności przeglądarki, ta strona nie może być poprawnie wyświetlona.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Użyj istniejącej kategorii lub utwórz nową", "filter_modal.select_filter.title": "Filtruj ten wpis", "filter_modal.title.status": "Filtruj wpis", + "filtered_notifications_banner.pending_requests": "Powiadomienia od {count, plural, =0 {żadnej osoby którą możesz znać} one {# osoby którą możesz znać} other {# osób które możesz znać}}", + "filtered_notifications_banner.title": "Powiadomienia filtrowane", "firehose.all": "Wszystko", "firehose.local": "Ten serwer", "firehose.remote": "Inne serwery", @@ -314,7 +317,6 @@ "hashtag.follow": "Obserwuj hasztag", "hashtag.unfollow": "Przestań obserwować hashtag", "hashtags.and_other": "…i {count, plural, other {jeszcze #}}", - "home.column_settings.basic": "Podstawowe", "home.column_settings.show_reblogs": "Pokazuj podbicia", "home.column_settings.show_replies": "Pokazuj odpowiedzi", "home.hide_announcements": "Ukryj ogłoszenia", @@ -440,15 +442,16 @@ "notification.reblog": "Twój post został podbity przez {name}", "notification.status": "{name} opublikował(a) nowy wpis", "notification.update": "{name} edytował(a) post", + "notification_requests.accept": "Akceptuj", + "notification_requests.dismiss": "Odrzuć", + "notification_requests.notifications_from": "Powiadomienia od {name}", + "notification_requests.title": "Powiadomienia filtrowane", "notifications.clear": "Wyczyść powiadomienia", "notifications.clear_confirmation": "Czy na pewno chcesz bezpowrotnie usunąć wszystkie powiadomienia?", "notifications.column_settings.admin.report": "Nowe zgłoszenia:", "notifications.column_settings.admin.sign_up": "Nowe rejestracje:", "notifications.column_settings.alert": "Powiadomienia na pulpicie", "notifications.column_settings.favourite": "Ulubione:", - "notifications.column_settings.filter_bar.advanced": "Wyświetl wszystkie kategorie", - "notifications.column_settings.filter_bar.category": "Szybkie filtrowanie", - "notifications.column_settings.filter_bar.show_bar": "Pokaż filtry", "notifications.column_settings.follow": "Nowi obserwujący:", "notifications.column_settings.follow_request": "Nowe prośby o możliwość obserwacji:", "notifications.column_settings.mention": "Wspomnienia:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "Powiadomienia na pulpicie nie są dostępne, ponieważ wcześniej nie udzielono uprawnień w przeglądarce", "notifications.permission_denied_alert": "Powiadomienia na pulpicie nie mogą zostać włączone, ponieważ wcześniej odmówiono uprawnień", "notifications.permission_required": "Powiadomienia na pulpicie nie są dostępne, ponieważ nie przyznano wymaganego uprawnienia.", + "notifications.policy.filter_new_accounts.hint": "Utworzone w ciągu {days, plural, one {ostatniego dnia} other {ostatnich # dni}}", + "notifications.policy.filter_new_accounts_title": "Nowe konta", + "notifications.policy.filter_not_followers_hint": "Zawierające osoby które obserwują cię krócej niż {days, plural, one {dzień} other {# dni}}", + "notifications.policy.filter_not_followers_title": "Ludzie, którzy cię nie obserwują", + "notifications.policy.filter_not_following_hint": "Aż ich ręcznie nie zatwierdzisz", + "notifications.policy.filter_not_following_title": "Ludzie, których nie obserwujesz", + "notifications.policy.filter_private_mentions_hint": "Odfiltrowane, chyba że są odpowiedzią na twoją własną wzmiankę, lub obserwujesz wysyłającego", + "notifications.policy.filter_private_mentions_title": "Nieproszone prywatne wzmianki", + "notifications.policy.title": "Odfiltruj powiadomienia od…", "notifications_permission_banner.enable": "Włącz powiadomienia na pulpicie", "notifications_permission_banner.how_to_control": "Aby otrzymywać powiadomienia, gdy Mastodon nie jest otwarty, włącz powiadomienia pulpitu. Możesz dokładnie kontrolować, októrych działaniach będziesz powiadomienia na pulpicie za pomocą przycisku {icon} powyżej, jeżeli tylko zostaną włączone.", "notifications_permission_banner.title": "Nie przegap niczego", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 8911afe946..a0b66e74e7 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -308,7 +308,6 @@ "hashtag.follow": "Seguir hashtag", "hashtag.unfollow": "Parar de seguir hashtag", "hashtags.and_other": "…e {count, plural, one {}other {outros #}}", - "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar boosts", "home.column_settings.show_replies": "Mostrar respostas", "home.hide_announcements": "Ocultar comunicados", @@ -440,9 +439,6 @@ "notifications.column_settings.admin.sign_up": "Novas inscrições:", "notifications.column_settings.alert": "Notificações no computador", "notifications.column_settings.favourite": "Favoritos:", - "notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorias", - "notifications.column_settings.filter_bar.category": "Barra de filtro rápido das notificações", - "notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtro", "notifications.column_settings.follow": "Seguidores:", "notifications.column_settings.follow_request": "Seguidores pendentes:", "notifications.column_settings.mention": "Menções:", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 26aa0f0b5f..da947f9bf4 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -241,6 +241,7 @@ "empty_column.list": "Ainda não existem publicações nesta lista. Quando membros desta lista fizerem novas publicações, elas aparecerão aqui.", "empty_column.lists": "Ainda não tem qualquer lista. Quando criar uma, ela irá aparecer aqui.", "empty_column.mutes": "Ainda não silenciaste qualquer utilizador.", + "empty_column.notification_requests": "Tudo limpo! Não há nada aqui. Quando você receber novas notificações, elas aparecerão aqui conforme as suas configurações.", "empty_column.notifications": "Não tens notificações. Interage com outros utilizadores para iniciar uma conversa.", "empty_column.public": "Não há nada aqui! Escreve algo publicamente ou segue outros utilizadores para veres aqui os conteúdos públicos", "error.unexpected_crash.explanation": "Devido a um erro no nosso código ou a uma compatilidade com o seu navegador, esta página não pôde ser apresentada correctamente.", @@ -271,6 +272,7 @@ "filter_modal.select_filter.subtitle": "Utilize uma categoria existente ou crie uma nova", "filter_modal.select_filter.title": "Filtrar esta publicação", "filter_modal.title.status": "Filtrar uma publicação", + "filtered_notifications_banner.title": "Notificações filtradas", "firehose.all": "Todas", "firehose.local": "Este servidor", "firehose.remote": "Outros servidores", @@ -314,7 +316,6 @@ "hashtag.follow": "Seguir #etiqueta", "hashtag.unfollow": "Deixar de seguir #etiqueta", "hashtags.and_other": "…e {count, plural, other {mais #}}", - "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar impulsos", "home.column_settings.show_replies": "Mostrar respostas", "home.hide_announcements": "Ocultar comunicações", @@ -440,15 +441,16 @@ "notification.reblog": "{name} reforçou a tua publicação", "notification.status": "{name} acabou de publicar", "notification.update": "{name} editou uma publicação", + "notification_requests.accept": "Aceitar", + "notification_requests.dismiss": "Descartar", + "notification_requests.notifications_from": "Notificações de {name}", + "notification_requests.title": "Notificações filtradas", "notifications.clear": "Limpar notificações", "notifications.clear_confirmation": "Queres mesmo limpar todas as notificações?", "notifications.column_settings.admin.report": "Novas denúncias:", "notifications.column_settings.admin.sign_up": "Novas inscrições:", "notifications.column_settings.alert": "Notificações no ambiente de trabalho", "notifications.column_settings.favourite": "Favoritos:", - "notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorias", - "notifications.column_settings.filter_bar.category": "Barra de filtros rápidos", - "notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtros", "notifications.column_settings.follow": "Novos seguidores:", "notifications.column_settings.follow_request": "Novos pedidos de seguidor:", "notifications.column_settings.mention": "Menções:", @@ -474,6 +476,13 @@ "notifications.permission_denied": "Notificações no ambiente de trabalho não estão disponíveis porque a permissão, solicitada pelo navegador, foi recusada anteriormente", "notifications.permission_denied_alert": "Notificações no ambiente de trabalho não podem ser ativadas, pois a permissão do navegador foi recusada anteriormente", "notifications.permission_required": "Notificações no ambiente de trabalho não estão disponíveis porque a permissão necessária não foi concedida.", + "notifications.policy.filter_new_accounts_title": "Novas contas", + "notifications.policy.filter_not_followers_title": "Pessoas não te seguem", + "notifications.policy.filter_not_following_hint": "Até que você os aprove manualmente", + "notifications.policy.filter_not_following_title": "Pessoas que você não segue", + "notifications.policy.filter_private_mentions_hint": "Filtrado, a menos que seja em resposta à sua própria menção ou se você seguir o remetente", + "notifications.policy.filter_private_mentions_title": "Menções privadas não solicitadas", + "notifications.policy.title": "Filtrar notificações de…", "notifications_permission_banner.enable": "Ativar notificações no ambiente de trabalho", "notifications_permission_banner.how_to_control": "Para receber notificações quando o Mastodon não estiver aberto, ative as notificações no ambiente de trabalho. Depois da sua ativação, pode controlar precisamente quais tipos de interações geram notificações, através do botão {icon} acima.", "notifications_permission_banner.title": "Nunca perca nada", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index b8bb779f85..f31499f845 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -292,7 +292,6 @@ "hashtag.column_settings.tag_toggle": "Adaugă etichete suplimentare pentru această coloană", "hashtag.follow": "Urmărește haștagul", "hashtag.unfollow": "Nu mai urmări haștagul", - "home.column_settings.basic": "De bază", "home.column_settings.show_reblogs": "Afișează distribuirile", "home.column_settings.show_replies": "Afișează răspunsurile", "home.hide_announcements": "Ascunde anunțurile", @@ -414,9 +413,6 @@ "notifications.column_settings.admin.report": "Raportări noi:", "notifications.column_settings.admin.sign_up": "Înscrieri noi:", "notifications.column_settings.alert": "Notificări pe desktop", - "notifications.column_settings.filter_bar.advanced": "Afișează toate categoriile", - "notifications.column_settings.filter_bar.category": "Bară de filtrare rapidă", - "notifications.column_settings.filter_bar.show_bar": "Arată bara de filtrare", "notifications.column_settings.follow": "Noi urmăritori:", "notifications.column_settings.follow_request": "Noi cereri de abonare:", "notifications.column_settings.mention": "Mențiuni:", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index fde170db60..000d485eda 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -308,7 +308,6 @@ "hashtag.follow": "Подписаться на новые посты", "hashtag.unfollow": "Отписаться", "hashtags.and_other": "...и {count, plural, other {# ещё}}", - "home.column_settings.basic": "Основные", "home.column_settings.show_reblogs": "Показывать продвижения", "home.column_settings.show_replies": "Показывать ответы", "home.hide_announcements": "Скрыть объявления", @@ -440,9 +439,6 @@ "notifications.column_settings.admin.sign_up": "Новые регистрации:", "notifications.column_settings.alert": "Уведомления на рабочем столе", "notifications.column_settings.favourite": "Избранные:", - "notifications.column_settings.filter_bar.advanced": "Отображать все категории", - "notifications.column_settings.filter_bar.category": "Панель сортировки", - "notifications.column_settings.filter_bar.show_bar": "Отображать панель сортировки", "notifications.column_settings.follow": "У вас новый подписчик:", "notifications.column_settings.follow_request": "Новые запросы на подписку:", "notifications.column_settings.mention": "Вас упомянули в посте:", diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json index 469930c3ed..36dae25c17 100644 --- a/app/javascript/mastodon/locales/sa.json +++ b/app/javascript/mastodon/locales/sa.json @@ -264,7 +264,6 @@ "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "hashtag.follow": "प्रचलितवस्तु अनुसर", "hashtag.unfollow": "प्रचलितवस्तु अनुसरणं वारय", - "home.column_settings.basic": "मूलभूतम्", "home.column_settings.show_reblogs": "बुस्त् दर्शय", "home.column_settings.show_replies": "उत्तराणि दर्शय", "home.hide_announcements": "विज्ञापनानि प्रच्छादय", @@ -376,9 +375,6 @@ "notifications.column_settings.admin.report": "नूतनावेदनानि", "notifications.column_settings.admin.sign_up": "नूतनपञ्जीकरणम्:", "notifications.column_settings.alert": "देस्क्टप्विज्ञापनानि", - "notifications.column_settings.filter_bar.advanced": "सर्वाणि वर्गाणि प्रदर्शय", - "notifications.column_settings.filter_bar.category": "द्रुतशोधकशलाका", - "notifications.column_settings.filter_bar.show_bar": "शोधकशालकां दर्शय", "notifications.column_settings.follow": "नूतनानुसारिणः:", "notifications.column_settings.follow_request": "नूतनानुसरणानुरोधाः:", "notifications.column_settings.mention": "उल्लिखितानि :", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index 90b663aea7..a3d11d7dbd 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -200,7 +200,6 @@ "hashtag.column_settings.tag_mode.none": "Perunu de custos", "hashtag.column_settings.tag_toggle": "Include etichetas additzionales pro custa colunna", "hashtag.follow": "Sighi su hashtag", - "home.column_settings.basic": "Bàsicu", "home.column_settings.show_reblogs": "Ammustra is cumpartziduras", "home.column_settings.show_replies": "Ammustra rispostas", "home.hide_announcements": "Cua annùntzios", @@ -300,8 +299,6 @@ "notifications.clear": "Lìmpia notìficas", "notifications.clear_confirmation": "Seguru chi boles isboidare in manera permanente totu is notìficas tuas?", "notifications.column_settings.alert": "Notìficas de iscrivania", - "notifications.column_settings.filter_bar.advanced": "Ammustra totu is categorias", - "notifications.column_settings.filter_bar.category": "Barra lestra de filtros", "notifications.column_settings.follow": "Sighiduras noas:", "notifications.column_settings.follow_request": "Rechestas noas de sighidura:", "notifications.column_settings.mention": "Mèntovos:", diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json index b7563022a9..7e9778b57c 100644 --- a/app/javascript/mastodon/locales/sco.json +++ b/app/javascript/mastodon/locales/sco.json @@ -249,7 +249,6 @@ "hashtag.column_settings.tag_toggle": "Pit in mair hashtags fir this column", "hashtag.follow": "Follae hashtag", "hashtag.unfollow": "Unfollae hashtag", - "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Shaw boosts", "home.column_settings.show_replies": "Shaw replies", "home.hide_announcements": "Hide annooncements", @@ -359,9 +358,6 @@ "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktap notes", - "notifications.column_settings.filter_bar.advanced": "Shaw aw caitegories", - "notifications.column_settings.filter_bar.category": "Quick filter baur", - "notifications.column_settings.filter_bar.show_bar": "Shaw filter baur", "notifications.column_settings.follow": "New follaers:", "notifications.column_settings.follow_request": "New follae requests:", "notifications.column_settings.mention": "Menshies:", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index 2058d1415b..a2194b56cb 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -201,7 +201,6 @@ "hashtag.column_settings.tag_mode.all": "මේ සියල්ලම", "hashtag.column_settings.tag_mode.none": "මේ කිසිවක් නැත", "hashtag.column_settings.tag_toggle": "මෙම තීරුවේ අමතර ටැග් ඇතුළත් කරන්න", - "home.column_settings.basic": "මූලික", "home.column_settings.show_replies": "පිළිතුරු පෙන්වන්න", "home.hide_announcements": "නිවේදන සඟවන්න", "home.pending_critical_update.link": "යාවත්කාල බලන්න", @@ -285,9 +284,6 @@ "notifications.column_settings.admin.sign_up": "නව ලියාපදිංචි:", "notifications.column_settings.alert": "වැඩතල දැනුම්දීම්", "notifications.column_settings.favourite": "ප්‍රියතමයන්:", - "notifications.column_settings.filter_bar.advanced": "සියළු ප්‍රවර්ග පෙන්වන්න", - "notifications.column_settings.filter_bar.category": "ඉක්මන් පෙරහන් තීරුව", - "notifications.column_settings.filter_bar.show_bar": "පෙරහන් තීරුව පෙන්වන්න", "notifications.column_settings.follow": "නව අනුගාමිකයින්:", "notifications.column_settings.follow_request": "නව අනුගමන ඉල්ලීම්:", "notifications.column_settings.mention": "සැඳහුම්:", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 7eee0c29c2..a9c7affab1 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -314,7 +314,6 @@ "hashtag.follow": "Sledovať hashtag", "hashtag.unfollow": "Prestať sledovať hashtag", "hashtags.and_other": "…a {count, plural, other {# ďalších}}", - "home.column_settings.basic": "Základné", "home.column_settings.show_reblogs": "Zobraziť zdieľania", "home.column_settings.show_replies": "Zobraziť odpovede", "home.hide_announcements": "Skryť oznámenia", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Nové registrácie:", "notifications.column_settings.alert": "Upozornenia na ploche", "notifications.column_settings.favourite": "Ohviezdičkované:", - "notifications.column_settings.filter_bar.advanced": "Zobraziť všetky kategórie", - "notifications.column_settings.filter_bar.category": "Rýchly filter", - "notifications.column_settings.filter_bar.show_bar": "Zobraziť filter", "notifications.column_settings.follow": "Nové sledovania od:", "notifications.column_settings.follow_request": "Nové žiadosti o sledovanie od:", "notifications.column_settings.mention": "Označenia:", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 8396e02a68..df150fc291 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -241,6 +241,7 @@ "empty_column.list": "Na tem seznamu ni ničesar. Ko bodo člani tega seznama objavili nove statuse, se bodo pojavili tukaj.", "empty_column.lists": "Nimate seznamov. Ko ga boste ustvarili, se bo prikazal tukaj.", "empty_column.mutes": "Niste utišali še nobenega uporabnika.", + "empty_column.notification_requests": "Vse prebrano! Tu ni ničesar več. Ko prejmete nova obvestila, se bodo pojavila tu glede na vaše nastavitve.", "empty_column.notifications": "Nimate še nobenih obvestil. Povežite se z drugimi, da začnete pogovor.", "empty_column.public": "Tukaj ni ničesar! Da ga napolnite, napišite nekaj javnega ali pa ročno sledite uporabnikom iz drugih strežnikov", "error.unexpected_crash.explanation": "Zaradi hrošča v naši kodi ali težave z združljivostjo brskalnika te strani ni mogoče ustrezno prikazati.", @@ -271,6 +272,7 @@ "filter_modal.select_filter.subtitle": "Uporabite obstoječo kategorijo ali ustvarite novo", "filter_modal.select_filter.title": "Filtriraj to objavo", "filter_modal.title.status": "Filtrirajte objavo", + "filtered_notifications_banner.title": "Filtrirana obvestila", "firehose.all": "Vse", "firehose.local": "Ta strežnik", "firehose.remote": "Drugi strežniki", @@ -314,7 +316,6 @@ "hashtag.follow": "Sledi ključniku", "hashtag.unfollow": "Nehaj slediti ključniku", "hashtags.and_other": "…in še {count, plural, other {#}}", - "home.column_settings.basic": "Osnovno", "home.column_settings.show_reblogs": "Pokaži izpostavitve", "home.column_settings.show_replies": "Pokaži odgovore", "home.hide_announcements": "Skrij obvestila", @@ -440,15 +441,16 @@ "notification.reblog": "{name} je izpostavila/a vašo objavo", "notification.status": "{name} je pravkar objavil/a", "notification.update": "{name} je uredil(a) objavo", + "notification_requests.accept": "Sprejmi", + "notification_requests.dismiss": "Zavrni", + "notification_requests.notifications_from": "Obvestila od {name}", + "notification_requests.title": "Filtrirana obvestila", "notifications.clear": "Počisti obvestila", "notifications.clear_confirmation": "Ali ste prepričani, da želite trajno izbrisati vsa svoja obvestila?", "notifications.column_settings.admin.report": "Nove prijave:", "notifications.column_settings.admin.sign_up": "Novi vpisi:", "notifications.column_settings.alert": "Namizna obvestila", "notifications.column_settings.favourite": "Priljubljeni:", - "notifications.column_settings.filter_bar.advanced": "Prikaži vse kategorije", - "notifications.column_settings.filter_bar.category": "Vrstica za hitro filtriranje", - "notifications.column_settings.filter_bar.show_bar": "Pokaži vrstico s filtri", "notifications.column_settings.follow": "Novi sledilci:", "notifications.column_settings.follow_request": "Nove prošnje za sledenje:", "notifications.column_settings.mention": "Omembe:", @@ -474,6 +476,13 @@ "notifications.permission_denied": "Namizna obvestila niso na voljo zaradi poprej zavrnjene zahteve dovoljenja brskalnika.", "notifications.permission_denied_alert": "Namiznih obvestil ni mogoče omogočiti, ker je bilo dovoljenje brskalnika že prej zavrnjeno", "notifications.permission_required": "Namizna obvestila niso na voljo, ker zahtevano dovoljenje ni bilo podeljeno.", + "notifications.policy.filter_new_accounts_title": "Novi računi", + "notifications.policy.filter_not_followers_title": "Ljudje, ki vam ne sledijo", + "notifications.policy.filter_not_following_hint": "Dokler jih ročno ne odobrite", + "notifications.policy.filter_not_following_title": "Ljudje, ki jim ne sledite", + "notifications.policy.filter_private_mentions_hint": "Filtrirano, razen če je odgovor na vašo lastno omembo ali če sledite pošiljatelju", + "notifications.policy.filter_private_mentions_title": "Neželene zasebne omembe", + "notifications.policy.title": "Skrij obvestila od …", "notifications_permission_banner.enable": "Omogoči obvestila na namizju", "notifications_permission_banner.how_to_control": "Če želite prejemati obvestila, ko Mastodon ni odprt, omogočite namizna obvestila. Natančno lahko nadzirate, katere vrste interakcij naj tvorijo namizna obvestila; ko so omogočena, za to uporabite gumb {icon} zgoraj.", "notifications_permission_banner.title": "Nikoli ne zamudite ničesar", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index c388ebb865..00d517de72 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -314,7 +314,6 @@ "hashtag.follow": "Ndiqe hashtag-un", "hashtag.unfollow": "Hiqe ndjekjen e hashtag-ut", "hashtags.and_other": "…dhe {count, plural, one {}other {# më tepër}}", - "home.column_settings.basic": "Bazë", "home.column_settings.show_reblogs": "Shfaq përforcime", "home.column_settings.show_replies": "Shfaq përgjigje", "home.hide_announcements": "Fshihi lajmërimet", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Regjistrime të reja:", "notifications.column_settings.alert": "Njoftime desktopi", "notifications.column_settings.favourite": "Të parapëlqyer:", - "notifications.column_settings.filter_bar.advanced": "Shfaq krejt kategoritë", - "notifications.column_settings.filter_bar.category": "Shtyllë filtrimesh të shpejta", - "notifications.column_settings.filter_bar.show_bar": "Shfaq shtyllë filtrash", "notifications.column_settings.follow": "Ndjekës të rinj:", "notifications.column_settings.follow_request": "Kërkesa të reja për ndjekje:", "notifications.column_settings.mention": "Përmendje:", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 35bfc79f2e..4c0264465d 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -314,7 +314,6 @@ "hashtag.follow": "Zaprati heš oznaku", "hashtag.unfollow": "Otprati heš oznaku", "hashtags.and_other": "…i {count, plural, one {još #} few {još #}other {još #}}", - "home.column_settings.basic": "Osnovna", "home.column_settings.show_reblogs": "Prikaži podržavanja", "home.column_settings.show_replies": "Prikaži odgovore", "home.hide_announcements": "Sakrij najave", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Nove ragistracije:", "notifications.column_settings.alert": "Obaveštenja na radnoj površini", "notifications.column_settings.favourite": "Omiljeno:", - "notifications.column_settings.filter_bar.advanced": "Prikaži sve kategorije", - "notifications.column_settings.filter_bar.category": "Traka za brzo filtriranje", - "notifications.column_settings.filter_bar.show_bar": "Prikaži traku sa filterima", "notifications.column_settings.follow": "Novi pratioci:", "notifications.column_settings.follow_request": "Novi zahtevi za praćenje:", "notifications.column_settings.mention": "Pominjanja:", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index dc20585c92..d00e322b42 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -314,7 +314,6 @@ "hashtag.follow": "Запрати хеш ознаку", "hashtag.unfollow": "Отпрати хеш ознаку", "hashtags.and_other": "…и {count, plural, one {још #} few {још #}other {још #}}", - "home.column_settings.basic": "Основна", "home.column_settings.show_reblogs": "Прикажи подржавања", "home.column_settings.show_replies": "Прикажи одговоре", "home.hide_announcements": "Сакриј најаве", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Нове рагистрације:", "notifications.column_settings.alert": "Обавештења на радној површини", "notifications.column_settings.favourite": "Омиљено:", - "notifications.column_settings.filter_bar.advanced": "Прикажи све категорије", - "notifications.column_settings.filter_bar.category": "Трака за брзо филтрирање", - "notifications.column_settings.filter_bar.show_bar": "Прикажи траку са филтерима", "notifications.column_settings.follow": "Нови пратиоци:", "notifications.column_settings.follow_request": "Нови захтеви за праћење:", "notifications.column_settings.mention": "Помињања:", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 55503ddf50..37886cd80f 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -314,7 +314,6 @@ "hashtag.follow": "Följ hashtagg", "hashtag.unfollow": "Avfölj hashtagg", "hashtags.and_other": "…och {count, plural, one {}other {# mer}}", - "home.column_settings.basic": "Grundläggande", "home.column_settings.show_reblogs": "Visa boostar", "home.column_settings.show_replies": "Visa svar", "home.hide_announcements": "Dölj notiser", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Nya registreringar:", "notifications.column_settings.alert": "Skrivbordsaviseringar", "notifications.column_settings.favourite": "Favoriter:", - "notifications.column_settings.filter_bar.advanced": "Visa alla kategorier", - "notifications.column_settings.filter_bar.category": "Snabbfilter", - "notifications.column_settings.filter_bar.show_bar": "Visa filterfält", "notifications.column_settings.follow": "Nya följare:", "notifications.column_settings.follow_request": "Ny följ-förfrågan:", "notifications.column_settings.mention": "Omnämningar:", @@ -474,6 +470,9 @@ "notifications.permission_denied": "Skrivbordsaviseringar är otillgängliga på grund av tidigare nekade förfrågningar om behörighet i webbläsaren", "notifications.permission_denied_alert": "Skrivbordsaviseringar kan inte aktiveras, eftersom att webbläsarens behörighet har nekats innan", "notifications.permission_required": "Skrivbordsaviseringar är otillgängliga eftersom att rättigheten som krävs inte har godkänts.", + "notifications.policy.filter_new_accounts_title": "Nya konton", + "notifications.policy.filter_not_followers_title": "Personer som inte följer dig", + "notifications.policy.filter_not_following_title": "Personer du inte följer", "notifications_permission_banner.enable": "Aktivera skrivbordsaviseringar", "notifications_permission_banner.how_to_control": "För att ta emot aviseringar när Mastodon inte är öppet, aktivera skrivbordsaviseringar. När de är aktiverade kan du styra exakt vilka typer av interaktioner som aviseras via {icon} -knappen ovan.", "notifications_permission_banner.title": "Missa aldrig något", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 6210c3d0b1..7de7146bf6 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -211,7 +211,6 @@ "hashtag.column_settings.tag_mode.any": "இவற்றில் எவையேனும்", "hashtag.column_settings.tag_mode.none": "இவற்றில் ஏதுமில்லை", "hashtag.column_settings.tag_toggle": "இந்த நெடுவரிசையில் கூடுதல் சிட்டைகளைச் சேர்க்கவும்", - "home.column_settings.basic": "அடிப்படையானவை", "home.column_settings.show_reblogs": "பகிர்வுகளைக் காண்பி", "home.column_settings.show_replies": "மறுமொழிகளைக் காண்பி", "home.hide_announcements": "அறிவிப்புகளை மறை", @@ -293,8 +292,6 @@ "notifications.clear": "அறிவிப்புகளை அழிக்கவும்", "notifications.clear_confirmation": "உங்கள் எல்லா அறிவிப்புகளையும் நிரந்தரமாக அழிக்க விரும்புகிறீர்களா?", "notifications.column_settings.alert": "டெஸ்க்டாப் அறிவிப்புகள்", - "notifications.column_settings.filter_bar.advanced": "எல்லா வகைகளையும் காட்டு", - "notifications.column_settings.filter_bar.category": "விரைவு வடிகட்டி பட்டை", "notifications.column_settings.follow": "புதிய பின்பற்றுபவர்கள்:", "notifications.column_settings.follow_request": "புதிய பின்தொடர் கோரிக்கைகள்:", "notifications.column_settings.mention": "குறிப்பிடுகிறது:", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 24a67247c0..1202de1556 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -127,7 +127,6 @@ "hashtag.column_settings.tag_mode.any": "వీటిలో ఏవైనా", "hashtag.column_settings.tag_mode.none": "ఇవేవీ కావు", "hashtag.column_settings.tag_toggle": "ఈ నిలువు వరుసలో మరికొన్ని ట్యాగులను చేర్చండి", - "home.column_settings.basic": "ప్రాథమిక", "home.column_settings.show_reblogs": "బూస్ట్ లను చూపించు", "home.column_settings.show_replies": "ప్రత్యుత్తరాలను చూపించు", "keyboard_shortcuts.back": "వెనక్కి తిరిగి వెళ్ళడానికి", @@ -198,8 +197,6 @@ "notifications.clear": "ప్రకటనలను తుడిచివేయు", "notifications.clear_confirmation": "మీరు మీ అన్ని నోటిఫికేషన్లను శాశ్వతంగా తొలగించాలనుకుంటున్నారా?", "notifications.column_settings.alert": "డెస్క్టాప్ నోటిఫికేషన్లు", - "notifications.column_settings.filter_bar.advanced": "అన్ని విభాగాలను చూపించు", - "notifications.column_settings.filter_bar.category": "క్విక్ ఫిల్టర్ బార్", "notifications.column_settings.follow": "క్రొత్త అనుచరులు:", "notifications.column_settings.mention": "ప్రస్తావనలు:", "notifications.column_settings.poll": "ఎన్నిక ఫలితాలు:", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 0865b18542..d92cbcda1f 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -271,6 +271,7 @@ "filter_modal.select_filter.subtitle": "ใช้หมวดหมู่ที่มีอยู่หรือสร้างหมวดหมู่ใหม่", "filter_modal.select_filter.title": "กรองโพสต์นี้", "filter_modal.title.status": "กรองโพสต์", + "filtered_notifications_banner.title": "การแจ้งเตือนที่กรองอยู่", "firehose.all": "ทั้งหมด", "firehose.local": "เซิร์ฟเวอร์นี้", "firehose.remote": "เซิร์ฟเวอร์อื่น ๆ", @@ -314,7 +315,6 @@ "hashtag.follow": "ติดตามแฮชแท็ก", "hashtag.unfollow": "เลิกติดตามแฮชแท็ก", "hashtags.and_other": "…และอีก {count, plural, other {# เพิ่มเติม}}", - "home.column_settings.basic": "พื้นฐาน", "home.column_settings.show_reblogs": "แสดงการดัน", "home.column_settings.show_replies": "แสดงการตอบกลับ", "home.hide_announcements": "ซ่อนประกาศ", @@ -440,15 +440,16 @@ "notification.reblog": "{name} ได้ดันโพสต์ของคุณ", "notification.status": "{name} เพิ่งโพสต์", "notification.update": "{name} ได้แก้ไขโพสต์", + "notification_requests.accept": "ยอมรับ", + "notification_requests.dismiss": "ปิด", + "notification_requests.notifications_from": "การแจ้งเตือนจาก {name}", + "notification_requests.title": "การแจ้งเตือนที่กรองอยู่", "notifications.clear": "ล้างการแจ้งเตือน", "notifications.clear_confirmation": "คุณแน่ใจหรือไม่ว่าต้องการล้างการแจ้งเตือนทั้งหมดของคุณอย่างถาวร?", "notifications.column_settings.admin.report": "รายงานใหม่:", "notifications.column_settings.admin.sign_up": "การลงทะเบียนใหม่:", "notifications.column_settings.alert": "การแจ้งเตือนบนเดสก์ท็อป", "notifications.column_settings.favourite": "รายการโปรด:", - "notifications.column_settings.filter_bar.advanced": "แสดงหมวดหมู่ทั้งหมด", - "notifications.column_settings.filter_bar.category": "แถบตัวกรองด่วน", - "notifications.column_settings.filter_bar.show_bar": "แสดงแถบตัวกรอง", "notifications.column_settings.follow": "ผู้ติดตามใหม่:", "notifications.column_settings.follow_request": "คำขอติดตามใหม่:", "notifications.column_settings.mention": "การกล่าวถึง:", @@ -474,6 +475,15 @@ "notifications.permission_denied": "การแจ้งเตือนบนเดสก์ท็อปไม่พร้อมใช้งานเนื่องจากมีการปฏิเสธคำขอสิทธิอนุญาตเบราว์เซอร์ก่อนหน้านี้", "notifications.permission_denied_alert": "ไม่สามารถเปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป เนื่องจากมีการปฏิเสธสิทธิอนุญาตเบราว์เซอร์ก่อนหน้านี้", "notifications.permission_required": "การแจ้งเตือนบนเดสก์ท็อปไม่พร้อมใช้งานเนื่องจากไม่ได้ให้สิทธิอนุญาตที่จำเป็น", + "notifications.policy.filter_new_accounts.hint": "สร้างขึ้นภายใน {days, plural, other {# วัน}}ที่ผ่านมา", + "notifications.policy.filter_new_accounts_title": "บัญชีใหม่", + "notifications.policy.filter_not_followers_hint": "รวมถึงผู้คนที่ได้ติดตามคุณน้อยกว่า {days, plural, other {# วัน}}", + "notifications.policy.filter_not_followers_title": "ผู้คนที่ไม่ได้ติดตามคุณ", + "notifications.policy.filter_not_following_hint": "จนกว่าคุณจะอนุมัติเขาด้วยตนเอง", + "notifications.policy.filter_not_following_title": "ผู้คนที่คุณไม่ได้ติดตาม", + "notifications.policy.filter_private_mentions_hint": "กรองไว้เว้นแต่การกล่าวถึงแบบส่วนตัวอยู่ในการตอบกลับการกล่าวถึงของคุณเองหรือหากคุณติดตามผู้ส่ง", + "notifications.policy.filter_private_mentions_title": "การกล่าวถึงแบบส่วนตัวที่ไม่พึงประสงค์", + "notifications.policy.title": "กรองการแจ้งเตือนจาก…", "notifications_permission_banner.enable": "เปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป", "notifications_permission_banner.how_to_control": "เพื่อรับการแจ้งเตือนเมื่อ Mastodon ไม่ได้เปิด เปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป คุณสามารถควบคุมชนิดของการโต้ตอบที่สร้างการแจ้งเตือนบนเดสก์ท็อปได้อย่างแม่นยำผ่านปุ่ม {icon} ด้านบนเมื่อเปิดใช้งานการแจ้งเตือน", "notifications_permission_banner.title": "ไม่พลาดสิ่งใด", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 02c9159be5..6774ad48e1 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -314,7 +314,6 @@ "hashtag.follow": "Etiketi takip et", "hashtag.unfollow": "Etiketi takibi bırak", "hashtags.and_other": "…ve {count, plural, one {}other {# fazlası}}", - "home.column_settings.basic": "Temel", "home.column_settings.show_reblogs": "Yeniden paylaşımları göster", "home.column_settings.show_replies": "Yanıtları göster", "home.hide_announcements": "Duyuruları gizle", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Yeni kayıtlar:", "notifications.column_settings.alert": "Masaüstü bildirimleri", "notifications.column_settings.favourite": "Favorilerin:", - "notifications.column_settings.filter_bar.advanced": "Tüm kategorileri görüntüle", - "notifications.column_settings.filter_bar.category": "Hızlı süzgeç çubuğu", - "notifications.column_settings.filter_bar.show_bar": "Süzgeç çubuğunu göster", "notifications.column_settings.follow": "Yeni takipçiler:", "notifications.column_settings.follow_request": "Yeni takip istekleri:", "notifications.column_settings.mention": "Değinmeler:", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json index 17de9884e7..49c7e9a145 100644 --- a/app/javascript/mastodon/locales/tt.json +++ b/app/javascript/mastodon/locales/tt.json @@ -236,7 +236,6 @@ "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "hashtag.follow": "Хэштегка язылу", "hashtag.unfollow": "Хэштегка язылу юк", - "home.column_settings.basic": "Төп", "home.column_settings.show_reblogs": "Табышмаклау", "home.column_settings.show_replies": "Җаваплар күрсәтү", "home.hide_announcements": "Игъланнарны яшерү", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index d14654d17c..49d79d32d1 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -314,7 +314,6 @@ "hashtag.follow": "Стежити за хештегом", "hashtag.unfollow": "Не стежити за хештегом", "hashtags.and_other": "…і {count, plural, other {ще #}}", - "home.column_settings.basic": "Основні", "home.column_settings.show_reblogs": "Показувати поширення", "home.column_settings.show_replies": "Показувати відповіді", "home.hide_announcements": "Приховати оголошення", @@ -440,15 +439,16 @@ "notification.reblog": "{name} поширює ваш допис", "notification.status": "{name} щойно дописує", "notification.update": "{name} змінює допис", + "notification_requests.accept": "Прийняти", + "notification_requests.dismiss": "Відхилити", + "notification_requests.notifications_from": "Сповіщення від {name}", + "notification_requests.title": "Відфільтровані сповіщення", "notifications.clear": "Очистити сповіщення", "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщення?", "notifications.column_settings.admin.report": "Нові скарги:", "notifications.column_settings.admin.sign_up": "Нові реєстрації:", "notifications.column_settings.alert": "Сповіщення стільниці", "notifications.column_settings.favourite": "Уподобане:", - "notifications.column_settings.filter_bar.advanced": "Показати всі категорії", - "notifications.column_settings.filter_bar.category": "Панель швидкого фільтру", - "notifications.column_settings.filter_bar.show_bar": "Показати панель фільтра", "notifications.column_settings.follow": "Нові підписники:", "notifications.column_settings.follow_request": "Нові запити на підписку:", "notifications.column_settings.mention": "Згадки:", @@ -474,6 +474,7 @@ "notifications.permission_denied": "Сповіщення стільниці недоступні через раніше відхилений запит дозволів для браузера", "notifications.permission_denied_alert": "Сповіщення не можна ввімкнути оскільки у дозволі вже було відмовлено раніше", "notifications.permission_required": "Сповіщення на стільниці не доступні, оскільки необхідний дозвіл не надано.", + "notifications.policy.filter_new_accounts_title": "Нові облікові записи", "notifications_permission_banner.enable": "Увімкнути сповіщення стільниці", "notifications_permission_banner.how_to_control": "Щоб отримувати сповіщення, коли Mastodon не відкрито, увімкніть сповіщення стільниці. Ви можете контролювати, які типи взаємодій створюють сповіщення через кнопку {icon} вгорі після їхнього увімкнення.", "notifications_permission_banner.title": "Не проґавте нічого", diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json index fee2cc3a98..d344f00c87 100644 --- a/app/javascript/mastodon/locales/ur.json +++ b/app/javascript/mastodon/locales/ur.json @@ -189,7 +189,6 @@ "hashtag.column_settings.tag_mode.any": "ان میں سے کوئی", "hashtag.column_settings.tag_mode.none": "ان میں سے کوئی بھی نہیں", "hashtag.column_settings.tag_toggle": "اس کالم کے لئے مزید ٹیگز شامل کریں", - "home.column_settings.basic": "بنیادی", "home.column_settings.show_reblogs": "افزائشات دکھائیں", "home.column_settings.show_replies": "جوابات دکھائیں", "intervals.full.days": "{number, plural, one {# روز} other {# روز}}", @@ -253,7 +252,6 @@ "notifications.clear": "اطلاعات ہٹائیں", "notifications.clear_confirmation": "کیا آپ واقعی اپنی تمام اطلاعات کو صاف کرنا چاہتے ہیں؟", "notifications.column_settings.alert": "ڈیسک ٹاپ اطلاعات", - "notifications.column_settings.filter_bar.advanced": "تمام زمرے دکھائیں", "notifications.column_settings.status": "New toots:", "onboarding.actions.go_to_explore": "See what's trending", "onboarding.actions.go_to_home": "Go to your home feed", diff --git a/app/javascript/mastodon/locales/uz.json b/app/javascript/mastodon/locales/uz.json index 8f231c8c77..b307d917fa 100644 --- a/app/javascript/mastodon/locales/uz.json +++ b/app/javascript/mastodon/locales/uz.json @@ -255,7 +255,6 @@ "hashtag.column_settings.tag_toggle": "Ushbu ustun uchun qo'shimcha teglarni qo'shing", "hashtag.follow": "Hashtagni kuzatish", "hashtag.unfollow": "Hashtagni kuzatishni to'xtatish", - "home.column_settings.basic": "Asos", "home.column_settings.show_reblogs": "Boostlarni ko'rish", "home.column_settings.show_replies": "Javoblarni ko'rish", "home.hide_announcements": "E'lonlarni yashirish", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 9a4182e540..b1785ca5d0 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -314,7 +314,6 @@ "hashtag.follow": "Theo dõi hashtag", "hashtag.unfollow": "Bỏ theo dõi hashtag", "hashtags.and_other": "…và {count, plural, other {# nữa}}", - "home.column_settings.basic": "Tùy chỉnh", "home.column_settings.show_reblogs": "Hiện những lượt đăng lại", "home.column_settings.show_replies": "Hiện những tút dạng trả lời", "home.hide_announcements": "Ẩn thông báo máy chủ", @@ -446,9 +445,6 @@ "notifications.column_settings.admin.sign_up": "Người mới tham gia:", "notifications.column_settings.alert": "Báo trên máy tính", "notifications.column_settings.favourite": "Lượt thích:", - "notifications.column_settings.filter_bar.advanced": "Toàn bộ", - "notifications.column_settings.filter_bar.category": "Phân loại", - "notifications.column_settings.filter_bar.show_bar": "Hiện bộ lọc", "notifications.column_settings.follow": "Người theo dõi:", "notifications.column_settings.follow_request": "Yêu cầu theo dõi:", "notifications.column_settings.mention": "Lượt nhắc đến:", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 3e714987c0..6d6cd4b6c7 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -241,6 +241,7 @@ "empty_column.list": "列表中还没有任何内容。当列表成员发布新嘟文时,它们将出现在这里。", "empty_column.lists": "你还没有创建过列表。你创建的列表会在这里显示。", "empty_column.mutes": "你没有隐藏任何用户。", + "empty_column.notification_requests": "都看完了!这里没有任何未读通知。当收到新的通知时,它们将根据您的设置显示在这里。", "empty_column.notifications": "你还没有收到过任何通知,快和其他用户互动吧。", "empty_column.public": "这里什么都没有!写一些公开的嘟文,或者关注其他服务器的用户后,这里就会有嘟文出现了", "error.unexpected_crash.explanation": "此页面无法正确显示,这可能是因为我们的代码中有错误,也可能是因为浏览器兼容问题。", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "使用一个已存在类别,或创建一个新类别", "filter_modal.select_filter.title": "过滤此嘟文", "filter_modal.title.status": "过滤一条嘟文", + "filtered_notifications_banner.pending_requests": "来自你可能认识的 {count, plural, =0 {0 个人} other {# 个人}}的通知", + "filtered_notifications_banner.title": "通知(已过滤)", "firehose.all": "全部", "firehose.local": "此服务器", "firehose.remote": "其他服务器", @@ -314,7 +317,6 @@ "hashtag.follow": "关注话题标签", "hashtag.unfollow": "取消关注话题标签", "hashtags.and_other": "… 和另外 {count, plural, other {# 个话题}}", - "home.column_settings.basic": "基本设置", "home.column_settings.show_reblogs": "显示转嘟", "home.column_settings.show_replies": "显示回复", "home.hide_announcements": "隐藏公告", @@ -440,15 +442,16 @@ "notification.reblog": "{name} 转发了你的嘟文", "notification.status": "{name} 刚刚发布嘟文", "notification.update": "{name} 编辑了嘟文", + "notification_requests.accept": "接受", + "notification_requests.dismiss": "拒绝", + "notification_requests.notifications_from": "来自 {name} 的通知", + "notification_requests.title": "通知(已过滤)", "notifications.clear": "清空通知列表", "notifications.clear_confirmation": "你确定要永久清空通知列表吗?", "notifications.column_settings.admin.report": "新举报:", "notifications.column_settings.admin.sign_up": "新注册:", "notifications.column_settings.alert": "桌面通知", "notifications.column_settings.favourite": "喜欢:", - "notifications.column_settings.filter_bar.advanced": "显示所有类别", - "notifications.column_settings.filter_bar.category": "快速筛选栏", - "notifications.column_settings.filter_bar.show_bar": "显示过滤栏", "notifications.column_settings.follow": "新粉丝:", "notifications.column_settings.follow_request": "新关注请求:", "notifications.column_settings.mention": "提及:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "由于权限被拒绝,无法启用桌面通知。", "notifications.permission_denied_alert": "由于在此之前浏览器权限请求就已被拒绝,所以启用桌面通知失败", "notifications.permission_required": "所需权限未被授予,所以桌面通知不可用", + "notifications.policy.filter_new_accounts.hint": "在 {days, plural, other {# 天}}内创建的账户", + "notifications.policy.filter_new_accounts_title": "新账户", + "notifications.policy.filter_not_followers_hint": "包括关注你少于 {days, plural, other {# 天}}的人", + "notifications.policy.filter_not_followers_title": "未关注你的人", + "notifications.policy.filter_not_following_hint": "直到你手动批准", + "notifications.policy.filter_not_following_title": "你没有关注的人", + "notifications.policy.filter_private_mentions_hint": "过滤通知,除非通知是在回复提及你自己的内容,或发送者是你关注的人", + "notifications.policy.filter_private_mentions_title": "不请自来的提及", + "notifications.policy.title": "通知过滤范围", "notifications_permission_banner.enable": "启用桌面通知", "notifications_permission_banner.how_to_control": "启用桌面通知以在 Mastodon 未打开时接收通知。你可以通过交互通过上面的 {icon} 按钮来精细控制可以发送桌面通知的交互类型。", "notifications_permission_banner.title": "精彩不容错过", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 2382e3c61c..74a5c5a2d6 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -308,7 +308,6 @@ "hashtag.follow": "追蹤主題標籤", "hashtag.unfollow": "取消追蹤主題標籤", "hashtags.and_other": "…及{count, plural, other {其他 # 個}}", - "home.column_settings.basic": "基本", "home.column_settings.show_reblogs": "顯示被轉推的文章", "home.column_settings.show_replies": "顯示回應文章", "home.hide_announcements": "隱藏公告", @@ -440,9 +439,6 @@ "notifications.column_settings.admin.sign_up": "新註冊:", "notifications.column_settings.alert": "顯示桌面通知", "notifications.column_settings.favourite": "最愛:", - "notifications.column_settings.filter_bar.advanced": "顯示所有分類", - "notifications.column_settings.filter_bar.category": "快速過濾欄", - "notifications.column_settings.filter_bar.show_bar": "顯示篩選欄", "notifications.column_settings.follow": "新追蹤者:", "notifications.column_settings.follow_request": "新的追蹤請求:", "notifications.column_settings.mention": "提及你:", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index f52f283810..ff0bd4c8ff 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -241,6 +241,7 @@ "empty_column.list": "這份列表下什麼也沒有。當此列表的成員嘟出新的嘟文時,它們將顯示於此。", "empty_column.lists": "您還沒有新增任何列表。當您新增列表時,它將於此顯示。", "empty_column.mutes": "您尚未靜音任何使用者。", + "empty_column.notification_requests": "清空啦!已經沒有任何通知。當您收到新通知時,它們將依照您的設定於此顯示。", "empty_column.notifications": "您還沒有收到任何通知,當您與別人開始互動時,它將於此顯示。", "empty_column.public": "這裡什麼都沒有!嘗試寫些公開的嘟文,或者跟隨其他伺服器的使用者後,就會有嘟文出現了", "error.unexpected_crash.explanation": "由於發生系統故障或瀏覽器相容性問題,無法正常顯示此頁面。", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "使用既有的類別或是新增", "filter_modal.select_filter.title": "過濾此嘟文", "filter_modal.title.status": "過濾一則嘟文", + "filtered_notifications_banner.pending_requests": "來自您可能認識的 {count, plural, =0 {0 人} other {# 人}} 之通知", + "filtered_notifications_banner.title": "已過濾之通知", "firehose.all": "全部", "firehose.local": "本站", "firehose.remote": "聯邦宇宙", @@ -314,7 +317,6 @@ "hashtag.follow": "跟隨主題標籤", "hashtag.unfollow": "取消跟隨主題標籤", "hashtags.and_other": "…及其他 {count, plural, other {# 個}}", - "home.column_settings.basic": "基本設定", "home.column_settings.show_reblogs": "顯示轉嘟", "home.column_settings.show_replies": "顯示回覆", "home.hide_announcements": "隱藏公告", @@ -394,7 +396,7 @@ "lists.replies_policy.list": "列表成員", "lists.replies_policy.none": "沒有人", "lists.replies_policy.title": "顯示回覆:", - "lists.search": "搜尋您跟隨的使用者", + "lists.search": "搜尋您跟隨之使用者", "lists.subheading": "您的列表", "load_pending": "{count, plural, one {# 個新項目} other {# 個新項目}}", "loading_indicator.label": "正在載入...", @@ -440,15 +442,16 @@ "notification.reblog": "{name} 已轉嘟您的嘟文", "notification.status": "{name} 剛剛嘟文", "notification.update": "{name} 已編輯嘟文", + "notification_requests.accept": "接受", + "notification_requests.dismiss": "關閉", + "notification_requests.notifications_from": "來自 {name} 之通知", + "notification_requests.title": "已過濾之通知", "notifications.clear": "清除通知", "notifications.clear_confirmation": "您確定要永久清除您的通知嗎?", "notifications.column_settings.admin.report": "新檢舉報告:", "notifications.column_settings.admin.sign_up": "新註冊帳號:", "notifications.column_settings.alert": "桌面通知", "notifications.column_settings.favourite": "最愛:", - "notifications.column_settings.filter_bar.advanced": "顯示所有分類", - "notifications.column_settings.filter_bar.category": "快速過濾器", - "notifications.column_settings.filter_bar.show_bar": "顯示過濾器", "notifications.column_settings.follow": "新的跟隨者:", "notifications.column_settings.follow_request": "新的跟隨請求:", "notifications.column_settings.mention": "提及:", @@ -474,6 +477,15 @@ "notifications.permission_denied": "由於之前已拒絕瀏覽器請求,因此無法使用桌面通知", "notifications.permission_denied_alert": "由於之前瀏覽器權限被拒絕,無法啟用桌面通知", "notifications.permission_required": "由於尚未授予所需的權限,因此無法使用桌面通知。", + "notifications.policy.filter_new_accounts.hint": "新增於過去 {days, plural, other {# 日}}", + "notifications.policy.filter_new_accounts_title": "新帳號", + "notifications.policy.filter_not_followers_hint": "包含最近 {days, plural, other {# 日}} 內跟隨您之使用者", + "notifications.policy.filter_not_followers_title": "未跟隨您之使用者", + "notifications.policy.filter_not_following_hint": "直至您手動核准他們", + "notifications.policy.filter_not_following_title": "您未跟隨之使用者", + "notifications.policy.filter_private_mentions_hint": "過濾通知,除非嘟文包含於您的提及,或您跟隨該發嘟帳號", + "notifications.policy.filter_private_mentions_title": "不請自來的私訊", + "notifications.policy.title": "過濾通知來自...", "notifications_permission_banner.enable": "啟用桌面通知", "notifications_permission_banner.how_to_control": "啟用桌面通知以於 Mastodon 沒有開啟的時候接收通知。啟用桌面通知後,您可以透過上面的 {icon} 按鈕準確的控制哪些類型的互動會產生桌面通知。", "notifications_permission_banner.title": "不要錯過任何東西!", @@ -486,7 +498,7 @@ "onboarding.follows.lead": "您的首頁時間軸是 Mastodon 的核心體驗。若您跟隨更多人,它將會變得更活躍有趣。這些個人檔案也許是個好起點,您可以隨時取消跟隨他們!", "onboarding.follows.title": "客製化您的首頁時間軸", "onboarding.profile.discoverable": "使我的個人檔案可以被找到", - "onboarding.profile.discoverable_hint": "當您於 Mastodon 上選擇加入可發現性時,您的嘟文可能會出現於搜尋結果與趨勢中。您的個人檔案可能會被推薦給與您志趣相投的人。", + "onboarding.profile.discoverable_hint": "當您於 Mastodon 上選擇加入可發現性時,您的嘟文可能會顯示於搜尋結果與趨勢中。您的個人檔案可能會被推薦給與您志趣相投的人。", "onboarding.profile.display_name": "顯示名稱", "onboarding.profile.display_name_hint": "完整名稱或暱稱...", "onboarding.profile.lead": "您隨時可以稍候於設定中完成此操作,將有更多自訂選項可使用。", @@ -531,7 +543,7 @@ "privacy.change": "調整嘟文隱私狀態", "privacy.direct.long": "此嘟文提及之所有人", "privacy.direct.short": "指定使用者", - "privacy.private.long": "只有跟隨您的人能看到", + "privacy.private.long": "只有跟隨您之使用者能看到", "privacy.private.short": "跟隨者", "privacy.public.long": "所有人 (無論在 Mastodon 上與否)", "privacy.public.short": "公開", diff --git a/config/locales/doorkeeper.zh-TW.yml b/config/locales/doorkeeper.zh-TW.yml index 65926dfeef..f9813b1319 100644 --- a/config/locales/doorkeeper.zh-TW.yml +++ b/config/locales/doorkeeper.zh-TW.yml @@ -172,7 +172,7 @@ zh-TW: read:bookmarks: 檢視您的書籤 read:favourites: 檢視您收藏之最愛嘟文 read:filters: 檢視您的過濾條件 - read:follows: 檢視您跟隨的人 + read:follows: 檢視您跟隨之使用者 read:lists: 檢視您的列表 read:mutes: 檢視您靜音的人 read:notifications: 檢視您的通知 diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 62336d89d4..52321b87bc 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -403,10 +403,12 @@ lt: import: Importuoti new: create: Sukurti bloką - hint: Domeno blokavimas nesustabdys vartotojų paskyrų sukūrimo duomenų sistemoje, tačiau automatiškai pritaikys atitinkamus moderavimo metodus šioms paskyroms. + hint: Domeno blokas netrukdys kurti paskyrų įrašų duomenų bazėje, bet atgaline data ir automatiškai taikys tam tikrus tų paskyrų prižiūrėjimo būdus. severity: + desc_html: "Ribojimas padarys šio domeno paskyrų įrašus nematomus visiems, kurie jų neseka. Pristabdymas iš tavo serverio pašalins visą šio domeno paskyrų turinį, mediją ir profilio duomenis. Naudok Nieko, jei nori tik atmesti medijos failus." noop: Nieko - suspend: Draudimas + silence: Riboti + suspend: Pristabdyti title: Naujos domeno blokas reject_media: Atmesti medijos failai reject_media_hint: Panaikina lokaliai saugomus medijos failus bei atsisako jų parsisiuntimo ateityje. Neliečia užblokavimu @@ -468,7 +470,7 @@ lt: assign_to_self: Paskirti man assigned: Paskirtas moderatorius comment: - none: Nėra + none: Nieko created_at: Reportuotas forwarded_replies_explanation: Šis ataskaita yra iš nuotolinio naudotojo ir susijusi su nuotoliniu turiniu. Jis buvo persiųstas tau, nes turinys, apie kurį pranešta, yra atsakymas vienam iš tavo naudotojų. mark_as_resolved: Pažymėti kaip išsprestą diff --git a/config/locales/lv.yml b/config/locales/lv.yml index d6d0f05c50..83489f7e7b 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -473,7 +473,7 @@ lv: status: Statuss suppress: Apspiest sekošanas rekomendāciju suppressed: Apspiestie - title: Sekošanas rekomendācijas + title: Sekošanas ieteikumi unsuppress: Atjaunot sekošanas rekomendāciju instances: availability: diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index 831e1a2f8c..e85e753e88 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -116,6 +116,7 @@ bg: sign_up_requires_approval: Новите регистрации ще изискват одобрението ви severity: Изберете какво да се случва със заявките от този IP rule: + hint: По избор. Дайте по-подробно за правилото text: Опишете правило или изискване за потребителите на този сървър. Опитайте се да го направите кратко и просто sessions: otp: 'Въведете двуфакторния код, породен от приложението на телефона си или използвайте един от кодовете си за възстановяване:' @@ -299,6 +300,7 @@ bg: patch: Известие за обновявания на оправени грешки trending_tag: Изискване на преглед за новонашумели rule: + hint: Допълнителни сведения text: Правило settings: indexable: Включване на страницата на профила в търсачките diff --git a/config/locales/simple_form.br.yml b/config/locales/simple_form.br.yml index 529e3224e6..196711aee9 100644 --- a/config/locales/simple_form.br.yml +++ b/config/locales/simple_form.br.yml @@ -67,6 +67,7 @@ br: notification_emails: follow: Heuliañ a ra {name} ac'hanoc'h rule: + hint: Titouroù ouzhpenn text: Reolenn tag: name: Hashtag diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 7d0f799d0c..357f482b83 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -116,6 +116,7 @@ ca: sign_up_requires_approval: Els nous registres requeriran la teva aprovació severity: Tria què passarà amb les sol·licituds des d’aquesta IP rule: + hint: Opcional. Proporciona més detalls de la regla text: Descriu una norma o requeriment pels usuaris d'aquest servidor. Intenta fer-la curta i senzilla sessions: otp: 'Introdueix el codi de dos factors generat per el teu telèfon o utilitza un dels teus codis de recuperació:' @@ -299,6 +300,7 @@ ca: patch: Notificar sobre les actualitzacions de correcció d'errors trending_tag: Nova tendència requereix revisió rule: + hint: Informació addicional text: Norma settings: indexable: Inclou la pàgina del perfil en els motors de cerca diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 3daedfc860..21cd1ddc0a 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -116,6 +116,7 @@ cy: sign_up_requires_approval: Bydd angen eich cymeradwyaeth ar gyfer cofrestriadau newydd severity: Dewiswch beth fydd yn digwydd gyda cheisiadau o'r IP hwn rule: + hint: Dewisol. Darparwch ragor o fanylion am y rheol text: Disgrifiwch reol neu ofyniad ar gyfer defnyddwyr ar y gweinydd hwn. Ceisiwch ei gadw'n fyr ac yn syml sessions: otp: 'Mewnbynnwch y cod dau gam a gynhyrchwyd gan eich ap ffôn neu defnyddiwch un o''ch codau adfer:' @@ -299,6 +300,7 @@ cy: patch: Rhoi gwybod am ddiweddariadau trwsio byg trending_tag: Mae pwnc llosg newydd angen adolygiad rule: + hint: Gwybodaeth ychwanegol text: Rheol settings: indexable: Cynnwys tudalen proffil mewn peiriannau chwilio diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index fde0bcc248..6c8d995bfd 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -116,6 +116,7 @@ da: sign_up_requires_approval: Nye tilmeldinger kræver din godkendelse severity: Afgør, hvordan forespørgsler fra denne IP behandles rule: + hint: Valgfrit. Oplys yderligere detaljer om reglen text: Beskriv på en kort og enkel form en regel/krav for brugere på denne server sessions: otp: 'Angiv tofaktorkoden generet af din mobil-app eller brug en af genoprettelseskoderne:' @@ -299,6 +300,7 @@ da: patch: Notificér om fejlrettelsesopdateringer trending_tag: Ny tendens kræver revidering rule: + hint: Yderligere oplysninger text: Regel settings: indexable: Inkludér profilside i søgemaskiner diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index b8fec42d66..1d608af08b 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -116,6 +116,7 @@ de: sign_up_requires_approval: Neue Registrierungen müssen genehmigt werden severity: Wähle aus, was mit Anfragen von dieser IP-Adresse geschehen soll rule: + hint: "(Optional) Gib weitere Details zu dieser Regel an" text: Führe eine Regel oder Auflage für Profile auf diesem Server ein. Bleib dabei kurz und knapp sessions: otp: 'Gib den Zwei-Faktor-Code von deinem Smartphone ein oder verwende einen deiner Wiederherstellungscodes:' @@ -299,6 +300,7 @@ de: patch: Über Fehlerbehebungen informieren trending_tag: Neuer Trend erfordert eine Überprüfung rule: + hint: Zusätzliche Informationen text: Regel settings: indexable: Profilseite in Suchmaschinen einbeziehen diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index a074091313..0111624082 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -116,6 +116,7 @@ es-AR: sign_up_requires_approval: Los nuevos registros requerirán tu aprobación severity: Elegí lo que pasará con las solicitudes desde esta dirección IP rule: + hint: Opcional. Ofrecé más detalles sobre la regla text: Describí una regla o requisito para los usuarios de este servidor. Intentá hacerla corta y sencilla sessions: otp: 'Ingresá el código de autenticación de dos factores generado por la aplicación en tu dispositivo, o usá uno de tus códigos de recuperación:' @@ -299,6 +300,7 @@ es-AR: patch: Notificar sobre actualizaciones de corrección de errores trending_tag: Una nueva tendencia requiere revisión rule: + hint: Información adicional text: Regla settings: indexable: Incluir la página de perfil en los motores de búsqueda diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index d8f1cf95a0..28253d385b 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -116,6 +116,7 @@ es-MX: sign_up_requires_approval: Nuevos registros requerirán su aprobación severity: Elegir lo que pasará con las peticiones desde esta IP rule: + hint: Opcional. Proporciona más detalles sobre la regla text: Describe una norma o requisito para los usuarios de este servidor. Intenta hacerla corta y sencilla sessions: otp: 'Introduce el código de autenticación de dos factores generado por tu aplicación de teléfono o usa uno de tus códigos de recuperación:' @@ -299,6 +300,7 @@ es-MX: patch: Notificar en actualizaciones de errores trending_tag: La nueva tendencia requiere de revisión rule: + hint: Información adicional text: Norma settings: indexable: Incluir la página de perfil en los motores de búsqueda diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index fee260aa89..008ac16073 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -116,6 +116,7 @@ es: sign_up_requires_approval: Nuevos registros requerirán su aprobación severity: Elegir lo que pasará con las peticiones desde esta IP rule: + hint: Opcional. Proporciona más detalles sobre la regla text: Describe una norma o requisito para los usuarios de este servidor. Intenta hacerla corta y sencilla sessions: otp: 'Introduce el código de autenticación de dos factores generado por tu aplicación de teléfono o usa uno de tus códigos de recuperación:' @@ -299,6 +300,7 @@ es: patch: Notificar de actualizaciones de errores trending_tag: Una nueva tendencia requiere revisión rule: + hint: Información adicional text: Norma settings: indexable: Incluye la página de perfil en los buscadores diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index b417b45fa9..03ba1aea6c 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -116,6 +116,7 @@ eu: sign_up_requires_approval: Izen emate berriek zure onarpena beharko dute severity: Aukeratu zer gertatuko den IP honetatik datozen eskaerekin rule: + hint: Aukerakoa. Eman arauari buruzko xehetasun gehiago. text: Deskribatu zerbitzari honetako erabiltzaileentzako arau edo betekizun bat. Saiatu labur eta sinple idazten sessions: otp: 'Sartu zure telefonoko aplikazioak sortutako bi faktoreetako kodea, edo erabili zure berreskuratze kodeetako bat:' @@ -299,6 +300,7 @@ eu: patch: Jakinarazi akats zuzenketa eguneraketa guztiak trending_tag: Joera berriak berrikuspena behar du rule: + hint: Informazio gehigarria text: Araua settings: indexable: Gehitu profila bilaketa-motorretan diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml index 003eede25b..599e79ea2f 100644 --- a/config/locales/simple_form.fo.yml +++ b/config/locales/simple_form.fo.yml @@ -116,6 +116,7 @@ fo: sign_up_requires_approval: Nýggjar tilmeldingar fara at krevja tína góðkenning severity: Vel, hvat skal henda við umbønum frá hesari IP adressuni rule: + hint: Valfrítt. Gev fleiri smálutir um regluna text: Lýs eina reglu ella eitt krav fyri brúkarar á hesum ambætaranum. Ger tað stutt og einfalt sessions: otp: 'Skriva tvey-faktor koduna frá telefon-appini ella brúka eina av tínum endurgerðskodum:' @@ -299,6 +300,7 @@ fo: patch: Gev fráboðan um feilrættingardagføringar trending_tag: Broytt rák skal kannast rule: + hint: Fleiri upplýsingar text: Regla settings: indexable: Lat vangasíðu vera tøka í leitimaskinum diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index 5dc5ab2c90..e2e40f04dd 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -116,6 +116,7 @@ fy: sign_up_requires_approval: Nije registraasjes fereaskje jo goedkarring severity: Kies wat der barre moat mei oanfragen fan dit IP-adres rule: + hint: Opsjoneel. Jou mear details oer de rigel text: Omskriuw in rigel of eask foar brûkers op dizze server. Probearje it koart en simpel te hâlden sessions: otp: 'Fier de twa-stapstagongskoade fan jo mobile telefoan ôf yn of brûk ien fan jo werstelkoaden:' @@ -299,6 +300,7 @@ fy: patch: Meldingen by bugfix-fernijingen trending_tag: Nije trend beoardieling fereasket rule: + hint: Oanfoljende ynformaasje text: Regel settings: indexable: Sykmasinen jo profylside fine litte diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index bd7e44455a..168e7168ed 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -116,6 +116,7 @@ gd: sign_up_requires_approval: Bidh cleachdaichean air an ùr-chlàradh feumach air d’ aonta severity: Tagh na thachras le iarrtasan on IP seo rule: + hint: Roghainneil. Thoir seachad barrachd fiosrachaidh mun riaghailt text: Mìnich riaghailt no riatanas do chleachdaichean an fhrithealaiche seo. Feuch an cùm thu sìmplidh goirid e sessions: otp: 'Cuir a-steach an còd dà-cheumnach a ghin aplacaid an fhòn agad no cleachd fear dhe na còdan aisig agad:' @@ -299,6 +300,7 @@ gd: patch: Thoir brathan dhomh do dh’ùrachaidhean càraidh trending_tag: Tha treand ùr ri lèirmheasadh rule: + hint: Barrachd fiosrachaidh text: Riaghailt settings: indexable: Gabh a-staigh duilleag na pròifil sna h-einnseanan-luirg diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index 719da8eefa..ffb12d31bc 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -116,6 +116,7 @@ gl: sign_up_requires_approval: Os novos rexistros requerirán a túa aprobación severity: Escolle que acontecerá coas peticións desde este IP rule: + hint: Optativo. Proporciona máis detalles acerca da regra text: Describe unha regra ou requerimento para as usuarias deste servidor. Intenta que sexa curta e simple sessions: otp: 'Escribe o código do segundo factor creado pola aplicación do teu móbil ou usa un dos códigos de recuperación:' @@ -299,6 +300,7 @@ gl: patch: Notificar as actualizacións de arranxos trending_tag: Hai que revisar unha nova tendencia rule: + hint: Información adicional text: Regra settings: indexable: Incluír páxina de perfil nos motores de busca diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index 3d7512c5f5..4f2611666a 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -116,6 +116,7 @@ he: sign_up_requires_approval: הרשמות חדשות ידרשו את אישורך severity: נא לבחור מה יקרה לבקשות מכתובת IP זו rule: + hint: לא חובה. פירוט נוסף לגבי הכלל text: נא לתאר את הכלל או הדרישה למשתמשים משרת זה. על התיאור להיות קצר ובהיר sessions: otp: 'נא להקליד קוד אימות דו-שלבי ממכשירך או להשתמש באחד מקודי אחזור הגישה שלך:' @@ -299,6 +300,7 @@ he: patch: קבלת הודעה על עדכוני תיקון שקצים trending_tag: נושאים חמים חדשים דורשים סקירה rule: + hint: מידע נוסף text: כלל settings: indexable: חשיפת דף המשתמש במנועי החיפוש diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 573809c73a..8855494fdf 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -116,6 +116,7 @@ hu: sign_up_requires_approval: Új regisztrációk csak a jóváhagyásoddal történhetnek majd meg severity: Válaszd ki, mi történjen a kérésekkel erről az IP-ről rule: + hint: Nem kötelező. Adj meg további részleteket a szabályról. text: Írd le, mi a szabály vagy elvárás ezen a kiszolgálón a felhasználók felé. Próbálj röviden, egyszerűen fogalmazni. sessions: otp: 'Add meg a telefonodon generált kétlépcsős azonosító kódodat vagy használd az egyik tartalék bejelentkező kódot:' @@ -299,6 +300,7 @@ hu: patch: Értesítés hibajavítási frissítésekről trending_tag: Új trend felülvizsgálatra vár rule: + hint: További információk text: Szabály settings: indexable: A profiloldal szerepeltetése a keresőmotorokban diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index 0859e89897..cae9bbed5f 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -116,6 +116,7 @@ is: sign_up_requires_approval: Nýskráningar munu þurfa samþykki þitt severity: Veldu hvað munir gerast við beiðnir frá þessu IP-vistfangi rule: + hint: Valkvætt. Gefðu nánari upplýsingar um regluna text: Lýstu reglum eða kröfum sem gerðar eru til notenda á þessum netþjóni. Reyndu að hafa þetta skýrt og skorinort sessions: otp: 'Settu inn tveggja-þátta kóðann sem farsímaforritið útbjó eða notaðu einn af endurheimtukóðunum þínum:' @@ -299,6 +300,7 @@ is: patch: Láta vita við uppfærslur með lagfæringum trending_tag: Nýtt vinsælt efni krefst yfirferðar rule: + hint: Viðbótarupplýsingar text: Regla settings: indexable: Hafa notandasnið með í leitarvélum diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 244cf7c44a..bf294a48c6 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -116,6 +116,7 @@ it: sign_up_requires_approval: Le nuove iscrizioni richiederanno la tua approvazione severity: Scegli cosa accadrà con le richieste da questo IP rule: + hint: Opzionale. Fornisce maggiori dettagli sulla regola text: Descrivi una regola o un requisito per gli utenti su questo server. Prova a mantenerla breve e semplice sessions: otp: 'Inserisci il codice a due fattori generato dall''app del tuo telefono o usa uno dei codici di recupero:' @@ -299,6 +300,7 @@ it: patch: Notifica sulle correzioni di bug trending_tag: La nuova tendenza richiede un controllo rule: + hint: Informazioni aggiuntive text: Regola settings: indexable: Includi la pagina del profilo nei motori di ricerca diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 1dee6f1431..d948a88ed1 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -116,6 +116,7 @@ ko: sign_up_requires_approval: 새 가입이 승인을 필요로 하도록 합니다 severity: 해당 IP로부터의 요청에 대해 무엇이 일어나게 할 지 고르세요 rule: + hint: 옵션사항. 규칙에 대한 더 상세한 정보를 제공하세요 text: 이 서버 사용자들이 지켜야 할 규칙과 요구사항을 설명해주세요. 짧고 간단하게 작성해주세요 sessions: otp: '휴대전화에서 생성된 이중 인증 코드를 입력하거나, 복구 코드 중 하나를 사용하세요:' @@ -299,6 +300,7 @@ ko: patch: 버그픽스 업데이트에 대해 알림 trending_tag: 검토해야 할 새 유행 rule: + hint: 추가 정보 text: 규칙 settings: indexable: 검색 엔진에 프로필 페이지 기재하기 diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index f9ee9a4b9a..2de24c38ff 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -299,6 +299,7 @@ lad: patch: Avizame de aktualizasyones de yerros trending_tag: Un muevo trend nesesita revizyon rule: + hint: Enformasyon adisyonala text: Regla settings: indexable: Inkluye la pajina de profil en los bushkadores diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index 53b8d672de..5431ea1b10 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -82,6 +82,8 @@ lt: thumbnail: Maždaug 2:1 dydžio vaizdas, rodomas šalia tavo serverio informacijos. timeline_preview: Atsijungę lankytojai galės naršyti naujausius viešus įrašus, esančius serveryje. trends: Trendai rodo, kurios įrašai, saitažodžiai ir naujienų istorijos tavo serveryje sulaukia didžiausio susidomėjimo. + rule: + hint: Pasirinktinai. Pateik daugiau informacijos apie taisyklę. sessions: otp: 'Įvesk telefono programėlėje sugeneruotą dviejų tapatybės kodą arba naudok vieną iš atkūrimo kodų:' webauthn: Jei tai USB raktas, būtinai jį įkišk ir, jei reikia, paspausk. @@ -168,6 +170,7 @@ lt: label: Yra nauja Mastodon versija patch: Pranešti apie klaidų ištaisymo atnaujinimus rule: + hint: Papildoma informacija text: Taisyklė settings: show_application: Rodyti, iš kurios programėles išsiuntei įrašą diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 3f4f339b93..df108a2fec 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -116,6 +116,7 @@ nl: sign_up_requires_approval: Nieuwe registraties vereisen jouw goedkeuring severity: Kies wat er moet gebeuren met aanvragen van dit IP-adres rule: + hint: Optioneel. Verstrek meer details over de regel text: Omschrijf een regel of vereiste voor gebruikers op deze server. Probeer het kort en simpel te houden sessions: otp: 'Voer de tweestaps-toegangscode vanaf jouw mobiele telefoon in of gebruik een van jouw herstelcodes:' @@ -299,6 +300,7 @@ nl: patch: Meldingen bij bugfix-updates trending_tag: Nieuwe trend vereist beoordeling rule: + hint: Aanvullende informatie text: Regel settings: indexable: Zoekmachines jouw profielpagina laten vinden diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index 98cc372be7..72525619c7 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -116,6 +116,7 @@ nn: sign_up_requires_approval: Du må godkjenna nye registreringar severity: Vel kva som skal skje ved førespurnader frå denne IP rule: + hint: Valfritt. Gje meir informasjon om regelen text: Forklar ein regel eller eit krav for brukarar på denne tenaren. Prøv å skriva kort og lettfattleg sessions: otp: Angi tofaktorkoden fra din telefon eller bruk en av dine gjenopprettingskoder. @@ -299,6 +300,7 @@ nn: patch: Varsle om feilrettingsoppdateringar trending_tag: Ny trend krev gjennomgang rule: + hint: Meir informasjon text: Regler settings: indexable: Ta med profilsida i søkjemotorar diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 4a8208202f..3a1c619f70 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -116,6 +116,7 @@ pl: sign_up_requires_approval: Nowe rejestracje będą wymagać twojej zgody severity: Wybierz co ma się stać z żadaniami z tego adresu IP rule: + hint: Opcjonalne. Dodaj więcej szczegółów dot. tej zasady text: Opisz wymóg lub regułę dla użytkowników na tym serwerze. Postaraj się, aby była krótka i prosta sessions: otp: 'Wprowadź kod weryfikacji dwuetapowej z telefonu lub wykorzystaj jeden z kodów zapasowych:' @@ -299,6 +300,7 @@ pl: patch: Powiadamiaj o aktualizacjach naprawiających błędy trending_tag: Nowe popularne wymagają przeglądu rule: + hint: Informacje dodatkowe text: Zasada settings: indexable: Udostępniaj profil wyszukiwarkom diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index 9c54e72140..a84f97f88d 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -116,6 +116,7 @@ pt-PT: sign_up_requires_approval: Novas inscrições requererão a sua aprovação severity: Escolha o que acontecerá com as solicitações deste IP rule: + hint: Opcional. Forneça mais detalhes sobre a regra text: Descreva uma regra ou requisito para os utilizadores nesta instância. Tente mantê-la curta e simples sessions: otp: 'Insira o código de autenticação em duas etapas gerado pelo seu telemóvel ou use um dos seus códigos de recuperação:' @@ -299,6 +300,7 @@ pt-PT: patch: Notificar sobre atualizações de correções de problemas trending_tag: Uma nova publicação em alta requer avaliação rule: + hint: Informação Adicional text: Regra settings: indexable: Incluir página de perfil nos motores de busca diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index 1e56894384..cbf0570187 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -116,6 +116,7 @@ sl: sign_up_requires_approval: Za nove registracije bo potrebna vaša odobritev severity: Izberite, kaj se bo zgodilo z zahtevami iz tega IP-naslova rule: + hint: Neobvezno. Vnesite dodatne podrobnosti o pravilu text: Opišite pravilo ali zahtevo za uporabnike na tem strežniku. Poskusite biti kratki in jasni sessions: otp: 'Vnesite dvomestno kodo, ki je ustvarjena z aplikacijo na telefonu, ali uporabite eno od vaših obnovitvenih kod:' @@ -299,6 +300,7 @@ sl: patch: Obveščaj o posodobitvah z odpravljenimi hrošči trending_tag: Nov trend zahteva pregled rule: + hint: Dodatne informacije text: Pravilo settings: indexable: V iskalnike vključi stran profila diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index b8404766f3..41ee3d9bd5 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -116,6 +116,7 @@ sq: sign_up_requires_approval: Regjistrime të reja do të duan miratimin tuaj severity: Zgjidhni ç’do të ndodhë me kërkesa nga kjo IP rule: + hint: Opsionale. Jepni më tepër hollësi rreth këtij rregulli text: Përshkruani një rregull ose një domosdoshmëri për përdoruesit në këtë shërbyes. Përpiquni të jetë i shkurtër dhe i thjeshtë sessions: otp: 'Jepni kodin dyfaktorësh të prodhuar nga aplikacioni i telefonit tuaj ose përdorni një nga kodet tuaj të rikthimeve:' @@ -299,6 +300,7 @@ sq: patch: Njofto për ndreqje të metash trending_tag: Për gjëra të reja në modë lypset shqyrtim rule: + hint: Informacion shtesë text: Rregull settings: indexable: Përfshi faqe profili në motorë kërkimesh diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml index 3214a722df..6ed095e2a2 100644 --- a/config/locales/simple_form.sr-Latn.yml +++ b/config/locales/simple_form.sr-Latn.yml @@ -299,6 +299,7 @@ sr-Latn: patch: Obavesti o ispravkama grešaka trending_tag: Novi trend treba pregledati rule: + hint: Dodatne informacije text: Pravilo settings: indexable: Uključi stranicu profila u pretraživače diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index 9631efc053..4fb32000b7 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -299,6 +299,7 @@ sr: patch: Обавести о исправкама грешака trending_tag: Нови тренд треба прегледати rule: + hint: Додатне информације text: Правило settings: indexable: Укључи страницу профила у претраживаче diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index 02806e711f..c3b8625c8e 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -299,6 +299,7 @@ sv: patch: Meddela vid buggfix-uppdateringar trending_tag: En ny trend kräver granskning rule: + hint: Ytterligare information text: Regel settings: indexable: Inkludera profilsidan i sökmotorer diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 259bb00099..b41cf0bea6 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -116,6 +116,7 @@ th: sign_up_requires_approval: การลงทะเบียนใหม่จะต้องการการอนุมัติของคุณ severity: เลือกสิ่งที่จะเกิดขึ้นกับคำขอจาก IP นี้ rule: + hint: ไม่จำเป็น ให้รายละเอียดเพิ่มเติมเกี่ยวกับกฎ text: อธิบายกฎหรือข้อกำหนดสำหรับผู้ใช้ในเซิร์ฟเวอร์นี้ พยายามทำให้กฎหรือข้อกำหนดสั้นและเรียบง่าย sessions: otp: 'ป้อนรหัสสองปัจจัยที่สร้างโดยแอปในโทรศัพท์ของคุณหรือใช้หนึ่งในรหัสกู้คืนของคุณ:' @@ -299,6 +300,7 @@ th: patch: แจ้งเตือนการอัปเดตการแก้ไขข้อบกพร่อง trending_tag: แนวโน้มใหม่ต้องการการตรวจทาน rule: + hint: ข้อมูลเพิ่มเติม text: กฎ settings: indexable: รวมหน้าโปรไฟล์ในเครื่องมือค้นหา diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index a85684a0f9..db8e4b4d27 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -119,6 +119,7 @@ uk: sign_up_requires_approval: Нові реєстрації потребуватимуть затвердження вами severity: Виберіть, що буде відбуватися з запитами з цієї IP rule: + hint: Необов'язково. Докладніше про правило text: Опис правила або вимоги для користувачів на цьому сервері. Спробуйте зробити його коротким і простим sessions: otp: 'Введіть код двофакторної автентифікації, згенерований вашим мобільним застосунком, або скористайтеся одним з ваших кодів відновлення:' @@ -302,6 +303,7 @@ uk: patch: Сповіщати про оновлення з виправленнями trending_tag: Нове популярне вимагає розгляду rule: + hint: Додаткова інформація text: Правило settings: indexable: Включити сторінку профілю в пошукові системи diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index ae0a5ea560..f4d9f526b6 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -116,6 +116,7 @@ vi: sign_up_requires_approval: Bạn sẽ phê duyệt những đăng ký mới từ IP này severity: Chọn hành động nếu nhận được yêu cầu từ IP này rule: + hint: Tùy chọn. Cung cấp chi tiết hơn về nội quy text: Mô tả một nội quy bắt buộc trên máy chủ này. Nên để ngắn và đơn giản sessions: otp: 'Nhập mã xác minh 2 bước được tạo bởi ứng dụng điện thoại của bạn hoặc dùng một trong các mã khôi phục của bạn:' @@ -299,6 +300,7 @@ vi: patch: Thông báo bản cập sửa lỗi trending_tag: Phê duyệt nội dung nổi bật mới rule: + hint: Thông tin thêm text: Nội quy settings: indexable: Cho phép hiện hồ sơ trong công cụ tìm kiếm diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index d0ca529a4d..7f2eee023c 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -116,6 +116,7 @@ zh-CN: sign_up_requires_approval: 新注册需要你的批准 severity: 选择如何处理来自此 IP 的请求。 rule: + hint: 选填。提供关于这条规则的更多详情 text: 描述这个服务器上的用户规则或要求。尽量确保简洁、清晰易懂 sessions: otp: 输入你手机应用上生成的双因素认证代码,或者任意一个恢复代码: @@ -299,6 +300,7 @@ zh-CN: patch: 通知错误修复更新 trending_tag: 新热门待审核 rule: + hint: 补充信息 text: 规则 settings: indexable: 允许搜索引擎索引个人资料页面 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index fe938712e3..69a2794e6c 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -8,7 +8,7 @@ zh-TW: fields: 烘培雞、自我認同代稱、年齡,及任何您想分享的。 indexable: 您的公開嘟文可能會顯示於 Mastodon 之搜尋結果中。曾與您嘟文互動過的人可能無論如何都能搜尋它們。 note: '您可以 @mention 其他人或者使用 #主題標籤。' - show_collections: 人們將能瀏覽您跟隨中及跟隨者帳號。您所跟隨之人能得知您正在跟隨其帳號。 + show_collections: 人們將能瀏覽您跟隨中及跟隨者帳號。您所跟隨之使用者能得知您正在跟隨其帳號。 unlocked: 人們將無需額外請求您的同意便能跟隨您的帳號。取消勾選以審查跟隨請求並選擇是否同意或拒絕新跟隨者。 account_alias: acct: 指定要移動的帳號之「使用者名稱@網域名稱」 @@ -16,7 +16,7 @@ zh-TW: acct: 指定欲移動至帳號之「使用者名稱@網域名稱」 account_warning_preset: text: 您可使用嘟文語法,例如網址、「#」標籤與提及功能 - title: 可選。不會向收件者顯示 + title: 可選的。不會向收件者顯示 admin_account_action: include_statuses: 使用者可看到導致檢舉或警告的嘟文 send_email_notification: 使用者將收到帳號發生之事情的解釋 @@ -116,6 +116,7 @@ zh-TW: sign_up_requires_approval: 新註冊申請需要先經過您的審核 severity: 請選擇將如何處理來自這個 IP 位址的請求 rule: + hint: 可選的。提供關於此規則更多細節 text: 說明使用者於此伺服器上需遵守的規則或條款。試著維持各項條款簡短而明瞭。 sessions: otp: 請輸入產生自您手機 App 的兩階段驗證碼,或輸入其中一個備用驗證碼: @@ -299,6 +300,7 @@ zh-TW: patch: 通知錯誤修正更新 trending_tag: 新熱門趨勢需要審核 rule: + hint: 其他資訊 text: 規則 settings: indexable: 於搜尋引擎中包含個人檔案頁面 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index d8952edec9..2eecfa7b46 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -397,7 +397,7 @@ zh-TW: create: 新增封鎖 hint: 站點封鎖動作並不會阻止帳號紀錄被新增至資料庫,但會自動回溯性地對那些帳號套用特定管理設定。 severity: - desc_html: "「靜音」令該站點下使用者的嘟文,設定為只對跟隨者顯示,沒有跟隨的人會看不到。「停權」會刪除將該站點下使用者的嘟文、媒體檔案與個人檔案。「」則會拒絕接收來自該站點的媒體檔案。" + desc_html: "「靜音」令該站點下使用者的嘟文,設定為只對跟隨者顯示,沒有跟隨之使用者會看不到。「停權」會刪除將該站點下使用者的嘟文、媒體檔案與個人檔案。「」則會拒絕接收來自該站點的媒體檔案。" noop: 無 silence: 靜音 suspend: 停權 From 0ba9f58e171035e531e86e829975e55955390ae2 Mon Sep 17 00:00:00 2001 From: cuithon <65674308+cuithon@users.noreply.github.com> Date: Tue, 12 Mar 2024 17:40:29 +0800 Subject: [PATCH 149/954] chore: fix some typos (#29555) Signed-off-by: cuithon --- Dockerfile | 2 +- Gemfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index facd9b8aa0..8778133e0d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,7 +20,7 @@ FROM docker.io/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} as ruby # Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA # Example: v4.2.0-nightly.2023.11.09+something -# Overwrite existance of 'alpha.0' in version.rb [--build-arg MASTODON_VERSION_PRERELEASE="nightly.2023.11.09"] +# Overwrite existence of 'alpha.0' in version.rb [--build-arg MASTODON_VERSION_PRERELEASE="nightly.2023.11.09"] ARG MASTODON_VERSION_PRERELEASE="" # Append build metadata or fork information to version.rb [--build-arg MASTODON_VERSION_METADATA="something"] ARG MASTODON_VERSION_METADATA="" diff --git a/Gemfile b/Gemfile index 355e69b0c4..d3bfeb4487 100644 --- a/Gemfile +++ b/Gemfile @@ -112,7 +112,7 @@ group :test do # RSpec helpers for email specs gem 'email_spec' - # Extra RSpec extenion methods and helpers for sidekiq + # Extra RSpec extension methods and helpers for sidekiq gem 'rspec-sidekiq', '~> 4.0' # Browser integration testing From af4e44e30a6a2701102a7d573e47e9db42025821 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Tue, 12 Mar 2024 10:42:51 +0100 Subject: [PATCH 150/954] Fix i18n typo (#29557) --- .../notifications/components/filtered_notifications_banner.jsx | 2 +- app/javascript/mastodon/locales/en.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx b/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx index dddb9d6412..bf9467bd63 100644 --- a/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx +++ b/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx @@ -38,7 +38,7 @@ export const FilteredNotificationsBanner = () => {
- +
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index aed3a3a600..2f202bfe15 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -272,7 +272,7 @@ "filter_modal.select_filter.subtitle": "Use an existing category or create a new one", "filter_modal.select_filter.title": "Filter this post", "filter_modal.title.status": "Filter a post", - "filtered_notifications_banner.pending_requests": "Notifications from {count, plural, =0 {no} one {one person} other {# people}} you may know", + "filtered_notifications_banner.pending_requests": "Notifications from {count, plural, =0 {no one} one {one person} other {# people}} you may know", "filtered_notifications_banner.title": "Filtered notifications", "firehose.all": "All", "firehose.local": "This server", From 5b60d4b696cd5fd58ca77eca3365c2a0761c0f57 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 12 Mar 2024 10:51:30 +0100 Subject: [PATCH 151/954] Change background color in web UI (#29522) --- .../mastodon/features/about/index.jsx | 24 +- .../styles/mastodon-light/diff.scss | 88 ------ .../styles/mastodon-light/variables.scss | 4 + app/javascript/styles/mastodon/about.scss | 2 +- app/javascript/styles/mastodon/admin.scss | 2 +- app/javascript/styles/mastodon/basics.scss | 2 +- .../styles/mastodon/components.scss | 250 +++++++++--------- app/javascript/styles/mastodon/variables.scss | 8 +- 8 files changed, 147 insertions(+), 233 deletions(-) diff --git a/app/javascript/mastodon/features/about/index.jsx b/app/javascript/mastodon/features/about/index.jsx index 5197d338cd..65a36520d6 100644 --- a/app/javascript/mastodon/features/about/index.jsx +++ b/app/javascript/mastodon/features/about/index.jsx @@ -189,18 +189,20 @@ class About extends PureComponent { <>

-
- {domainBlocks.get('items').map(block => ( -
-
-
{block.get('domain')}
- {intl.formatMessage(severityMessages[block.get('severity')].title)} -
+ {domainBlocks.get('items').size > 0 && ( +
+ {domainBlocks.get('items').map(block => ( +
+
+
{block.get('domain')}
+ {intl.formatMessage(severityMessages[block.get('severity')].title)} +
-

{(block.get('comment') || '').length > 0 ? block.get('comment') : }

-
- ))} -
+

{(block.get('comment') || '').length > 0 ? block.get('comment') : }

+
+ ))} +
+ )} ) : (

diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index e3872283e1..675a01dd36 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -21,25 +21,6 @@ html { } // Change default background colors of columns -.column > .scrollable, -.getting-started, -.column-inline-form, -.regeneration-indicator { - background: $white; - border: 1px solid lighten($ui-base-color, 8%); - border-top: 0; -} - -.error-column { - border: 1px solid lighten($ui-base-color, 8%); -} - -.column > .scrollable.about { - border-top: 1px solid lighten($ui-base-color, 8%); -} - -.about__meta, -.about__section__title, .interaction-modal { background: $white; border: 1px solid lighten($ui-base-color, 8%); @@ -53,37 +34,10 @@ html { background: lighten($ui-base-color, 12%); } -.filter-form { - background: $white; - border-bottom: 1px solid lighten($ui-base-color, 8%); -} - -.column-back-button, -.column-header { - background: $white; - border: 1px solid lighten($ui-base-color, 8%); - - @media screen and (max-width: $no-gap-breakpoint) { - border-top: 0; - } - - &--slim-button { - top: -50px; - right: 0; - } -} - -.column-header__back-button, -.column-header__button, -.column-header__button.active, .account__header { background: $white; } -.column-header { - border-bottom: 0; -} - .column-header__button.active { color: $ui-highlight-color; @@ -91,7 +45,6 @@ html { &:active, &:focus { color: $ui-highlight-color; - background: $white; } } @@ -117,25 +70,6 @@ html { } } -.column-subheading { - background: darken($ui-base-color, 4%); - border-bottom: 1px solid lighten($ui-base-color, 8%); -} - -.getting-started, -.scrollable { - .column-link { - background: $white; - border-bottom: 1px solid lighten($ui-base-color, 8%); - - &:hover, - &:active, - &:focus { - background: $ui-base-color; - } - } -} - .getting-started .navigation-bar { border-top: 1px solid lighten($ui-base-color, 8%); border-bottom: 1px solid lighten($ui-base-color, 8%); @@ -168,23 +102,6 @@ html { border-bottom: 0; } -.notification__filter-bar { - border: 1px solid lighten($ui-base-color, 8%); - border-top: 0; -} - -.drawer__header, -.drawer__inner { - background: $white; - border: 1px solid lighten($ui-base-color, 8%); -} - -.drawer__inner__mastodon { - background: $white - url('data:image/svg+xml;utf8,') - no-repeat bottom / 100% auto; -} - .upload-progress__backdrop { background: $ui-base-color; } @@ -194,11 +111,6 @@ html { background: lighten($white, 4%); } -.detailed-status, -.detailed-status__action-bar { - background: $white; -} - // Change the background colors of status__content__spoiler-link .reply-indicator__content .status__content__spoiler-link, .status__content .status__content__spoiler-link { diff --git a/app/javascript/styles/mastodon-light/variables.scss b/app/javascript/styles/mastodon-light/variables.scss index 3cf5561ca3..09a75a834b 100644 --- a/app/javascript/styles/mastodon-light/variables.scss +++ b/app/javascript/styles/mastodon-light/variables.scss @@ -59,4 +59,8 @@ $emojis-requiring-inversion: 'chains'; .theme-mastodon-light { --dropdown-border-color: #d9e1e8; --dropdown-background-color: #fff; + --background-border-color: #d9e1e8; + --background-color: #fff; + --background-color-tint: rgba(255, 255, 255, 90%); + --background-filter: blur(10px); } diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index 9d23ef41ab..48fe9449f0 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -26,7 +26,7 @@ $fluid-breakpoint: $maximum-width + 20px; li { position: relative; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); padding: 1em 1.75em; padding-inline-start: 3em; font-weight: 500; diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index ef9c2fd889..60e3cc19dd 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -1378,8 +1378,8 @@ a.sparkline { } .account-card { - background: $ui-base-color; border-radius: 4px; + border: 1px solid lighten($ui-base-color, 8%); &__permalink { color: inherit; diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss index 28dad81da5..2e7d5e5e9c 100644 --- a/app/javascript/styles/mastodon/basics.scss +++ b/app/javascript/styles/mastodon/basics.scss @@ -8,7 +8,7 @@ body { font-family: $font-sans-serif, sans-serif; - background: darken($ui-base-color, 8%); + background: var(--background-color); font-size: 13px; line-height: 18px; font-weight: 400; diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index faa775ec4b..047d9d9739 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1311,7 +1311,7 @@ body > [data-popper-placement] { box-sizing: border-box; width: 100%; clear: both; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); &__button { display: inline; @@ -1332,19 +1332,14 @@ body > [data-popper-placement] { .focusable { &:focus { outline: 0; - background: lighten($ui-base-color, 4%); - - .detailed-status, - .detailed-status__action-bar { - background: lighten($ui-base-color, 8%); - } + background: rgba($ui-highlight-color, 0.05); } } .status { padding: 16px; min-height: 54px; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); cursor: auto; @keyframes fade { @@ -1588,10 +1583,10 @@ body > [data-popper-placement] { } .status__wrapper-direct { - background: mix($ui-base-color, $ui-highlight-color, 95%); + background: rgba($ui-highlight-color, 0.05); &:focus { - background: mix(lighten($ui-base-color, 4%), $ui-highlight-color, 95%); + background: rgba($ui-highlight-color, 0.05); } .status__prepend { @@ -1616,9 +1611,8 @@ body > [data-popper-placement] { } .detailed-status { - background: lighten($ui-base-color, 4%); padding: 16px; - border-top: 1px solid lighten($ui-base-color, 8%); + border-top: 1px solid var(--background-border-color); &--flex { display: flex; @@ -1678,9 +1672,8 @@ body > [data-popper-placement] { } .detailed-status__action-bar { - background: lighten($ui-base-color, 4%); - border-top: 1px solid lighten($ui-base-color, 8%); - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-top: 1px solid var(--background-border-color); + border-bottom: 1px solid var(--background-border-color); display: flex; flex-direction: row; padding: 10px 0; @@ -1735,7 +1728,7 @@ body > [data-popper-placement] { .domain { padding: 10px; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); .domain__domain-name { flex: 1 1 auto; @@ -1759,7 +1752,7 @@ body > [data-popper-placement] { .account { padding: 16px; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); .account__display-name { flex: 1 1 auto; @@ -2017,7 +2010,7 @@ a.account__display-name { .notification__report { padding: 16px; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); display: flex; gap: 10px; @@ -2276,6 +2269,7 @@ a.account__display-name { .dropdown-menu { background: var(--dropdown-background-color); + backdrop-filter: var(--background-filter); border: 1px solid var(--dropdown-border-color); padding: 4px; border-radius: 4px; @@ -2466,6 +2460,7 @@ $ui-header-height: 55px; z-index: 3; justify-content: space-between; align-items: center; + backdrop-filter: var(--background-filter); &__logo { display: inline-flex; @@ -2514,7 +2509,8 @@ $ui-header-height: 55px; } .tabs-bar__wrapper { - background: darken($ui-base-color, 8%); + background: var(--background-color-tint); + backdrop-filter: var(--background-filter); position: sticky; top: $ui-header-height; z-index: 2; @@ -2550,8 +2546,15 @@ $ui-header-height: 55px; flex-direction: column; > .scrollable { - background: $ui-base-color; + border: 1px solid var(--background-border-color); + border-top: 0; border-radius: 0 0 4px 4px; + + &.about, + &.privacy-policy { + border-top: 1px solid var(--background-border-color); + border-radius: 4px; + } } } @@ -2581,7 +2584,6 @@ $ui-header-height: 55px; font-size: 16px; align-items: center; justify-content: center; - border-bottom: 2px solid transparent; } .column, @@ -2710,8 +2712,7 @@ $ui-header-height: 55px; .navigation-panel { margin: 0; - background: $ui-base-color; - border-inline-start: 1px solid lighten($ui-base-color, 8%); + border-inline-start: 1px solid var(--background-border-color); height: 100vh; } @@ -2729,8 +2730,15 @@ $ui-header-height: 55px; .layout-single-column .ui__header { display: flex; - background: $ui-base-color; - border-bottom: 1px solid lighten($ui-base-color, 8%); + background: var(--background-color-tint); + border-bottom: 1px solid var(--background-border-color); + } + + .column > .scrollable, + .tabs-bar__wrapper .column-header, + .tabs-bar__wrapper .column-back-button { + border-left: 0; + border-right: 0; } .column-header, @@ -2788,7 +2796,7 @@ $ui-header-height: 55px; inset-inline-start: 9px; top: -13px; background: $ui-highlight-color; - border: 2px solid lighten($ui-base-color, 8%); + border: 2px solid var(--background-color); padding: 1px 6px; border-radius: 6px; font-size: 10px; @@ -2810,7 +2818,7 @@ $ui-header-height: 55px; } .column-link--transparent .icon-with-badge__badge { - border-color: darken($ui-base-color, 8%); + border-color: var(--background-color); } .column-title { @@ -3160,7 +3168,7 @@ $ui-header-height: 55px; flex: 0 0 auto; border: 0; background: transparent; - border-top: 1px solid lighten($ui-base-color, 4%); + border-top: 1px solid var(--background-border-color); margin: 10px 0; } @@ -3177,13 +3185,14 @@ $ui-header-height: 55px; overflow: hidden; display: flex; border-radius: 4px; + border: 1px solid var(--background-border-color); } .drawer__inner { position: absolute; top: 0; inset-inline-start: 0; - background: darken($ui-base-color, 4%); + background: var(--background-color); box-sizing: border-box; padding: 0; display: flex; @@ -3192,15 +3201,11 @@ $ui-header-height: 55px; overflow-y: auto; width: 100%; height: 100%; - - &.darker { - background: $ui-base-color; - } } .drawer__inner__mastodon { - background: darken($ui-base-color, 4%) - url('data:image/svg+xml;utf8,') + background: var(--background-color) + url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto; flex: 1; min-height: 47px; @@ -3224,7 +3229,7 @@ $ui-header-height: 55px; .drawer__header { flex: 0 0 auto; font-size: 16px; - background: darken($ui-base-color, 4%); + border: 1px solid var(--background-border-color); margin-bottom: 10px; display: flex; flex-direction: row; @@ -3234,7 +3239,7 @@ $ui-header-height: 55px; a:hover, a:focus, a:active { - background: $ui-base-color; + color: $primary-text-color; } } @@ -3279,15 +3284,14 @@ $ui-header-height: 55px; .column-back-button { box-sizing: border-box; width: 100%; - background: $ui-base-color; + background: transparent; + border: 1px solid var(--background-border-color); border-radius: 4px 4px 0 0; color: $highlight-text-color; cursor: pointer; flex: 0 0 auto; font-size: 16px; line-height: inherit; - border: 0; - border-bottom: 1px solid lighten($ui-base-color, 8%); text-align: unset; padding: 13px; margin: 0; @@ -3300,13 +3304,17 @@ $ui-header-height: 55px; &:hover { text-decoration: underline; } + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + } } .column-header__back-button { display: flex; align-items: center; gap: 5px; - background: $ui-base-color; + background: transparent; border: 0; font-family: inherit; color: $highlight-text-color; @@ -3412,8 +3420,6 @@ $ui-header-height: 55px; } .column-link { - background: lighten($ui-base-color, 8%); - color: $primary-text-color; display: flex; align-items: center; gap: 5px; @@ -3423,12 +3429,18 @@ $ui-header-height: 55px; overflow: hidden; white-space: nowrap; border: 0; + background: transparent; + color: $secondary-text-color; border-left: 4px solid transparent; &:hover, &:focus, &:active { - background: lighten($ui-base-color, 11%); + color: $primary-text-color; + } + + &.active { + color: $highlight-text-color; } &:focus { @@ -3440,22 +3452,6 @@ $ui-header-height: 55px; border-radius: 0; } - &--transparent { - background: transparent; - color: $secondary-text-color; - - &:hover, - &:focus, - &:active { - background: transparent; - color: $primary-text-color; - } - - &.active { - color: $highlight-text-color; - } - } - &--logo { background: transparent; padding: 10px; @@ -3480,8 +3476,8 @@ $ui-header-height: 55px; } .column-subheading { - background: $ui-base-color; - color: $dark-text-color; + background: darken($ui-base-color, 4%); + color: $darker-text-color; padding: 8px 20px; font-size: 12px; font-weight: 500; @@ -3489,12 +3485,6 @@ $ui-header-height: 55px; cursor: default; } -.getting-started__wrapper, -.getting-started, -.flex-spacer { - background: $ui-base-color; -} - .getting-started__wrapper { flex: 0 0 auto; } @@ -3506,6 +3496,8 @@ $ui-header-height: 55px; .getting-started { color: $dark-text-color; overflow: auto; + border: 1px solid var(--background-border-color); + border-top: 0; &__trends { flex: 0 1 auto; @@ -3514,7 +3506,7 @@ $ui-header-height: 55px; margin-top: 10px; h4 { - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); padding: 10px; font-size: 12px; text-transform: uppercase; @@ -3636,7 +3628,7 @@ $ui-header-height: 55px; margin-top: 14px; text-decoration: none; overflow: hidden; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); border-radius: 8px; &__actions { @@ -3893,7 +3885,7 @@ a.status-card { } .load-gap { - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); } .timeline-hint { @@ -3926,7 +3918,8 @@ a.status-card { font-size: 16px; font-weight: 500; color: $dark-text-color; - background: $ui-base-color; + border: 1px solid var(--background-border-color); + border-top: 0; cursor: default; display: flex; flex: 1 1 auto; @@ -4002,8 +3995,7 @@ a.status-card { .column-header { display: flex; font-size: 16px; - background: $ui-base-color; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); border-radius: 4px 4px 0 0; flex: 0 0 auto; cursor: pointer; @@ -4070,6 +4062,10 @@ a.status-card { padding-top: 16px; } } + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + } } .column-header__buttons { @@ -4089,9 +4085,9 @@ a.status-card { display: flex; justify-content: center; align-items: center; - background: $ui-base-color; border: 0; color: $darker-text-color; + background: transparent; cursor: pointer; font-size: 16px; padding: 0 15px; @@ -4110,7 +4106,6 @@ a.status-card { &.active { color: $primary-text-color; - background: lighten($ui-base-color, 4%); &:hover { color: $primary-text-color; @@ -4127,7 +4122,6 @@ a.status-card { max-height: 70vh; overflow: hidden; overflow-y: auto; - border-bottom: 1px solid lighten($ui-base-color, 8%); color: $darker-text-color; transition: max-height 150ms ease-in-out, @@ -4149,13 +4143,14 @@ a.status-card { height: 0; background: transparent; border: 0; - border-top: 1px solid lighten($ui-base-color, 8%); + border-top: 1px solid var(--background-border-color); margin: 10px 0; } } .column-header__collapsible-inner { - background: $ui-base-color; + border: 1px solid var(--background-border-color); + border-top: 0; } .column-header__setting-btn { @@ -4401,9 +4396,8 @@ a.status-card { } .account--panel { - background: lighten($ui-base-color, 4%); - border-top: 1px solid lighten($ui-base-color, 8%); - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-top: 1px solid var(--background-border-color); + border-bottom: 1px solid var(--background-border-color); display: flex; flex-direction: row; padding: 10px 0; @@ -4609,7 +4603,6 @@ a.status-card { .empty-column-indicator, .follow_requests-unlocked_explanation { color: $dark-text-color; - background: $ui-base-color; text-align: center; padding: 20px; font-size: 15px; @@ -4636,14 +4629,14 @@ a.status-card { .follow_requests-unlocked_explanation { background: darken($ui-base-color, 4%); - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); contain: initial; flex-grow: 0; } .error-column { padding: 20px; - background: $ui-base-color; + border: 1px solid var(--background-border-color); border-radius: 4px; display: flex; flex: 1 1 auto; @@ -4858,7 +4851,7 @@ a.status-card { width: 100%; height: 6px; border-radius: 6px; - background: darken($ui-base-color, 8%); + background: var(--background-color); position: relative; margin-top: 5px; } @@ -5280,7 +5273,7 @@ a.status-card { } .search-results__section { - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); &:last-child { border-bottom: 0; @@ -5288,7 +5281,7 @@ a.status-card { &__header { background: darken($ui-base-color, 4%); - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); padding: 15px; font-weight: 500; font-size: 14px; @@ -6335,7 +6328,7 @@ a.status-card { .attachment-list { display: flex; font-size: 14px; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); border-radius: 4px; margin-top: 16px; overflow: hidden; @@ -6345,7 +6338,7 @@ a.status-card { color: $dark-text-color; padding: 8px 18px; cursor: default; - border-inline-end: 1px solid lighten($ui-base-color, 8%); + border-inline-end: 1px solid var(--background-border-color); display: flex; flex-direction: column; align-items: center; @@ -6497,7 +6490,7 @@ a.status-card { overflow: hidden; box-sizing: border-box; position: relative; - background: darken($ui-base-color, 8%); + background: var(--background-color); border-radius: 8px; padding-bottom: 44px; width: 100%; @@ -6893,7 +6886,6 @@ a.status-card { .scrollable .account-card { margin: 10px; - background: lighten($ui-base-color, 8%); } .scrollable .account-card__title__avatar { @@ -6904,11 +6896,7 @@ a.status-card { } .scrollable .account-card__bio::after { - background: linear-gradient( - to left, - lighten($ui-base-color, 8%), - transparent - ); + background: linear-gradient(to left, var(--background-color), transparent); } .account-gallery__container { @@ -6937,8 +6925,8 @@ a.status-card { .notification__filter-bar, .account__section-headline { - background: $ui-base-color; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); + border-top: 0; cursor: default; display: flex; flex-shrink: 0; @@ -6979,10 +6967,15 @@ a.status-card { } } } + + .scrollable & { + border-left: 0; + border-right: 0; + } } .filter-form { - background: $ui-base-color; + border-bottom: 1px solid var(--background-border-color); &__column { display: flex; @@ -7200,7 +7193,8 @@ noscript { justify-content: flex-start; gap: 15px; align-items: center; - background: lighten($ui-base-color, 4%); + border: 1px solid var(--background-border-color); + border-top: 0; label { flex: 1 1 auto; @@ -7301,7 +7295,7 @@ noscript { .list { padding: 10px; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); } .list__wrapper { @@ -7445,7 +7439,7 @@ noscript { height: 145px; position: relative; background: darken($ui-base-color, 4%); - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); img { object-fit: cover; @@ -7459,7 +7453,7 @@ noscript { &__bar { position: relative; padding: 0 20px; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); .avatar { display: block; @@ -7467,8 +7461,8 @@ noscript { width: 94px; .account__avatar { - background: darken($ui-base-color, 8%); - border: 2px solid $ui-base-color; + background: var(--background-color); + border: 2px solid var(--background-border-color); } } } @@ -7583,13 +7577,12 @@ noscript { margin: 0; margin-top: 16px; border-radius: 4px; - background: darken($ui-base-color, 4%); - border: 0; + border: 1px solid var(--background-border-color); dl { display: block; padding: 11px 16px; - border-bottom-color: lighten($ui-base-color, 4%); + border-bottom-color: var(--background-border-color); } dd, @@ -7764,7 +7757,7 @@ noscript { display: flex; align-items: center; padding: 15px; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); gap: 15px; &:last-child { @@ -7882,7 +7875,7 @@ noscript { .conversation { display: flex; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); padding: 5px; padding-bottom: 0; @@ -8237,7 +8230,7 @@ noscript { .picture-in-picture-placeholder { box-sizing: border-box; - border: 2px dashed lighten($ui-base-color, 8%); + border: 2px dashed var(--background-border-color); background: $base-shadow-color; display: flex; flex-direction: column; @@ -8265,7 +8258,7 @@ noscript { .notifications-permission-banner { padding: 30px; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); display: flex; flex-direction: column; align-items: center; @@ -8335,7 +8328,7 @@ noscript { color: $primary-text-color; text-decoration: none; padding: 15px; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); gap: 15px; &:last-child { @@ -8714,7 +8707,6 @@ noscript { } .privacy-policy { - background: $ui-base-color; padding: 20px; @media screen and (min-width: $no-gap-breakpoint) { @@ -9083,6 +9075,7 @@ noscript { .about { padding: 20px; + border-top: 1px solid var(--background-border-color); @media screen and (min-width: $no-gap-breakpoint) { border-radius: 4px; @@ -9129,7 +9122,7 @@ noscript { } &__meta { - background: lighten($ui-base-color, 4%); + border: 1px solid var(--background-border-color); border-radius: 4px; display: flex; margin-bottom: 30px; @@ -9145,7 +9138,7 @@ noscript { width: 0; border: 0; border-style: solid; - border-color: lighten($ui-base-color, 8%); + border-color: var(--background-border-color); border-left-width: 1px; min-height: calc(100% - 60px); flex: 0 0 auto; @@ -9253,7 +9246,7 @@ noscript { line-height: 22px; padding: 20px; border-radius: 4px; - background: lighten($ui-base-color, 4%); + border: 1px solid var(--background-border-color); color: $highlight-text-color; cursor: pointer; } @@ -9263,7 +9256,7 @@ noscript { } &__body { - border: 1px solid lighten($ui-base-color, 4%); + border: 1px solid var(--background-border-color); border-top: 0; padding: 20px; font-size: 15px; @@ -9273,18 +9266,17 @@ noscript { &__domain-blocks { margin-top: 30px; - background: darken($ui-base-color, 4%); - border: 1px solid lighten($ui-base-color, 4%); + border: 1px solid var(--background-border-color); border-radius: 4px; &__domain { - border-bottom: 1px solid lighten($ui-base-color, 4%); + border-bottom: 1px solid var(--background-border-color); padding: 10px; font-size: 15px; color: $darker-text-color; &:nth-child(2n) { - background: darken($ui-base-color, 2%); + background: darken($ui-base-color, 4%); } &:last-child { @@ -9380,7 +9372,7 @@ noscript { } .hashtag-header { - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); padding: 15px; font-size: 17px; line-height: 22px; @@ -9442,8 +9434,8 @@ noscript { gap: 12px; padding: 16px 0; padding-bottom: 0; - border-bottom: 1px solid mix($ui-base-color, $ui-highlight-color, 75%); - background: mix($ui-base-color, $ui-highlight-color, 95%); + border-bottom: 1px solid var(--background-border-color); + background: rgba($ui-highlight-color, 0.05); &__header { display: flex; @@ -9527,8 +9519,8 @@ noscript { overflow-x: scroll; &__card { - background: darken($ui-base-color, 4%); - border: 1px solid lighten($ui-base-color, 8%); + background: var(--background-color); + border: 1px solid var(--background-border-color); border-radius: 4px; display: flex; flex-direction: column; @@ -9565,7 +9557,7 @@ noscript { .account__avatar { flex-shrink: 0; align-self: flex-end; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); background-color: $ui-base-color; } diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss index 611c8bb5d1..94078d960d 100644 --- a/app/javascript/styles/mastodon/variables.scss +++ b/app/javascript/styles/mastodon/variables.scss @@ -94,10 +94,14 @@ $font-display: 'mastodon-font-display' !default; $font-monospace: 'mastodon-font-monospace' !default; :root { - --dropdown-border-color: #{lighten($ui-base-color, 12%)}; - --dropdown-background-color: #{lighten($ui-base-color, 4%)}; + --dropdown-border-color: #{lighten($ui-base-color, 4%)}; + --dropdown-background-color: #{rgba(darken($ui-base-color, 8%), 0.9)}; --dropdown-shadow: 0 20px 25px -5px #{rgba($base-shadow-color, 0.25)}, 0 8px 10px -6px #{rgba($base-shadow-color, 0.25)}; --modal-background-color: #{darken($ui-base-color, 4%)}; --modal-border-color: #{lighten($ui-base-color, 4%)}; + --background-border-color: #{lighten($ui-base-color, 4%)}; + --background-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%); + --background-color: #{darken($ui-base-color, 8%)}; + --background-color-tint: #{rgba(darken($ui-base-color, 8%), 0.9)}; } From d4ed7e466c41f19e5f9352700c76e7ffc4d28119 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 12 Mar 2024 09:09:11 -0400 Subject: [PATCH 152/954] Extract `by_domain_length` scope in `DomainNormalizable` concern (#29517) --- app/models/concerns/domain_normalizable.rb | 12 ++++++++++++ app/models/domain_block.rb | 2 +- app/models/email_domain_block.rb | 2 +- app/models/preview_card_provider.rb | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/models/concerns/domain_normalizable.rb b/app/models/concerns/domain_normalizable.rb index 8e244c1d87..76f91c5b64 100644 --- a/app/models/concerns/domain_normalizable.rb +++ b/app/models/concerns/domain_normalizable.rb @@ -5,6 +5,18 @@ module DomainNormalizable included do before_validation :normalize_domain + + scope :by_domain_length, -> { order(domain_char_length.desc) } + end + + class_methods do + def domain_char_length + Arel.sql( + <<~SQL.squish + CHAR_LENGTH(domain) + SQL + ) + end end private diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb index e310918e9b..b5d1f2e079 100644 --- a/app/models/domain_block.rb +++ b/app/models/domain_block.rb @@ -70,7 +70,7 @@ class DomainBlock < ApplicationRecord segments = uri.normalized_host.split('.') variants = segments.map.with_index { |_, i| segments[i..].join('.') } - where(domain: variants).order(Arel.sql('char_length(domain) desc')).first + where(domain: variants).by_domain_length.first rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError nil end diff --git a/app/models/email_domain_block.rb b/app/models/email_domain_block.rb index 40be59420a..f3a86eae8f 100644 --- a/app/models/email_domain_block.rb +++ b/app/models/email_domain_block.rb @@ -56,7 +56,7 @@ class EmailDomainBlock < ApplicationRecord end def blocking?(allow_with_approval: false) - blocks = EmailDomainBlock.where(domain: domains_with_variants, allow_with_approval: allow_with_approval).order(Arel.sql('char_length(domain) desc')) + blocks = EmailDomainBlock.where(domain: domains_with_variants, allow_with_approval: allow_with_approval).by_domain_length blocks.each { |block| block.history.add(@attempt_ip) } if @attempt_ip.present? blocks.any? end diff --git a/app/models/preview_card_provider.rb b/app/models/preview_card_provider.rb index 8ba24331bb..756707e3f1 100644 --- a/app/models/preview_card_provider.rb +++ b/app/models/preview_card_provider.rb @@ -54,6 +54,6 @@ class PreviewCardProvider < ApplicationRecord def self.matching_domain(domain) segments = domain.split('.') - where(domain: segments.map.with_index { |_, i| segments[i..].join('.') }).order(Arel.sql('char_length(domain) desc')).first + where(domain: segments.map.with_index { |_, i| segments[i..].join('.') }).by_domain_length.first end end From 00d94f3ffabda89a2f955212e763cdba3f1f54c6 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 12 Mar 2024 13:10:37 -0400 Subject: [PATCH 153/954] Use vanilla JS to get Rails CSRF values (#29403) --- app/javascript/mastodon/utils/log_out.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/utils/log_out.ts b/app/javascript/mastodon/utils/log_out.ts index 3a4cc8ecb1..b08a61a6a2 100644 --- a/app/javascript/mastodon/utils/log_out.ts +++ b/app/javascript/mastodon/utils/log_out.ts @@ -1,5 +1,3 @@ -import Rails from '@rails/ujs'; - export const logOut = () => { const form = document.createElement('form'); @@ -9,13 +7,18 @@ export const logOut = () => { methodInput.setAttribute('type', 'hidden'); form.appendChild(methodInput); - const csrfToken = Rails.csrfToken(); - const csrfParam = Rails.csrfParam(); + const csrfToken = document.querySelector( + 'meta[name=csrf-token]', + ); + + const csrfParam = document.querySelector( + 'meta[name=csrf-param]', + ); if (csrfParam && csrfToken) { const csrfInput = document.createElement('input'); - csrfInput.setAttribute('name', csrfParam); - csrfInput.setAttribute('value', csrfToken); + csrfInput.setAttribute('name', csrfParam.content); + csrfInput.setAttribute('value', csrfToken.content); csrfInput.setAttribute('type', 'hidden'); form.appendChild(csrfInput); } From 96013cd576ec51a41a7fe06a28225a3e43ca8496 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Mar 2024 04:22:32 -0400 Subject: [PATCH 154/954] Reduce `RSpec/ExampleLength` in CSP request spec (#29104) --- spec/requests/content_security_policy_spec.rb | 49 ++++++++++++------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/spec/requests/content_security_policy_spec.rb b/spec/requests/content_security_policy_spec.rb index d4cc40bce5..d4447dca4b 100644 --- a/spec/requests/content_security_policy_spec.rb +++ b/spec/requests/content_security_policy_spec.rb @@ -3,25 +3,38 @@ require 'rails_helper' describe 'Content-Security-Policy' do - it 'sets the expected CSP headers' do - allow(SecureRandom).to receive(:base64).with(16).and_return('ZbA+JmE7+bK8F5qvADZHuQ==') + before { allow(SecureRandom).to receive(:base64).with(16).and_return('ZbA+JmE7+bK8F5qvADZHuQ==') } + it 'sets the expected CSP headers' do get '/' - expect(response.headers['Content-Security-Policy'].split(';').map(&:strip)).to contain_exactly( - "base-uri 'none'", - "default-src 'none'", - "frame-ancestors 'none'", - "font-src 'self' https://cb6e6126.ngrok.io", - "img-src 'self' data: blob: https://cb6e6126.ngrok.io", - "style-src 'self' https://cb6e6126.ngrok.io 'nonce-ZbA+JmE7+bK8F5qvADZHuQ=='", - "media-src 'self' data: https://cb6e6126.ngrok.io", - "frame-src 'self' https:", - "manifest-src 'self' https://cb6e6126.ngrok.io", - "form-action 'self'", - "child-src 'self' blob: https://cb6e6126.ngrok.io", - "worker-src 'self' blob: https://cb6e6126.ngrok.io", - "connect-src 'self' data: blob: https://cb6e6126.ngrok.io ws://cb6e6126.ngrok.io:4000", - "script-src 'self' https://cb6e6126.ngrok.io 'wasm-unsafe-eval'" - ) + + expect(response_csp_headers) + .to match_array(expected_csp_headers) + end + + def response_csp_headers + response + .headers['Content-Security-Policy'] + .split(';') + .map(&:strip) + end + + def expected_csp_headers + <<~CSP.split("\n").map(&:strip) + base-uri 'none' + child-src 'self' blob: https://cb6e6126.ngrok.io + connect-src 'self' data: blob: https://cb6e6126.ngrok.io ws://cb6e6126.ngrok.io:4000 + default-src 'none' + font-src 'self' https://cb6e6126.ngrok.io + form-action 'self' + frame-ancestors 'none' + frame-src 'self' https: + img-src 'self' data: blob: https://cb6e6126.ngrok.io + manifest-src 'self' https://cb6e6126.ngrok.io + media-src 'self' data: https://cb6e6126.ngrok.io + script-src 'self' https://cb6e6126.ngrok.io 'wasm-unsafe-eval' + style-src 'self' https://cb6e6126.ngrok.io 'nonce-ZbA+JmE7+bK8F5qvADZHuQ==' + worker-src 'self' blob: https://cb6e6126.ngrok.io + CSP end end From 19f0590795500c2a93baa317b79b53efaca2ec88 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Mar 2024 04:33:03 -0400 Subject: [PATCH 155/954] Add basic coverage for `TagSearchService` class (#29319) --- spec/services/tag_search_service_spec.rb | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 spec/services/tag_search_service_spec.rb diff --git a/spec/services/tag_search_service_spec.rb b/spec/services/tag_search_service_spec.rb new file mode 100644 index 0000000000..de42e54071 --- /dev/null +++ b/spec/services/tag_search_service_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe TagSearchService do + describe '#call' do + let!(:one) { Fabricate(:tag, name: 'one') } + + before { Fabricate(:tag, name: 'two') } + + it 'runs a search for tags' do + results = subject.call('#one', limit: 5) + + expect(results) + .to have_attributes( + size: 1, + first: eq(one) + ) + end + end +end From 3eaac3af73eac44accf4abefb273486e90c4c9dd Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Mar 2024 04:38:57 -0400 Subject: [PATCH 156/954] Use `before_all` block to setup `requests/cache_spec` data (#29437) --- spec/rails_helper.rb | 1 + spec/requests/cache_spec.rb | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 3e84d68738..89fc25bcbd 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -21,6 +21,7 @@ require 'paperclip/matchers' require 'capybara/rspec' require 'chewy/rspec' require 'email_spec/rspec' +require 'test_prof/recipes/rspec/before_all' Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f } diff --git a/spec/requests/cache_spec.rb b/spec/requests/cache_spec.rb index c56eec16c5..91e5b022e3 100644 --- a/spec/requests/cache_spec.rb +++ b/spec/requests/cache_spec.rb @@ -39,7 +39,7 @@ module TestEndpoints /api/v1/accounts/lookup?acct=alice /api/v1/statuses/110224538612341312 /api/v1/statuses/110224538612341312/context - /api/v1/polls/12345 + /api/v1/polls/123456789 /api/v1/trends/statuses /api/v1/directory ).freeze @@ -166,14 +166,18 @@ describe 'Caching behavior' do ActionController::Base.allow_forgery_protection = old end - let(:alice) { Fabricate(:account, username: 'alice') } - let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Moderator')) } + let(:alice) { Account.find_by(username: 'alice') } + let(:user) { User.find_by(email: 'user@host.example') } + let(:token) { Doorkeeper::AccessToken.find_by(resource_owner_id: user.id) } - before do - status = Fabricate(:status, account: alice, id: '110224538612341312') - Fabricate(:status, account: alice, id: '110224538643211312', visibility: :private) + before_all do + alice = Fabricate(:account, username: 'alice') + user = Fabricate(:user, email: 'user@host.example', role: UserRole.find_by(name: 'Moderator')) + status = Fabricate(:status, account: alice, id: 110_224_538_612_341_312) + Fabricate(:status, account: alice, id: 110_224_538_643_211_312, visibility: :private) Fabricate(:invite, code: 'abcdef') - Fabricate(:poll, status: status, account: alice, id: '12345') + Fabricate(:poll, status: status, account: alice, id: 123_456_789) + Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') user.account.follow!(alice) end @@ -321,8 +325,6 @@ describe 'Caching behavior' do end context 'with an auth token' do - let!(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } - TestEndpoints::ALWAYS_CACHED.each do |endpoint| describe endpoint do before do @@ -585,8 +587,6 @@ describe 'Caching behavior' do end context 'with an auth token' do - let!(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } - TestEndpoints::ALWAYS_CACHED.each do |endpoint| describe endpoint do before do From 469028b6d3788c1b1e535d6d0b1f9f6e91e26c33 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Mar 2024 04:39:26 -0400 Subject: [PATCH 157/954] Remove unneeded `type: :service` from spec/services files (#29304) --- spec/services/account_search_service_spec.rb | 2 +- spec/services/account_statuses_cleanup_service_spec.rb | 2 +- .../activitypub/fetch_featured_collection_service_spec.rb | 2 +- .../activitypub/fetch_featured_tags_collection_service_spec.rb | 2 +- spec/services/activitypub/fetch_remote_account_service_spec.rb | 2 +- spec/services/activitypub/fetch_remote_actor_service_spec.rb | 2 +- spec/services/activitypub/fetch_remote_key_service_spec.rb | 2 +- spec/services/activitypub/fetch_remote_status_service_spec.rb | 2 +- spec/services/activitypub/fetch_replies_service_spec.rb | 2 +- spec/services/activitypub/process_account_service_spec.rb | 2 +- spec/services/activitypub/process_collection_service_spec.rb | 2 +- spec/services/activitypub/process_status_update_service_spec.rb | 2 +- spec/services/activitypub/synchronize_followers_service_spec.rb | 2 +- spec/services/after_block_domain_from_account_service_spec.rb | 2 +- spec/services/after_block_service_spec.rb | 2 +- spec/services/app_sign_up_service_spec.rb | 2 +- spec/services/authorize_follow_service_spec.rb | 2 +- spec/services/backup_service_spec.rb | 2 +- spec/services/batched_remove_status_service_spec.rb | 2 +- spec/services/block_domain_service_spec.rb | 2 +- spec/services/block_service_spec.rb | 2 +- spec/services/bootstrap_timeline_service_spec.rb | 2 +- spec/services/clear_domain_media_service_spec.rb | 2 +- spec/services/delete_account_service_spec.rb | 2 +- spec/services/fan_out_on_write_service_spec.rb | 2 +- spec/services/favourite_service_spec.rb | 2 +- spec/services/fetch_link_card_service_spec.rb | 2 +- spec/services/fetch_oembed_service_spec.rb | 2 +- spec/services/fetch_remote_status_service_spec.rb | 2 +- spec/services/fetch_resource_service_spec.rb | 2 +- spec/services/follow_service_spec.rb | 2 +- spec/services/import_service_spec.rb | 2 +- spec/services/mute_service_spec.rb | 2 +- spec/services/notify_service_spec.rb | 2 +- spec/services/post_status_service_spec.rb | 2 +- spec/services/precompute_feed_service_spec.rb | 2 +- spec/services/process_mentions_service_spec.rb | 2 +- spec/services/purge_domain_service_spec.rb | 2 +- spec/services/reblog_service_spec.rb | 2 +- spec/services/reject_follow_service_spec.rb | 2 +- spec/services/remove_from_followers_service_spec.rb | 2 +- spec/services/remove_status_service_spec.rb | 2 +- spec/services/report_service_spec.rb | 2 +- spec/services/resolve_account_service_spec.rb | 2 +- spec/services/resolve_url_service_spec.rb | 2 +- spec/services/search_service_spec.rb | 2 +- spec/services/software_update_check_service_spec.rb | 2 +- spec/services/suspend_account_service_spec.rb | 2 +- spec/services/translate_status_service_spec.rb | 2 +- spec/services/unallow_domain_service_spec.rb | 2 +- spec/services/unblock_domain_service_spec.rb | 2 +- spec/services/unblock_service_spec.rb | 2 +- spec/services/unfollow_service_spec.rb | 2 +- spec/services/unsuspend_account_service_spec.rb | 2 +- spec/services/update_account_service_spec.rb | 2 +- spec/services/update_status_service_spec.rb | 2 +- spec/services/verify_link_service_spec.rb | 2 +- 57 files changed, 57 insertions(+), 57 deletions(-) diff --git a/spec/services/account_search_service_spec.rb b/spec/services/account_search_service_spec.rb index 4f89cd220c..5ec0885903 100644 --- a/spec/services/account_search_service_spec.rb +++ b/spec/services/account_search_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe AccountSearchService, type: :service do +describe AccountSearchService do describe '#call' do context 'with a query to ignore' do it 'returns empty array for missing query' do diff --git a/spec/services/account_statuses_cleanup_service_spec.rb b/spec/services/account_statuses_cleanup_service_spec.rb index 0ac113f105..403c4632d7 100644 --- a/spec/services/account_statuses_cleanup_service_spec.rb +++ b/spec/services/account_statuses_cleanup_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe AccountStatusesCleanupService, type: :service do +describe AccountStatusesCleanupService do let(:account) { Fabricate(:account, username: 'alice', domain: nil) } let(:account_policy) { Fabricate(:account_statuses_cleanup_policy, account: account) } let!(:unrelated_status) { Fabricate(:status, created_at: 3.years.ago) } diff --git a/spec/services/activitypub/fetch_featured_collection_service_spec.rb b/spec/services/activitypub/fetch_featured_collection_service_spec.rb index dab204406b..7ea87922ac 100644 --- a/spec/services/activitypub/fetch_featured_collection_service_spec.rb +++ b/spec/services/activitypub/fetch_featured_collection_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do +RSpec.describe ActivityPub::FetchFeaturedCollectionService do subject { described_class.new } let(:actor) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/account', featured_collection_url: 'https://example.com/account/pinned') } diff --git a/spec/services/activitypub/fetch_featured_tags_collection_service_spec.rb b/spec/services/activitypub/fetch_featured_tags_collection_service_spec.rb index 638278a10e..59367b1e32 100644 --- a/spec/services/activitypub/fetch_featured_tags_collection_service_spec.rb +++ b/spec/services/activitypub/fetch_featured_tags_collection_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ActivityPub::FetchFeaturedTagsCollectionService, type: :service do +RSpec.describe ActivityPub::FetchFeaturedTagsCollectionService do subject { described_class.new } let(:collection_url) { 'https://example.com/account/tags' } diff --git a/spec/services/activitypub/fetch_remote_account_service_spec.rb b/spec/services/activitypub/fetch_remote_account_service_spec.rb index 799a70d091..789a705c41 100644 --- a/spec/services/activitypub/fetch_remote_account_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_account_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do +RSpec.describe ActivityPub::FetchRemoteAccountService do subject { described_class.new } let!(:actor) do diff --git a/spec/services/activitypub/fetch_remote_actor_service_spec.rb b/spec/services/activitypub/fetch_remote_actor_service_spec.rb index 4ce42ea560..025051e9fa 100644 --- a/spec/services/activitypub/fetch_remote_actor_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_actor_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do +RSpec.describe ActivityPub::FetchRemoteActorService do subject { described_class.new } let!(:actor) do diff --git a/spec/services/activitypub/fetch_remote_key_service_spec.rb b/spec/services/activitypub/fetch_remote_key_service_spec.rb index 478778cc9f..b6fcf3f479 100644 --- a/spec/services/activitypub/fetch_remote_key_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_key_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ActivityPub::FetchRemoteKeyService, type: :service do +RSpec.describe ActivityPub::FetchRemoteKeyService do subject { described_class.new } let(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } diff --git a/spec/services/activitypub/fetch_remote_status_service_spec.rb b/spec/services/activitypub/fetch_remote_status_service_spec.rb index 0fb32d20b1..a86f141fe0 100644 --- a/spec/services/activitypub/fetch_remote_status_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_status_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do +RSpec.describe ActivityPub::FetchRemoteStatusService do include ActionView::Helpers::TextHelper subject { described_class.new } diff --git a/spec/services/activitypub/fetch_replies_service_spec.rb b/spec/services/activitypub/fetch_replies_service_spec.rb index 8e1f606e26..e7d8d3528a 100644 --- a/spec/services/activitypub/fetch_replies_service_spec.rb +++ b/spec/services/activitypub/fetch_replies_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ActivityPub::FetchRepliesService, type: :service do +RSpec.describe ActivityPub::FetchRepliesService do subject { described_class.new } let(:actor) { Fabricate(:account, domain: 'example.com', uri: 'http://example.com/account') } diff --git a/spec/services/activitypub/process_account_service_spec.rb b/spec/services/activitypub/process_account_service_spec.rb index b13869f357..8b80dafe45 100644 --- a/spec/services/activitypub/process_account_service_spec.rb +++ b/spec/services/activitypub/process_account_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ActivityPub::ProcessAccountService, type: :service do +RSpec.describe ActivityPub::ProcessAccountService do subject { described_class.new } context 'with property values, an avatar, and a profile header' do diff --git a/spec/services/activitypub/process_collection_service_spec.rb b/spec/services/activitypub/process_collection_service_spec.rb index 63502c546e..74df0f9106 100644 --- a/spec/services/activitypub/process_collection_service_spec.rb +++ b/spec/services/activitypub/process_collection_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ActivityPub::ProcessCollectionService, type: :service do +RSpec.describe ActivityPub::ProcessCollectionService do subject { described_class.new } let(:actor) { Fabricate(:account, domain: 'example.com', uri: 'http://example.com/account') } diff --git a/spec/services/activitypub/process_status_update_service_spec.rb b/spec/services/activitypub/process_status_update_service_spec.rb index 67f2f27276..e451d15dc0 100644 --- a/spec/services/activitypub/process_status_update_service_spec.rb +++ b/spec/services/activitypub/process_status_update_service_spec.rb @@ -6,7 +6,7 @@ def poll_option_json(name, votes) { type: 'Note', name: name, replies: { type: 'Collection', totalItems: votes } } end -RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do +RSpec.describe ActivityPub::ProcessStatusUpdateService do subject { described_class.new } let!(:status) { Fabricate(:status, text: 'Hello world', account: Fabricate(:account, domain: 'example.com')) } diff --git a/spec/services/activitypub/synchronize_followers_service_spec.rb b/spec/services/activitypub/synchronize_followers_service_spec.rb index f62376ab95..648f9a3321 100644 --- a/spec/services/activitypub/synchronize_followers_service_spec.rb +++ b/spec/services/activitypub/synchronize_followers_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ActivityPub::SynchronizeFollowersService, type: :service do +RSpec.describe ActivityPub::SynchronizeFollowersService do subject { described_class.new } let(:actor) { Fabricate(:account, domain: 'example.com', uri: 'http://example.com/account', inbox_url: 'http://example.com/inbox') } diff --git a/spec/services/after_block_domain_from_account_service_spec.rb b/spec/services/after_block_domain_from_account_service_spec.rb index 05af125997..2fce424b1a 100644 --- a/spec/services/after_block_domain_from_account_service_spec.rb +++ b/spec/services/after_block_domain_from_account_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe AfterBlockDomainFromAccountService, type: :service do +RSpec.describe AfterBlockDomainFromAccountService do subject { described_class.new } let!(:wolf) { Fabricate(:account, username: 'wolf', domain: 'evil.org', inbox_url: 'https://evil.org/inbox', protocol: :activitypub) } diff --git a/spec/services/after_block_service_spec.rb b/spec/services/after_block_service_spec.rb index d81bba1d8d..82825dad98 100644 --- a/spec/services/after_block_service_spec.rb +++ b/spec/services/after_block_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe AfterBlockService, type: :service do +RSpec.describe AfterBlockService do subject { described_class.new.call(account, target_account) } let(:account) { Fabricate(:account) } diff --git a/spec/services/app_sign_up_service_spec.rb b/spec/services/app_sign_up_service_spec.rb index b37b6da1f0..ec7b7516f9 100644 --- a/spec/services/app_sign_up_service_spec.rb +++ b/spec/services/app_sign_up_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe AppSignUpService, type: :service do +RSpec.describe AppSignUpService do subject { described_class.new } let(:app) { Fabricate(:application, scopes: 'read write') } diff --git a/spec/services/authorize_follow_service_spec.rb b/spec/services/authorize_follow_service_spec.rb index 602250ee96..be2a864185 100644 --- a/spec/services/authorize_follow_service_spec.rb +++ b/spec/services/authorize_follow_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe AuthorizeFollowService, type: :service do +RSpec.describe AuthorizeFollowService do subject { described_class.new } let(:sender) { Fabricate(:account, username: 'alice') } diff --git a/spec/services/backup_service_spec.rb b/spec/services/backup_service_spec.rb index 806ba18323..b4cb60083b 100644 --- a/spec/services/backup_service_spec.rb +++ b/spec/services/backup_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe BackupService, type: :service do +RSpec.describe BackupService do subject(:service_call) { described_class.new.call(backup) } let!(:user) { Fabricate(:user) } diff --git a/spec/services/batched_remove_status_service_spec.rb b/spec/services/batched_remove_status_service_spec.rb index 1c59d5ed06..e501b9ba84 100644 --- a/spec/services/batched_remove_status_service_spec.rb +++ b/spec/services/batched_remove_status_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe BatchedRemoveStatusService, :sidekiq_inline, type: :service do +RSpec.describe BatchedRemoveStatusService, :sidekiq_inline do subject { described_class.new } let!(:alice) { Fabricate(:account) } diff --git a/spec/services/block_domain_service_spec.rb b/spec/services/block_domain_service_spec.rb index 7ad00fff68..0f278293a8 100644 --- a/spec/services/block_domain_service_spec.rb +++ b/spec/services/block_domain_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe BlockDomainService, type: :service do +RSpec.describe BlockDomainService do subject { described_class.new } let!(:bad_account) { Fabricate(:account, username: 'badguy666', domain: 'evil.org') } diff --git a/spec/services/block_service_spec.rb b/spec/services/block_service_spec.rb index 9e4ff8e598..e72e528259 100644 --- a/spec/services/block_service_spec.rb +++ b/spec/services/block_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe BlockService, type: :service do +RSpec.describe BlockService do subject { described_class.new } let(:sender) { Fabricate(:account, username: 'alice') } diff --git a/spec/services/bootstrap_timeline_service_spec.rb b/spec/services/bootstrap_timeline_service_spec.rb index 721a0337fd..c99813bceb 100644 --- a/spec/services/bootstrap_timeline_service_spec.rb +++ b/spec/services/bootstrap_timeline_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe BootstrapTimelineService, type: :service do +RSpec.describe BootstrapTimelineService do subject { described_class.new } context 'when the new user has registered from an invite' do diff --git a/spec/services/clear_domain_media_service_spec.rb b/spec/services/clear_domain_media_service_spec.rb index 9766e62de8..f1e5097a99 100644 --- a/spec/services/clear_domain_media_service_spec.rb +++ b/spec/services/clear_domain_media_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ClearDomainMediaService, type: :service do +RSpec.describe ClearDomainMediaService do subject { described_class.new } let!(:bad_account) { Fabricate(:account, username: 'badguy666', domain: 'evil.org') } diff --git a/spec/services/delete_account_service_spec.rb b/spec/services/delete_account_service_spec.rb index 1965b7daab..de93862435 100644 --- a/spec/services/delete_account_service_spec.rb +++ b/spec/services/delete_account_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe DeleteAccountService, type: :service do +RSpec.describe DeleteAccountService do shared_examples 'common behavior' do subject { described_class.new.call(account) } diff --git a/spec/services/fan_out_on_write_service_spec.rb b/spec/services/fan_out_on_write_service_spec.rb index 77237dffbd..b51d802a5b 100644 --- a/spec/services/fan_out_on_write_service_spec.rb +++ b/spec/services/fan_out_on_write_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe FanOutOnWriteService, type: :service do +RSpec.describe FanOutOnWriteService do subject { described_class.new } let(:last_active_at) { Time.now.utc } diff --git a/spec/services/favourite_service_spec.rb b/spec/services/favourite_service_spec.rb index 3143e7b669..d0f1ff17c1 100644 --- a/spec/services/favourite_service_spec.rb +++ b/spec/services/favourite_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe FavouriteService, type: :service do +RSpec.describe FavouriteService do subject { described_class.new } let(:sender) { Fabricate(:account, username: 'alice') } diff --git a/spec/services/fetch_link_card_service_spec.rb b/spec/services/fetch_link_card_service_spec.rb index d8ca310b28..63ebc3b978 100644 --- a/spec/services/fetch_link_card_service_spec.rb +++ b/spec/services/fetch_link_card_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe FetchLinkCardService, type: :service do +RSpec.describe FetchLinkCardService do subject { described_class.new } let(:html) { 'Hello world' } diff --git a/spec/services/fetch_oembed_service_spec.rb b/spec/services/fetch_oembed_service_spec.rb index 777cbae3fb..c9f84048b6 100644 --- a/spec/services/fetch_oembed_service_spec.rb +++ b/spec/services/fetch_oembed_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe FetchOEmbedService, type: :service do +describe FetchOEmbedService do subject { described_class.new } before do diff --git a/spec/services/fetch_remote_status_service_spec.rb b/spec/services/fetch_remote_status_service_spec.rb index 798740c9b3..a9c61e7b4e 100644 --- a/spec/services/fetch_remote_status_service_spec.rb +++ b/spec/services/fetch_remote_status_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe FetchRemoteStatusService, type: :service do +RSpec.describe FetchRemoteStatusService do let(:account) { Fabricate(:account, domain: 'example.org', uri: 'https://example.org/foo') } let(:prefetched_body) { nil } diff --git a/spec/services/fetch_resource_service_spec.rb b/spec/services/fetch_resource_service_spec.rb index 78037a06ce..ee4810571b 100644 --- a/spec/services/fetch_resource_service_spec.rb +++ b/spec/services/fetch_resource_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe FetchResourceService, type: :service do +RSpec.describe FetchResourceService do describe '#call' do subject { described_class.new.call(url) } diff --git a/spec/services/follow_service_spec.rb b/spec/services/follow_service_spec.rb index cf4de34c89..bea2412a3d 100644 --- a/spec/services/follow_service_spec.rb +++ b/spec/services/follow_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe FollowService, type: :service do +RSpec.describe FollowService do subject { described_class.new } let(:sender) { Fabricate(:account, username: 'alice') } diff --git a/spec/services/import_service_spec.rb b/spec/services/import_service_spec.rb index 7d005c8a11..90877d9997 100644 --- a/spec/services/import_service_spec.rb +++ b/spec/services/import_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ImportService, :sidekiq_inline, type: :service do +RSpec.describe ImportService, :sidekiq_inline do include RoutingHelper let!(:account) { Fabricate(:account, locked: false) } diff --git a/spec/services/mute_service_spec.rb b/spec/services/mute_service_spec.rb index a2ca2ffe13..681afc0b16 100644 --- a/spec/services/mute_service_spec.rb +++ b/spec/services/mute_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe MuteService, type: :service do +RSpec.describe MuteService do subject { described_class.new.call(account, target_account) } let(:account) { Fabricate(:account) } diff --git a/spec/services/notify_service_spec.rb b/spec/services/notify_service_spec.rb index 57ff326c73..514f634d7f 100644 --- a/spec/services/notify_service_spec.rb +++ b/spec/services/notify_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe NotifyService, type: :service do +RSpec.describe NotifyService do subject { described_class.new.call(recipient, type, activity) } let(:user) { Fabricate(:user) } diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index acbebc5056..ee68092a36 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe PostStatusService, type: :service do +RSpec.describe PostStatusService do subject { described_class.new } it 'creates a new status' do diff --git a/spec/services/precompute_feed_service_spec.rb b/spec/services/precompute_feed_service_spec.rb index 663babae8a..9b2c6c280f 100644 --- a/spec/services/precompute_feed_service_spec.rb +++ b/spec/services/precompute_feed_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe PrecomputeFeedService, type: :service do +RSpec.describe PrecomputeFeedService do subject { described_class.new } describe 'call' do diff --git a/spec/services/process_mentions_service_spec.rb b/spec/services/process_mentions_service_spec.rb index 0db73c41fa..2c202d3e57 100644 --- a/spec/services/process_mentions_service_spec.rb +++ b/spec/services/process_mentions_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ProcessMentionsService, type: :service do +RSpec.describe ProcessMentionsService do subject { described_class.new } let(:account) { Fabricate(:account, username: 'alice') } diff --git a/spec/services/purge_domain_service_spec.rb b/spec/services/purge_domain_service_spec.rb index 6d8af14deb..a5c49160db 100644 --- a/spec/services/purge_domain_service_spec.rb +++ b/spec/services/purge_domain_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe PurgeDomainService, type: :service do +RSpec.describe PurgeDomainService do subject { described_class.new } let(:domain) { 'obsolete.org' } diff --git a/spec/services/reblog_service_spec.rb b/spec/services/reblog_service_spec.rb index e5d0a2d6ce..f807536a2e 100644 --- a/spec/services/reblog_service_spec.rb +++ b/spec/services/reblog_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ReblogService, type: :service do +RSpec.describe ReblogService do let(:alice) { Fabricate(:account, username: 'alice') } context 'when creates a reblog with appropriate visibility' do diff --git a/spec/services/reject_follow_service_spec.rb b/spec/services/reject_follow_service_spec.rb index 48316a6c4d..98aaf70478 100644 --- a/spec/services/reject_follow_service_spec.rb +++ b/spec/services/reject_follow_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe RejectFollowService, type: :service do +RSpec.describe RejectFollowService do subject { described_class.new } let(:sender) { Fabricate(:account, username: 'alice') } diff --git a/spec/services/remove_from_followers_service_spec.rb b/spec/services/remove_from_followers_service_spec.rb index 21da38a97b..d6420f7674 100644 --- a/spec/services/remove_from_followers_service_spec.rb +++ b/spec/services/remove_from_followers_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe RemoveFromFollowersService, type: :service do +RSpec.describe RemoveFromFollowersService do subject { described_class.new } let(:bob) { Fabricate(:account, username: 'bob') } diff --git a/spec/services/remove_status_service_spec.rb b/spec/services/remove_status_service_spec.rb index 109acfb09a..b385cfa55b 100644 --- a/spec/services/remove_status_service_spec.rb +++ b/spec/services/remove_status_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe RemoveStatusService, :sidekiq_inline, type: :service do +RSpec.describe RemoveStatusService, :sidekiq_inline do subject { described_class.new } let!(:alice) { Fabricate(:account) } diff --git a/spec/services/report_service_spec.rb b/spec/services/report_service_spec.rb index 2caeb189d9..141dc8c3be 100644 --- a/spec/services/report_service_spec.rb +++ b/spec/services/report_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ReportService, type: :service do +RSpec.describe ReportService do subject { described_class.new } let(:source_account) { Fabricate(:account) } diff --git a/spec/services/resolve_account_service_spec.rb b/spec/services/resolve_account_service_spec.rb index b82e5b3865..316266c8f8 100644 --- a/spec/services/resolve_account_service_spec.rb +++ b/spec/services/resolve_account_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ResolveAccountService, type: :service do +RSpec.describe ResolveAccountService do subject { described_class.new } before do diff --git a/spec/services/resolve_url_service_spec.rb b/spec/services/resolve_url_service_spec.rb index 5270cc10dd..3d59a55f10 100644 --- a/spec/services/resolve_url_service_spec.rb +++ b/spec/services/resolve_url_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe ResolveURLService, type: :service do +describe ResolveURLService do subject { described_class.new } describe '#call' do diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb index 39adf43876..394ee7c3a6 100644 --- a/spec/services/search_service_spec.rb +++ b/spec/services/search_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe SearchService, type: :service do +describe SearchService do subject { described_class.new } describe '#call' do diff --git a/spec/services/software_update_check_service_spec.rb b/spec/services/software_update_check_service_spec.rb index c8821348ac..a1eb9d86e9 100644 --- a/spec/services/software_update_check_service_spec.rb +++ b/spec/services/software_update_check_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe SoftwareUpdateCheckService, type: :service do +RSpec.describe SoftwareUpdateCheckService do subject { described_class.new } shared_examples 'when the feature is enabled' do diff --git a/spec/services/suspend_account_service_spec.rb b/spec/services/suspend_account_service_spec.rb index 4a5f8a0b6b..d62f7ef0d6 100644 --- a/spec/services/suspend_account_service_spec.rb +++ b/spec/services/suspend_account_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe SuspendAccountService, :sidekiq_inline, type: :service do +RSpec.describe SuspendAccountService, :sidekiq_inline do shared_examples 'common behavior' do subject { described_class.new.call(account) } diff --git a/spec/services/translate_status_service_spec.rb b/spec/services/translate_status_service_spec.rb index 5f6418f5d6..0779fbbe6c 100644 --- a/spec/services/translate_status_service_spec.rb +++ b/spec/services/translate_status_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe TranslateStatusService, type: :service do +RSpec.describe TranslateStatusService do subject(:service) { described_class.new } let(:status) { Fabricate(:status, text: text, spoiler_text: spoiler_text, language: 'en', preloadable_poll: poll, media_attachments: media_attachments) } diff --git a/spec/services/unallow_domain_service_spec.rb b/spec/services/unallow_domain_service_spec.rb index 383977d352..caec3d596f 100644 --- a/spec/services/unallow_domain_service_spec.rb +++ b/spec/services/unallow_domain_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe UnallowDomainService, type: :service do +RSpec.describe UnallowDomainService do subject { described_class.new } let(:bad_domain) { 'evil.org' } diff --git a/spec/services/unblock_domain_service_spec.rb b/spec/services/unblock_domain_service_spec.rb index 3d6d82ff68..289ddfc218 100644 --- a/spec/services/unblock_domain_service_spec.rb +++ b/spec/services/unblock_domain_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe UnblockDomainService, type: :service do +describe UnblockDomainService do subject { described_class.new } describe 'call' do diff --git a/spec/services/unblock_service_spec.rb b/spec/services/unblock_service_spec.rb index 9813c5e7fa..4c9fcb9aee 100644 --- a/spec/services/unblock_service_spec.rb +++ b/spec/services/unblock_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe UnblockService, type: :service do +RSpec.describe UnblockService do subject { described_class.new } let(:sender) { Fabricate(:account, username: 'alice') } diff --git a/spec/services/unfollow_service_spec.rb b/spec/services/unfollow_service_spec.rb index 18a25a676d..bba17a8d27 100644 --- a/spec/services/unfollow_service_spec.rb +++ b/spec/services/unfollow_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe UnfollowService, type: :service do +RSpec.describe UnfollowService do subject { described_class.new } let(:sender) { Fabricate(:account, username: 'alice') } diff --git a/spec/services/unsuspend_account_service_spec.rb b/spec/services/unsuspend_account_service_spec.rb index c848767cd1..79a4441d3e 100644 --- a/spec/services/unsuspend_account_service_spec.rb +++ b/spec/services/unsuspend_account_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe UnsuspendAccountService, type: :service do +RSpec.describe UnsuspendAccountService do shared_context 'with common context' do subject { described_class.new.call(account) } diff --git a/spec/services/update_account_service_spec.rb b/spec/services/update_account_service_spec.rb index 9f4e36862d..5204f1f34d 100644 --- a/spec/services/update_account_service_spec.rb +++ b/spec/services/update_account_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe UpdateAccountService, type: :service do +RSpec.describe UpdateAccountService do subject { described_class.new } describe 'switching form locked to unlocked accounts', :sidekiq_inline do diff --git a/spec/services/update_status_service_spec.rb b/spec/services/update_status_service_spec.rb index 55651c305d..930f673e10 100644 --- a/spec/services/update_status_service_spec.rb +++ b/spec/services/update_status_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe UpdateStatusService, type: :service do +RSpec.describe UpdateStatusService do subject { described_class.new } context 'when nothing changes' do diff --git a/spec/services/verify_link_service_spec.rb b/spec/services/verify_link_service_spec.rb index 2895072420..0ce8c9a904 100644 --- a/spec/services/verify_link_service_spec.rb +++ b/spec/services/verify_link_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe VerifyLinkService, type: :service do +RSpec.describe VerifyLinkService do subject { described_class.new } context 'when given a local account' do From 8349b45d6038c4d029b6371ea1caa40c48a8ea3b Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Mar 2024 04:46:11 -0400 Subject: [PATCH 158/954] Accept extra args that we wont verify in `ap/activity/add_spec` (#29005) --- spec/lib/activitypub/activity/add_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/lib/activitypub/activity/add_spec.rb b/spec/lib/activitypub/activity/add_spec.rb index ec6df01716..c0abd9f393 100644 --- a/spec/lib/activitypub/activity/add_spec.rb +++ b/spec/lib/activitypub/activity/add_spec.rb @@ -50,7 +50,7 @@ RSpec.describe ActivityPub::Activity::Add do end it 'fetches the status and pins it' do - allow(service_stub).to receive(:call) do |uri, id: true, on_behalf_of: nil, request_id: nil| # rubocop:disable Lint/UnusedBlockArgument + allow(service_stub).to receive(:call) do |uri, id: true, on_behalf_of: nil, **| expect(uri).to eq 'https://example.com/unknown' expect(id).to be true expect(on_behalf_of&.following?(sender)).to be true @@ -64,7 +64,7 @@ RSpec.describe ActivityPub::Activity::Add do context 'when there is no local follower' do it 'tries to fetch the status' do - allow(service_stub).to receive(:call) do |uri, id: true, on_behalf_of: nil, request_id: nil| # rubocop:disable Lint/UnusedBlockArgument + allow(service_stub).to receive(:call) do |uri, id: true, on_behalf_of: nil, **| expect(uri).to eq 'https://example.com/unknown' expect(id).to be true expect(on_behalf_of).to be_nil From 71eecbfa1fa5a8c2a06d232260ac9d3a4bd77ddb Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Mar 2024 04:47:09 -0400 Subject: [PATCH 159/954] Move `api/v2/filters/*` to request spec (#28956) --- .../api/v2/filters/keywords_spec.rb} | 31 ++++++++----------- .../api/v2/filters/statuses_spec.rb} | 25 ++++++--------- 2 files changed, 23 insertions(+), 33 deletions(-) rename spec/{controllers/api/v2/filters/keywords_controller_spec.rb => requests/api/v2/filters/keywords_spec.rb} (79%) rename spec/{controllers/api/v2/filters/statuses_controller_spec.rb => requests/api/v2/filters/statuses_spec.rb} (81%) diff --git a/spec/controllers/api/v2/filters/keywords_controller_spec.rb b/spec/requests/api/v2/filters/keywords_spec.rb similarity index 79% rename from spec/controllers/api/v2/filters/keywords_controller_spec.rb rename to spec/requests/api/v2/filters/keywords_spec.rb index 9f25237bcf..55fb2afd95 100644 --- a/spec/controllers/api/v2/filters/keywords_controller_spec.rb +++ b/spec/requests/api/v2/filters/keywords_spec.rb @@ -2,25 +2,20 @@ require 'rails_helper' -RSpec.describe Api::V2::Filters::KeywordsController do - render_views - +RSpec.describe 'API V2 Filters Keywords' do let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:filter) { Fabricate(:custom_filter, account: user.account) } let(:other_user) { Fabricate(:user) } let(:other_filter) { Fabricate(:custom_filter, account: other_user.account) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index' do + describe 'GET /api/v2/filters/:filter_id/keywords' do let(:scopes) { 'read:filters' } let!(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } it 'returns http success' do - get :index, params: { filter_id: filter.id } + get "/api/v2/filters/#{filter.id}/keywords", headers: headers expect(response).to have_http_status(200) expect(body_as_json) .to contain_exactly( @@ -30,18 +25,18 @@ RSpec.describe Api::V2::Filters::KeywordsController do context "when trying to access another's user filters" do it 'returns http not found' do - get :index, params: { filter_id: other_filter.id } + get "/api/v2/filters/#{other_filter.id}/keywords", headers: headers expect(response).to have_http_status(404) end end end - describe 'POST #create' do + describe 'POST /api/v2/filters/:filter_id/keywords' do let(:scopes) { 'write:filters' } let(:filter_id) { filter.id } before do - post :create, params: { filter_id: filter_id, keyword: 'magic', whole_word: false } + post "/api/v2/filters/#{filter_id}/keywords", headers: headers, params: { keyword: 'magic', whole_word: false } end it 'creates a filter', :aggregate_failures do @@ -65,12 +60,12 @@ RSpec.describe Api::V2::Filters::KeywordsController do end end - describe 'GET #show' do + describe 'GET /api/v2/filters/keywords/:id' do let(:scopes) { 'read:filters' } let(:keyword) { Fabricate(:custom_filter_keyword, keyword: 'foo', whole_word: false, custom_filter: filter) } before do - get :show, params: { id: keyword.id } + get "/api/v2/filters/keywords/#{keyword.id}", headers: headers end it 'responds with the keyword', :aggregate_failures do @@ -90,12 +85,12 @@ RSpec.describe Api::V2::Filters::KeywordsController do end end - describe 'PUT #update' do + describe 'PUT /api/v2/filters/keywords/:id' do let(:scopes) { 'write:filters' } let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } before do - get :update, params: { id: keyword.id, keyword: 'updated' } + put "/api/v2/filters/keywords/#{keyword.id}", headers: headers, params: { keyword: 'updated' } end it 'updates the keyword', :aggregate_failures do @@ -113,12 +108,12 @@ RSpec.describe Api::V2::Filters::KeywordsController do end end - describe 'DELETE #destroy' do + describe 'DELETE /api/v2/filters/keywords/:id' do let(:scopes) { 'write:filters' } let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } before do - delete :destroy, params: { id: keyword.id } + delete "/api/v2/filters/keywords/#{keyword.id}", headers: headers end it 'destroys the keyword', :aggregate_failures do diff --git a/spec/controllers/api/v2/filters/statuses_controller_spec.rb b/spec/requests/api/v2/filters/statuses_spec.rb similarity index 81% rename from spec/controllers/api/v2/filters/statuses_controller_spec.rb rename to spec/requests/api/v2/filters/statuses_spec.rb index d9df803971..26d2fb00e1 100644 --- a/spec/controllers/api/v2/filters/statuses_controller_spec.rb +++ b/spec/requests/api/v2/filters/statuses_spec.rb @@ -2,25 +2,20 @@ require 'rails_helper' -RSpec.describe Api::V2::Filters::StatusesController do - render_views - +RSpec.describe 'API V2 Filters Statuses' do let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:filter) { Fabricate(:custom_filter, account: user.account) } let(:other_user) { Fabricate(:user) } let(:other_filter) { Fabricate(:custom_filter, account: other_user.account) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index' do + describe 'GET /api/v2/filters/:filter_id/statuses' do let(:scopes) { 'read:filters' } let!(:status_filter) { Fabricate(:custom_filter_status, custom_filter: filter) } it 'returns http success' do - get :index, params: { filter_id: filter.id } + get "/api/v2/filters/#{filter.id}/statuses", headers: headers expect(response).to have_http_status(200) expect(body_as_json) .to contain_exactly( @@ -30,7 +25,7 @@ RSpec.describe Api::V2::Filters::StatusesController do context "when trying to access another's user filters" do it 'returns http not found' do - get :index, params: { filter_id: other_filter.id } + get "/api/v2/filters/#{other_filter.id}/statuses", headers: headers expect(response).to have_http_status(404) end end @@ -42,7 +37,7 @@ RSpec.describe Api::V2::Filters::StatusesController do let!(:status) { Fabricate(:status) } before do - post :create, params: { filter_id: filter_id, status_id: status.id } + post "/api/v2/filters/#{filter_id}/statuses", headers: headers, params: { status_id: status.id } end it 'creates a filter', :aggregate_failures do @@ -65,12 +60,12 @@ RSpec.describe Api::V2::Filters::StatusesController do end end - describe 'GET #show' do + describe 'GET /api/v2/filters/statuses/:id' do let(:scopes) { 'read:filters' } let!(:status_filter) { Fabricate(:custom_filter_status, custom_filter: filter) } before do - get :show, params: { id: status_filter.id } + get "/api/v2/filters/statuses/#{status_filter.id}", headers: headers end it 'responds with the filter', :aggregate_failures do @@ -89,12 +84,12 @@ RSpec.describe Api::V2::Filters::StatusesController do end end - describe 'DELETE #destroy' do + describe 'DELETE /api/v2/filters/statuses/:id' do let(:scopes) { 'write:filters' } let(:status_filter) { Fabricate(:custom_filter_status, custom_filter: filter) } before do - delete :destroy, params: { id: status_filter.id } + delete "/api/v2/filters/statuses/#{status_filter.id}", headers: headers end it 'destroys the filter', :aggregate_failures do From 01b624c4a0d17ec24f6acf56298fe9e5e8a6dd49 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Mar 2024 04:50:21 -0400 Subject: [PATCH 160/954] Use `normalizes` on `CustomFilter#context` value (#27602) --- app/models/custom_filter.rb | 6 +----- spec/models/custom_filter_spec.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb index 5e2d152e34..7c148e877f 100644 --- a/app/models/custom_filter.rb +++ b/app/models/custom_filter.rb @@ -41,7 +41,7 @@ class CustomFilter < ApplicationRecord validates :title, :context, presence: true validate :context_must_be_valid - before_validation :clean_up_contexts + normalizes :context, with: ->(context) { context.map(&:strip).filter_map(&:presence) } before_save :prepare_cache_invalidation! before_destroy :prepare_cache_invalidation! @@ -114,10 +114,6 @@ class CustomFilter < ApplicationRecord private - def clean_up_contexts - self.context = Array(context).map(&:strip).filter_map(&:presence) - end - def context_must_be_valid errors.add(:context, I18n.t('filters.errors.invalid_context')) if invalid_context_value? end diff --git a/spec/models/custom_filter_spec.rb b/spec/models/custom_filter_spec.rb index 9404936337..8ac9dbb896 100644 --- a/spec/models/custom_filter_spec.rb +++ b/spec/models/custom_filter_spec.rb @@ -32,4 +32,12 @@ RSpec.describe CustomFilter do expect(record).to model_have_error_on_field(:context) end end + + describe 'Normalizations' do + it 'cleans up context values' do + record = described_class.new(context: ['home', 'notifications', 'public ', '']) + + expect(record.context).to eq(%w(home notifications public)) + end + end end From 9754967d5fd37cf35b362d4429d320c1e5f94428 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Mar 2024 04:51:44 -0400 Subject: [PATCH 161/954] Move `pagination_max_id` and `pagination_since_id` into api/base controller (#28844) --- app/controllers/api/base_controller.rb | 8 ++++++++ app/controllers/api/v1/accounts/statuses_controller.rb | 8 ++------ app/controllers/api/v1/admin/accounts_controller.rb | 8 ++------ .../api/v1/admin/canonical_email_blocks_controller.rb | 8 ++------ app/controllers/api/v1/admin/domain_allows_controller.rb | 8 ++------ app/controllers/api/v1/admin/domain_blocks_controller.rb | 8 ++------ .../api/v1/admin/email_domain_blocks_controller.rb | 8 ++------ app/controllers/api/v1/admin/ip_blocks_controller.rb | 8 ++------ app/controllers/api/v1/admin/reports_controller.rb | 8 ++------ app/controllers/api/v1/admin/tags_controller.rb | 8 ++------ .../trends/links/preview_card_providers_controller.rb | 8 ++------ app/controllers/api/v1/blocks_controller.rb | 8 ++------ app/controllers/api/v1/bookmarks_controller.rb | 8 ++------ .../api/v1/crypto/encrypted_messages_controller.rb | 8 ++------ app/controllers/api/v1/domain_blocks_controller.rb | 8 ++------ app/controllers/api/v1/endorsements_controller.rb | 8 ++------ app/controllers/api/v1/favourites_controller.rb | 8 ++------ app/controllers/api/v1/followed_tags_controller.rb | 8 ++------ app/controllers/api/v1/lists/accounts_controller.rb | 8 ++------ app/controllers/api/v1/mutes_controller.rb | 8 ++------ app/controllers/api/v1/notifications_controller.rb | 8 ++------ app/controllers/api/v1/scheduled_statuses_controller.rb | 8 ++------ app/controllers/api/v1/timelines/base_controller.rb | 8 ++------ 23 files changed, 52 insertions(+), 132 deletions(-) diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index 98fa1897ef..8bf9da2cfd 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -73,6 +73,14 @@ class Api::BaseController < ApplicationController protected + def pagination_max_id + pagination_collection.last.id + end + + def pagination_since_id + pagination_collection.first.id + end + def set_pagination_headers(next_path = nil, prev_path = nil) links = [] links << [next_path, [%w(rel next)]] if next_path diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb index 6a994ff541..56d4e69091 100644 --- a/app/controllers/api/v1/accounts/statuses_controller.rb +++ b/app/controllers/api/v1/accounts/statuses_controller.rb @@ -51,11 +51,7 @@ class Api::V1::Accounts::StatusesController < Api::BaseController @statuses.size == limit_param(DEFAULT_STATUSES_LIMIT) end - def pagination_max_id - @statuses.last.id - end - - def pagination_since_id - @statuses.first.id + def pagination_collection + @statuses end end diff --git a/app/controllers/api/v1/admin/accounts_controller.rb b/app/controllers/api/v1/admin/accounts_controller.rb index ff9cae6398..06cebffcb6 100644 --- a/app/controllers/api/v1/admin/accounts_controller.rb +++ b/app/controllers/api/v1/admin/accounts_controller.rb @@ -137,12 +137,8 @@ class Api::V1::Admin::AccountsController < Api::BaseController api_v1_admin_accounts_url(pagination_params(min_id: pagination_since_id)) unless @accounts.empty? end - def pagination_max_id - @accounts.last.id - end - - def pagination_since_id - @accounts.first.id + def pagination_collection + @accounts end def records_continue? diff --git a/app/controllers/api/v1/admin/canonical_email_blocks_controller.rb b/app/controllers/api/v1/admin/canonical_email_blocks_controller.rb index 7b192b979f..f81e480bd7 100644 --- a/app/controllers/api/v1/admin/canonical_email_blocks_controller.rb +++ b/app/controllers/api/v1/admin/canonical_email_blocks_controller.rb @@ -77,12 +77,8 @@ class Api::V1::Admin::CanonicalEmailBlocksController < Api::BaseController api_v1_admin_canonical_email_blocks_url(pagination_params(min_id: pagination_since_id)) unless @canonical_email_blocks.empty? end - def pagination_max_id - @canonical_email_blocks.last.id - end - - def pagination_since_id - @canonical_email_blocks.first.id + def pagination_collection + @canonical_email_blocks end def records_continue? diff --git a/app/controllers/api/v1/admin/domain_allows_controller.rb b/app/controllers/api/v1/admin/domain_allows_controller.rb index dd54d67106..1841292843 100644 --- a/app/controllers/api/v1/admin/domain_allows_controller.rb +++ b/app/controllers/api/v1/admin/domain_allows_controller.rb @@ -73,12 +73,8 @@ class Api::V1::Admin::DomainAllowsController < Api::BaseController api_v1_admin_domain_allows_url(pagination_params(min_id: pagination_since_id)) unless @domain_allows.empty? end - def pagination_max_id - @domain_allows.last.id - end - - def pagination_since_id - @domain_allows.first.id + def pagination_collection + @domain_allows end def records_continue? diff --git a/app/controllers/api/v1/admin/domain_blocks_controller.rb b/app/controllers/api/v1/admin/domain_blocks_controller.rb index 2538c7c7c2..8cd90b7c52 100644 --- a/app/controllers/api/v1/admin/domain_blocks_controller.rb +++ b/app/controllers/api/v1/admin/domain_blocks_controller.rb @@ -84,12 +84,8 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController api_v1_admin_domain_blocks_url(pagination_params(min_id: pagination_since_id)) unless @domain_blocks.empty? end - def pagination_max_id - @domain_blocks.last.id - end - - def pagination_since_id - @domain_blocks.first.id + def pagination_collection + @domain_blocks end def records_continue? diff --git a/app/controllers/api/v1/admin/email_domain_blocks_controller.rb b/app/controllers/api/v1/admin/email_domain_blocks_controller.rb index df54b9f0a4..34489e19b4 100644 --- a/app/controllers/api/v1/admin/email_domain_blocks_controller.rb +++ b/app/controllers/api/v1/admin/email_domain_blocks_controller.rb @@ -70,12 +70,8 @@ class Api::V1::Admin::EmailDomainBlocksController < Api::BaseController api_v1_admin_email_domain_blocks_url(pagination_params(min_id: pagination_since_id)) unless @email_domain_blocks.empty? end - def pagination_max_id - @email_domain_blocks.last.id - end - - def pagination_since_id - @email_domain_blocks.first.id + def pagination_collection + @email_domain_blocks end def records_continue? diff --git a/app/controllers/api/v1/admin/ip_blocks_controller.rb b/app/controllers/api/v1/admin/ip_blocks_controller.rb index 61c1912344..0f666476c5 100644 --- a/app/controllers/api/v1/admin/ip_blocks_controller.rb +++ b/app/controllers/api/v1/admin/ip_blocks_controller.rb @@ -75,12 +75,8 @@ class Api::V1::Admin::IpBlocksController < Api::BaseController api_v1_admin_ip_blocks_url(pagination_params(min_id: pagination_since_id)) unless @ip_blocks.empty? end - def pagination_max_id - @ip_blocks.last.id - end - - def pagination_since_id - @ip_blocks.first.id + def pagination_collection + @ip_blocks end def records_continue? diff --git a/app/controllers/api/v1/admin/reports_controller.rb b/app/controllers/api/v1/admin/reports_controller.rb index 7129a5f6ca..f0598aa81e 100644 --- a/app/controllers/api/v1/admin/reports_controller.rb +++ b/app/controllers/api/v1/admin/reports_controller.rb @@ -101,12 +101,8 @@ class Api::V1::Admin::ReportsController < Api::BaseController api_v1_admin_reports_url(pagination_params(min_id: pagination_since_id)) unless @reports.empty? end - def pagination_max_id - @reports.last.id - end - - def pagination_since_id - @reports.first.id + def pagination_collection + @reports end def records_continue? diff --git a/app/controllers/api/v1/admin/tags_controller.rb b/app/controllers/api/v1/admin/tags_controller.rb index 6a7c9f5bf3..989e7e610a 100644 --- a/app/controllers/api/v1/admin/tags_controller.rb +++ b/app/controllers/api/v1/admin/tags_controller.rb @@ -56,12 +56,8 @@ class Api::V1::Admin::TagsController < Api::BaseController api_v1_admin_tags_url(pagination_params(min_id: pagination_since_id)) unless @tags.empty? end - def pagination_max_id - @tags.last.id - end - - def pagination_since_id - @tags.first.id + def pagination_collection + @tags end def records_continue? diff --git a/app/controllers/api/v1/admin/trends/links/preview_card_providers_controller.rb b/app/controllers/api/v1/admin/trends/links/preview_card_providers_controller.rb index 5d9fcc82c0..7ab7e6bd04 100644 --- a/app/controllers/api/v1/admin/trends/links/preview_card_providers_controller.rb +++ b/app/controllers/api/v1/admin/trends/links/preview_card_providers_controller.rb @@ -54,12 +54,8 @@ class Api::V1::Admin::Trends::Links::PreviewCardProvidersController < Api::BaseC api_v1_admin_trends_links_preview_card_providers_url(pagination_params(min_id: pagination_since_id)) unless @providers.empty? end - def pagination_max_id - @providers.last.id - end - - def pagination_since_id - @providers.first.id + def pagination_collection + @providers end def records_continue? diff --git a/app/controllers/api/v1/blocks_controller.rb b/app/controllers/api/v1/blocks_controller.rb index 0934622f88..7826a3c681 100644 --- a/app/controllers/api/v1/blocks_controller.rb +++ b/app/controllers/api/v1/blocks_controller.rb @@ -40,12 +40,8 @@ class Api::V1::BlocksController < Api::BaseController api_v1_blocks_url pagination_params(since_id: pagination_since_id) unless paginated_blocks.empty? end - def pagination_max_id - paginated_blocks.last.id - end - - def pagination_since_id - paginated_blocks.first.id + def pagination_collection + paginated_blocks end def records_continue? diff --git a/app/controllers/api/v1/bookmarks_controller.rb b/app/controllers/api/v1/bookmarks_controller.rb index 498eb16f44..08d3cf8344 100644 --- a/app/controllers/api/v1/bookmarks_controller.rb +++ b/app/controllers/api/v1/bookmarks_controller.rb @@ -43,12 +43,8 @@ class Api::V1::BookmarksController < Api::BaseController api_v1_bookmarks_url pagination_params(min_id: pagination_since_id) unless results.empty? end - def pagination_max_id - results.last.id - end - - def pagination_since_id - results.first.id + def pagination_collection + results end def records_continue? diff --git a/app/controllers/api/v1/crypto/encrypted_messages_controller.rb b/app/controllers/api/v1/crypto/encrypted_messages_controller.rb index 68cf4384f7..c70ae46d18 100644 --- a/app/controllers/api/v1/crypto/encrypted_messages_controller.rb +++ b/app/controllers/api/v1/crypto/encrypted_messages_controller.rb @@ -41,12 +41,8 @@ class Api::V1::Crypto::EncryptedMessagesController < Api::BaseController api_v1_crypto_encrypted_messages_url pagination_params(min_id: pagination_since_id) unless @encrypted_messages.empty? end - def pagination_max_id - @encrypted_messages.last.id - end - - def pagination_since_id - @encrypted_messages.first.id + def pagination_collection + @encrypted_messages end def records_continue? diff --git a/app/controllers/api/v1/domain_blocks_controller.rb b/app/controllers/api/v1/domain_blocks_controller.rb index 34def3c44a..5774c4d1c7 100644 --- a/app/controllers/api/v1/domain_blocks_controller.rb +++ b/app/controllers/api/v1/domain_blocks_controller.rb @@ -50,12 +50,8 @@ class Api::V1::DomainBlocksController < Api::BaseController api_v1_domain_blocks_url pagination_params(since_id: pagination_since_id) unless @blocks.empty? end - def pagination_max_id - @blocks.last.id - end - - def pagination_since_id - @blocks.first.id + def pagination_collection + @blocks end def records_continue? diff --git a/app/controllers/api/v1/endorsements_controller.rb b/app/controllers/api/v1/endorsements_controller.rb index 2216a9860d..449a9ac245 100644 --- a/app/controllers/api/v1/endorsements_controller.rb +++ b/app/controllers/api/v1/endorsements_controller.rb @@ -44,12 +44,8 @@ class Api::V1::EndorsementsController < Api::BaseController api_v1_endorsements_url pagination_params(since_id: pagination_since_id) unless @accounts.empty? end - def pagination_max_id - @accounts.last.id - end - - def pagination_since_id - @accounts.first.id + def pagination_collection + @accounts end def records_continue? diff --git a/app/controllers/api/v1/favourites_controller.rb b/app/controllers/api/v1/favourites_controller.rb index faf1bda96a..85e46b1166 100644 --- a/app/controllers/api/v1/favourites_controller.rb +++ b/app/controllers/api/v1/favourites_controller.rb @@ -43,12 +43,8 @@ class Api::V1::FavouritesController < Api::BaseController api_v1_favourites_url pagination_params(min_id: pagination_since_id) unless results.empty? end - def pagination_max_id - results.last.id - end - - def pagination_since_id - results.first.id + def pagination_collection + results end def records_continue? diff --git a/app/controllers/api/v1/followed_tags_controller.rb b/app/controllers/api/v1/followed_tags_controller.rb index eae2bdc010..0ea4a95ef5 100644 --- a/app/controllers/api/v1/followed_tags_controller.rb +++ b/app/controllers/api/v1/followed_tags_controller.rb @@ -34,12 +34,8 @@ class Api::V1::FollowedTagsController < Api::BaseController api_v1_followed_tags_url pagination_params(since_id: pagination_since_id) unless @results.empty? end - def pagination_max_id - @results.last.id - end - - def pagination_since_id - @results.first.id + def pagination_collection + @results end def records_continue? diff --git a/app/controllers/api/v1/lists/accounts_controller.rb b/app/controllers/api/v1/lists/accounts_controller.rb index 0604ad60fc..5ae74bf04d 100644 --- a/app/controllers/api/v1/lists/accounts_controller.rb +++ b/app/controllers/api/v1/lists/accounts_controller.rb @@ -71,12 +71,8 @@ class Api::V1::Lists::AccountsController < Api::BaseController api_v1_list_accounts_url pagination_params(since_id: pagination_since_id) unless @accounts.empty? end - def pagination_max_id - @accounts.last.id - end - - def pagination_since_id - @accounts.first.id + def pagination_collection + @accounts end def records_continue? diff --git a/app/controllers/api/v1/mutes_controller.rb b/app/controllers/api/v1/mutes_controller.rb index 2fb685ac39..9542d96110 100644 --- a/app/controllers/api/v1/mutes_controller.rb +++ b/app/controllers/api/v1/mutes_controller.rb @@ -40,12 +40,8 @@ class Api::V1::MutesController < Api::BaseController api_v1_mutes_url pagination_params(since_id: pagination_since_id) unless paginated_mutes.empty? end - def pagination_max_id - paginated_mutes.last.id - end - - def pagination_since_id - paginated_mutes.first.id + def pagination_collection + paginated_mutes end def records_continue? diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb index 52280ef607..777740751f 100644 --- a/app/controllers/api/v1/notifications_controller.rb +++ b/app/controllers/api/v1/notifications_controller.rb @@ -70,12 +70,8 @@ class Api::V1::NotificationsController < Api::BaseController api_v1_notifications_url pagination_params(min_id: pagination_since_id) unless @notifications.empty? end - def pagination_max_id - @notifications.last.id - end - - def pagination_since_id - @notifications.first.id + def pagination_collection + @notifications end def browserable_params diff --git a/app/controllers/api/v1/scheduled_statuses_controller.rb b/app/controllers/api/v1/scheduled_statuses_controller.rb index 2220b6d22e..f6c0703833 100644 --- a/app/controllers/api/v1/scheduled_statuses_controller.rb +++ b/app/controllers/api/v1/scheduled_statuses_controller.rb @@ -63,11 +63,7 @@ class Api::V1::ScheduledStatusesController < Api::BaseController @statuses.size == limit_param(DEFAULT_STATUSES_LIMIT) end - def pagination_max_id - @statuses.last.id - end - - def pagination_since_id - @statuses.first.id + def pagination_collection + @statuses end end diff --git a/app/controllers/api/v1/timelines/base_controller.rb b/app/controllers/api/v1/timelines/base_controller.rb index 173e173cc9..7735cf1dc0 100644 --- a/app/controllers/api/v1/timelines/base_controller.rb +++ b/app/controllers/api/v1/timelines/base_controller.rb @@ -9,12 +9,8 @@ class Api::V1::Timelines::BaseController < Api::BaseController set_pagination_headers(next_path, prev_path) end - def pagination_max_id - @statuses.last.id - end - - def pagination_since_id - @statuses.first.id + def pagination_collection + @statuses end def next_path_params From 7e6eb64f1e89179f49ebdaddab7f96ac3f53ad05 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Mar 2024 04:56:37 -0400 Subject: [PATCH 162/954] Use full snowflake range in `admin/metrics` classes (#29416) --- .../admin/metrics/dimension/instance_languages_dimension.rb | 4 ++-- app/lib/admin/metrics/dimension/servers_dimension.rb | 4 ++-- app/lib/admin/metrics/dimension/tag_languages_dimension.rb | 4 ++-- app/lib/admin/metrics/dimension/tag_servers_dimension.rb | 4 ++-- app/lib/admin/metrics/measure/instance_statuses_measure.rb | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/lib/admin/metrics/dimension/instance_languages_dimension.rb b/app/lib/admin/metrics/dimension/instance_languages_dimension.rb index b478213808..661e6d93b7 100644 --- a/app/lib/admin/metrics/dimension/instance_languages_dimension.rb +++ b/app/lib/admin/metrics/dimension/instance_languages_dimension.rb @@ -37,11 +37,11 @@ class Admin::Metrics::Dimension::InstanceLanguagesDimension < Admin::Metrics::Di end def earliest_status_id - Mastodon::Snowflake.id_at(@start_at, with_random: false) + Mastodon::Snowflake.id_at(@start_at.beginning_of_day, with_random: false) end def latest_status_id - Mastodon::Snowflake.id_at(@end_at, with_random: false) + Mastodon::Snowflake.id_at(@end_at.end_of_day, with_random: false) end def params diff --git a/app/lib/admin/metrics/dimension/servers_dimension.rb b/app/lib/admin/metrics/dimension/servers_dimension.rb index 42aba8e213..2c8406d52f 100644 --- a/app/lib/admin/metrics/dimension/servers_dimension.rb +++ b/app/lib/admin/metrics/dimension/servers_dimension.rb @@ -30,10 +30,10 @@ class Admin::Metrics::Dimension::ServersDimension < Admin::Metrics::Dimension::B end def earliest_status_id - Mastodon::Snowflake.id_at(@start_at) + Mastodon::Snowflake.id_at(@start_at.beginning_of_day, with_random: false) end def latest_status_id - Mastodon::Snowflake.id_at(@end_at) + Mastodon::Snowflake.id_at(@end_at.end_of_day, with_random: false) end end diff --git a/app/lib/admin/metrics/dimension/tag_languages_dimension.rb b/app/lib/admin/metrics/dimension/tag_languages_dimension.rb index cd077ff863..6e283d2c65 100644 --- a/app/lib/admin/metrics/dimension/tag_languages_dimension.rb +++ b/app/lib/admin/metrics/dimension/tag_languages_dimension.rb @@ -40,11 +40,11 @@ class Admin::Metrics::Dimension::TagLanguagesDimension < Admin::Metrics::Dimensi end def earliest_status_id - Mastodon::Snowflake.id_at(@start_at, with_random: false) + Mastodon::Snowflake.id_at(@start_at.beginning_of_day, with_random: false) end def latest_status_id - Mastodon::Snowflake.id_at(@end_at, with_random: false) + Mastodon::Snowflake.id_at(@end_at.end_of_day, with_random: false) end def params diff --git a/app/lib/admin/metrics/dimension/tag_servers_dimension.rb b/app/lib/admin/metrics/dimension/tag_servers_dimension.rb index fc5e49a966..db820e965c 100644 --- a/app/lib/admin/metrics/dimension/tag_servers_dimension.rb +++ b/app/lib/admin/metrics/dimension/tag_servers_dimension.rb @@ -40,11 +40,11 @@ class Admin::Metrics::Dimension::TagServersDimension < Admin::Metrics::Dimension end def earliest_status_id - Mastodon::Snowflake.id_at(@start_at, with_random: false) + Mastodon::Snowflake.id_at(@start_at.beginning_of_day, with_random: false) end def latest_status_id - Mastodon::Snowflake.id_at(@end_at, with_random: false) + Mastodon::Snowflake.id_at(@end_at.end_of_day, with_random: false) end def params diff --git a/app/lib/admin/metrics/measure/instance_statuses_measure.rb b/app/lib/admin/metrics/measure/instance_statuses_measure.rb index 8c71c66145..b918a30a57 100644 --- a/app/lib/admin/metrics/measure/instance_statuses_measure.rb +++ b/app/lib/admin/metrics/measure/instance_statuses_measure.rb @@ -51,11 +51,11 @@ class Admin::Metrics::Measure::InstanceStatusesMeasure < Admin::Metrics::Measure end def earliest_status_id - Mastodon::Snowflake.id_at(@start_at, with_random: false) + Mastodon::Snowflake.id_at(@start_at.beginning_of_day, with_random: false) end def latest_status_id - Mastodon::Snowflake.id_at(@end_at, with_random: false) + Mastodon::Snowflake.id_at(@end_at.end_of_day, with_random: false) end def time_period From 2c0441acd7f943a9873b650cf75d33c73d545acf Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Mar 2024 05:19:54 -0400 Subject: [PATCH 163/954] Use rails built-in `tag` methods in `TextFormatter.shortened_link` (#28976) --- app/lib/text_formatter.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/lib/text_formatter.rb b/app/lib/text_formatter.rb index 581ee835b3..2b3febc219 100644 --- a/app/lib/text_formatter.rb +++ b/app/lib/text_formatter.rb @@ -50,6 +50,7 @@ class TextFormatter class << self include ERB::Util + include ActionView::Helpers::TagHelper def shortened_link(url, rel_me: false) url = Addressable::URI.parse(url).to_s @@ -60,9 +61,11 @@ class TextFormatter suffix = url[prefix.length + 30..] cutoff = url[prefix.length..].length > 30 - <<~HTML.squish.html_safe # rubocop:disable Rails/OutputSafety - #{h(display_url)} - HTML + tag.a href: url, target: '_blank', rel: rel.join(' '), translate: 'no' do + tag.span(prefix, class: 'invisible') + + tag.span(display_url, class: (cutoff ? 'ellipsis' : '')) + + tag.span(suffix, class: 'invisible') + end rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError h(url) end From 46e902f1f373210f75e24bbbdcf0850b20bb1c53 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Mar 2024 05:22:43 -0400 Subject: [PATCH 164/954] Merge `api/v1/accounts/credentials` controller spec into existing request spec (#29006) --- .../accounts/credentials_controller_spec.rb | 105 ------------------ .../api/v1/accounts/credentials_spec.rb | 74 +++++++++--- 2 files changed, 61 insertions(+), 118 deletions(-) delete mode 100644 spec/controllers/api/v1/accounts/credentials_controller_spec.rb diff --git a/spec/controllers/api/v1/accounts/credentials_controller_spec.rb b/spec/controllers/api/v1/accounts/credentials_controller_spec.rb deleted file mode 100644 index a62fa54e60..0000000000 --- a/spec/controllers/api/v1/accounts/credentials_controller_spec.rb +++ /dev/null @@ -1,105 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe Api::V1::Accounts::CredentialsController do - render_views - - let(:user) { Fabricate(:user) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - - context 'with an oauth token' do - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #show' do - let(:scopes) { 'read:accounts' } - - it 'returns http success' do - get :show - expect(response).to have_http_status(200) - end - end - - describe 'PATCH #update' do - let(:scopes) { 'write:accounts' } - - describe 'with valid data' do - before do - allow(ActivityPub::UpdateDistributionWorker).to receive(:perform_async) - - patch :update, params: { - display_name: "Alice Isn't Dead", - note: "Hi!\n\nToot toot!", - avatar: fixture_file_upload('avatar.gif', 'image/gif'), - header: fixture_file_upload('attachment.jpg', 'image/jpeg'), - source: { - privacy: 'unlisted', - sensitive: true, - }, - } - end - - it 'updates account info', :aggregate_failures do - expect(response).to have_http_status(200) - - user.reload - user.account.reload - - expect(user.account.display_name).to eq("Alice Isn't Dead") - expect(user.account.note).to eq("Hi!\n\nToot toot!") - expect(user.account.avatar).to exist - expect(user.account.header).to exist - expect(user.setting_default_privacy).to eq('unlisted') - expect(user.setting_default_sensitive).to be(true) - - expect(ActivityPub::UpdateDistributionWorker).to have_received(:perform_async).with(user.account_id) - end - end - - describe 'with empty source list' do - before do - patch :update, params: { - display_name: "I'm a cat", - source: {}, - }, as: :json - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - end - - describe 'with invalid data' do - before do - patch :update, params: { note: 'This is too long. ' * 30 } - end - - it 'returns http unprocessable entity' do - expect(response).to have_http_status(422) - end - end - end - end - - context 'without an oauth token' do - before do - allow(controller).to receive(:doorkeeper_token).and_return(nil) - end - - describe 'GET #show' do - it 'returns http unauthorized' do - get :show - expect(response).to have_http_status(401) - end - end - - describe 'PATCH #update' do - it 'returns http unauthorized' do - patch :update, params: { note: 'Foo' } - expect(response).to have_http_status(401) - end - end - end -end diff --git a/spec/requests/api/v1/accounts/credentials_spec.rb b/spec/requests/api/v1/accounts/credentials_spec.rb index b13e79b12b..737348c2dd 100644 --- a/spec/requests/api/v1/accounts/credentials_spec.rb +++ b/spec/requests/api/v1/accounts/credentials_spec.rb @@ -15,15 +15,11 @@ RSpec.describe 'credentials API' do it_behaves_like 'forbidden for wrong scope', 'write write:accounts' - it 'returns http success' do - subject - - expect(response).to have_http_status(200) - end - - it 'returns the expected content' do + it 'returns http success with expected content' do subject + expect(response) + .to have_http_status(200) expect(body_as_json).to include({ source: hash_including({ discoverable: false, @@ -34,24 +30,55 @@ RSpec.describe 'credentials API' do end end - describe 'POST /api/v1/accounts/update_credentials' do + describe 'PATCH /api/v1/accounts/update_credentials' do subject do patch '/api/v1/accounts/update_credentials', headers: headers, params: params end - let(:params) { { discoverable: true, locked: false, indexable: true } } + before { allow(ActivityPub::UpdateDistributionWorker).to receive(:perform_async) } + + let(:params) do + { + avatar: fixture_file_upload('avatar.gif', 'image/gif'), + discoverable: true, + display_name: "Alice Isn't Dead", + header: fixture_file_upload('attachment.jpg', 'image/jpeg'), + indexable: true, + locked: false, + note: 'Hello!', + source: { + privacy: 'unlisted', + sensitive: true, + }, + } + end it_behaves_like 'forbidden for wrong scope', 'read read:accounts' - it 'returns http success' do - subject + describe 'with empty source list' do + let(:params) { { display_name: "I'm a cat", source: {} } } - expect(response).to have_http_status(200) + it 'returns http success' do + subject + expect(response).to have_http_status(200) + end end - it 'returns JSON with updated attributes' do + describe 'with invalid data' do + let(:params) { { note: 'This is too long. ' * 30 } } + + it 'returns http unprocessable entity' do + subject + expect(response).to have_http_status(422) + end + end + + it 'returns http success with updated JSON attributes' do subject + expect(response) + .to have_http_status(200) + expect(body_as_json).to include({ source: hash_including({ discoverable: true, @@ -59,6 +86,27 @@ RSpec.describe 'credentials API' do }), locked: false, }) + + expect(ActivityPub::UpdateDistributionWorker) + .to have_received(:perform_async).with(user.account_id) + end + + def expect_account_updates + expect(user.account.reload) + .to have_attributes( + display_name: eq("Alice Isn't Dead"), + note: 'Hello!', + avatar: exist, + header: exist + ) + end + + def expect_user_updates + expect(user.reload) + .to have_attributes( + setting_default_privacy: eq('unlisted'), + setting_default_sensitive: be(true) + ) end end end From 27fd084cb5ccb4bf6b2a3eb28b0b123063230c10 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 13 Mar 2024 11:17:55 +0100 Subject: [PATCH 165/954] Exempt some notification types from notification filtering (#29565) --- app/services/notify_service.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index 428fdb4d47..66cbff0ef8 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -68,6 +68,13 @@ class NotifyService < BaseService NEW_FOLLOWER_THRESHOLD = 3.days.freeze + NON_FILTERABLE_TYPES = %i( + admin.sign_up + admin.report + poll + update + ).freeze + def initialize(notification) @notification = notification @recipient = notification.account @@ -76,6 +83,7 @@ class NotifyService < BaseService end def filter? + return false if NON_FILTERABLE_TYPES.include?(@notification.type) return false if override_for_sender? from_limited? || From b43eaa4517107326c7e73b949cec759f841b4a30 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 13 Mar 2024 11:35:49 +0100 Subject: [PATCH 166/954] Refactor notification filtering behavior definition (#29567) --- app/models/notification.rb | 46 +++++++++++++++++++++++++--------- app/services/notify_service.rb | 2 +- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/app/models/notification.rb b/app/models/notification.rb index e322daea4a..861a154369 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -29,18 +29,40 @@ class Notification < ApplicationRecord 'Poll' => :poll, }.freeze - TYPES = %i( - mention - status - reblog - follow - follow_request - favourite - poll - update - admin.sign_up - admin.report - ).freeze + PROPERTIES = { + mention: { + filterable: true, + }.freeze, + status: { + filterable: false, + }.freeze, + reblog: { + filterable: true, + }.freeze, + follow: { + filterable: true, + }.freeze, + follow_request: { + filterable: true, + }.freeze, + favourite: { + filterable: true, + }.freeze, + poll: { + filterable: false, + }.freeze, + update: { + filterable: false, + }.freeze, + 'admin.sign_up': { + filterable: false, + }.freeze, + 'admin.report': { + filterable: false, + }.freeze, + }.freeze + + TYPES = PROPERTIES.keys.freeze TARGET_STATUS_INCLUDES_BY_TYPE = { status: :status, diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index 66cbff0ef8..f3d16f1be7 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -83,7 +83,7 @@ class NotifyService < BaseService end def filter? - return false if NON_FILTERABLE_TYPES.include?(@notification.type) + return false unless Notification::PROPERTIES[@notification.type][:filterable] return false if override_for_sender? from_limited? || From 268856d5d9f72f003a08a53c7d094ed4df7c16bc Mon Sep 17 00:00:00 2001 From: Erik Uden Date: Wed, 13 Mar 2024 12:45:20 +0100 Subject: [PATCH 167/954] Fix toggle button color for light (and dark/default) theme (#29553) --- app/javascript/styles/mastodon-light/diff.scss | 4 ++-- app/javascript/styles/mastodon/components.scss | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index 675a01dd36..493e377d61 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -263,11 +263,11 @@ html { } .react-toggle-track { - background: $ui-secondary-color; + background: $ui-primary-color; } .react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track { - background: darken($ui-secondary-color, 10%); + background: lighten($ui-primary-color, 10%); } .react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 047d9d9739..b6dc1abc99 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3369,7 +3369,7 @@ $ui-header-height: 55px; height: 20px; padding: 0; border-radius: 10px; - background-color: #626982; + background-color: $ui-primary-color; } .react-toggle--focus { @@ -3392,7 +3392,7 @@ $ui-header-height: 55px; width: 16px; height: 16px; border-radius: 50%; - background-color: $primary-text-color; + background-color: $ui-button-color; box-sizing: border-box; transition: all 0.25s ease; transition-property: border-color, left; @@ -3403,6 +3403,15 @@ $ui-header-height: 55px; border-color: $ui-highlight-color; } +.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track { + background: darken($ui-primary-color, 5%); +} + +.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) + .react-toggle-track { + background: lighten($ui-highlight-color, 5%); +} + .switch-to-advanced { color: $light-text-color; background-color: $ui-base-color; From 171948b910684cb5b3f7ac0e2da169c527196ed1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 13:42:44 +0100 Subject: [PATCH 168/954] New Crowdin Translations (automated) (#29563) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/be.json | 16 ++++++++++++++++ app/javascript/mastodon/locales/ca.json | 1 - app/javascript/mastodon/locales/cy.json | 15 +++++++++++++++ app/javascript/mastodon/locales/da.json | 1 + app/javascript/mastodon/locales/es-AR.json | 2 +- app/javascript/mastodon/locales/et.json | 1 + app/javascript/mastodon/locales/fa.json | 4 ++-- app/javascript/mastodon/locales/fi.json | 11 +++++++++++ app/javascript/mastodon/locales/fil.json | 1 + app/javascript/mastodon/locales/fo.json | 2 +- app/javascript/mastodon/locales/gl.json | 16 ++++++++++++++++ app/javascript/mastodon/locales/he.json | 1 - app/javascript/mastodon/locales/hu.json | 2 +- app/javascript/mastodon/locales/it.json | 2 +- app/javascript/mastodon/locales/ko.json | 3 ++- app/javascript/mastodon/locales/lad.json | 8 ++++++++ app/javascript/mastodon/locales/lt.json | 10 ++++++++++ app/javascript/mastodon/locales/nl.json | 2 +- app/javascript/mastodon/locales/sk.json | 7 +++++++ app/javascript/mastodon/locales/sl.json | 3 +++ app/javascript/mastodon/locales/sq.json | 13 +++++++++++++ app/javascript/mastodon/locales/sr-Latn.json | 16 ++++++++++++++++ app/javascript/mastodon/locales/sr.json | 16 ++++++++++++++++ app/javascript/mastodon/locales/th.json | 1 + app/javascript/mastodon/locales/tr.json | 20 ++++++++++++++++++-- app/javascript/mastodon/locales/vi.json | 16 ++++++++++++++++ config/locales/fa.yml | 8 ++++---- config/locales/fi.yml | 4 ++-- config/locales/lad.yml | 10 ++++++++++ config/locales/simple_form.be.yml | 2 ++ config/locales/simple_form.ca.yml | 2 +- config/locales/simple_form.fa.yml | 2 +- config/locales/simple_form.fi.yml | 2 ++ config/locales/simple_form.ja.yml | 2 ++ config/locales/simple_form.lad.yml | 1 + config/locales/simple_form.sr-Latn.yml | 1 + config/locales/simple_form.sr.yml | 1 + config/locales/simple_form.tr.yml | 2 ++ config/locales/sq.yml | 1 + 39 files changed, 208 insertions(+), 20 deletions(-) diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index bbe21f0569..6e0c5afb60 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -241,6 +241,7 @@ "empty_column.list": "У гэтым спісе пакуль што нічога няма. Калі члены лісту апублікуюць новыя запісы, яны з'явяцца тут.", "empty_column.lists": "Як толькі вы створыце новы спіс ён будзе захоўвацца тут, але пакуль што тут пуста.", "empty_column.mutes": "Вы яшчэ нікога не ігнаруеце.", + "empty_column.notification_requests": "Чысціня! Тут нічога няма. Калі вы будзеце атрымліваць новыя апавяшчэння, яны будуць з'яўляцца тут у адпаведнасці з вашымі наладамі.", "empty_column.notifications": "У вас няма ніякіх апавяшчэнняў. Калі іншыя людзі ўзаемадзейнічаюць з вамі, вы ўбачыце гэта тут.", "empty_column.public": "Тут нічога няма! Апублікуйце што-небудзь, або падпішыцеся на карыстальнікаў з другіх сервераў", "error.unexpected_crash.explanation": "Гэта старонка не можа быць адлюстравана карэктна з-за памылкі ў нашым кодзе, або праблемы з сумяшчальнасцю браўзера.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Скарыстайцеся існуючай катэгорыяй або стварыце новую", "filter_modal.select_filter.title": "Фільтраваць гэты допіс", "filter_modal.title.status": "Фільтраваць допіс", + "filtered_notifications_banner.pending_requests": "Апавяшчэнні ад {count, plural, =0 {# людзей якіх} one {# чалавека якіх} few {# чалавек якіх} many {# людзей якіх} other {# чалавека якіх}} вы магчыма ведаеце", + "filtered_notifications_banner.title": "Адфільтраваныя апавяшчэнні", "firehose.all": "Усе", "firehose.local": "Гэты сервер", "firehose.remote": "Іншыя серверы", @@ -439,6 +442,10 @@ "notification.reblog": "{name} пашырыў ваш допіс", "notification.status": "Новы допіс ад {name}", "notification.update": "Допіс {name} адрэдагаваны", + "notification_requests.accept": "Прыняць", + "notification_requests.dismiss": "Адхіліць", + "notification_requests.notifications_from": "Апавяшчэнні ад {name}", + "notification_requests.title": "Адфільтраваныя апавяшчэнні", "notifications.clear": "Ачысціць апавяшчэнні", "notifications.clear_confirmation": "Вы ўпэўнены, што жадаеце назаўсёды сцерці ўсё паведамленні?", "notifications.column_settings.admin.report": "Новыя скаргі:", @@ -470,6 +477,15 @@ "notifications.permission_denied": "Апавяшчэнні на працоўным стале недаступныя з-за папярэдне адхіленага запыта праў браўзера", "notifications.permission_denied_alert": "Апавяшчэнні на працоўным стале не могуць быць уключаныя, з-за таго што запыт браўзера быў адхілены", "notifications.permission_required": "Апавяшчэнні на працоўным стале недаступныя, з-за таго што неабходны дазвол не быў дадзены.", + "notifications.policy.filter_new_accounts.hint": "Створаныя на працягу {days, plural, one {апошняга # дня} few {апошніх # дзён} many {апошніх # дзён} other {апошняй # дня}}", + "notifications.policy.filter_new_accounts_title": "Новыя ўліковыя запісы", + "notifications.policy.filter_not_followers_hint": "Уключаючы людзей, якія падпісаны на вас менш, чым {days, plural, one {# дзень} few {# дні} many {# дзён} other {# дня}}", + "notifications.policy.filter_not_followers_title": "Людзі, якія не падпісаны на вас", + "notifications.policy.filter_not_following_hint": "Пакуль вы не пацвердзіце іх уручную", + "notifications.policy.filter_not_following_title": "Людзі, на якіх вы не падпісаны", + "notifications.policy.filter_private_mentions_hint": "Фільтруецца за выключэннем адказу на вашае згадванне ці калі вы падпісаны на адпраўніка", + "notifications.policy.filter_private_mentions_title": "Непажаданыя асаблівыя згадванні", + "notifications.policy.title": "Адфільтроўваць апавяшчэнні ад…", "notifications_permission_banner.enable": "Уключыць апавяшчэнні на працоўным стале", "notifications_permission_banner.how_to_control": "Каб атрымліваць апавяшчэнні, калі Mastodon не адкрыты, уключыце апавяшчэнні працоўнага стала. Вы зможаце дакладна кантраляваць, якія падзеі будуць ствараць апавяшчэнні з дапамогай {icon} кнопкі, як толькі яны будуць уключаны.", "notifications_permission_banner.title": "Не прапусціце нічога", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 0c237ccda0..8ba140d207 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -272,7 +272,6 @@ "filter_modal.select_filter.subtitle": "Usa una categoria existent o crea'n una de nova", "filter_modal.select_filter.title": "Filtra aquest tut", "filter_modal.title.status": "Filtra un tut", - "filtered_notifications_banner.pending_requests": "Notificacions de {count, plural, =0 {no} one {una persona} other {# persones}} que potser coneixeu", "filtered_notifications_banner.title": "Notificacions filtrades", "firehose.all": "Tots", "firehose.local": "Aquest servidor", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 583660b283..e55dff9254 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -241,6 +241,7 @@ "empty_column.list": "Does dim yn y rhestr yma eto. Pan fydd aelodau'r rhestr yn cyhoeddi postiad newydd, mi fydd yn ymddangos yma.", "empty_column.lists": "Nid oes gennych unrhyw restrau eto. Pan fyddwch yn creu un, mi fydd yn ymddangos yma.", "empty_column.mutes": "Nid ydych wedi tewi unrhyw ddefnyddwyr eto.", + "empty_column.notification_requests": "Dim i boeni amdano! Does dim byd yma. Pan fyddwch yn derbyn hysbysiadau newydd, byddan nhw'n ymddangos yma yn ôl eich gosodiadau.", "empty_column.notifications": "Nid oes gennych unrhyw hysbysiadau eto. Rhyngweithiwch ag eraill i ddechrau'r sgwrs.", "empty_column.public": "Does dim byd yma! Ysgrifennwch rywbeth cyhoeddus, neu dilynwch ddefnyddwyr o weinyddion eraill i'w lanw", "error.unexpected_crash.explanation": "Oherwydd gwall yn ein cod neu oherwydd problem cysondeb porwr, nid oedd y dudalen hon gallu cael ei dangos yn gywir.", @@ -271,6 +272,7 @@ "filter_modal.select_filter.subtitle": "Defnyddiwch gategori sy'n bodoli eisoes neu crëu un newydd", "filter_modal.select_filter.title": "Hidlo'r postiad hwn", "filter_modal.title.status": "Hidlo postiad", + "filtered_notifications_banner.title": "Hysbysiadau wedi'u hidlo", "firehose.all": "Popeth", "firehose.local": "Gweinydd hwn", "firehose.remote": "Gweinyddion eraill", @@ -439,6 +441,10 @@ "notification.reblog": "Hybodd {name} eich post", "notification.status": "{name} newydd ei bostio", "notification.update": "Golygodd {name} bostiad", + "notification_requests.accept": "Derbyn", + "notification_requests.dismiss": "Cau", + "notification_requests.notifications_from": "Hysbysiadau gan {name}", + "notification_requests.title": "Hysbysiadau wedi'u hidlo", "notifications.clear": "Clirio hysbysiadau", "notifications.clear_confirmation": "Ydych chi'n siŵr eich bod am glirio'ch holl hysbysiadau am byth?", "notifications.column_settings.admin.report": "Adroddiadau newydd:", @@ -470,6 +476,15 @@ "notifications.permission_denied": "Nid oes hysbysiadau bwrdd gwaith ar gael oherwydd cais am ganiatâd porwr a wrthodwyd yn flaenorol", "notifications.permission_denied_alert": "Nid oes modd galluogi hysbysiadau bwrdd gwaith, gan fod caniatâd porwr wedi'i wrthod o'r blaen", "notifications.permission_required": "Nid oes hysbysiadau bwrdd gwaith ar gael oherwydd na roddwyd y caniatâd gofynnol.", + "notifications.policy.filter_new_accounts.hint": "Crëwyd o fewn {days, lluosog, un {yr un diwrnod} arall {y # diwrnod}} diwethaf", + "notifications.policy.filter_new_accounts_title": "Cyfrifon newydd", + "notifications.policy.filter_not_followers_hint": "Gan gynnwys pobl sydd wedi bod yn eich dilyn am llai {days, plural, un {nag un diwrnod} arall {na # diwrnod}}", + "notifications.policy.filter_not_followers_title": "Pobl sydd ddim yn eich dilyn", + "notifications.policy.filter_not_following_hint": "Hyd nes i chi eu cymeradwyo â llaw", + "notifications.policy.filter_not_following_title": "Pobl nad ydych yn eu dilyn", + "notifications.policy.filter_private_mentions_hint": "Wedi'i hidlo oni bai ei fod mewn ymateb i'ch crybwylliad eich hun neu os ydych yn dilyn yr anfonwr", + "notifications.policy.filter_private_mentions_title": "Crybwylliadau preifat digymell", + "notifications.policy.title": "Hidlo hysbysiadau gan…", "notifications_permission_banner.enable": "Galluogi hysbysiadau bwrdd gwaith", "notifications_permission_banner.how_to_control": "I dderbyn hysbysiadau pan nad yw Mastodon ar agor, galluogwch hysbysiadau bwrdd gwaith. Gallwch reoli'n union pa fathau o ryngweithiadau sy'n cynhyrchu hysbysiadau bwrdd gwaith trwy'r botwm {icon} uchod unwaith y byddan nhw wedi'u galluogi.", "notifications_permission_banner.title": "Peidiwch â cholli dim", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index ddc0440abc..4f03c55bd4 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -272,6 +272,7 @@ "filter_modal.select_filter.subtitle": "Vælg en eksisterende kategori eller opret en ny", "filter_modal.select_filter.title": "Filtrér dette indlæg", "filter_modal.title.status": "Filtrér et indlæg", + "filtered_notifications_banner.pending_requests": "Notifikationer fra {count, plural, =0 {ingen} one {én person} other {# personer}} du måske kender", "filtered_notifications_banner.title": "Filtrerede notifikationer", "firehose.all": "Alle", "firehose.local": "Denne server", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 48d4580056..35802420d0 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -272,7 +272,7 @@ "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.title": "Filtrar este mensaje", "filter_modal.title.status": "Filtrar un mensaje", - "filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {ninguna cuenta} one {una cuenta} other {# cuentas}} que podrías conocer", + "filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", "filtered_notifications_banner.title": "Notificaciones filtradas", "firehose.all": "Todos", "firehose.local": "Este servidor", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 2759c96a10..79e376693e 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -271,6 +271,7 @@ "filter_modal.select_filter.subtitle": "Kasuta olemasolevat kategooriat või loo uus", "filter_modal.select_filter.title": "Filtreeri seda postitust", "filter_modal.title.status": "Postituse filtreerimine", + "filtered_notifications_banner.pending_requests": "Teateid {count, plural, =0 {mitte üheltki} one {ühelt} other {#}} inimeselt, keda võid teada", "firehose.all": "Kõik", "firehose.local": "See server", "firehose.remote": "Teised serverid", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 9e6128b873..2ca44a41aa 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -325,8 +325,8 @@ "interaction_modal.description.follow": "با حسابی روی ماستودون می‌توانید {name} را برای دریافت فرسته‌هایش در خوراک خانگیتان دنبال کنید.", "interaction_modal.description.reblog": "با حسابی روی ماستودون می‌توانید این فرسته را با پی‌گیران خودتان هم‌رسانی کنید.", "interaction_modal.description.reply": "با حسابی روی ماستودون می‌توانید به این فرسته پاسخ دهید.", - "interaction_modal.login.action": "من رو ببر خونه", - "interaction_modal.login.prompt": "دامنه سرور شخصی شما، به عنوان مثال. mastodon.social", + "interaction_modal.login.action": "رفتن به خانه", + "interaction_modal.login.prompt": "دامنهٔ کارساز شخصیتان چون mastodon.social", "interaction_modal.no_account_yet": "در ماستودون نیست؟", "interaction_modal.on_another_server": "روی کارسازی دیگر", "interaction_modal.on_this_server": "روی این کارساز", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 3f964a7101..93e758dd40 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -271,6 +271,7 @@ "filter_modal.select_filter.subtitle": "Käytä olemassa olevaa luokkaa tai luo uusi", "filter_modal.select_filter.title": "Suodata tämä julkaisu", "filter_modal.title.status": "Suodata julkaisu", + "filtered_notifications_banner.title": "Suodatetut ilmoitukset", "firehose.all": "Kaikki", "firehose.local": "Tämä palvelin", "firehose.remote": "Muut palvelimet", @@ -439,6 +440,10 @@ "notification.reblog": "{name} tehosti julkaisuasi", "notification.status": "{name} julkaisi juuri", "notification.update": "{name} muokkasi julkaisua", + "notification_requests.accept": "Hyväksy", + "notification_requests.dismiss": "Hylkää", + "notification_requests.notifications_from": "Ilmoitukset käyttäjältä {name}", + "notification_requests.title": "Suodatetut ilmoitukset", "notifications.clear": "Tyhjennä ilmoitukset", "notifications.clear_confirmation": "Haluatko varmasti poistaa kaikki ilmoitukset pysyvästi?", "notifications.column_settings.admin.report": "Uudet ilmoitukset:", @@ -470,6 +475,12 @@ "notifications.permission_denied": "Työpöytäilmoitukset eivät ole käytettävissä, koska selaimen käyttöoikeuspyyntö on aiemmin evätty", "notifications.permission_denied_alert": "Työpöytäilmoituksia ei voi ottaa käyttöön, koska selaimen käyttöoikeus on aiemmin estetty", "notifications.permission_required": "Työpöytäilmoitukset eivät ole käytettävissä, koska siihen tarvittavaa lupaa ei ole myönnetty.", + "notifications.policy.filter_new_accounts.hint": "Luotu {days, plural, one {viime päivänä} other {viimeisenä # päivänä}}", + "notifications.policy.filter_new_accounts_title": "Uudet tilit", + "notifications.policy.filter_not_followers_title": "Henkilöt, jotka eivät seuraa sinua", + "notifications.policy.filter_not_following_title": "Henkilöt, joita et seuraa", + "notifications.policy.filter_private_mentions_title": "Ei-toivotut yksityismaininnat", + "notifications.policy.title": "Suodata ilmoitukset pois kohteesta…", "notifications_permission_banner.enable": "Ota työpöytäilmoitukset käyttöön", "notifications_permission_banner.how_to_control": "Saadaksesi ilmoituksia, kun Mastodon ei ole auki, ota työpöytäilmoitukset käyttöön. Voit hallita tarkasti, mistä saat työpöytäilmoituksia kun ilmoitukset on otettu käyttöön yllä olevan {icon}-painikkeen kautta.", "notifications_permission_banner.title": "Älä anna minkään mennä ohi", diff --git a/app/javascript/mastodon/locales/fil.json b/app/javascript/mastodon/locales/fil.json index 04208c5544..14bf1af222 100644 --- a/app/javascript/mastodon/locales/fil.json +++ b/app/javascript/mastodon/locales/fil.json @@ -169,6 +169,7 @@ "empty_column.list": "Wala pang laman ang listahang ito. Kapag naglathala ng mga bagong post ang mga miyembro ng listahang ito, makikita iyon dito.", "empty_column.lists": "Wala ka pang mga listahan. Kapag gumawa ka ng isa, makikita yun dito.", "explore.search_results": "Mga resulta ng paghahanap", + "filter_modal.select_filter.search": "Hanapin o gumawa", "firehose.all": "Lahat", "firehose.local": "Itong serbiro", "firehose.remote": "Ibang mga serbiro", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 67b323e2cf..daaefea86d 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -272,7 +272,7 @@ "filter_modal.select_filter.subtitle": "Brúka ein verandi bólk ella skapa ein nýggjan", "filter_modal.select_filter.title": "Filtrera hendan postin", "filter_modal.title.status": "Filtrera ein post", - "filtered_notifications_banner.pending_requests": "Fráboðanir frá {count, plural, =0 {ongum} one {einum persóni} other {# persónum}}, sum tú møguliga kennir", + "filtered_notifications_banner.pending_requests": "Fráboðanir frá {count, plural, =0 {ongum} one {einum persóni} other {# persónum}}, sum tú kanska kennir", "filtered_notifications_banner.title": "Sáldaðar fráboðanir", "firehose.all": "Allar", "firehose.local": "Hesin ambætarin", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 52e0ee6f6d..e3928b5f3b 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -241,6 +241,7 @@ "empty_column.list": "Aínda non hai nada nesta listaxe. Cando as usuarias incluídas na listaxe publiquen mensaxes, amosaranse aquí.", "empty_column.lists": "Aínda non tes listaxes. Cando crees unha, amosarase aquí.", "empty_column.mutes": "Aínda non silenciaches a ningúnha usuaria.", + "empty_column.notification_requests": "Todo ben! Nada por aquí. Cando recibas novas notificación aparecerán aquí seguindo o criterio dos teus axustes.", "empty_column.notifications": "Aínda non tes notificacións. Aparecerán cando outras persoas interactúen contigo.", "empty_column.public": "Nada por aquí! Escribe algo de xeito público, ou segue de xeito manual usuarias doutros servidores para ir enchéndoo", "error.unexpected_crash.explanation": "Debido a un erro no noso código ou a unha compatilidade co teu navegador, esta páxina non pode ser amosada correctamente.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Usar unha categoría existente ou crear unha nova", "filter_modal.select_filter.title": "Filtrar esta publicación", "filter_modal.title.status": "Filtrar unha publicación", + "filtered_notifications_banner.pending_requests": "Notificacións de {count, plural, =0 {ninguén} one {unha persoa} other {# persoas}} que poderías coñecer", + "filtered_notifications_banner.title": "Notificacións filtradas", "firehose.all": "Todo", "firehose.local": "Este servidor", "firehose.remote": "Outros servidores", @@ -439,6 +442,10 @@ "notification.reblog": "{name} compartiu a túa publicación", "notification.status": "{name} publicou", "notification.update": "{name} editou unha publicación", + "notification_requests.accept": "Aceptar", + "notification_requests.dismiss": "Desbotar", + "notification_requests.notifications_from": "Notificacións de {name}", + "notification_requests.title": "Notificacións filtradas", "notifications.clear": "Limpar notificacións", "notifications.clear_confirmation": "Tes a certeza de querer limpar de xeito permanente todas as túas notificacións?", "notifications.column_settings.admin.report": "Novas denuncias:", @@ -470,6 +477,15 @@ "notifications.permission_denied": "Non se activaron as notificacións de escritorio porque se denegou o permiso", "notifications.permission_denied_alert": "Non se poden activar as notificacións de escritorio, xa que o permiso para o navegador foi denegado previamente", "notifications.permission_required": "As notificacións de escritorio non están dispoñibles porque non se concedeu o permiso necesario.", + "notifications.policy.filter_new_accounts.hint": "Creadas desde {days, plural, one {onte} other {fai # días}}", + "notifications.policy.filter_new_accounts_title": "Novas contas", + "notifications.policy.filter_not_followers_hint": "Inclúe a persoas que te seguen desde fai menos de {days, plural, one {1 día} other {# días}}", + "notifications.policy.filter_not_followers_title": "Persoas que non te seguen", + "notifications.policy.filter_not_following_hint": "Ata que as autorices", + "notifications.policy.filter_not_following_title": "Persoas que ti non segues", + "notifications.policy.filter_private_mentions_hint": "Filtradas a non ser que sexa unha resposta á túa propia mención ou se ti segues á remitente", + "notifications.policy.filter_private_mentions_title": "Mencións privadas non solicitadas", + "notifications.policy.title": "Desbotar notificacións de…", "notifications_permission_banner.enable": "Activar notificacións de escritorio", "notifications_permission_banner.how_to_control": "Activa as notificacións de escritorio para recibir notificacións mentras Mastodon non está aberto. Podes controlar de xeito preciso o tipo de interaccións que crean as notificacións de escritorio a través da {icon} superior unha vez están activadas.", "notifications_permission_banner.title": "Non perder nada", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index dcbc30308c..af6b1c6118 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -272,7 +272,6 @@ "filter_modal.select_filter.subtitle": "שימוש בקטגורייה קיימת או יצירת אחת חדשה", "filter_modal.select_filter.title": "סינון ההודעה הזו", "filter_modal.title.status": "סנן הודעה", - "filtered_notifications_banner.pending_requests": "{count, plural,=0 {אין התראות ממשתמשים ה}one {התראה אחת ממישהו/מישהי ה}other {יש # התראות ממשתמשים }}מוכרים לך", "filtered_notifications_banner.title": "התראות מסוננות", "firehose.all": "הכל", "firehose.local": "שרת זה", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 5dd0e7aee5..1cbca5654b 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -272,7 +272,7 @@ "filter_modal.select_filter.subtitle": "Válassz egy meglévő kategóriát, vagy hozz létre egy újat", "filter_modal.select_filter.title": "E bejegyzés szűrése", "filter_modal.title.status": "Egy bejegyzés szűrése", - "filtered_notifications_banner.pending_requests": "Értesítések {count, plural, =0 {0 személytől} one {egy feltehetőleg ismert személytől} other {# feltehetőleg ismert személytől}}", + "filtered_notifications_banner.pending_requests": "Értesítések {count, plural, =0 {nincsenek} one {egy valósztínűleg ismerős személytől} other {# valószínűleg ismerős személytől}}", "filtered_notifications_banner.title": "Szűrt értesítések", "firehose.all": "Összes", "firehose.local": "Ez a kiszolgáló", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 303abd4982..56b637612d 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -272,7 +272,7 @@ "filter_modal.select_filter.subtitle": "Usa una categoria esistente o creane una nuova", "filter_modal.select_filter.title": "Filtra questo post", "filter_modal.title.status": "Filtra un post", - "filtered_notifications_banner.pending_requests": "Notifiche da {count, plural, =0 {nessuna persona} one {una persona} other {# persone}} che potresti conoscere", + "filtered_notifications_banner.pending_requests": "Notifiche da {count, plural, =0 {nessuno} one {una persona} other {# persone}} che potresti conoscere", "filtered_notifications_banner.title": "Notifiche filtrate", "firehose.all": "Tutto", "firehose.local": "Questo server", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 7dd7636089..642a3f4ae1 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -271,7 +271,7 @@ "filter_modal.select_filter.subtitle": "기존의 카테고리를 사용하거나 새로 하나를 만듧니다", "filter_modal.select_filter.title": "이 게시물을 필터", "filter_modal.title.status": "게시물 필터", - "filtered_notifications_banner.pending_requests": "알 수도 있는 {count, plural, =0 {0명} one {한 명} other {# 명}}의 사람들로부터의 알림", + "filtered_notifications_banner.pending_requests": "알 수도 있는 {count, plural, =0 {0 명} one {한 명} other {# 명}}의 사람들로부터의 알림", "filtered_notifications_banner.title": "걸러진 알림", "firehose.all": "모두", "firehose.local": "이 서버", @@ -478,6 +478,7 @@ "notifications.permission_required": "필요한 권한이 승인되지 않아 데스크탑 알림을 사용할 수 없습니다.", "notifications.policy.filter_new_accounts.hint": "{days, plural, one {하루} other {#일}} 안에 만들어진", "notifications.policy.filter_new_accounts_title": "새 계정", + "notifications.policy.filter_not_followers_hint": "나를 팔로우 한 지 {days, plural, other {# 일}}이 되지 않은 사람들을 포함", "notifications.policy.filter_not_followers_title": "나를 팔로우하지 않는 사람들", "notifications.policy.filter_not_following_hint": "내가 수동으로 승인하기 전까지", "notifications.policy.filter_not_following_title": "내가 팔로우하지 않는 사람들", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index de84becca3..e23f225928 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -271,6 +271,7 @@ "filter_modal.select_filter.subtitle": "Kulanea una kategoria egzistente o kriya mueva", "filter_modal.select_filter.title": "Filtra esta publikasyon", "filter_modal.title.status": "Filtra una publikasyon", + "filtered_notifications_banner.pending_requests": "Avizos de {count, plural, =0 {dingun} one {una persona} other {# personas}} ke puedes koneser", "filtered_notifications_banner.title": "Avizos filtrados", "firehose.all": "Todo", "firehose.local": "Este sirvidor", @@ -442,6 +443,7 @@ "notification.update": "{name} edito una publikasyon", "notification_requests.accept": "Acheta", "notification_requests.dismiss": "Kita", + "notification_requests.notifications_from": "Avizos de {name}", "notification_requests.title": "Avizos filtrados", "notifications.clear": "Efasa avizos", "notifications.clear_confirmation": "Estas siguro ke keres permanentemente efasar todos tus avizos?", @@ -474,7 +476,13 @@ "notifications.permission_denied": "Avizos de ensimameza no estan desponivles porke ya se tiene refuzado el permiso", "notifications.permission_denied_alert": "\"No se pueden kapasitar los avizos de ensimameza, porke ya se tiene refuzado el permiso de navigador", "notifications.permission_required": "Avizos de ensimameza no estan desponivles porke los nesesarios permisos no tienen sido risividos.", + "notifications.policy.filter_new_accounts.hint": "Kriyadas durante {days, plural, one {el ultimo diya} other {los ultimos # diyas}}", "notifications.policy.filter_new_accounts_title": "Muevos kuentos", + "notifications.policy.filter_not_followers_title": "Personas ke te no sigen", + "notifications.policy.filter_not_following_hint": "Asta ke las aproves manualmente", + "notifications.policy.filter_not_following_title": "Personas ke no siges", + "notifications.policy.filter_private_mentions_title": "Enmentaduras privadas no solisitadas", + "notifications.policy.title": "Filtra avizos de…", "notifications_permission_banner.enable": "Kapasita avizos de ensimameza", "notifications_permission_banner.how_to_control": "Para risivir avizos kuando Mastodon no esta avierto, kapasita avizos de ensimameza. Puedes kontrolar presizamente kualos tipos de enteraksiones djeneren avizos de ensimameza kon el boton {icon} arriva kuando esten kapasitadas.", "notifications_permission_banner.title": "Nunkua te piedres niente", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 6963c43a3a..326560c888 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -439,6 +439,10 @@ "notification.reblog": "{name} pakėlė tavo įrašą", "notification.status": "{name} ką tik paskelbė", "notification.update": "{name} redagavo įrašą", + "notification_requests.accept": "Priimti", + "notification_requests.dismiss": "Atmesti", + "notification_requests.notifications_from": "Pranešimai iš {name}", + "notification_requests.title": "Filtruojami pranešimai", "notifications.clear": "Išvalyti pranešimus", "notifications.clear_confirmation": "Ar tikrai nori visam laikui išvalyti visus pranešimus?", "notifications.column_settings.admin.report": "Naujos ataskaitos:", @@ -470,6 +474,12 @@ "notifications.permission_denied": "Darbalaukio pranešimai nepasiekiami dėl anksčiau atmestos naršyklės leidimų užklausos.", "notifications.permission_denied_alert": "Negalima įjungti darbalaukio pranešimų, nes prieš tai naršyklės leidimas buvo atmestas.", "notifications.permission_required": "Darbalaukio pranešimai nepasiekiami, nes nebuvo suteiktas reikiamas leidimas.", + "notifications.policy.filter_new_accounts.hint": "Sukurta per {days, plural, one {vieną dieną} few {# dienas} many {# dienos} other {# dienų}}", + "notifications.policy.filter_new_accounts_title": "Naujos paskyros", + "notifications.policy.filter_not_following_hint": "Kol jų nepatvirtinsi rankiniu būdu", + "notifications.policy.filter_not_following_title": "Žmonių, kuriuos neseki", + "notifications.policy.filter_private_mentions_title": "Nepageidaujami privatūs paminėjimai", + "notifications.policy.title": "Filtruoti pranešimus iš…", "notifications_permission_banner.enable": "Įjungti darbalaukio pranešimus", "notifications_permission_banner.how_to_control": "Jei nori gauti pranešimus, kai Mastodon nėra atidarytas, įjunk darbalaukio pranešimus. Įjungęs (-usi) darbalaukio pranešimus, gali tiksliai valdyti, kokių tipų sąveikos generuoja darbalaukio pranešimus, naudojant pirmiau esančiu mygtuku {icon}.", "notifications_permission_banner.title": "Niekada nieko nepraleisk", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index da5c4d8643..34a0c5ea5a 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -272,7 +272,7 @@ "filter_modal.select_filter.subtitle": "Een bestaande categorie gebruiken of een nieuwe aanmaken", "filter_modal.select_filter.title": "Dit bericht filteren", "filter_modal.title.status": "Een bericht filteren", - "filtered_notifications_banner.pending_requests": "Meldingen van {count, plural, =0 {no} one {één persoon} other {# mensen}} die je misschien kent", + "filtered_notifications_banner.pending_requests": "Meldingen van {count, plural, =0 {niemand} one {één persoon} other {# mensen}} die je misschien kent", "filtered_notifications_banner.title": "Gefilterde meldingen", "firehose.all": "Alles", "firehose.local": "Deze server", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index a9c7affab1..07f7617358 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -271,6 +271,7 @@ "filter_modal.select_filter.subtitle": "Použite existujúcu kategóriu alebo vytvorte novú", "filter_modal.select_filter.title": "Filtrovanie tohto príspevku", "filter_modal.title.status": "Filtrovanie príspevku", + "filtered_notifications_banner.pending_requests": "Oboznámenia od {count, plural, =0 {nikoho} one {jedného človeka} other {# ľudí}} čo môžeš poznať", "firehose.all": "Všetko", "firehose.local": "Tento server", "firehose.remote": "Ostatné servery", @@ -439,6 +440,9 @@ "notification.reblog": "{name} zdieľa váš príspevok", "notification.status": "{name} uverejňuje niečo nové", "notification.update": "{name} upravuje príspevok", + "notification_requests.accept": "Prijať", + "notification_requests.notifications_from": "Oboznámenia od {name}", + "notification_requests.title": "Filtrované oboznámenia", "notifications.clear": "Vyčistiť upozornenia", "notifications.clear_confirmation": "Určite chcete nenávratne odstrániť všetky svoje upozornenia?", "notifications.column_settings.admin.report": "Nové hlásenia:", @@ -470,6 +474,9 @@ "notifications.permission_denied": "Upozornenia na ploche sú nedostupné pre už skôr zamietnutú požiadavku prehliadača", "notifications.permission_denied_alert": "Upozornenia na ploche nemôžu byť zapnuté, pretože požiadavka prehliadača bola už skôr zamietnutá", "notifications.permission_required": "Upozornenia na ploche sú nedostupné, pretože neboli udelené potrebné povolenia.", + "notifications.policy.filter_new_accounts_title": "Nové účty", + "notifications.policy.filter_not_followers_title": "Ľudia, ktorí ťa nenasledujú", + "notifications.policy.filter_not_following_title": "Ľudia, ktorých nenasleduješ", "notifications_permission_banner.enable": "Povoliť upozornenia na ploche", "notifications_permission_banner.how_to_control": "Ak chcete dostávať upozornenia, keď Mastodon nie je otvorený, povoľte upozornenia na ploche. Po ich zapnutí môžete presne kontrolovať, ktoré typy interakcií generujú upozornenia na ploche, a to prostredníctvom tlačidla {icon} vyššie.", "notifications_permission_banner.title": "Nenechajte si nič ujsť", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index df150fc291..1fe7dd0786 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -272,6 +272,7 @@ "filter_modal.select_filter.subtitle": "Uporabite obstoječo kategorijo ali ustvarite novo", "filter_modal.select_filter.title": "Filtriraj to objavo", "filter_modal.title.status": "Filtrirajte objavo", + "filtered_notifications_banner.pending_requests": "Obvestila od {count, plural, =0 {nikogar, ki bi ga} one {# človeka, ki bi ga} two {# ljudi, ki bi ju} few {# ljudi, ki bi jih} other {# ljudi, ki bi jih}} lahko poznali", "filtered_notifications_banner.title": "Filtrirana obvestila", "firehose.all": "Vse", "firehose.local": "Ta strežnik", @@ -476,7 +477,9 @@ "notifications.permission_denied": "Namizna obvestila niso na voljo zaradi poprej zavrnjene zahteve dovoljenja brskalnika.", "notifications.permission_denied_alert": "Namiznih obvestil ni mogoče omogočiti, ker je bilo dovoljenje brskalnika že prej zavrnjeno", "notifications.permission_required": "Namizna obvestila niso na voljo, ker zahtevano dovoljenje ni bilo podeljeno.", + "notifications.policy.filter_new_accounts.hint": "Ustvarjen v {days, plural, one {zadnjem # dnevu} two {zadnjih # dnevih} few {zadnjih # dnevih} other {zadnjih # dnevih}}", "notifications.policy.filter_new_accounts_title": "Novi računi", + "notifications.policy.filter_not_followers_hint": "Vključujoč ljudi, ki vam sledijo manj kot {days, plural, one {# dan} two {# dneva} few {# dni} other {# dni}}", "notifications.policy.filter_not_followers_title": "Ljudje, ki vam ne sledijo", "notifications.policy.filter_not_following_hint": "Dokler jih ročno ne odobrite", "notifications.policy.filter_not_following_title": "Ljudje, ki jim ne sledite", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 00d517de72..beba09d59b 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -241,6 +241,7 @@ "empty_column.list": "Në këtë listë ende s’ka gjë. Kur anëtarë të kësaj liste postojnë gjendje të reja, ato do të shfaqen këtu.", "empty_column.lists": "Ende s’keni ndonjë listë. Kur të krijoni një të tillë, do të duket këtu.", "empty_column.mutes": "S’keni heshtuar ende ndonjë përdorues.", + "empty_column.notification_requests": "Gjithçka si duhet! S’ka ç’bëhet këtu. Kur merrni njoftime të reja, do të shfaqen këtu, në përputhje me rregullimet tuaja.", "empty_column.notifications": "Ende s’keni ndonjë njoftim. Ndërveproni me të tjerët që të nisë biseda.", "empty_column.public": "S’ka gjë këtu! Shkruani diçka publikisht, ose ndiqni dorazi përdorues prej instancash të tjera, që kjo të mbushet", "error.unexpected_crash.explanation": "Për shkak të një të mete në kodin tonë ose të një problemi përputhshmërie të shfletuesit, kjo faqe s’mund të shfaqet saktë.", @@ -271,6 +272,7 @@ "filter_modal.select_filter.subtitle": "Përdorni një kategori ekzistuese, ose krijoni një të re", "filter_modal.select_filter.title": "Filtroje këtë postim", "filter_modal.title.status": "Filtroni një postim", + "filtered_notifications_banner.title": "Njoftime të filtruar", "firehose.all": "Krejt", "firehose.local": "Këtë shërbyes", "firehose.remote": "Shërbyes të tjerë", @@ -439,6 +441,10 @@ "notification.reblog": "{name} përforcoi mesazhin tuaj", "notification.status": "{name} sapo postoi", "notification.update": "{name} përpunoi një postim", + "notification_requests.accept": "Pranoje", + "notification_requests.dismiss": "Hidhe tej", + "notification_requests.notifications_from": "Njoftime prej {name}", + "notification_requests.title": "Njoftime të filtruar", "notifications.clear": "Spastroji njoftimet", "notifications.clear_confirmation": "Jeni i sigurt se doni të spastrohen përgjithmonë krejt njoftimet tuaja?", "notifications.column_settings.admin.report": "Raportime të reja:", @@ -470,6 +476,13 @@ "notifications.permission_denied": "S’merren dot njoftime në desktop, ngaqë më herët shfletuesit i janë mohuar lejet për këtë", "notifications.permission_denied_alert": "S’mund të aktivizohen njoftimet në desktop, ngaqë lejet e shfletuesit për këtë janë mohuar më herët", "notifications.permission_required": "S’merren dot njoftime desktop, ngaqë s’është akorduar leja përkatëse.", + "notifications.policy.filter_new_accounts_title": "Llogari të reja", + "notifications.policy.filter_not_followers_title": "Persona që s’ju ndjekin", + "notifications.policy.filter_not_following_hint": "Deri sa t’i miratoni dorazi", + "notifications.policy.filter_not_following_title": "Persona që s’i ndiqni", + "notifications.policy.filter_private_mentions_hint": "Filtruar, hiq rastin nëse gjendet te përgjigje ndaj përmendjes tuaj, ose nëse dërguesin e ndiqni", + "notifications.policy.filter_private_mentions_title": "Përmendje private të pakërkuara", + "notifications.policy.title": "Filtroni njoftime nga…", "notifications_permission_banner.enable": "Aktivizo njoftime në desktop", "notifications_permission_banner.how_to_control": "Për të marrë njoftime, kur Mastodon-i s’është i hapur, aktivizoni njoftime në desktop. Përmes butoni {icon} më sipër, mund të kontrolloni me përpikëri cilat lloje ndërveprimesh prodhojnë njoftime në desktop, pasi të jenë aktivizuar.", "notifications_permission_banner.title": "Mos t’ju shpëtojë gjë", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 4c0264465d..6a5ad998d4 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -241,6 +241,7 @@ "empty_column.list": "U ovoj listi još nema ničega. Kada članovi ove liste objave nešto novo, pojaviće se ovde.", "empty_column.lists": "Još uvek nemate nijednu listu. Kada napravite jednu, ona će se pojaviti ovde.", "empty_column.mutes": "Još uvek ne ignorišete nijednog korisnika.", + "empty_column.notification_requests": "Sve je čisto! Ovde nema ničega. Kada dobijete nova obaveštenja, ona će se pojaviti ovde u skladu sa vašim podešavanjima.", "empty_column.notifications": "Još uvek nemate nikakva obaveštenja. Kada drugi ljudi budu u interakciji sa vama, videćete to ovde.", "empty_column.public": "Ovde nema ničega! Napišite nešto javno ili ručno pratite korisnike sa drugih servera da biste ovo popunili", "error.unexpected_crash.explanation": "Zbog greške u našem kodu ili problema sa kompatibilnošću pregledača, ova stranica se nije mogla pravilno prikazati.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Koristite postojeću kategoriju ili kreirajte novu", "filter_modal.select_filter.title": "Filtriraj ovu objavu", "filter_modal.title.status": "Filtriraj objavu", + "filtered_notifications_banner.pending_requests": "Obaveštenja od {count, plural, =0 {nikoga koga možda poznajete} one {# osobe koju možda poznajete} few {# osobe koje možda poznajete} other {# osoba koje možda poznajete}}", + "filtered_notifications_banner.title": "Filtrirana obaveštenja", "firehose.all": "Sve", "firehose.local": "Ovaj server", "firehose.remote": "Ostali serveri", @@ -439,6 +442,10 @@ "notification.reblog": "{name} je podržao vašu objavu", "notification.status": "{name} je upravo objavio", "notification.update": "{name} je uredio objavu", + "notification_requests.accept": "Prihvati", + "notification_requests.dismiss": "Odbaci", + "notification_requests.notifications_from": "Obaveštenja od {name}", + "notification_requests.title": "Filtrirana obaveštenja", "notifications.clear": "Obriši obaveštenja", "notifications.clear_confirmation": "Da li ste sigurni da želite trajno da obrišete sva vaša obaveštenja?", "notifications.column_settings.admin.report": "Nove prijave:", @@ -470,6 +477,15 @@ "notifications.permission_denied": "Obaveštenja na radnoj površini nisu dostupna zbog prethodno odbijenog zahteva za dozvolu pregledača", "notifications.permission_denied_alert": "Obaveštenja na radnoj površini ne mogu biti omogućena, jer je dozvola pregledača ranije bila odbijena", "notifications.permission_required": "Obaveštenja na radnoj površini nisu dostupna jer potrebna dozvola nije dodeljena.", + "notifications.policy.filter_new_accounts.hint": "Kreirano {days, plural, one {u poslednjeg # dana} few {u poslednja # dana} other {u poslednjih # dana}}", + "notifications.policy.filter_new_accounts_title": "Novi nalozi", + "notifications.policy.filter_not_followers_hint": "Uključujući ljude koji su vas pratili manje od {days, plural, one {# dana} few {# dana} other {# dana}}", + "notifications.policy.filter_not_followers_title": "Ljudi koji vas ne prate", + "notifications.policy.filter_not_following_hint": "Dok ih ručno ne odobrite", + "notifications.policy.filter_not_following_title": "Ljudi koje ne pratite", + "notifications.policy.filter_private_mentions_hint": "Filtrirano osim ako je odgovor na vaše pominjanje ili ako pratite pošiljaoca", + "notifications.policy.filter_private_mentions_title": "Neželjena privatna pominjanja", + "notifications.policy.title": "Filtriraj obaveštenja od…", "notifications_permission_banner.enable": "Omogućiti obaveštenja na radnoj površini", "notifications_permission_banner.how_to_control": "Da biste primali obaveštenja kada Mastodon nije otvoren, omogućite obaveštenja na radnoj površini. Kada su obaveštenja na radnoj površini omogućena vrste interakcija koje ona generišu mogu se podešavati pomoću dugmeta {icon}.", "notifications_permission_banner.title": "Nikada ništa ne propustite", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index d00e322b42..9f96a2ccc0 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -241,6 +241,7 @@ "empty_column.list": "У овој листи још нема ничега. Када чланови ове листе објаве нешто ново, појавиће се овде.", "empty_column.lists": "Још увек немате ниједну листу. Када направите једну, она ће се појавити овде.", "empty_column.mutes": "Још увек не игноришете ниједног корисника.", + "empty_column.notification_requests": "Све је чисто! Овде нема ничега. Када добијете нова обавештења, она ће се појавити овде у складу са вашим подешавањима.", "empty_column.notifications": "Још увек немате никаква обавештења. Када други људи буду у интеракцији са вама, видећете то овде.", "empty_column.public": "Овде нема ничега! Напишите нешто јавно или ручно пратите кориснике са других сервера да бисте ово попунили", "error.unexpected_crash.explanation": "Због грешке у нашем коду или проблема са компатибилношћу прегледача, ова страница се није могла правилно приказати.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Користите постојећу категорију или креирајте нову", "filter_modal.select_filter.title": "Филтрирај ову објаву", "filter_modal.title.status": "Филтрирај објаву", + "filtered_notifications_banner.pending_requests": "Обавештења од {count, plural, =0 {никога кога можда познајете} one {# особе коју можда познајете} few {# особе које можда познајете} other {# особа које можда познајете}}", + "filtered_notifications_banner.title": "Филтрирана обавештења", "firehose.all": "Све", "firehose.local": "Овај сервер", "firehose.remote": "Остали сервери", @@ -439,6 +442,10 @@ "notification.reblog": "{name} је подржао вашу објаву", "notification.status": "{name} је управо објавио", "notification.update": "{name} је уредио објаву", + "notification_requests.accept": "Прихвати", + "notification_requests.dismiss": "Одбаци", + "notification_requests.notifications_from": "Обавештења од {name}", + "notification_requests.title": "Филтрирана обавештења", "notifications.clear": "Обриши обавештења", "notifications.clear_confirmation": "Да ли сте сигурни да желите трајно да обришете сва ваша обавештења?", "notifications.column_settings.admin.report": "Нове пријаве:", @@ -470,6 +477,15 @@ "notifications.permission_denied": "Обавештења на радној површини нису доступна због претходно одбијеног захтева за дозволу прегледача", "notifications.permission_denied_alert": "Обавештења на радној површини не могу бити омогућена, јер је дозвола прегледача раније била одбијена", "notifications.permission_required": "Обавештења на радној површини нису доступна јер потребна дозвола није додељена.", + "notifications.policy.filter_new_accounts.hint": "Креирано {days, plural, one {у последњег # дана} few {у последња # дана} other {у последњих # дана}}", + "notifications.policy.filter_new_accounts_title": "Нови налози", + "notifications.policy.filter_not_followers_hint": "Укључујући људе који су вас пратили мање од {days, plural, one {# дана} few {# дана} other {# дана}}", + "notifications.policy.filter_not_followers_title": "Људи који вас не прате", + "notifications.policy.filter_not_following_hint": "Док их ручно не одобрите", + "notifications.policy.filter_not_following_title": "Људи које не пратите", + "notifications.policy.filter_private_mentions_hint": "Филтрирано осим ако је одговор на ваше помињање или ако пратите пошиљаоца", + "notifications.policy.filter_private_mentions_title": "Нежељена приватна помињања", + "notifications.policy.title": "Филтрирај обавештења од…", "notifications_permission_banner.enable": "Омогућити обавештења на радној површини", "notifications_permission_banner.how_to_control": "Да бисте примали обавештења када Mastodon није отворен, омогућите обавештења на радној површини. Kада су обавештења на радној површини омогућена врсте интеракција које она генеришу могу се подешавати помоћу дугмета {icon}.", "notifications_permission_banner.title": "Никада ништа не пропустите", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index d92cbcda1f..30a9601d67 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -271,6 +271,7 @@ "filter_modal.select_filter.subtitle": "ใช้หมวดหมู่ที่มีอยู่หรือสร้างหมวดหมู่ใหม่", "filter_modal.select_filter.title": "กรองโพสต์นี้", "filter_modal.title.status": "กรองโพสต์", + "filtered_notifications_banner.pending_requests": "การแจ้งเตือนจาก {count, plural, =0 {ไม่มีใคร} other {# คน}} ที่คุณอาจรู้จัก", "filtered_notifications_banner.title": "การแจ้งเตือนที่กรองอยู่", "firehose.all": "ทั้งหมด", "firehose.local": "เซิร์ฟเวอร์นี้", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 6774ad48e1..08fe40fe45 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -241,6 +241,7 @@ "empty_column.list": "Henüz bu listede bir şey yok. Bu listenin üyeleri bir şey paylaşığında burada gözükecek.", "empty_column.lists": "Henüz listen yok. Liste oluşturduğunda burada görünür.", "empty_column.mutes": "Henüz bir kullanıcıyı sessize almadınız.", + "empty_column.notification_requests": "Hepsi tamam! Burada yeni bir şey yok. Yeni bildirim aldığınızda, ayarlarınıza göre burada görüntülenecekler.", "empty_column.notifications": "Henüz bildiriminiz yok. Sohbete başlamak için başkalarıyla etkileşim kurun.", "empty_column.public": "Burada hiçbir şey yok! Herkese açık bir şeyler yazın veya burayı doldurmak için diğer sunuculardaki kullanıcıları takip edin", "error.unexpected_crash.explanation": "Bizim kodumuzdaki bir hatadan ya da tarayıcı uyumluluk sorunundan dolayı, bu sayfa düzgün görüntülenemedi.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Mevcut bir kategoriyi kullan veya yeni bir tane oluştur", "filter_modal.select_filter.title": "Bu gönderiyi süzgeçle", "filter_modal.title.status": "Bir gönderi süzgeçle", + "filtered_notifications_banner.pending_requests": "Bildiğiniz {count, plural, =0 {hiç kimseden} one {bir kişiden} other {# kişiden}} bildirim", + "filtered_notifications_banner.title": "Filtrelenmiş bildirimler", "firehose.all": "Tümü", "firehose.local": "Bu sunucu", "firehose.remote": "Diğer sunucular", @@ -356,7 +359,7 @@ "keyboard_shortcuts.hotkey": "Kısayol tuşu", "keyboard_shortcuts.legend": "Bu efsaneyi görüntülemek için", "keyboard_shortcuts.local": "Yerel akışı aç", - "keyboard_shortcuts.mention": "Yazandan bahsetmek için", + "keyboard_shortcuts.mention": "Yazana değinmek için", "keyboard_shortcuts.muted": "Sessize alınmış kullanıcı listesini açmak için", "keyboard_shortcuts.my_profile": "Profilinizi açmak için", "keyboard_shortcuts.notifications": "Bildirimler sütununu açmak için", @@ -433,12 +436,16 @@ "notification.favourite": "{name} gönderinizi beğendi", "notification.follow": "{name} seni takip etti", "notification.follow_request": "{name} size takip isteği gönderdi", - "notification.mention": "{name} senden bahsetti", + "notification.mention": "{name} sana değindi", "notification.own_poll": "Anketiniz sona erdi", "notification.poll": "Oy verdiğiniz bir anket sona erdi", "notification.reblog": "{name} gönderini yeniden paylaştı", "notification.status": "{name} az önce gönderdi", "notification.update": "{name} bir gönderiyi düzenledi", + "notification_requests.accept": "Onayla", + "notification_requests.dismiss": "Yoksay", + "notification_requests.notifications_from": "{name} bildirimleri", + "notification_requests.title": "Filtrelenmiş bildirimler", "notifications.clear": "Bildirimleri temizle", "notifications.clear_confirmation": "Tüm bildirimlerinizi kalıcı olarak temizlemek ister misiniz?", "notifications.column_settings.admin.report": "Yeni bildirimler:", @@ -470,6 +477,15 @@ "notifications.permission_denied": "Daha önce reddedilen tarayıcı izinleri isteği nedeniyle masaüstü bildirimleri kullanılamıyor", "notifications.permission_denied_alert": "Tarayıcı izni daha önce reddedildiğinden, masaüstü bildirimleri etkinleştirilemez", "notifications.permission_required": "Masaüstü bildirimleri, gereksinim duyulan izin verilmediği için mevcut değil.", + "notifications.policy.filter_new_accounts.hint": "Son {days, plural, one {bir gün} other {# gün}}de oluşturuldu", + "notifications.policy.filter_new_accounts_title": "Yeni hesaplar", + "notifications.policy.filter_not_followers_hint": "Sizi {days, plural, one {bir gün} other {# gün}}den azdır takip eden kişileri de içeriyor", + "notifications.policy.filter_not_followers_title": "Seni takip etmeyen kullanıcılar", + "notifications.policy.filter_not_following_hint": "Onları manuel olarak onaylayana kadar", + "notifications.policy.filter_not_following_title": "Takip etmediğin kullanıcılar", + "notifications.policy.filter_private_mentions_hint": "Kendi değinmenize yanıt veya takip ettiğiniz kullanıcıdan değilse filtrelenir", + "notifications.policy.filter_private_mentions_title": "İstenmeyen özel değinmeler", + "notifications.policy.title": "Şundan bildirimleri filtrele…", "notifications_permission_banner.enable": "Masaüstü bildirimlerini etkinleştir", "notifications_permission_banner.how_to_control": "Mastodon açık olmadığında bildirim almak için masaüstü bildirimlerini etkinleştirin. Etkinleştirildikten sonra yukarıdaki {icon} düğmesini kullanarak hangi etkileşim türlerinin masaüstü bildirimleri oluşturduğunu tam olarak kontrol edebilirsiniz.", "notifications_permission_banner.title": "Hiçbir şeyi kaçırmayın", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index b1785ca5d0..c74c780127 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -241,6 +241,7 @@ "empty_column.list": "Chưa có tút. Khi những người trong danh sách này đăng tút mới, chúng sẽ xuất hiện ở đây.", "empty_column.lists": "Bạn chưa tạo danh sách nào.", "empty_column.mutes": "Bạn chưa ẩn bất kỳ ai.", + "empty_column.notification_requests": "Sạch sẽ! Không còn gì ở đây. Khi bạn nhận được thông báo mới, chúng sẽ xuất hiện ở đây theo cài đặt của bạn.", "empty_column.notifications": "Bạn chưa có thông báo nào. Hãy thử theo dõi hoặc nhắn riêng cho ai đó.", "empty_column.public": "Trống trơn! Bạn hãy viết gì đó hoặc bắt đầu theo dõi những người khác", "error.unexpected_crash.explanation": "Trang này có thể không hiển thị chính xác do lỗi lập trình Mastodon hoặc vấn đề tương thích trình duyệt.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Sử dụng một danh mục hiện có hoặc tạo một danh mục mới", "filter_modal.select_filter.title": "Lọc tút này", "filter_modal.title.status": "Lọc một tút", + "filtered_notifications_banner.pending_requests": "{count, plural, =0 {} other {#}}", + "filtered_notifications_banner.title": "Thông báo đã lọc", "firehose.all": "Toàn bộ", "firehose.local": "Máy chủ này", "firehose.remote": "Máy chủ khác", @@ -439,6 +442,10 @@ "notification.reblog": "{name} đăng lại tút của bạn", "notification.status": "{name} đăng tút mới", "notification.update": "{name} đã sửa tút", + "notification_requests.accept": "Chấp nhận", + "notification_requests.dismiss": "Bỏ qua", + "notification_requests.notifications_from": "Thông báo từ {name}", + "notification_requests.title": "Thông báo đã lọc", "notifications.clear": "Xóa hết thông báo", "notifications.clear_confirmation": "Bạn thật sự muốn xóa vĩnh viễn tất cả thông báo của mình?", "notifications.column_settings.admin.report": "Báo cáo mới:", @@ -470,6 +477,15 @@ "notifications.permission_denied": "Trình duyệt không cho phép hiển thị thông báo trên màn hình.", "notifications.permission_denied_alert": "Không thể bật thông báo trên màn hình bởi vì trình duyệt đã cấm trước đó", "notifications.permission_required": "Không hiện thông báo trên màn hình bởi vì chưa cho phép.", + "notifications.policy.filter_new_accounts.hint": "Đã tạo trong vòng {days, plural, other {# ngày}}", + "notifications.policy.filter_new_accounts_title": "Tài khoản mới", + "notifications.policy.filter_not_followers_hint": "Bao gồm những người đã theo dõi bạn ít hơn {days, plural, other {# ngày}}", + "notifications.policy.filter_not_followers_title": "Những người không theo dõi bạn", + "notifications.policy.filter_not_following_hint": "Cho tới khi bạn duyệt họ", + "notifications.policy.filter_not_following_title": "Những người bạn không theo dõi", + "notifications.policy.filter_private_mentions_hint": "Được lọc trừ khi nó trả lời lượt nhắc từ bạn hoặc nếu bạn theo dõi người gửi", + "notifications.policy.filter_private_mentions_title": "Lượt nhắc riêng tư không được yêu cầu", + "notifications.policy.title": "Lọc ra thông báo từ…", "notifications_permission_banner.enable": "Cho phép thông báo trên màn hình", "notifications_permission_banner.how_to_control": "Hãy bật thông báo trên màn hình để không bỏ lỡ những thông báo từ Mastodon. Một khi đã bật, bạn có thể lựa chọn từng loại thông báo khác nhau thông qua {icon} nút bên dưới.", "notifications_permission_banner.title": "Không bỏ lỡ điều thú vị nào", diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 5d62f9143e..af5e1cfea8 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -508,7 +508,7 @@ fa: private_comment: یادداشت خصوصی public_comment: یادداشت عمومی purge: پاکسازی - title: ارتباط میان‌سروری + title: ارتباط همگانی total_blocked_by_us: مسدودشده از طرف ما total_followed_by_them: ما را پی می‌گیرند total_followed_by_us: ما پیگیرشان هستیم @@ -673,7 +673,7 @@ fa: follow_recommendations: پیروی از پیشنهادها profile_directory: شاخهٔ نمایه public_timelines: خط زمانی‌های عمومی - publish_discovered_servers: انتشار سرورهای یافته‌شده + publish_discovered_servers: انتشار کارسازهای کشف شده publish_statistics: انتشار آمار title: کشف trends: پرطرفدارها @@ -898,7 +898,7 @@ fa: description: prefix_invited_by_user: "@%{name} شما را به عضویت در این کارساز ماستودون دعوت کرده است!" prefix_sign_up: همین امروز عضو ماستودون شوید! - suffix: با داشتن حساب می‌توانید دیگران را پی بگیرید، نوشته‌های تازه منتشر کنید، و با کاربران دیگر از هر سرور ماستودون دیگری و حتی سرورهای دیگر در ارتباط باشید! + suffix: با داشتن حساب می‌توانید دیگران را پی گرفته، نوشته‌هایی منتشر کرده و با کاربرانی از هر کارساز ماستودن دیگری در ارتباط باشید! didnt_get_confirmation: یک پیوند تأیید را دریافت نکردید؟ dont_have_your_security_key: کلید امنیتیتان را ندارید؟ forgot_password: گذرواژه خود را فراموش کرده‌اید؟ @@ -921,7 +921,7 @@ fa: cas: CAS saml: SAML register: عضو شوید - registration_closed: سرور %{instance} عضو تازه‌ای نمی‌پذیرد + registration_closed: کارساز %{instance} عضو تازه‌ای نمی‌پذیرد resend_confirmation: ارسال مجدد پیوند تایید reset_password: بازنشانی گذرواژه rules: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index bc73e3ee0e..156a4700eb 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1551,7 +1551,7 @@ fi: limit_reached: Erilaisten reaktioiden raja saavutettu unrecognized_emoji: ei ole tunnistettu emoji redirects: - prompt: Mikäli luotat linkkiin, jatka napsauttaen sitä. + prompt: Jos luotat linkkiin, jatka napsauttamalla sitä. title: Olet poistumassa palvelimelta %{instance}. relationships: activity: Tilin aktiivisuus @@ -1802,7 +1802,7 @@ fi: explanation: Joku on yrittänyt kirjautua tilillesi antaen väärän toisen todennustunnisteen. further_actions_html: Jos se et ollut sinä, suosittelemme, että %{action} välittömästi, sillä se on saattanut vaarantua. subject: Kaksivaiheisen todennuksen virhe - title: Kaksivaihekirjautumisen toinen vaihe epäonnistui + title: Kaksivaiheisen kirjautumisen toinen vaihe epäonnistui suspicious_sign_in: change_password: vaihda salasanasi details: 'Tässä on tiedot kirjautumisesta:' diff --git a/config/locales/lad.yml b/config/locales/lad.yml index 2293045375..8affb2a88b 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -1846,15 +1846,25 @@ lad: apps_ios_action: Abasha en App Store apps_step: Abasha muestras aplikasyones ofisyalas. apps_title: Aplikasyones de Mastodon + checklist_title: Lista de bienvenida edit_profile_action: Personaliza edit_profile_step: Kompleta tu profil para aumentar tus enteraksyones. edit_profile_title: Personaliza tu profil explanation: Aki ay algunos konsejos para ampesar feature_action: Ambezate mas + feature_audience_title: Konstruye tu audyensya kon konfyansa + feature_control_title: Manten kontrol de tu linya de tyempo + feature_creativity_title: Kreativita sin paralelas + feature_moderation_title: La moderasyon komo deveria ser follow_action: Sige follow_title: Personaliza tu linya prinsipala + follows_subtitle: Sige kuentos konesidos follows_title: A ken segir + follows_view_more: Ve mas personas para segir + hashtags_recent_count: "%{people} personas en los ultimos %{days} diyas" + hashtags_subtitle: Eksplora los trendes de los ultimos 2 diyas hashtags_title: Etiketas en trend + hashtags_view_more: Ve mas etiketas en trend post_action: Eskrive post_step: Puedes introdusirte al mundo kon teksto, fotos, videos o anketas. post_title: Eskrive tu primera publikasyon diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index e72d16a187..245c1e8528 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -116,6 +116,7 @@ be: sign_up_requires_approval: Новыя рэгістрацыі запатрабуюць вашага ўзгаднення severity: Абярыце, што будзе адбывацца з запытамі з гэтага IP rule: + hint: Неабавязкова. Пазначце дадатковыя звесткі аб правіле text: Апішыце правіла ці патрабаванне для карыстальнікаў на гэтым серверы. Імкніцеся зрабіць яго простым ды кароткім sessions: otp: 'Увядзіце код двухфактарнай аўтэнтыфікацыі з вашага тэлефона або адзін з кодаў аднаўлення:' @@ -299,6 +300,7 @@ be: patch: Апавяшчаць аб абнаўленнях з выпраўленнем памылак trending_tag: Новы трэнд патрабуе разгляду rule: + hint: Дадатковая інфармацыя text: Правіла settings: indexable: Індэксаваць профіль у пошукавых сістэмах diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 357f482b83..e4bee0214c 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -116,7 +116,7 @@ ca: sign_up_requires_approval: Els nous registres requeriran la teva aprovació severity: Tria què passarà amb les sol·licituds des d’aquesta IP rule: - hint: Opcional. Proporciona més detalls de la regla + hint: Opcional. Proporcioneu més detalls de la regla text: Descriu una norma o requeriment pels usuaris d'aquest servidor. Intenta fer-la curta i senzilla sessions: otp: 'Introdueix el codi de dos factors generat per el teu telèfon o utilitza un dels teus codis de recuperació:' diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index a312e5aa1c..03f1875451 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -62,7 +62,7 @@ fa: username: تنها می‌توانید از حروف، اعداد، و زیرخط استفاده کنید whole_word: اگر کلیدواژه فقط دارای حروف و اعداد باشد، تنها وقتی پیدا می‌شود که با کل یک واژه در متن منطبق باشد، نه با بخشی از یک واژه domain_allow: - domain: این دامین خواهد توانست داده‌ها از این سرور را دریافت کند و داده‌های از این دامین در این‌جا پردازش و ذخیره خواهند شد + domain: این دامنه خواهد توانست داده‌ها را از این کارساز واکشی کرده و داده‌های ورودی از آن پردازش و ذخیره خواهند شد email_domain_block: domain: این می‌تواند نام دامنه‌ای باشد که در نشانی رایانامه یا رکورد MX استفاده می‌شود. پس از ثبت نام بررسی خواهند شد. with_dns_records: تلاشی برای resolve کردن رکوردهای ساناد دامنهٔ داده‌شده انجام شده و نتیجه نیز مسدود خواهد شد diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index 3d79f76e8a..b1c2e91a1e 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -116,6 +116,7 @@ fi: sign_up_requires_approval: Uudet rekisteröitymiset edellyttävät hyväksyntääsi severity: Valitse, mitä tapahtuu tämän IP-osoitteen pyynnöille rule: + hint: Valinnainen. Anna lisätietoja säännöstä text: Kuvaile sääntöä tai edellytystä palvelimesi käyttäjille. Suosi tiivistä, yksinkertaista ilmaisua sessions: otp: 'Näppäile mobiilisovelluksessa näkyvä kaksivaiheisen todennuksen tunnusluku, tai käytä tarvittaessa palautuskoodia:' @@ -299,6 +300,7 @@ fi: patch: Ilmoita virhekorjauspäivityksistä trending_tag: Uusi trendi vaatii tarkistusta rule: + hint: Lisätietoja text: Sääntö settings: indexable: Sisällytä profiilisivu hakukoneisiin diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index e7b8e15616..81615c1344 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -116,6 +116,7 @@ ja: sign_up_requires_approval: 承認するまで新規登録が完了しなくなります severity: このIPに対する措置を選択してください rule: + hint: ルールについての具体的な説明を追加できます (任意) text: ユーザーのためのルールや要件を記述してください。短くシンプルにしてください。 sessions: otp: '携帯電話のアプリで生成された二要素認証コードを入力するか、リカバリーコードを使用してください:' @@ -299,6 +300,7 @@ ja: patch: 緊急のアップデートとバグ修正アップデートを通知する trending_tag: 新しいトレンドのレビューをする必要がある時 rule: + hint: ルールの補足説明 text: ルール settings: indexable: 検索エンジンからアクセスできるようにする diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index 2de24c38ff..75113be18b 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -116,6 +116,7 @@ lad: sign_up_requires_approval: Muevas enrejistrasyones rekeriran tu achetasyon severity: Eskoje lo ke pasara kon las petisyones dizde este IP rule: + hint: Opsyonal. Adjusta mas detalyos sovre la regla text: Deskrive una norma o rekerensya para los utilizadores de este sirvidor. Aprova fazerla kurta i kolay sessions: otp: 'Introduse el kodiche de autentifikasyon de dos pasos djenerado por tu aplikasyon de telefon o uza uno de tus kodiches de recuperasyon:' diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml index 6ed095e2a2..13296a04ce 100644 --- a/config/locales/simple_form.sr-Latn.yml +++ b/config/locales/simple_form.sr-Latn.yml @@ -116,6 +116,7 @@ sr-Latn: sign_up_requires_approval: Nove registracije će zahtevati Vaše odobrenje severity: Izaberite šta će se desiti sa zahtevima sa ove IP adrese rule: + hint: Opcionalno. Pružite više detalja o pravilu text: Opišite pravilo ili uslov za korisnike na ovom serveru. Potrudite se da opis bude kratak i jednostavan sessions: otp: 'Unesite dvofaktorski kod sa Vašeg telefona ili koristite jedan od kodova za oporavak:' diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index 4fb32000b7..9820482182 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -116,6 +116,7 @@ sr: sign_up_requires_approval: Нове регистрације ће захтевати Ваше одобрење severity: Изаберите шта ће се десити са захтевима са ове IP адресе rule: + hint: Опционално. Пружите више детаља о правилу text: Опишите правило или услов за кориснике на овом серверу. Потрудите се да опис буде кратак и једноставан sessions: otp: 'Унесите двофакторски код са Вашег телефона или користите један од кодова за опоравак:' diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index cc644d4df4..16c23caeb0 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -116,6 +116,7 @@ tr: sign_up_requires_approval: Yeni kayıt onayınızı gerektirir severity: Bu IP'den gelen isteklere ne olacağını seçin rule: + hint: İsteğe bağlı. Kural hakkında daha fazla ayrıntı verin text: Bu sunucu üzerindeki kullanıcılar için bir kural veya gereksinimi tanımlayın. Kuralı kısa ve yalın tutmaya çalışın sessions: otp: 'Telefonunuzdaki two-factor kodunuzu giriniz veya kurtarma kodlarınızdan birini giriniz:' @@ -299,6 +300,7 @@ tr: patch: Yama güncellemelerini bildir trending_tag: Yeni eğilimin gözden geçmesi gerekiyor rule: + hint: Ek bilgi text: Kural settings: indexable: Arama motorları profil sayfasını içersin diff --git a/config/locales/sq.yml b/config/locales/sq.yml index ecf79da51a..0aa7ad34bc 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1843,6 +1843,7 @@ sq: apps_step: Shkarkoni aplikacionet tona zyrtare. apps_title: Aplikacione Mastodon checklist_subtitle: 'Le t’ju vëmë në udhë drejt këtij horizonti të ri rrjetesh shoqërorë:' + checklist_title: Listë hapash mirëseardhjeje edit_profile_action: Personalizojeni edit_profile_step: Përforconi ndërveprimet tuaja, duke pasur një profil shterues. edit_profile_title: Personalizoni profilin tuaj From acf3f410aef3cfb9e8f5f73042526de9b2f96d13 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Wed, 13 Mar 2024 13:54:50 +0100 Subject: [PATCH 169/954] Fix navigation panel icons missing classes (#29569) --- .../mastodon/features/ui/components/navigation_panel.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx index deda3258b9..f2b40af72b 100644 --- a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx +++ b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx @@ -64,8 +64,8 @@ const NotificationsLink = () => { } - activeIcon={} + icon={} + activeIcon={} text={intl.formatMessage(messages.notifications)} /> ); @@ -88,8 +88,8 @@ const FollowRequestsLink = () => { } - activeIcon={} + icon={} + activeIcon={} text={intl.formatMessage(messages.followRequests)} /> ); From c09b8a716473ff251ecd81fe6050a38133ddabb0 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Mar 2024 10:11:23 -0400 Subject: [PATCH 170/954] Add `Account.without_internal` scope (#29559) Co-authored-by: Claire --- app/controllers/application_controller.rb | 2 +- app/helpers/application_helper.rb | 2 +- app/models/account.rb | 1 + spec/models/account_spec.rb | 8 ++++---- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index a046ea19c9..8ba10d64c0 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -129,7 +129,7 @@ class ApplicationController < ActionController::Base end def single_user_mode? - @single_user_mode ||= Rails.configuration.x.single_user_mode && Account.where('id > 0').exists? + @single_user_mode ||= Rails.configuration.x.single_user_mode && Account.without_internal.exists? end def use_seamless_external_login? diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 4f7f66985d..a4f92743c5 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -213,7 +213,7 @@ module ApplicationHelper state_params[:moved_to_account] = current_account.moved_to_account end - state_params[:owner] = Account.local.without_suspended.where('id > 0').first if single_user_mode? + state_params[:owner] = Account.local.without_suspended.without_internal.first if single_user_mode? json = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(state_params), serializer: InitialStateSerializer).to_json # rubocop:disable Rails/OutputSafety diff --git a/app/models/account.rb b/app/models/account.rb index d627fd6b64..0a4c0f3478 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -111,6 +111,7 @@ class Account < ApplicationRecord normalizes :username, with: ->(username) { username.squish } + scope :without_internal, -> { where(id: 1...) } scope :remote, -> { where.not(domain: nil) } scope :local, -> { where(domain: nil) } scope :partitioned, -> { order(Arel.sql('row_number() over (partition by domain)')) } diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index f6376eb36e..bdb33e53ce 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -888,7 +888,7 @@ RSpec.describe Account do { username: 'b', domain: 'b' }, ].map(&method(:Fabricate).curry(2).call(:account)) - expect(described_class.where('id > 0').alphabetic).to eq matches + expect(described_class.without_internal.alphabetic).to eq matches end end @@ -939,7 +939,7 @@ RSpec.describe Account do it 'returns an array of accounts who do not have a domain' do local_account = Fabricate(:account, domain: nil) _account_with_domain = Fabricate(:account, domain: 'example.com') - expect(described_class.where('id > 0').local).to contain_exactly(local_account) + expect(described_class.without_internal.local).to contain_exactly(local_account) end end @@ -950,14 +950,14 @@ RSpec.describe Account do matches[index] = Fabricate(:account, domain: matches[index]) end - expect(described_class.where('id > 0').partitioned).to match_array(matches) + expect(described_class.without_internal.partitioned).to match_array(matches) end end describe 'recent' do it 'returns a relation of accounts sorted by recent creation' do matches = Array.new(2) { Fabricate(:account) } - expect(described_class.where('id > 0').recent).to match_array(matches) + expect(described_class.without_internal.recent).to match_array(matches) end end From 6262ceeb704c9636f09c25e856638ee4441b58d9 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Mar 2024 11:42:39 -0400 Subject: [PATCH 171/954] Fix `RSpec/DescribedClass` cop (#29472) --- spec/lib/feed_manager_spec.rb | 12 +++++----- spec/lib/sanitize/config_spec.rb | 2 +- spec/lib/signature_parser_spec.rb | 2 +- spec/lib/webfinger_resource_spec.rb | 4 ++-- spec/models/account_spec.rb | 2 +- spec/models/form/import_spec.rb | 2 +- spec/models/privacy_policy_spec.rb | 2 +- spec/models/tag_spec.rb | 2 +- spec/models/user_role_spec.rb | 22 +++++++++---------- spec/models/user_settings_spec.rb | 4 ++-- spec/services/post_status_service_spec.rb | 2 +- .../validators/follow_limit_validator_spec.rb | 2 +- 12 files changed, 29 insertions(+), 29 deletions(-) diff --git a/spec/lib/feed_manager_spec.rb b/spec/lib/feed_manager_spec.rb index 618b6167bd..613bcb3045 100644 --- a/spec/lib/feed_manager_spec.rb +++ b/spec/lib/feed_manager_spec.rb @@ -11,7 +11,7 @@ RSpec.describe FeedManager do end it 'tracks at least as many statuses as reblogs', :skip_stub do - expect(FeedManager::REBLOG_FALLOFF).to be <= FeedManager::MAX_ITEMS + expect(described_class::REBLOG_FALLOFF).to be <= described_class::MAX_ITEMS end describe '#key' do @@ -225,12 +225,12 @@ RSpec.describe FeedManager do it 'trims timelines if they will have more than FeedManager::MAX_ITEMS' do account = Fabricate(:account) status = Fabricate(:status) - members = Array.new(FeedManager::MAX_ITEMS) { |count| [count, count] } + members = Array.new(described_class::MAX_ITEMS) { |count| [count, count] } redis.zadd("feed:home:#{account.id}", members) described_class.instance.push_to_home(account, status) - expect(redis.zcard("feed:home:#{account.id}")).to eq FeedManager::MAX_ITEMS + expect(redis.zcard("feed:home:#{account.id}")).to eq described_class::MAX_ITEMS end context 'with reblogs' do @@ -260,7 +260,7 @@ RSpec.describe FeedManager do described_class.instance.push_to_home(account, reblogged) # Fill the feed with intervening statuses - FeedManager::REBLOG_FALLOFF.times do + described_class::REBLOG_FALLOFF.times do described_class.instance.push_to_home(account, Fabricate(:status)) end @@ -321,7 +321,7 @@ RSpec.describe FeedManager do described_class.instance.push_to_home(account, reblogs.first) # Fill the feed with intervening statuses - FeedManager::REBLOG_FALLOFF.times do + described_class::REBLOG_FALLOFF.times do described_class.instance.push_to_home(account, Fabricate(:status)) end @@ -467,7 +467,7 @@ RSpec.describe FeedManager do status = Fabricate(:status, reblog: reblogged) described_class.instance.push_to_home(receiver, reblogged) - FeedManager::REBLOG_FALLOFF.times { described_class.instance.push_to_home(receiver, Fabricate(:status)) } + described_class::REBLOG_FALLOFF.times { described_class.instance.push_to_home(receiver, Fabricate(:status)) } described_class.instance.push_to_home(receiver, status) # The reblogging status should show up under normal conditions. diff --git a/spec/lib/sanitize/config_spec.rb b/spec/lib/sanitize/config_spec.rb index 550ad1c52b..2d8dc2f63b 100644 --- a/spec/lib/sanitize/config_spec.rb +++ b/spec/lib/sanitize/config_spec.rb @@ -4,7 +4,7 @@ require 'rails_helper' describe Sanitize::Config do describe '::MASTODON_STRICT' do - subject { Sanitize::Config::MASTODON_STRICT } + subject { described_class::MASTODON_STRICT } it 'converts h1 to p strong' do expect(Sanitize.fragment('

Foo

', subject)).to eq '

Foo

' diff --git a/spec/lib/signature_parser_spec.rb b/spec/lib/signature_parser_spec.rb index 08e9bea66c..3f398e8dd0 100644 --- a/spec/lib/signature_parser_spec.rb +++ b/spec/lib/signature_parser_spec.rb @@ -27,7 +27,7 @@ RSpec.describe SignatureParser do let(:header) { 'hello this is malformed!' } it 'raises an error' do - expect { subject }.to raise_error(SignatureParser::ParsingError) + expect { subject }.to raise_error(described_class::ParsingError) end end end diff --git a/spec/lib/webfinger_resource_spec.rb b/spec/lib/webfinger_resource_spec.rb index 0e2bdcb71a..442f91aad0 100644 --- a/spec/lib/webfinger_resource_spec.rb +++ b/spec/lib/webfinger_resource_spec.rb @@ -46,7 +46,7 @@ describe WebfingerResource do expect do described_class.new(resource).username - end.to raise_error(WebfingerResource::InvalidRequest) + end.to raise_error(described_class::InvalidRequest) end it 'finds the username in a valid https route' do @@ -137,7 +137,7 @@ describe WebfingerResource do expect do described_class.new(resource).username - end.to raise_error(WebfingerResource::InvalidRequest) + end.to raise_error(described_class::InvalidRequest) end end end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index bdb33e53ce..2c5df198d9 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -678,7 +678,7 @@ RSpec.describe Account do end describe 'MENTION_RE' do - subject { Account::MENTION_RE } + subject { described_class::MENTION_RE } it 'matches usernames in the middle of a sentence' do expect(subject.match('Hello to @alice from me')[1]).to eq 'alice' diff --git a/spec/models/form/import_spec.rb b/spec/models/form/import_spec.rb index 872697485e..c2f41d442c 100644 --- a/spec/models/form/import_spec.rb +++ b/spec/models/form/import_spec.rb @@ -30,7 +30,7 @@ RSpec.describe Form::Import do it 'has errors' do subject.validate - expect(subject.errors[:data]).to include(I18n.t('imports.errors.over_rows_processing_limit', count: Form::Import::ROWS_PROCESSING_LIMIT)) + expect(subject.errors[:data]).to include(I18n.t('imports.errors.over_rows_processing_limit', count: described_class::ROWS_PROCESSING_LIMIT)) end end diff --git a/spec/models/privacy_policy_spec.rb b/spec/models/privacy_policy_spec.rb index 0d74713755..03bbe7264b 100644 --- a/spec/models/privacy_policy_spec.rb +++ b/spec/models/privacy_policy_spec.rb @@ -8,7 +8,7 @@ describe PrivacyPolicy do it 'has the privacy text' do policy = described_class.current - expect(policy.text).to eq(PrivacyPolicy::DEFAULT_PRIVACY_POLICY) + expect(policy.text).to eq(described_class::DEFAULT_PRIVACY_POLICY) end end diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb index 69aaeed0af..5a1d620884 100644 --- a/spec/models/tag_spec.rb +++ b/spec/models/tag_spec.rb @@ -22,7 +22,7 @@ RSpec.describe Tag do end describe 'HASHTAG_RE' do - subject { Tag::HASHTAG_RE } + subject { described_class::HASHTAG_RE } it 'does not match URLs with anchors with non-hashtag characters' do expect(subject.match('Check this out https://medium.com/@alice/some-article#.abcdef123')).to be_nil diff --git a/spec/models/user_role_spec.rb b/spec/models/user_role_spec.rb index 96d12263ae..4ab66c3260 100644 --- a/spec/models/user_role_spec.rb +++ b/spec/models/user_role_spec.rb @@ -8,7 +8,7 @@ RSpec.describe UserRole do describe '#can?' do context 'with a single flag' do it 'returns true if any of them are present' do - subject.permissions = UserRole::FLAGS[:manage_reports] + subject.permissions = described_class::FLAGS[:manage_reports] expect(subject.can?(:manage_reports)).to be true end @@ -19,7 +19,7 @@ RSpec.describe UserRole do context 'with multiple flags' do it 'returns true if any of them are present' do - subject.permissions = UserRole::FLAGS[:manage_users] + subject.permissions = described_class::FLAGS[:manage_users] expect(subject.can?(:manage_reports, :manage_users)).to be true end @@ -51,7 +51,7 @@ RSpec.describe UserRole do describe '#permissions_as_keys' do before do - subject.permissions = UserRole::FLAGS[:invite_users] | UserRole::FLAGS[:view_dashboard] | UserRole::FLAGS[:manage_reports] + subject.permissions = described_class::FLAGS[:invite_users] | described_class::FLAGS[:view_dashboard] | described_class::FLAGS[:manage_reports] end it 'returns an array' do @@ -70,7 +70,7 @@ RSpec.describe UserRole do let(:input) { %w(manage_users) } it 'sets permission flags' do - expect(subject.permissions).to eq UserRole::FLAGS[:manage_users] + expect(subject.permissions).to eq described_class::FLAGS[:manage_users] end end @@ -78,7 +78,7 @@ RSpec.describe UserRole do let(:input) { %w(manage_users manage_reports) } it 'sets permission flags' do - expect(subject.permissions).to eq UserRole::FLAGS[:manage_users] | UserRole::FLAGS[:manage_reports] + expect(subject.permissions).to eq described_class::FLAGS[:manage_users] | described_class::FLAGS[:manage_reports] end end @@ -86,7 +86,7 @@ RSpec.describe UserRole do let(:input) { %w(foo) } it 'does not set permission flags' do - expect(subject.permissions).to eq UserRole::Flags::NONE + expect(subject.permissions).to eq described_class::Flags::NONE end end end @@ -96,7 +96,7 @@ RSpec.describe UserRole do subject { described_class.nobody } it 'returns none' do - expect(subject.computed_permissions).to eq UserRole::Flags::NONE + expect(subject.computed_permissions).to eq described_class::Flags::NONE end end @@ -110,11 +110,11 @@ RSpec.describe UserRole do context 'when role has the administrator flag' do before do - subject.permissions = UserRole::FLAGS[:administrator] + subject.permissions = described_class::FLAGS[:administrator] end it 'returns all permissions' do - expect(subject.computed_permissions).to eq UserRole::Flags::ALL + expect(subject.computed_permissions).to eq described_class::Flags::ALL end end @@ -135,7 +135,7 @@ RSpec.describe UserRole do end it 'has default permissions' do - expect(subject.permissions).to eq UserRole::FLAGS[:invite_users] + expect(subject.permissions).to eq described_class::FLAGS[:invite_users] end it 'has negative position' do @@ -155,7 +155,7 @@ RSpec.describe UserRole do end it 'has no permissions' do - expect(subject.permissions).to eq UserRole::Flags::NONE + expect(subject.permissions).to eq described_class::Flags::NONE end it 'has negative position' do diff --git a/spec/models/user_settings_spec.rb b/spec/models/user_settings_spec.rb index 653597c90d..dfc4910d6e 100644 --- a/spec/models/user_settings_spec.rb +++ b/spec/models/user_settings_spec.rb @@ -24,7 +24,7 @@ RSpec.describe UserSettings do context 'when setting was not defined' do it 'raises error' do - expect { subject[:foo] }.to raise_error UserSettings::KeyError + expect { subject[:foo] }.to raise_error described_class::KeyError end end end @@ -93,7 +93,7 @@ RSpec.describe UserSettings do describe '.definition_for' do context 'when key is defined' do it 'returns a setting' do - expect(described_class.definition_for(:always_send_emails)).to be_a UserSettings::Setting + expect(described_class.definition_for(:always_send_emails)).to be_a described_class::Setting end end diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index ee68092a36..3c2e4f3a79 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -150,7 +150,7 @@ RSpec.describe PostStatusService do expect do subject.call(account, text: '@alice hm, @bob is really annoying lately', allowed_mentions: [mentioned_account.id]) - end.to raise_error(an_instance_of(PostStatusService::UnexpectedMentionsError).and(having_attributes(accounts: [unexpected_mentioned_account]))) + end.to raise_error(an_instance_of(described_class::UnexpectedMentionsError).and(having_attributes(accounts: [unexpected_mentioned_account]))) end it 'processes duplicate mentions correctly' do diff --git a/spec/validators/follow_limit_validator_spec.rb b/spec/validators/follow_limit_validator_spec.rb index 51b0683d27..e069b0ed3a 100644 --- a/spec/validators/follow_limit_validator_spec.rb +++ b/spec/validators/follow_limit_validator_spec.rb @@ -56,7 +56,7 @@ RSpec.describe FollowLimitValidator do follow.valid? - expect(follow.errors[:base]).to include(I18n.t('users.follow_limit_reached', limit: FollowLimitValidator::LIMIT)) + expect(follow.errors[:base]).to include(I18n.t('users.follow_limit_reached', limit: described_class::LIMIT)) end end From 71e5f0f48c3bc95a894fa3ad2c5a34f05c584482 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Mar 2024 11:43:40 -0400 Subject: [PATCH 172/954] Add coverage for suspended instance actor scenario (#29571) --- spec/controllers/instance_actors_controller_spec.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/controllers/instance_actors_controller_spec.rb b/spec/controllers/instance_actors_controller_spec.rb index 70aaff9d65..42ffb67988 100644 --- a/spec/controllers/instance_actors_controller_spec.rb +++ b/spec/controllers/instance_actors_controller_spec.rb @@ -41,6 +41,14 @@ RSpec.describe InstanceActorsController do it_behaves_like 'shared behavior' end + + context 'with a suspended instance actor' do + let(:authorized_fetch_mode) { false } + + before { Account.representative.update(suspended_at: 10.days.ago) } + + it_behaves_like 'shared behavior' + end end end end From a32a126cac42c73236236b5a9bd660765b9c58ee Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 13 Mar 2024 17:47:48 +0100 Subject: [PATCH 173/954] Hide media by default in notification requests (#29572) --- app/javascript/mastodon/components/status.jsx | 25 ++++++----- .../features/notifications/request.jsx | 41 ++++++++++--------- .../ui/util/sensitive_media_context.tsx | 28 +++++++++++++ 3 files changed, 65 insertions(+), 29 deletions(-) create mode 100644 app/javascript/mastodon/features/ui/util/sensitive_media_context.tsx diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index be9a1cec65..7b97e45766 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -22,6 +22,7 @@ import Card from '../features/status/components/card'; // to use the progress bar to show download progress import Bundle from '../features/ui/components/bundle'; import { MediaGallery, Video, Audio } from '../features/ui/util/async-components'; +import { SensitiveMediaContext } from '../features/ui/util/sensitive_media_context'; import { displayMedia } from '../initial_state'; import { Avatar } from './avatar'; @@ -78,6 +79,8 @@ const messages = defineMessages({ class Status extends ImmutablePureComponent { + static contextType = SensitiveMediaContext; + static propTypes = { status: ImmutablePropTypes.map, account: ImmutablePropTypes.record, @@ -133,19 +136,21 @@ class Status extends ImmutablePureComponent { ]; state = { - showMedia: defaultMediaVisibility(this.props.status), - statusId: undefined, + showMedia: defaultMediaVisibility(this.props.status) && !(this.context?.hideMediaByDefault), forceFilter: undefined, }; - static getDerivedStateFromProps(nextProps, prevState) { - if (nextProps.status && nextProps.status.get('id') !== prevState.statusId) { - return { - showMedia: defaultMediaVisibility(nextProps.status), - statusId: nextProps.status.get('id'), - }; - } else { - return null; + componentDidUpdate (prevProps) { + // This will potentially cause a wasteful redraw, but in most cases `Status` components are used + // with a `key` directly depending on their `id`, preventing re-use of the component across + // different IDs. + // But just in case this does change, reset the state on status change. + + if (this.props.status?.get('id') !== prevProps.status?.get('id')) { + this.setState({ + showMedia: defaultMediaVisibility(this.props.status) && !(this.context?.hideMediaByDefault), + forceFilter: undefined, + }); } } diff --git a/app/javascript/mastodon/features/notifications/request.jsx b/app/javascript/mastodon/features/notifications/request.jsx index 5977a6ce96..da9ed21e55 100644 --- a/app/javascript/mastodon/features/notifications/request.jsx +++ b/app/javascript/mastodon/features/notifications/request.jsx @@ -15,6 +15,7 @@ import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; import { IconButton } from 'mastodon/components/icon_button'; import ScrollableList from 'mastodon/components/scrollable_list'; +import { SensitiveMediaContextProvider } from 'mastodon/features/ui/util/sensitive_media_context'; import NotificationContainer from './containers/notification_container'; @@ -106,25 +107,27 @@ export const NotificationRequest = ({ multiColumn, params: { id } }) => { )} /> - - {notifications.map(item => ( - item && - ))} - + + + {notifications.map(item => ( + item && + ))} + + {columnTitle} diff --git a/app/javascript/mastodon/features/ui/util/sensitive_media_context.tsx b/app/javascript/mastodon/features/ui/util/sensitive_media_context.tsx new file mode 100644 index 0000000000..408154c31b --- /dev/null +++ b/app/javascript/mastodon/features/ui/util/sensitive_media_context.tsx @@ -0,0 +1,28 @@ +import { createContext, useContext, useMemo } from 'react'; + +export const SensitiveMediaContext = createContext<{ + hideMediaByDefault: boolean; +}>({ + hideMediaByDefault: false, +}); + +export function useSensitiveMediaContext() { + return useContext(SensitiveMediaContext); +} + +type ContextValue = React.ContextType; + +export const SensitiveMediaContextProvider: React.FC< + React.PropsWithChildren<{ hideMediaByDefault: boolean }> +> = ({ hideMediaByDefault, children }) => { + const contextValue = useMemo( + () => ({ hideMediaByDefault }), + [hideMediaByDefault], + ); + + return ( + + {children} + + ); +}; From 3156d04ec12294b4b211b191b22d245e18aba024 Mon Sep 17 00:00:00 2001 From: mogaminsk Date: Thu, 14 Mar 2024 17:58:44 +0900 Subject: [PATCH 174/954] Use sender's `username` to column title in notification request if it's `display_name` is not set (#29575) --- app/javascript/mastodon/features/notifications/request.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/notifications/request.jsx b/app/javascript/mastodon/features/notifications/request.jsx index da9ed21e55..d1f4498440 100644 --- a/app/javascript/mastodon/features/notifications/request.jsx +++ b/app/javascript/mastodon/features/notifications/request.jsx @@ -88,7 +88,7 @@ export const NotificationRequest = ({ multiColumn, params: { id } }) => { } }, [dispatch, accountId]); - const columnTitle = intl.formatMessage(messages.title, { name: account?.get('display_name') }); + const columnTitle = intl.formatMessage(messages.title, { name: account?.get('display_name') || account?.get('username') }); return ( From 42875fee52857ddf9745d056f5da7159cf4f22e6 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 14 Mar 2024 04:58:53 -0400 Subject: [PATCH 175/954] Add coverage for bad args/options in `CLI::Domains#purge` (#29578) --- spec/lib/mastodon/cli/domains_spec.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/spec/lib/mastodon/cli/domains_spec.rb b/spec/lib/mastodon/cli/domains_spec.rb index 24f341c124..448e6fe42b 100644 --- a/spec/lib/mastodon/cli/domains_spec.rb +++ b/spec/lib/mastodon/cli/domains_spec.rb @@ -15,6 +15,23 @@ describe Mastodon::CLI::Domains do describe '#purge' do let(:action) { :purge } + context 'with invalid limited federation mode argument' do + let(:arguments) { ['example.host'] } + let(:options) { { limited_federation_mode: true } } + + it 'warns about usage and exits' do + expect { subject } + .to raise_error(Thor::Error, /DOMAIN parameter not supported/) + end + end + + context 'without a domains argument' do + it 'warns about usage and exits' do + expect { subject } + .to raise_error(Thor::Error, 'No domain(s) given') + end + end + context 'with accounts from the domain' do let(:domain) { 'host.example' } let!(:account) { Fabricate(:account, domain: domain) } From 5aea35de13a74a3d3cfec734cc1fbe176c84cfa1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 10:00:42 +0100 Subject: [PATCH 176/954] New Crowdin Translations (automated) (#29587) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/ca.json | 7 ++++--- app/javascript/mastodon/locales/fi.json | 5 +++++ app/javascript/mastodon/locales/he.json | 1 + app/javascript/mastodon/locales/kab.json | 2 +- app/javascript/mastodon/locales/nn.json | 16 ++++++++++++++++ app/javascript/mastodon/locales/pt-PT.json | 3 +++ app/javascript/mastodon/locales/th.json | 1 + app/javascript/mastodon/locales/vi.json | 4 ++-- config/locales/fi.yml | 3 +++ config/locales/kab.yml | 2 ++ config/locales/simple_form.kab.yml | 4 ++++ 11 files changed, 42 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 8ba140d207..27c1532768 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -272,6 +272,7 @@ "filter_modal.select_filter.subtitle": "Usa una categoria existent o crea'n una de nova", "filter_modal.select_filter.title": "Filtra aquest tut", "filter_modal.title.status": "Filtra un tut", + "filtered_notifications_banner.pending_requests": "Notificacions {count, plural, =0 {de ningú} one {d'una persona} other {de # persones}} que potser coneixes", "filtered_notifications_banner.title": "Notificacions filtrades", "firehose.all": "Tots", "firehose.local": "Aquest servidor", @@ -476,13 +477,13 @@ "notifications.permission_denied": "Les notificacions d’escriptori no estan disponibles perquè prèviament s’ha denegat el permís al navegador", "notifications.permission_denied_alert": "No es poden activar les notificacions de l'escriptori perquè abans s'ha denegat el permís del navegador", "notifications.permission_required": "Les notificacions d'escriptori no estan disponibles perquè el permís requerit no ha estat concedit.", - "notifications.policy.filter_new_accounts.hint": "Creat durant els passats {days, plural, one {un dia} other {# dies}}", + "notifications.policy.filter_new_accounts.hint": "Creat {days, plural, one {ahir} other {durant els # dies passats}}", "notifications.policy.filter_new_accounts_title": "Comptes nous", - "notifications.policy.filter_not_followers_hint": "Incloent les persones que us segueixen fa menys de {days, plural, one {un dia} other {# dies}}", + "notifications.policy.filter_not_followers_hint": "Incloent les persones que us segueixen fa menys {days, plural, one {d'un dia} other {de # dies}}", "notifications.policy.filter_not_followers_title": "Persones que no us segueixen", "notifications.policy.filter_not_following_hint": "Fins que no ho aproveu de forma manual", "notifications.policy.filter_not_following_title": "Persones que no seguiu", - "notifications.policy.filter_private_mentions_hint": "Filtra-ho excepte si és en resposta a una menció vostra o si seguiu el remitent", + "notifications.policy.filter_private_mentions_hint": "Filtrat si no és que és en resposta a una menció vostra o si seguiu el remitent", "notifications.policy.filter_private_mentions_title": "Mencions privades no sol·licitades", "notifications.policy.title": "Filtra les notificacions de…", "notifications_permission_banner.enable": "Activa les notificacions d’escriptori", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 93e758dd40..9acae62de4 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -241,6 +241,7 @@ "empty_column.list": "Tällä listalla ei ole vielä mitään. Kun tämän listan jäsenet lähettävät uusia julkaisuja, ne näkyvät tässä.", "empty_column.lists": "Sinulla ei ole vielä yhtään listaa. Kun luot sellaisen, näkyy se tässä.", "empty_column.mutes": "Et ole mykistänyt vielä yhtään käyttäjää.", + "empty_column.notification_requests": "Kaikki kunnossa! Täällä ei ole mitään. Kun saat uusia ilmoituksia, ne näkyvät täällä asetustesi mukaisesti.", "empty_column.notifications": "Sinulla ei ole vielä ilmoituksia. Kun keskustelet muille, näet sen täällä.", "empty_column.public": "Täällä ei ole mitään! Kirjoita jotain julkisesti. Voit myös seurata muiden palvelimien käyttäjiä", "error.unexpected_crash.explanation": "Sivua ei voida näyttää oikein ohjelmointivirheen tai selaimen yhteensopivuusvajeen vuoksi.", @@ -271,6 +272,7 @@ "filter_modal.select_filter.subtitle": "Käytä olemassa olevaa luokkaa tai luo uusi", "filter_modal.select_filter.title": "Suodata tämä julkaisu", "filter_modal.title.status": "Suodata julkaisu", + "filtered_notifications_banner.pending_requests": "Ilmoitukset, {count, plural, =0 {ei tänään} one {1 henkilö} other {# henkilöä}}", "filtered_notifications_banner.title": "Suodatetut ilmoitukset", "firehose.all": "Kaikki", "firehose.local": "Tämä palvelin", @@ -477,8 +479,11 @@ "notifications.permission_required": "Työpöytäilmoitukset eivät ole käytettävissä, koska siihen tarvittavaa lupaa ei ole myönnetty.", "notifications.policy.filter_new_accounts.hint": "Luotu {days, plural, one {viime päivänä} other {viimeisenä # päivänä}}", "notifications.policy.filter_new_accounts_title": "Uudet tilit", + "notifications.policy.filter_not_followers_hint": "Mukaan lukien ne, jotka ovat seuranneet sinua vähemmän kuin {days, plural, one {päivän} other {# päivää}}", "notifications.policy.filter_not_followers_title": "Henkilöt, jotka eivät seuraa sinua", + "notifications.policy.filter_not_following_hint": "Kunnes hyväksyt ne manuaalisesti", "notifications.policy.filter_not_following_title": "Henkilöt, joita et seuraa", + "notifications.policy.filter_private_mentions_hint": "Suodatetaan, ellei se vastaa omaan mainintaan tai jos seuraat lähettäjää", "notifications.policy.filter_private_mentions_title": "Ei-toivotut yksityismaininnat", "notifications.policy.title": "Suodata ilmoitukset pois kohteesta…", "notifications_permission_banner.enable": "Ota työpöytäilmoitukset käyttöön", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index af6b1c6118..53e2653130 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -272,6 +272,7 @@ "filter_modal.select_filter.subtitle": "שימוש בקטגורייה קיימת או יצירת אחת חדשה", "filter_modal.select_filter.title": "סינון ההודעה הזו", "filter_modal.title.status": "סנן הודעה", + "filtered_notifications_banner.pending_requests": "{count, plural,=0 {אין התראות ממשתמשים ה}one {התראה אחת ממישהו/מישהי ה}two {יש התראותיים ממשתמשים }other {יש # התראות ממשתמשים }}מוכרים לך", "filtered_notifications_banner.title": "התראות מסוננות", "firehose.all": "הכל", "firehose.local": "שרת זה", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 4ffae68bd0..db770b427a 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -320,7 +320,7 @@ "mute_modal.hide_notifications": "Tebɣiḍ ad teffreḍ talɣutin n umseqdac-a?", "mute_modal.indefinite": "Ur yettwasbadu ara", "navigation_bar.about": "Ɣef", - "navigation_bar.blocks": "Imseqdacen yettusḥebsen", + "navigation_bar.blocks": "Iseqdacen yettusḥebsen", "navigation_bar.bookmarks": "Ticraḍ", "navigation_bar.community_timeline": "Tasuddemt tadigant", "navigation_bar.compose": "Aru tajewwiqt tamaynut", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index b8a0512b8c..94fee3498d 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -241,6 +241,7 @@ "empty_column.list": "Det er ingenting i denne lista enno. Når medlemer av denne lista legg ut nye statusar, så dukkar dei opp her.", "empty_column.lists": "Du har ingen lister enno. Når du lagar ei, så dukkar ho opp her.", "empty_column.mutes": "Du har ikkje målbunde nokon enno.", + "empty_column.notification_requests": "Ferdig! Her er det ingenting. Når du får nye varsel, kjem dei opp her slik du har valt.", "empty_column.notifications": "Du har ingen varsel enno. Kommuniser med andre for å starte samtalen.", "empty_column.public": "Det er ingenting her! Skriv noko offentleg, eller følg brukarar frå andre tenarar manuelt for å fylle det opp", "error.unexpected_crash.explanation": "På grunn av eit nettlesarkompatibilitetsproblem eller ein feil i koden vår, kunne ikkje denne sida bli vist slik den skal.", @@ -271,6 +272,8 @@ "filter_modal.select_filter.subtitle": "Bruk ein eksisterande kategori eller opprett ein ny", "filter_modal.select_filter.title": "Filtrer dette innlegget", "filter_modal.title.status": "Filtrer eit innlegg", + "filtered_notifications_banner.pending_requests": "Varsel frå {count, plural, =0 {ingen} one {ein person} other {# folk}} du kanskje kjenner", + "filtered_notifications_banner.title": "Filtrerte varslingar", "firehose.all": "Alle", "firehose.local": "Denne tenaren", "firehose.remote": "Andre tenarar", @@ -439,6 +442,10 @@ "notification.reblog": "{name} framheva innlegget ditt", "notification.status": "{name} la nettopp ut", "notification.update": "{name} redigerte eit innlegg", + "notification_requests.accept": "Godkjenn", + "notification_requests.dismiss": "Avvis", + "notification_requests.notifications_from": "Varslingar frå {name}", + "notification_requests.title": "Filtrerte varslingar", "notifications.clear": "Tøm varsel", "notifications.clear_confirmation": "Er du sikker på at du vil fjerna alle varsla dine for alltid?", "notifications.column_settings.admin.report": "Nye rapportar:", @@ -470,6 +477,15 @@ "notifications.permission_denied": "Skrivebordsvarsel er ikkje tilgjengelege på grunn av at nettlesaren tidlegare ikkje har fått naudsynte rettar til å vise dei", "notifications.permission_denied_alert": "Sidan nettlesaren tidlegare har blitt nekta naudsynte rettar, kan ikkje skrivebordsvarsel aktiverast", "notifications.permission_required": "Skrivebordsvarsel er utilgjengelege fordi naudsynte rettar ikkje er gitt.", + "notifications.policy.filter_new_accounts.hint": "Skrive siste {days, plural, one {dag} other {# dagar}}", + "notifications.policy.filter_new_accounts_title": "Nye brukarkontoar", + "notifications.policy.filter_not_followers_hint": "Inkludert folk som har fylgt deg mindre enn {days, plural, one {ein dag} other {# dagar}}", + "notifications.policy.filter_not_followers_title": "Folk som ikkje fylgjer deg", + "notifications.policy.filter_not_following_hint": "Til du godkjenner dei manuelt", + "notifications.policy.filter_not_following_title": "Folk du ikkje fylgjer", + "notifications.policy.filter_private_mentions_hint": "Filtrert viss det ikkje er eit svar på dine eigne nemningar eller viss du fylgjer avsendaren", + "notifications.policy.filter_private_mentions_title": "Masseutsende private nemningar", + "notifications.policy.title": "Filtrer ut varslingar frå…", "notifications_permission_banner.enable": "Skru på skrivebordsvarsel", "notifications_permission_banner.how_to_control": "Aktiver skrivebordsvarsel for å få varsel når Mastodon ikkje er open. Du kan nøye bestemme kva samhandlingar som skal føre til skrivebordsvarsel gjennom {icon}-knappen ovanfor etter at varsel er aktivert.", "notifications_permission_banner.title": "Gå aldri glipp av noko", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index da947f9bf4..18a550d641 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -272,6 +272,7 @@ "filter_modal.select_filter.subtitle": "Utilize uma categoria existente ou crie uma nova", "filter_modal.select_filter.title": "Filtrar esta publicação", "filter_modal.title.status": "Filtrar uma publicação", + "filtered_notifications_banner.pending_requests": "Notificações de {count, plural, =0 {ninguém} one {uma pessoa} other {# pessoas}} que talvez conheça", "filtered_notifications_banner.title": "Notificações filtradas", "firehose.all": "Todas", "firehose.local": "Este servidor", @@ -476,7 +477,9 @@ "notifications.permission_denied": "Notificações no ambiente de trabalho não estão disponíveis porque a permissão, solicitada pelo navegador, foi recusada anteriormente", "notifications.permission_denied_alert": "Notificações no ambiente de trabalho não podem ser ativadas, pois a permissão do navegador foi recusada anteriormente", "notifications.permission_required": "Notificações no ambiente de trabalho não estão disponíveis porque a permissão necessária não foi concedida.", + "notifications.policy.filter_new_accounts.hint": "Criada nos últimos {days, plural, one {um dia} other {# dias}}", "notifications.policy.filter_new_accounts_title": "Novas contas", + "notifications.policy.filter_not_followers_hint": "Incluindo pessoas que o seguem há menos de {days, plural, one {um dia} other {# dias}}", "notifications.policy.filter_not_followers_title": "Pessoas não te seguem", "notifications.policy.filter_not_following_hint": "Até que você os aprove manualmente", "notifications.policy.filter_not_following_title": "Pessoas que você não segue", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 30a9601d67..28b1764510 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -241,6 +241,7 @@ "empty_column.list": "ยังไม่มีสิ่งใดในรายการนี้ เมื่อสมาชิกของรายการนี้โพสต์โพสต์ใหม่ โพสต์จะปรากฏที่นี่", "empty_column.lists": "คุณยังไม่มีรายการใด ๆ เมื่อคุณสร้างรายการ รายการจะปรากฏที่นี่", "empty_column.mutes": "คุณยังไม่ได้ซ่อนผู้ใช้ใด ๆ", + "empty_column.notification_requests": "โล่งทั้งหมด! ไม่มีสิ่งใดที่นี่ เมื่อคุณได้รับการแจ้งเตือนใหม่ การแจ้งเตือนจะปรากฏที่นี่ตามการตั้งค่าของคุณ", "empty_column.notifications": "คุณยังไม่มีการแจ้งเตือนใด ๆ เมื่อผู้คนอื่น ๆ โต้ตอบกับคุณ คุณจะเห็นการแจ้งเตือนที่นี่", "empty_column.public": "ไม่มีสิ่งใดที่นี่! เขียนบางอย่างเป็นสาธารณะ หรือติดตามผู้ใช้จากเซิร์ฟเวอร์อื่น ๆ ด้วยตนเองเพื่อเติมเส้นเวลาให้เต็ม", "error.unexpected_crash.explanation": "เนื่องจากข้อบกพร่องในโค้ดของเราหรือปัญหาความเข้ากันได้ของเบราว์เซอร์ จึงไม่สามารถแสดงหน้านี้ได้อย่างถูกต้อง", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index c74c780127..998aecd275 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -272,7 +272,7 @@ "filter_modal.select_filter.subtitle": "Sử dụng một danh mục hiện có hoặc tạo một danh mục mới", "filter_modal.select_filter.title": "Lọc tút này", "filter_modal.title.status": "Lọc một tút", - "filtered_notifications_banner.pending_requests": "{count, plural, =0 {} other {#}}", + "filtered_notifications_banner.pending_requests": "Thông báo từ {count, plural, =0 {không ai} other {# người}} bạn có thể biết", "filtered_notifications_banner.title": "Thông báo đã lọc", "firehose.all": "Toàn bộ", "firehose.local": "Máy chủ này", @@ -364,7 +364,7 @@ "keyboard_shortcuts.my_profile": "mở hồ sơ của bạn", "keyboard_shortcuts.notifications": "mở thông báo", "keyboard_shortcuts.open_media": "mở ảnh hoặc video", - "keyboard_shortcuts.pinned": "Open pinned posts list", + "keyboard_shortcuts.pinned": "mở những tút đã ghim", "keyboard_shortcuts.profile": "mở trang của người đăng tút", "keyboard_shortcuts.reply": "trả lời", "keyboard_shortcuts.requests": "mở danh sách yêu cầu theo dõi", diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 156a4700eb..93dbd01627 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1846,7 +1846,10 @@ fi: apps_ios_action: Lataa App Storesta apps_step: Lataa viralliset sovelluksemme. apps_title: Mastodon-sovellukset + checklist_subtitle: 'Aloitetaan, sinä aloitat uudella sosiaalisella seudulla:' + checklist_title: Tervetuloa tarkistuslista edit_profile_action: Mukauta + edit_profile_step: Täydentämällä profiilisi tietoja tehostat vaikutemaa. edit_profile_title: Mukauta profiiliasi explanation: Näillä vinkeillä pääset alkuun feature_action: Lue lisää diff --git a/config/locales/kab.yml b/config/locales/kab.yml index b25a4e3a1d..66c544f9e7 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -705,6 +705,7 @@ kab: moved: Igujj primary: Agejdan relationship: Assaɣ + remove_selected_follows: Ur ṭṭafar ara iseqdacen yettwafernen status: Addad n umiḍan sessions: activity: Armud aneggaru @@ -729,6 +730,7 @@ kab: current_session: Tiɣimit tamirant date: Azemz description: "%{browser} s %{platform}" + explanation: Ha-t-en yiminigen web ikecmen akka tura ɣer umiḍan-ik·im Mastodon. ip: IP platforms: adobe_air: Adobe Air diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml index a9b040b058..8e63211b65 100644 --- a/config/locales/simple_form.kab.yml +++ b/config/locales/simple_form.kab.yml @@ -23,6 +23,8 @@ kab: setting_display_media_hide_all: Ffer yal tikkelt akk taywalt setting_display_media_show_all: Ffer yal tikkelt teywalt yettwacreḍ d tanafrit username: Tzemreḍ ad tesqedceḍ isekkilen, uṭṭunen akked yijerriden n wadda + featured_tag: + name: 'Ha-t-an kra seg ihacṭagen i tesseqdaceḍ ussan-a ineggura maḍi :' imports: data: Afaylu CSV id yusan seg uqeddac-nniḍen n Maṣṭudun ip_block: @@ -102,7 +104,9 @@ kab: no_access: Sewḥel anekcum severity: Alugen notification_emails: + favourite: Ma yella walbɛaḍ i iḥemmlen tasuffeɣt-ik·im follow: Yeḍfer-ik·im-id walbɛaḍ + follow_request: Ma yella win i d-yessutren ad k·em-yeḍfer mention: Yuder-ik·em-id walbɛaḍ reblog: Yella win yesselhan adda-dik·im rule: From 1e1d97a78727570bb3343aa4008b93edae3dde1d Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 14 Mar 2024 10:07:29 +0100 Subject: [PATCH 177/954] Fix wrong background color on search results in web UI (#29584) --- .../compose/components/search_results.jsx | 6 ----- .../styles/mastodon/components.scss | 23 +++++-------------- app/javascript/styles/mastodon/variables.scss | 1 + 3 files changed, 7 insertions(+), 23 deletions(-) diff --git a/app/javascript/mastodon/features/compose/components/search_results.jsx b/app/javascript/mastodon/features/compose/components/search_results.jsx index 694deea04e..667662781e 100644 --- a/app/javascript/mastodon/features/compose/components/search_results.jsx +++ b/app/javascript/mastodon/features/compose/components/search_results.jsx @@ -7,7 +7,6 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import FindInPageIcon from '@/material-icons/400-24px/find_in_page.svg?react'; import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; -import SearchIcon from '@/material-icons/400-24px/search.svg?react'; import TagIcon from '@/material-icons/400-24px/tag.svg?react'; import { Icon } from 'mastodon/components/icon'; import { LoadMore } from 'mastodon/components/load_more'; @@ -76,11 +75,6 @@ class SearchResults extends ImmutablePureComponent { return (
-
- - -
- {accounts} {hashtags} {statuses} diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index b6dc1abc99..6aa3588501 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3485,7 +3485,7 @@ $ui-header-height: 55px; } .column-subheading { - background: darken($ui-base-color, 4%); + background: var(--surface-background-color); color: $darker-text-color; padding: 8px 20px; font-size: 12px; @@ -4637,7 +4637,7 @@ a.status-card { } .follow_requests-unlocked_explanation { - background: darken($ui-base-color, 4%); + background: var(--surface-background-color); border-bottom: 1px solid var(--background-border-color); contain: initial; flex-grow: 0; @@ -5269,18 +5269,6 @@ a.status-card { } } -.search-results__header { - color: $dark-text-color; - background: lighten($ui-base-color, 2%); - padding: 15px; - font-weight: 500; - font-size: 16px; - cursor: default; - display: flex; - align-items: center; - gap: 5px; -} - .search-results__section { border-bottom: 1px solid var(--background-border-color); @@ -5289,8 +5277,8 @@ a.status-card { } &__header { - background: darken($ui-base-color, 4%); border-bottom: 1px solid var(--background-border-color); + background: var(--surface-background-color); padding: 15px; font-weight: 500; font-size: 14px; @@ -7159,7 +7147,7 @@ noscript { .follow-request-banner, .account-memorial-banner { padding: 20px; - background: lighten($ui-base-color, 4%); + background: var(--surface-background-color); display: flex; align-items: center; flex-direction: column; @@ -8326,7 +8314,8 @@ noscript { flex: 1 1 auto; display: flex; flex-direction: column; - background: $ui-base-color; + border: 1px solid var(--background-border-color); + border-top: 0; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; } diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss index 94078d960d..2b2a295791 100644 --- a/app/javascript/styles/mastodon/variables.scss +++ b/app/javascript/styles/mastodon/variables.scss @@ -104,4 +104,5 @@ $font-monospace: 'mastodon-font-monospace' !default; --background-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%); --background-color: #{darken($ui-base-color, 8%)}; --background-color-tint: #{rgba(darken($ui-base-color, 8%), 0.9)}; + --surface-background-color: #{darken($ui-base-color, 4%)}; } From f9100743ecec65cdeeabdaa29ed94afc4b2e3aa5 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 14 Mar 2024 05:09:47 -0400 Subject: [PATCH 178/954] Add `Api::ErrorHandling` concern for api/base controller (#29574) --- app/controllers/api/base_controller.rb | 46 +--------------- .../concerns/api/error_handling.rb | 52 +++++++++++++++++++ spec/controllers/api/base_controller_spec.rb | 36 ------------- .../concerns/api/error_handling_spec.rb | 51 ++++++++++++++++++ 4 files changed, 104 insertions(+), 81 deletions(-) create mode 100644 app/controllers/concerns/api/error_handling.rb create mode 100644 spec/controllers/concerns/api/error_handling_spec.rb diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index 8bf9da2cfd..bf7deac5cf 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -8,6 +8,7 @@ class Api::BaseController < ApplicationController include Api::AccessTokenTrackingConcern include Api::CachingConcern include Api::ContentSecurityPolicy + include Api::ErrorHandling skip_before_action :require_functional!, unless: :limited_federation_mode? @@ -18,51 +19,6 @@ class Api::BaseController < ApplicationController protect_from_forgery with: :null_session - rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e| - render json: { error: e.to_s }, status: 422 - end - - rescue_from ActiveRecord::RecordNotUnique do - render json: { error: 'Duplicate record' }, status: 422 - end - - rescue_from Date::Error do - render json: { error: 'Invalid date supplied' }, status: 422 - end - - rescue_from ActiveRecord::RecordNotFound do - render json: { error: 'Record not found' }, status: 404 - end - - rescue_from HTTP::Error, Mastodon::UnexpectedResponseError do - render json: { error: 'Remote data could not be fetched' }, status: 503 - end - - rescue_from OpenSSL::SSL::SSLError do - render json: { error: 'Remote SSL certificate could not be verified' }, status: 503 - end - - rescue_from Mastodon::NotPermittedError do - render json: { error: 'This action is not allowed' }, status: 403 - end - - rescue_from Seahorse::Client::NetworkingError do |e| - Rails.logger.warn "Storage server error: #{e}" - render json: { error: 'There was a temporary problem serving your request, please try again' }, status: 503 - end - - rescue_from Mastodon::RaceConditionError, Stoplight::Error::RedLight do - render json: { error: 'There was a temporary problem serving your request, please try again' }, status: 503 - end - - rescue_from Mastodon::RateLimitExceededError do - render json: { error: I18n.t('errors.429') }, status: 429 - end - - rescue_from ActionController::ParameterMissing, Mastodon::InvalidParameterError do |e| - render json: { error: e.to_s }, status: 400 - end - def doorkeeper_unauthorized_render_options(error: nil) { json: { error: error.try(:description) || 'Not authorized' } } end diff --git a/app/controllers/concerns/api/error_handling.rb b/app/controllers/concerns/api/error_handling.rb new file mode 100644 index 0000000000..ad559fe2d7 --- /dev/null +++ b/app/controllers/concerns/api/error_handling.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module Api::ErrorHandling + extend ActiveSupport::Concern + + included do + rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e| + render json: { error: e.to_s }, status: 422 + end + + rescue_from ActiveRecord::RecordNotUnique do + render json: { error: 'Duplicate record' }, status: 422 + end + + rescue_from Date::Error do + render json: { error: 'Invalid date supplied' }, status: 422 + end + + rescue_from ActiveRecord::RecordNotFound do + render json: { error: 'Record not found' }, status: 404 + end + + rescue_from HTTP::Error, Mastodon::UnexpectedResponseError do + render json: { error: 'Remote data could not be fetched' }, status: 503 + end + + rescue_from OpenSSL::SSL::SSLError do + render json: { error: 'Remote SSL certificate could not be verified' }, status: 503 + end + + rescue_from Mastodon::NotPermittedError do + render json: { error: 'This action is not allowed' }, status: 403 + end + + rescue_from Seahorse::Client::NetworkingError do |e| + Rails.logger.warn "Storage server error: #{e}" + render json: { error: 'There was a temporary problem serving your request, please try again' }, status: 503 + end + + rescue_from Mastodon::RaceConditionError, Stoplight::Error::RedLight do + render json: { error: 'There was a temporary problem serving your request, please try again' }, status: 503 + end + + rescue_from Mastodon::RateLimitExceededError do + render json: { error: I18n.t('errors.429') }, status: 429 + end + + rescue_from ActionController::ParameterMissing, Mastodon::InvalidParameterError do |e| + render json: { error: e.to_s }, status: 400 + end + end +end diff --git a/spec/controllers/api/base_controller_spec.rb b/spec/controllers/api/base_controller_spec.rb index f8e014be2f..659d55f801 100644 --- a/spec/controllers/api/base_controller_spec.rb +++ b/spec/controllers/api/base_controller_spec.rb @@ -3,10 +3,6 @@ require 'rails_helper' describe Api::BaseController do - before do - stub_const('FakeService', Class.new) - end - controller do def success head 200 @@ -72,36 +68,4 @@ describe Api::BaseController do expect(response).to have_http_status(403) end end - - describe 'error handling' do - before do - routes.draw { get 'failure' => 'api/base#failure' } - end - - { - ActiveRecord::RecordInvalid => 422, - ActiveRecord::RecordNotFound => 404, - ActiveRecord::RecordNotUnique => 422, - Date::Error => 422, - HTTP::Error => 503, - Mastodon::InvalidParameterError => 400, - Mastodon::NotPermittedError => 403, - Mastodon::RaceConditionError => 503, - Mastodon::RateLimitExceededError => 429, - Mastodon::UnexpectedResponseError => 503, - Mastodon::ValidationError => 422, - OpenSSL::SSL::SSLError => 503, - Seahorse::Client::NetworkingError => 503, - Stoplight::Error::RedLight => 503, - }.each do |error, code| - it "Handles error class of #{error}" do - allow(FakeService).to receive(:new).and_raise(error) - - get :failure - - expect(response).to have_http_status(code) - expect(FakeService).to have_received(:new) - end - end - end end diff --git a/spec/controllers/concerns/api/error_handling_spec.rb b/spec/controllers/concerns/api/error_handling_spec.rb new file mode 100644 index 0000000000..9b36fc20a3 --- /dev/null +++ b/spec/controllers/concerns/api/error_handling_spec.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Api::ErrorHandling do + before do + stub_const('FakeService', Class.new) + end + + controller(Api::BaseController) do + def failure + FakeService.new + end + end + + describe 'error handling' do + before do + routes.draw { get 'failure' => 'api/base#failure' } + end + + { + ActiveRecord::RecordInvalid => 422, + ActiveRecord::RecordNotFound => 404, + ActiveRecord::RecordNotUnique => 422, + Date::Error => 422, + HTTP::Error => 503, + Mastodon::InvalidParameterError => 400, + Mastodon::NotPermittedError => 403, + Mastodon::RaceConditionError => 503, + Mastodon::RateLimitExceededError => 429, + Mastodon::UnexpectedResponseError => 503, + Mastodon::ValidationError => 422, + OpenSSL::SSL::SSLError => 503, + Seahorse::Client::NetworkingError => 503, + Stoplight::Error::RedLight => 503, + }.each do |error, code| + it "Handles error class of #{error}" do + allow(FakeService) + .to receive(:new) + .and_raise(error) + + get :failure + + expect(response) + .to have_http_status(code) + expect(FakeService) + .to have_received(:new) + end + end + end +end From 4991198b703f5020ab136062fe7d5ef44e8f0aec Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 14 Mar 2024 10:18:24 +0100 Subject: [PATCH 179/954] Change design of metadata underneath posts in web UI (#29585) --- .../components/edited_timestamp/index.jsx | 4 +- .../status/components/detailed_status.jsx | 72 +++++++++---------- app/javascript/mastodon/locales/en.json | 4 +- .../styles/mastodon/components.scss | 45 +++++++----- 4 files changed, 65 insertions(+), 60 deletions(-) diff --git a/app/javascript/mastodon/components/edited_timestamp/index.jsx b/app/javascript/mastodon/components/edited_timestamp/index.jsx index 7b70f9d6e1..fbf14ec4bd 100644 --- a/app/javascript/mastodon/components/edited_timestamp/index.jsx +++ b/app/javascript/mastodon/components/edited_timestamp/index.jsx @@ -5,9 +5,7 @@ import { FormattedMessage, injectIntl } from 'react-intl'; import { connect } from 'react-redux'; -import ArrowDropDownIcon from '@/material-icons/400-24px/arrow_drop_down.svg?react'; import { openModal } from 'mastodon/actions/modal'; -import { Icon } from 'mastodon/components/icon'; import InlineAccount from 'mastodon/components/inline_account'; import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; @@ -67,7 +65,7 @@ class EditedTimestamp extends PureComponent { return ( ); diff --git a/app/javascript/mastodon/features/status/components/detailed_status.jsx b/app/javascript/mastodon/features/status/components/detailed_status.jsx index d10c8966e4..45935716ca 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.jsx +++ b/app/javascript/mastodon/features/status/components/detailed_status.jsx @@ -9,8 +9,6 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; -import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; -import StarIcon from '@/material-icons/400-24px/star-fill.svg?react'; import { AnimatedNumber } from 'mastodon/components/animated_number'; import EditedTimestamp from 'mastodon/components/edited_timestamp'; import { getHashtagBarForStatus } from 'mastodon/components/hashtag_bar'; @@ -143,10 +141,7 @@ class DetailedStatus extends ImmutablePureComponent { let media = ''; let applicationLink = ''; let reblogLink = ''; - const reblogIcon = 'retweet'; - const reblogIconComponent = RepeatIcon; let favouriteLink = ''; - let edited = ''; if (this.props.measureHeight) { outerStyle.height = `${this.state.height}px`; @@ -218,68 +213,53 @@ class DetailedStatus extends ImmutablePureComponent { } if (status.get('application')) { - applicationLink = <> · {status.getIn(['application', 'name'])}; + applicationLink = <>·{status.getIn(['application', 'name'])}; } - const visibilityLink = <> · ; + const visibilityLink = <>·; if (['private', 'direct'].includes(status.get('visibility'))) { reblogLink = ''; } else if (this.props.history) { reblogLink = ( - <> - {' · '} - - - - - - - + + + + + + ); } else { reblogLink = ( - <> - {' · '} - - - - - - - + + + + + + ); } if (this.props.history) { favouriteLink = ( - + ); } else { favouriteLink = ( - + ); } - if (status.get('edited_at')) { - edited = ( - <> - {' · '} - - - ); - } - const {statusContentProps, hashtagBar} = getHashtagBarForStatus(status); const expanded = !status.get('hidden') || status.get('spoiler_text').length === 0; @@ -310,9 +290,23 @@ class DetailedStatus extends ImmutablePureComponent { {expanded && hashtagBar}
- - - {edited}{visibilityLink}{applicationLink}{reblogLink} · {favouriteLink} +
+ + + + + {visibilityLink} + + {applicationLink} +
+ + {status.get('edited_at') &&
} + +
+ {reblogLink} + · + {favouriteLink} +
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 2f202bfe15..8a66695f32 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -662,10 +662,11 @@ "status.direct": "Privately mention @{name}", "status.direct_indicator": "Private mention", "status.edit": "Edit", - "status.edited": "Edited {date}", + "status.edited": "Last edited {date}", "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}", "status.embed": "Embed", "status.favourite": "Favorite", + "status.favourites": "{count, plural, one {favorite} other {favorites}}", "status.filter": "Filter this post", "status.filtered": "Filtered", "status.hide": "Hide post", @@ -686,6 +687,7 @@ "status.reblog": "Boost", "status.reblog_private": "Boost with original visibility", "status.reblogged_by": "{name} boosted", + "status.reblogs": "{count, plural, one {boost} other {boosts}}", "status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.", "status.redraft": "Delete & re-draft", "status.remove_bookmark": "Remove bookmark", diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 6aa3588501..398babb259 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1659,15 +1659,35 @@ body > [data-popper-placement] { } .detailed-status__meta { - margin-top: 16px; + margin-top: 24px; color: $dark-text-color; font-size: 14px; line-height: 18px; + &__line { + border-bottom: 1px solid var(--background-border-color); + padding: 8px 0; + display: flex; + align-items: center; + gap: 8px; + + &:first-child { + padding-top: 0; + } + + &:last-child { + padding-bottom: 0; + border-bottom: 0; + } + } + .icon { - width: 15px; - height: 15px; - vertical-align: middle; + width: 18px; + height: 18px; + } + + .animated-number { + color: $secondary-text-color; } } @@ -1711,19 +1731,6 @@ body > [data-popper-placement] { color: inherit; text-decoration: none; gap: 6px; - position: relative; - top: 0.145em; - - .icon { - top: 0; - } -} - -.detailed-status__favorites, -.detailed-status__reblogs { - font-weight: 500; - font-size: 12px; - line-height: 18px; } .domain { @@ -2292,6 +2299,10 @@ a.account__display-name { outline: 1px dotted; } + &:hover { + text-decoration: underline; + } + .icon { width: 15px; height: 15px; From 01ecc8011899949c19a1f58d715eb020bea4f387 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 14 Mar 2024 05:18:31 -0400 Subject: [PATCH 180/954] Add module `accounts` route scope in api routes (#29582) --- config/routes/api.rb | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/config/routes/api.rb b/config/routes/api.rb index 07340a6340..d2d0e3900c 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -181,12 +181,14 @@ namespace :api, format: false do end resources :accounts, only: [:create, :show] do - resources :statuses, only: :index, controller: 'accounts/statuses' - resources :followers, only: :index, controller: 'accounts/follower_accounts' - resources :following, only: :index, controller: 'accounts/following_accounts' - resources :lists, only: :index, controller: 'accounts/lists' - resources :identity_proofs, only: :index, controller: 'accounts/identity_proofs' - resources :featured_tags, only: :index, controller: 'accounts/featured_tags' + scope module: :accounts do + resources :statuses, only: :index + resources :followers, only: :index, controller: :follower_accounts + resources :following, only: :index, controller: :following_accounts + resources :lists, only: :index + resources :identity_proofs, only: :index + resources :featured_tags, only: :index + end member do post :follow From 18ffd4d925030a3d3a3826bc7156d3a22a44d78e Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 14 Mar 2024 05:18:36 -0400 Subject: [PATCH 181/954] Add module `instances` route scope in api routes (#29581) --- config/routes/api.rb | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/config/routes/api.rb b/config/routes/api.rb index d2d0e3900c..60fb0394e7 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -125,14 +125,16 @@ namespace :api, format: false do end resource :instance, only: [:show] do - resources :peers, only: [:index], controller: 'instances/peers' - resources :rules, only: [:index], controller: 'instances/rules' - resources :domain_blocks, only: [:index], controller: 'instances/domain_blocks' - resource :privacy_policy, only: [:show], controller: 'instances/privacy_policies' - resource :extended_description, only: [:show], controller: 'instances/extended_descriptions' - resource :translation_languages, only: [:show], controller: 'instances/translation_languages' - resource :languages, only: [:show], controller: 'instances/languages' - resource :activity, only: [:show], controller: 'instances/activity' + scope module: :instances do + resources :peers, only: [:index] + resources :rules, only: [:index] + resources :domain_blocks, only: [:index] + resource :privacy_policy, only: [:show] + resource :extended_description, only: [:show] + resource :translation_languages, only: [:show] + resource :languages, only: [:show] + resource :activity, only: [:show], controller: :activity + end end namespace :peers do From 65e8349980d2f09eee63c7dde7edb1e5ebc0e5d5 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 14 Mar 2024 05:18:41 -0400 Subject: [PATCH 182/954] Clean up `activitypub` module route scope near collections/boxes (#29580) --- config/routes.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 2ec7494969..a3e3f368b1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -126,11 +126,13 @@ Rails.application.routes.draw do resources :followers, only: [:index], controller: :follower_accounts resources :following, only: [:index], controller: :following_accounts - resource :outbox, only: [:show], module: :activitypub - resource :inbox, only: [:create], module: :activitypub - resource :claim, only: [:create], module: :activitypub - resources :collections, only: [:show], module: :activitypub - resource :followers_synchronization, only: [:show], module: :activitypub + scope module: :activitypub do + resource :outbox, only: [:show] + resource :inbox, only: [:create] + resource :claim, only: [:create] + resources :collections, only: [:show] + resource :followers_synchronization, only: [:show] + end end resource :inbox, only: [:create], module: :activitypub From 79e7590578770c906d7a30e6ce7e0b654f725972 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 14 Mar 2024 05:18:46 -0400 Subject: [PATCH 183/954] Clean up `activitypub` module route scope near instance actor (#29579) --- config/routes.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index a3e3f368b1..8d658b4de1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -77,8 +77,10 @@ Rails.application.routes.draw do get 'remote_interaction_helper', to: 'remote_interaction_helper#index' resource :instance_actor, path: 'actor', only: [:show] do - resource :inbox, only: [:create], module: :activitypub - resource :outbox, only: [:show], module: :activitypub + scope module: :activitypub do + resource :inbox, only: [:create] + resource :outbox, only: [:show] + end end get '/invite/:invite_code', constraints: ->(req) { req.format == :json }, to: 'api/v1/invites#show' From 681a89f684a54f2686324ecfddca250356da338b Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 14 Mar 2024 05:24:00 -0400 Subject: [PATCH 184/954] Readability clean up in `ImportVacuum` spec (#28955) --- spec/lib/vacuum/imports_vacuum_spec.rb | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/spec/lib/vacuum/imports_vacuum_spec.rb b/spec/lib/vacuum/imports_vacuum_spec.rb index c712b7b9b2..3a273d8276 100644 --- a/spec/lib/vacuum/imports_vacuum_spec.rb +++ b/spec/lib/vacuum/imports_vacuum_spec.rb @@ -13,7 +13,26 @@ RSpec.describe Vacuum::ImportsVacuum do describe '#perform' do it 'cleans up the expected imports' do - expect { subject.perform }.to change { BulkImport.pluck(:id) }.from([old_unconfirmed, new_unconfirmed, recent_ongoing, recent_finished, old_finished].map(&:id)).to([new_unconfirmed, recent_ongoing, recent_finished].map(&:id)) + expect { subject.perform } + .to change { ordered_bulk_imports.pluck(:id) } + .from(original_import_ids) + .to(remaining_import_ids) + end + + def ordered_bulk_imports + BulkImport.order(id: :asc) + end + + def original_import_ids + [old_unconfirmed, new_unconfirmed, recent_ongoing, recent_finished, old_finished].map(&:id) + end + + def vacuumed_import_ids + [old_unconfirmed, old_finished].map(&:id) + end + + def remaining_import_ids + original_import_ids - vacuumed_import_ids end end end From 19cbadfbd66be628a9c544debe752f92b293d345 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 14 Mar 2024 05:31:15 -0400 Subject: [PATCH 185/954] Use enum-generated scope for `IpBlock` in CLI (#28144) --- app/models/ip_block.rb | 2 +- app/models/user.rb | 2 +- lib/mastodon/cli/ip_blocks.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/ip_block.rb b/app/models/ip_block.rb index 9def5b0cde..d6242efbf7 100644 --- a/app/models/ip_block.rb +++ b/app/models/ip_block.rb @@ -23,7 +23,7 @@ class IpBlock < ApplicationRecord sign_up_requires_approval: 5000, sign_up_block: 5500, no_access: 9999, - } + }, prefix: true validates :ip, :severity, presence: true validates :ip, uniqueness: true diff --git a/app/models/user.rb b/app/models/user.rb index 14c2bb6e0c..ee9116b9f4 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -446,7 +446,7 @@ class User < ApplicationRecord end def sign_up_from_ip_requires_approval? - sign_up_ip.present? && IpBlock.sign_up_requires_approval.exists?(['ip >>= ?', sign_up_ip.to_s]) + sign_up_ip.present? && IpBlock.severity_sign_up_requires_approval.exists?(['ip >>= ?', sign_up_ip.to_s]) end def sign_up_email_requires_approval? diff --git a/lib/mastodon/cli/ip_blocks.rb b/lib/mastodon/cli/ip_blocks.rb index 100bf7bada..3c5fdb275c 100644 --- a/lib/mastodon/cli/ip_blocks.rb +++ b/lib/mastodon/cli/ip_blocks.rb @@ -105,7 +105,7 @@ module Mastodon::CLI tools. Only blocks with no_access severity are returned. LONG_DESC def export - IpBlock.where(severity: :no_access).find_each do |ip_block| + IpBlock.severity_no_access.find_each do |ip_block| case options[:format] when 'nginx' say "deny #{ip_block.ip}/#{ip_block.ip.prefix};" From 0bc17a3d48eeed102af3b4d733f0ff8ad2f9f62b Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 14 Mar 2024 05:31:57 -0400 Subject: [PATCH 186/954] Use enum-generated `public_visibility` scope on Status (#28156) --- app/models/concerns/account/statuses_search.rb | 2 +- app/models/concerns/status/search_concern.rb | 2 +- app/models/public_feed.rb | 2 +- app/models/status.rb | 1 - spec/search/models/concerns/account/statuses_search_spec.rb | 4 ++-- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/models/concerns/account/statuses_search.rb b/app/models/concerns/account/statuses_search.rb index 334b714504..93452b78b0 100644 --- a/app/models/concerns/account/statuses_search.rb +++ b/app/models/concerns/account/statuses_search.rb @@ -31,7 +31,7 @@ module Account::StatusesSearch def add_to_public_statuses_index! return unless Chewy.enabled? - statuses.without_reblogs.where(visibility: :public).reorder(nil).find_in_batches do |batch| + statuses.without_reblogs.public_visibility.reorder(nil).find_in_batches do |batch| PublicStatusesIndex.import(batch) end end diff --git a/app/models/concerns/status/search_concern.rb b/app/models/concerns/status/search_concern.rb index c16db8bd8c..3f31b3b675 100644 --- a/app/models/concerns/status/search_concern.rb +++ b/app/models/concerns/status/search_concern.rb @@ -4,7 +4,7 @@ module Status::SearchConcern extend ActiveSupport::Concern included do - scope :indexable, -> { without_reblogs.where(visibility: :public).joins(:account).where(account: { indexable: true }) } + scope :indexable, -> { without_reblogs.public_visibility.joins(:account).where(account: { indexable: true }) } end def searchable_by diff --git a/app/models/public_feed.rb b/app/models/public_feed.rb index c208d6f664..1e2cca4d38 100644 --- a/app/models/public_feed.rb +++ b/app/models/public_feed.rb @@ -61,7 +61,7 @@ class PublicFeed end def public_scope - Status.with_public_visibility.joins(:account).merge(Account.without_suspended.without_silenced) + Status.public_visibility.joins(:account).merge(Account.without_suspended.without_silenced) end def local_only_scope diff --git a/app/models/status.rb b/app/models/status.rb index 0ec69c8dd1..a9c0ea70f1 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -108,7 +108,6 @@ class Status < ApplicationRecord scope :with_accounts, ->(ids) { where(id: ids).includes(:account) } scope :without_replies, -> { where('statuses.reply = FALSE OR statuses.in_reply_to_account_id = statuses.account_id') } scope :without_reblogs, -> { where(statuses: { reblog_of_id: nil }) } - scope :with_public_visibility, -> { where(visibility: :public) } scope :tagged_with, ->(tag_ids) { joins(:statuses_tags).where(statuses_tags: { tag_id: tag_ids }) } scope :not_excluded_by_account, ->(account) { where.not(account_id: account.excluded_from_timeline_account_ids) } scope :not_domain_blocked_by_account, ->(account) { account.excluded_from_timeline_domains.blank? ? left_outer_joins(:account) : left_outer_joins(:account).where('accounts.domain IS NULL OR accounts.domain NOT IN (?)', account.excluded_from_timeline_domains) } diff --git a/spec/search/models/concerns/account/statuses_search_spec.rb b/spec/search/models/concerns/account/statuses_search_spec.rb index 915bc094cb..a1b0bf405c 100644 --- a/spec/search/models/concerns/account/statuses_search_spec.rb +++ b/spec/search/models/concerns/account/statuses_search_spec.rb @@ -21,7 +21,7 @@ describe Account::StatusesSearch, :sidekiq_inline do account.indexable = true account.save! - expect(PublicStatusesIndex.filter(term: { account_id: account.id }).count).to eq(account.statuses.where(visibility: :public).count) + expect(PublicStatusesIndex.filter(term: { account_id: account.id }).count).to eq(account.statuses.public_visibility.count) expect(StatusesIndex.filter(term: { account_id: account.id }).count).to eq(account.statuses.count) end end @@ -32,7 +32,7 @@ describe Account::StatusesSearch, :sidekiq_inline do context 'when picking an indexable account' do it 'has statuses in the PublicStatusesIndex' do - expect(PublicStatusesIndex.filter(term: { account_id: account.id }).count).to eq(account.statuses.where(visibility: :public).count) + expect(PublicStatusesIndex.filter(term: { account_id: account.id }).count).to eq(account.statuses.public_visibility.count) end it 'has statuses in the StatusesIndex' do From 95a5713ff73787bdea8a2d5cb848386bf8c4fe80 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 14 Mar 2024 10:34:36 +0100 Subject: [PATCH 187/954] Fix accounts not getting imported into redux store for some filtered notification types (#29588) --- app/javascript/mastodon/actions/notifications.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index 30b7601d5d..b54cbe27b9 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -552,7 +552,10 @@ export const fetchNotificationsForRequest = accountId => (dispatch, getState) => api(getState).get('/api/v1/notifications', { params }).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); + dispatch(importFetchedAccounts(response.data.map(item => item.account))); dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status))); + dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account))); + dispatch(fetchNotificationsForRequestSuccess(response.data, next?.uri)); }).catch(err => { dispatch(fetchNotificationsForRequestFail(err)); @@ -585,7 +588,10 @@ export const expandNotificationsForRequest = () => (dispatch, getState) => { api(getState).get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); + dispatch(importFetchedAccounts(response.data.map(item => item.account))); dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status))); + dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account))); + dispatch(expandNotificationsForRequestSuccess(response.data, next?.uri)); }).catch(err => { dispatch(expandNotificationsForRequestFail(err)); From 30483d618f94ed85ac90c78ae24fc40349891208 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 14 Mar 2024 11:01:55 +0100 Subject: [PATCH 188/954] Fix back button appearing in column header unexpectedly in web UI (#29551) --- app/javascript/mastodon/components/column_header.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/components/column_header.jsx b/app/javascript/mastodon/components/column_header.jsx index 8b7dcebc67..7fd646690d 100644 --- a/app/javascript/mastodon/components/column_header.jsx +++ b/app/javascript/mastodon/components/column_header.jsx @@ -199,7 +199,7 @@ class ColumnHeader extends PureComponent {

{hasTitle && ( <> - {backButton} + {showBackButton && backButton} + + + {({ props }) => ( +
+
+
+

+
+ +
+
{isSelf ? : }
+
@{username}@{domain}
+
+ +
+
+
+ +
+
+

{isSelf ? : }

+
+
+ +
+
+ +
+
+

{isSelf ? : }

+
+
+
+ +

{isSelf ? }} /> : }} />}

+ + {expanded && ( + <> +

+

+ + )} +
+ )} +
+ + ); +}; + +DomainPill.propTypes = { + username: PropTypes.string.isRequired, + domain: PropTypes.string.isRequired, + isSelf: PropTypes.bool, +}; diff --git a/app/javascript/mastodon/features/account/components/header.jsx b/app/javascript/mastodon/features/account/components/header.jsx index c6295d7c4a..ecb1108ded 100644 --- a/app/javascript/mastodon/features/account/components/header.jsx +++ b/app/javascript/mastodon/features/account/components/header.jsx @@ -25,13 +25,15 @@ import { IconButton } from 'mastodon/components/icon_button'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import { ShortNumber } from 'mastodon/components/short_number'; import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container'; -import { autoPlayGif, me, domain } from 'mastodon/initial_state'; +import { autoPlayGif, me, domain as localDomain } from 'mastodon/initial_state'; import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; import AccountNoteContainer from '../containers/account_note_container'; import FollowRequestNoteContainer from '../containers/follow_request_note_container'; +import { DomainPill } from './domain_pill'; + const messages = defineMessages({ unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' }, follow: { id: 'account.follow', defaultMessage: 'Follow' }, @@ -78,7 +80,7 @@ const messages = defineMessages({ const titleFromAccount = account => { const displayName = account.get('display_name'); - const acct = account.get('acct') === account.get('username') ? `${account.get('username')}@${domain}` : account.get('acct'); + const acct = account.get('acct') === account.get('username') ? `${account.get('username')}@${localDomain}` : account.get('acct'); const prefix = displayName.trim().length === 0 ? account.get('username') : displayName; return `${prefix} (@${acct})`; @@ -252,7 +254,7 @@ class Header extends ImmutablePureComponent { } render () { - const { account, hidden, intl, domain } = this.props; + const { account, hidden, intl } = this.props; const { signedIn, permissions } = this.context.identity; if (!account) { @@ -393,7 +395,8 @@ class Header extends ImmutablePureComponent { const displayNameHtml = { __html: account.get('display_name_html') }; const fields = account.get('fields'); const isLocal = account.get('acct').indexOf('@') === -1; - const acct = isLocal && domain ? `${account.get('acct')}@${domain}` : account.get('acct'); + const username = account.get('acct').split('@')[0]; + const domain = isLocal ? localDomain : account.get('acct').split('@')[1]; const isIndexable = !account.get('noindex'); const badges = []; @@ -438,7 +441,9 @@ class Header extends ImmutablePureComponent {

- @{acct} {lockedIcon} + @{username}@{domain} + + {lockedIcon}

diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 8a66695f32..e05cf8c4c1 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -205,6 +205,19 @@ "dismissable_banner.explore_statuses": "These are posts from across the social web that are gaining traction today. Newer posts with more boosts and favorites are ranked higher.", "dismissable_banner.explore_tags": "These are hashtags that are gaining traction on the social web today. Hashtags that are used by more different people are ranked higher.", "dismissable_banner.public_timeline": "These are the most recent public posts from people on the social web that people on {domain} follow.", + "domain_pill.activitypub_lets_connect": "It lets you connect and interact with people not just on Mastodon, but across different social apps too.", + "domain_pill.activitypub_like_language": "ActivityPub is like the language Mastodon speaks with other social networks.", + "domain_pill.server": "Server", + "domain_pill.their_handle": "Their handle:", + "domain_pill.their_server": "Their digital home, where all of their posts live.", + "domain_pill.their_username": "Their unique identifier on their server. It’s possible to find users with the same username on different servers.", + "domain_pill.username": "Username", + "domain_pill.whats_in_a_handle": "What's in a handle?", + "domain_pill.who_they_are": "Since handles say who someone is and where they are, you can interact with people across the social web of .", + "domain_pill.who_you_are": "Because your handle says who you are and where you are, people can interact with you across the social web of .", + "domain_pill.your_handle": "Your handle:", + "domain_pill.your_server": "Your digital home, where all of your posts live. Don’t like this one? Transfer servers at any time and bring your followers, too.", + "domain_pill.your_username": "Your unique identifier on this server. It’s possible to find users with the same username on different servers.", "embed.instructions": "Embed this post on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", diff --git a/app/javascript/material-icons/400-24px/badge-fill.svg b/app/javascript/material-icons/400-24px/badge-fill.svg new file mode 100644 index 0000000000..2f7175b7f1 --- /dev/null +++ b/app/javascript/material-icons/400-24px/badge-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/badge.svg b/app/javascript/material-icons/400-24px/badge.svg new file mode 100644 index 0000000000..d413363a4c --- /dev/null +++ b/app/javascript/material-icons/400-24px/badge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/globe-fill.svg b/app/javascript/material-icons/400-24px/globe-fill.svg new file mode 100644 index 0000000000..c931f53c74 --- /dev/null +++ b/app/javascript/material-icons/400-24px/globe-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/globe.svg b/app/javascript/material-icons/400-24px/globe.svg new file mode 100644 index 0000000000..c931f53c74 --- /dev/null +++ b/app/javascript/material-icons/400-24px/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/star-fill.svg b/app/javascript/material-icons/400-24px/star-fill.svg index cb2231e634..84e8230ab7 100644 --- a/app/javascript/material-icons/400-24px/star-fill.svg +++ b/app/javascript/material-icons/400-24px/star-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/star.svg b/app/javascript/material-icons/400-24px/star.svg index 1736e085d0..6a72ecc226 100644 --- a/app/javascript/material-icons/400-24px/star.svg +++ b/app/javascript/material-icons/400-24px/star.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 398babb259..8e0859038d 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1792,6 +1792,118 @@ body > [data-popper-placement] { } } + &__domain-pill { + display: inline-flex; + background: rgba($highlight-text-color, 0.2); + border-radius: 4px; + border: 0; + color: $highlight-text-color; + font-weight: 500; + font-size: 12px; + line-height: 16px; + padding: 4px 8px; + + &.active { + color: $white; + background: $ui-highlight-color; + } + + &__popout { + background: var(--dropdown-background-color); + backdrop-filter: var(--background-filter); + border: 1px solid var(--dropdown-border-color); + box-shadow: var(--dropdown-shadow); + max-width: 320px; + padding: 16px; + border-radius: 8px; + display: flex; + flex-direction: column; + gap: 24px; + font-size: 14px; + line-height: 20px; + color: $darker-text-color; + + .link-button { + display: inline; + font-size: inherit; + line-height: inherit; + } + + &__header { + display: flex; + align-items: center; + gap: 12px; + + &__icon { + width: 40px; + height: 40px; + background: $ui-highlight-color; + color: $white; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + flex-shrink: 0; + } + + h3 { + font-size: 17px; + line-height: 22px; + color: $primary-text-color; + } + } + + &__handle { + border: 2px dashed $highlight-text-color; + background: rgba($highlight-text-color, 0.1); + padding: 12px 8px; + color: $highlight-text-color; + border-radius: 4px; + + &__label { + font-size: 11px; + line-height: 16px; + font-weight: 500; + } + + &__handle { + user-select: all; + } + } + + &__parts { + display: flex; + flex-direction: column; + gap: 8px; + font-size: 12px; + line-height: 16px; + + & > div { + display: flex; + align-items: flex-start; + gap: 12px; + } + + &__icon { + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + color: $highlight-text-color; + } + + h6 { + font-size: 14px; + line-height: 20px; + font-weight: 500; + color: $primary-text-color; + } + } + } + } + &__note { font-size: 14px; font-weight: 400; @@ -7544,14 +7656,17 @@ noscript { font-size: 17px; line-height: 22px; color: $primary-text-color; - font-weight: 700; + font-weight: 600; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; small { - display: block; - font-size: 15px; + display: flex; + align-items: center; + gap: 4px; + font-size: 14px; + line-height: 20px; color: $darker-text-color; font-weight: 400; overflow: hidden; @@ -7562,10 +7677,8 @@ noscript { } .icon-lock { - height: 16px; - width: 16px; - position: relative; - top: 3px; + height: 18px; + width: 18px; } } } From c76ae7a5c0d247264afa896f081db9d1fd278711 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Fri, 15 Mar 2024 14:16:45 +0100 Subject: [PATCH 203/954] Convert `packs/public.jsx` to Typescript (#29501) --- .../components/relative_timestamp.tsx | 2 +- app/javascript/packs/public.jsx | 285 ----------- app/javascript/packs/public.tsx | 462 ++++++++++++++++++ 3 files changed, 463 insertions(+), 286 deletions(-) delete mode 100644 app/javascript/packs/public.jsx create mode 100644 app/javascript/packs/public.tsx diff --git a/app/javascript/mastodon/components/relative_timestamp.tsx b/app/javascript/mastodon/components/relative_timestamp.tsx index 12530c2b17..b9e1e4f8fd 100644 --- a/app/javascript/mastodon/components/relative_timestamp.tsx +++ b/app/javascript/mastodon/components/relative_timestamp.tsx @@ -102,7 +102,7 @@ const getUnitDelay = (units: string) => { }; export const timeAgoString = ( - intl: IntlShape, + intl: Pick, date: Date, now: number, year: number, diff --git a/app/javascript/packs/public.jsx b/app/javascript/packs/public.jsx deleted file mode 100644 index d8a4c16034..0000000000 --- a/app/javascript/packs/public.jsx +++ /dev/null @@ -1,285 +0,0 @@ -import { createRoot } from 'react-dom/client'; - -import './public-path'; - -import { IntlMessageFormat } from 'intl-messageformat'; -import { defineMessages } from 'react-intl'; - -import Rails from '@rails/ujs'; -import axios from 'axios'; -import { throttle } from 'lodash'; - -import { start } from '../mastodon/common'; -import { timeAgoString } from '../mastodon/components/relative_timestamp'; -import emojify from '../mastodon/features/emoji/emoji'; -import loadKeyboardExtensions from '../mastodon/load_keyboard_extensions'; -import { loadLocale, getLocale } from '../mastodon/locales'; -import { loadPolyfills } from '../mastodon/polyfills'; -import ready from '../mastodon/ready'; - -import 'cocoon-js-vanilla'; - -start(); - -const messages = defineMessages({ - usernameTaken: { id: 'username.taken', defaultMessage: 'That username is taken. Try another' }, - passwordExceedsLength: { id: 'password_confirmation.exceeds_maxlength', defaultMessage: 'Password confirmation exceeds the maximum password length' }, - passwordDoesNotMatch: { id: 'password_confirmation.mismatching', defaultMessage: 'Password confirmation does not match' }, -}); - -window.addEventListener('message', e => { - const data = e.data || {}; - - if (!window.parent || data.type !== 'setHeight') { - return; - } - - ready(() => { - window.parent.postMessage({ - type: 'setHeight', - id: data.id, - height: document.getElementsByTagName('html')[0].scrollHeight, - }, '*'); - }); -}); - -function loaded() { - const { messages: localeData } = getLocale(); - - const locale = document.documentElement.lang; - - const dateTimeFormat = new Intl.DateTimeFormat(locale, { - year: 'numeric', - month: 'long', - day: 'numeric', - hour: 'numeric', - minute: 'numeric', - }); - - const dateFormat = new Intl.DateTimeFormat(locale, { - year: 'numeric', - month: 'short', - day: 'numeric', - timeFormat: false, - }); - - const timeFormat = new Intl.DateTimeFormat(locale, { - timeStyle: 'short', - }); - - const formatMessage = ({ id, defaultMessage }, values) => { - const messageFormat = new IntlMessageFormat(localeData[id] || defaultMessage, locale); - return messageFormat.format(values); - }; - - document.querySelectorAll('.emojify').forEach((content) => { - content.innerHTML = emojify(content.innerHTML); - }); - - document.querySelectorAll('time.formatted').forEach((content) => { - const datetime = new Date(content.getAttribute('datetime')); - const formattedDate = dateTimeFormat.format(datetime); - - content.title = formattedDate; - content.textContent = formattedDate; - }); - - const isToday = date => { - const today = new Date(); - - return date.getDate() === today.getDate() && - date.getMonth() === today.getMonth() && - date.getFullYear() === today.getFullYear(); - }; - const todayFormat = new IntlMessageFormat(localeData['relative_format.today'] || 'Today at {time}', locale); - - document.querySelectorAll('time.relative-formatted').forEach((content) => { - const datetime = new Date(content.getAttribute('datetime')); - - let formattedContent; - - if (isToday(datetime)) { - const formattedTime = timeFormat.format(datetime); - - formattedContent = todayFormat.format({ time: formattedTime }); - } else { - formattedContent = dateFormat.format(datetime); - } - - content.title = formattedContent; - content.textContent = formattedContent; - }); - - document.querySelectorAll('time.time-ago').forEach((content) => { - const datetime = new Date(content.getAttribute('datetime')); - const now = new Date(); - - const timeGiven = content.getAttribute('datetime').includes('T'); - content.title = timeGiven ? dateTimeFormat.format(datetime) : dateFormat.format(datetime); - content.textContent = timeAgoString({ - formatMessage, - formatDate: (date, options) => (new Intl.DateTimeFormat(locale, options)).format(date), - }, datetime, now, now.getFullYear(), timeGiven); - }); - - const reactComponents = document.querySelectorAll('[data-component]'); - - if (reactComponents.length > 0) { - import(/* webpackChunkName: "containers/media_container" */ '../mastodon/containers/media_container') - .then(({ default: MediaContainer }) => { - reactComponents.forEach((component) => { - Array.from(component.children).forEach((child) => { - component.removeChild(child); - }); - }); - - const content = document.createElement('div'); - - const root = createRoot(content); - root.render(); - document.body.appendChild(content); - }) - .catch(error => { - console.error(error); - }); - } - - Rails.delegate(document, '#user_account_attributes_username', 'input', throttle(({ target }) => { - if (target.value && target.value.length > 0) { - axios.get('/api/v1/accounts/lookup', { params: { acct: target.value } }).then(() => { - target.setCustomValidity(formatMessage(messages.usernameTaken)); - }).catch(() => { - target.setCustomValidity(''); - }); - } else { - target.setCustomValidity(''); - } - }, 500, { leading: false, trailing: true })); - - Rails.delegate(document, '#user_password,#user_password_confirmation', 'input', () => { - const password = document.getElementById('user_password'); - const confirmation = document.getElementById('user_password_confirmation'); - if (!confirmation) return; - - if (confirmation.value && confirmation.value.length > password.maxLength) { - confirmation.setCustomValidity(formatMessage(messages.passwordExceedsLength)); - } else if (password.value && password.value !== confirmation.value) { - confirmation.setCustomValidity(formatMessage(messages.passwordDoesNotMatch)); - } else { - confirmation.setCustomValidity(''); - } - }); - - Rails.delegate(document, '.status__content__spoiler-link', 'click', function() { - const statusEl = this.parentNode.parentNode; - - if (statusEl.dataset.spoiler === 'expanded') { - statusEl.dataset.spoiler = 'folded'; - this.textContent = (new IntlMessageFormat(localeData['status.show_more'] || 'Show more', locale)).format(); - } else { - statusEl.dataset.spoiler = 'expanded'; - this.textContent = (new IntlMessageFormat(localeData['status.show_less'] || 'Show less', locale)).format(); - } - - return false; - }); - - document.querySelectorAll('.status__content__spoiler-link').forEach((spoilerLink) => { - const statusEl = spoilerLink.parentNode.parentNode; - const message = (statusEl.dataset.spoiler === 'expanded') ? (localeData['status.show_less'] || 'Show less') : (localeData['status.show_more'] || 'Show more'); - spoilerLink.textContent = (new IntlMessageFormat(message, locale)).format(); - }); -} - -Rails.delegate(document, '#edit_profile input[type=file]', 'change', ({ target }) => { - const avatar = document.getElementById(target.id + '-preview'); - const [file] = target.files || []; - const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; - - avatar.src = url; -}); - -Rails.delegate(document, '.input-copy input', 'click', ({ target }) => { - target.focus(); - target.select(); - target.setSelectionRange(0, target.value.length); -}); - -Rails.delegate(document, '.input-copy button', 'click', ({ target }) => { - const input = target.parentNode.querySelector('.input-copy__wrapper input'); - - const oldReadOnly = input.readonly; - - input.readonly = false; - input.focus(); - input.select(); - input.setSelectionRange(0, input.value.length); - - try { - if (document.execCommand('copy')) { - input.blur(); - target.parentNode.classList.add('copied'); - - setTimeout(() => { - target.parentNode.classList.remove('copied'); - }, 700); - } - } catch (err) { - console.error(err); - } - - input.readonly = oldReadOnly; -}); - -const toggleSidebar = () => { - const sidebar = document.querySelector('.sidebar ul'); - const toggleButton = document.querySelector('.sidebar__toggle__icon'); - - if (sidebar.classList.contains('visible')) { - document.body.style.overflow = null; - toggleButton.setAttribute('aria-expanded', 'false'); - } else { - document.body.style.overflow = 'hidden'; - toggleButton.setAttribute('aria-expanded', 'true'); - } - - toggleButton.classList.toggle('active'); - sidebar.classList.toggle('visible'); -}; - -Rails.delegate(document, '.sidebar__toggle__icon', 'click', () => { - toggleSidebar(); -}); - -Rails.delegate(document, '.sidebar__toggle__icon', 'keydown', e => { - if (e.key === ' ' || e.key === 'Enter') { - e.preventDefault(); - toggleSidebar(); - } -}); - -Rails.delegate(document, '.custom-emoji', 'mouseover', ({ target }) => target.src = target.getAttribute('data-original')); -Rails.delegate(document, '.custom-emoji', 'mouseout', ({ target }) => target.src = target.getAttribute('data-static')); - -// Empty the honeypot fields in JS in case something like an extension -// automatically filled them. -Rails.delegate(document, '#registration_new_user,#new_user', 'submit', () => { - ['user_website', 'user_confirm_password', 'registration_user_website', 'registration_user_confirm_password'].forEach(id => { - const field = document.getElementById(id); - if (field) { - field.value = ''; - } - }); -}); - -function main() { - ready(loaded); -} - -loadPolyfills() - .then(loadLocale) - .then(main) - .then(loadKeyboardExtensions) - .catch(error => { - console.error(error); - }); diff --git a/app/javascript/packs/public.tsx b/app/javascript/packs/public.tsx new file mode 100644 index 0000000000..044faeb296 --- /dev/null +++ b/app/javascript/packs/public.tsx @@ -0,0 +1,462 @@ +import { createRoot } from 'react-dom/client'; + +import './public-path'; + +import { IntlMessageFormat } from 'intl-messageformat'; +import type { MessageDescriptor, PrimitiveType } from 'react-intl'; +import { defineMessages } from 'react-intl'; + +import Rails from '@rails/ujs'; +import axios from 'axios'; +import { throttle } from 'lodash'; + +import { start } from '../mastodon/common'; +import { timeAgoString } from '../mastodon/components/relative_timestamp'; +import emojify from '../mastodon/features/emoji/emoji'; +import loadKeyboardExtensions from '../mastodon/load_keyboard_extensions'; +import { loadLocale, getLocale } from '../mastodon/locales'; +import { loadPolyfills } from '../mastodon/polyfills'; +import ready from '../mastodon/ready'; + +import 'cocoon-js-vanilla'; + +start(); + +const messages = defineMessages({ + usernameTaken: { + id: 'username.taken', + defaultMessage: 'That username is taken. Try another', + }, + passwordExceedsLength: { + id: 'password_confirmation.exceeds_maxlength', + defaultMessage: 'Password confirmation exceeds the maximum password length', + }, + passwordDoesNotMatch: { + id: 'password_confirmation.mismatching', + defaultMessage: 'Password confirmation does not match', + }, +}); + +interface SetHeightMessage { + type: 'setHeight'; + id: string; + height: number; +} + +function isSetHeightMessage(data: unknown): data is SetHeightMessage { + if ( + data && + typeof data === 'object' && + 'type' in data && + data.type === 'setHeight' + ) + return true; + else return false; +} + +window.addEventListener('message', (e) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- typings are not correct, it can be null in very rare cases + if (!e.data || !isSetHeightMessage(e.data) || !window.parent) return; + + const data = e.data; + + ready(() => { + window.parent.postMessage( + { + type: 'setHeight', + id: data.id, + height: document.getElementsByTagName('html')[0].scrollHeight, + }, + '*', + ); + }).catch((e) => { + console.error('Error in setHeightMessage postMessage', e); + }); +}); + +function loaded() { + const { messages: localeData } = getLocale(); + + const locale = document.documentElement.lang; + + const dateTimeFormat = new Intl.DateTimeFormat(locale, { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + }); + + const dateFormat = new Intl.DateTimeFormat(locale, { + year: 'numeric', + month: 'short', + day: 'numeric', + }); + + const timeFormat = new Intl.DateTimeFormat(locale, { + timeStyle: 'short', + }); + + const formatMessage = ( + { id, defaultMessage }: MessageDescriptor, + values?: Record, + ) => { + let message: string | undefined = undefined; + + if (id) message = localeData[id]; + + if (!message) message = defaultMessage as string; + + const messageFormat = new IntlMessageFormat(message, locale); + return messageFormat.format(values) as string; + }; + + document.querySelectorAll('.emojify').forEach((content) => { + content.innerHTML = emojify(content.innerHTML); + }); + + document + .querySelectorAll('time.formatted') + .forEach((content) => { + const datetime = new Date(content.dateTime); + const formattedDate = dateTimeFormat.format(datetime); + + content.title = formattedDate; + content.textContent = formattedDate; + }); + + const isToday = (date: Date) => { + const today = new Date(); + + return ( + date.getDate() === today.getDate() && + date.getMonth() === today.getMonth() && + date.getFullYear() === today.getFullYear() + ); + }; + const todayFormat = new IntlMessageFormat( + localeData['relative_format.today'] || 'Today at {time}', + locale, + ); + + document + .querySelectorAll('time.relative-formatted') + .forEach((content) => { + const datetime = new Date(content.dateTime); + + let formattedContent: string; + + if (isToday(datetime)) { + const formattedTime = timeFormat.format(datetime); + + formattedContent = todayFormat.format({ + time: formattedTime, + }) as string; + } else { + formattedContent = dateFormat.format(datetime); + } + + content.title = formattedContent; + content.textContent = formattedContent; + }); + + document + .querySelectorAll('time.time-ago') + .forEach((content) => { + const datetime = new Date(content.dateTime); + const now = new Date(); + + const timeGiven = content.dateTime.includes('T'); + content.title = timeGiven + ? dateTimeFormat.format(datetime) + : dateFormat.format(datetime); + content.textContent = timeAgoString( + { + formatMessage, + formatDate: (date: Date, options) => + new Intl.DateTimeFormat(locale, options).format(date), + }, + datetime, + now.getTime(), + now.getFullYear(), + timeGiven, + ); + }); + + const reactComponents = document.querySelectorAll('[data-component]'); + + if (reactComponents.length > 0) { + import( + /* webpackChunkName: "containers/media_container" */ '../mastodon/containers/media_container' + ) + .then(({ default: MediaContainer }) => { + reactComponents.forEach((component) => { + Array.from(component.children).forEach((child) => { + component.removeChild(child); + }); + }); + + const content = document.createElement('div'); + + const root = createRoot(content); + root.render( + , + ); + document.body.appendChild(content); + + return true; + }) + .catch((error) => { + console.error(error); + }); + } + + Rails.delegate( + document, + 'input#user_account_attributes_username', + 'input', + throttle( + ({ target }) => { + if (!(target instanceof HTMLInputElement)) return; + + if (target.value && target.value.length > 0) { + axios + .get('/api/v1/accounts/lookup', { params: { acct: target.value } }) + .then(() => { + target.setCustomValidity(formatMessage(messages.usernameTaken)); + return true; + }) + .catch(() => { + target.setCustomValidity(''); + }); + } else { + target.setCustomValidity(''); + } + }, + 500, + { leading: false, trailing: true }, + ), + ); + + Rails.delegate( + document, + '#user_password,#user_password_confirmation', + 'input', + () => { + const password = document.querySelector( + 'input#user_password', + ); + const confirmation = document.querySelector( + 'input#user_password_confirmation', + ); + if (!confirmation || !password) return; + + if ( + confirmation.value && + confirmation.value.length > password.maxLength + ) { + confirmation.setCustomValidity( + formatMessage(messages.passwordExceedsLength), + ); + } else if (password.value && password.value !== confirmation.value) { + confirmation.setCustomValidity( + formatMessage(messages.passwordDoesNotMatch), + ); + } else { + confirmation.setCustomValidity(''); + } + }, + ); + + Rails.delegate( + document, + 'button.status__content__spoiler-link', + 'click', + function () { + if (!(this instanceof HTMLButtonElement)) return; + + const statusEl = this.parentNode?.parentNode; + + if ( + !( + statusEl instanceof HTMLDivElement && + statusEl.classList.contains('.status__content') + ) + ) + return; + + if (statusEl.dataset.spoiler === 'expanded') { + statusEl.dataset.spoiler = 'folded'; + this.textContent = new IntlMessageFormat( + localeData['status.show_more'] || 'Show more', + locale, + ).format() as string; + } else { + statusEl.dataset.spoiler = 'expanded'; + this.textContent = new IntlMessageFormat( + localeData['status.show_less'] || 'Show less', + locale, + ).format() as string; + } + }, + ); + + document + .querySelectorAll('button.status__content__spoiler-link') + .forEach((spoilerLink) => { + const statusEl = spoilerLink.parentNode?.parentNode; + + if ( + !( + statusEl instanceof HTMLDivElement && + statusEl.classList.contains('.status__content') + ) + ) + return; + + const message = + statusEl.dataset.spoiler === 'expanded' + ? localeData['status.show_less'] || 'Show less' + : localeData['status.show_more'] || 'Show more'; + spoilerLink.textContent = new IntlMessageFormat( + message, + locale, + ).format() as string; + }); +} + +Rails.delegate( + document, + '#edit_profile input[type=file]', + 'change', + ({ target }) => { + if (!(target instanceof HTMLInputElement)) return; + + const avatar = document.querySelector( + `img#${target.id}-preview`, + ); + + if (!avatar) return; + + let file: File | undefined; + if (target.files) file = target.files[0]; + + const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; + + if (url) avatar.src = url; + }, +); + +Rails.delegate(document, '.input-copy input', 'click', ({ target }) => { + if (!(target instanceof HTMLInputElement)) return; + + target.focus(); + target.select(); + target.setSelectionRange(0, target.value.length); +}); + +Rails.delegate(document, '.input-copy button', 'click', ({ target }) => { + if (!(target instanceof HTMLButtonElement)) return; + + const input = target.parentNode?.querySelector( + '.input-copy__wrapper input', + ); + + if (!input) return; + + const oldReadOnly = input.readOnly; + + input.readOnly = false; + input.focus(); + input.select(); + input.setSelectionRange(0, input.value.length); + + try { + if (document.execCommand('copy')) { + input.blur(); + + const parent = target.parentElement; + + if (!parent) return; + parent.classList.add('copied'); + + setTimeout(() => { + parent.classList.remove('copied'); + }, 700); + } + } catch (err) { + console.error(err); + } + + input.readOnly = oldReadOnly; +}); + +const toggleSidebar = () => { + const sidebar = document.querySelector('.sidebar ul'); + const toggleButton = document.querySelector( + 'a.sidebar__toggle__icon', + ); + + if (!sidebar || !toggleButton) return; + + if (sidebar.classList.contains('visible')) { + document.body.style.overflow = ''; + toggleButton.setAttribute('aria-expanded', 'false'); + } else { + document.body.style.overflow = 'hidden'; + toggleButton.setAttribute('aria-expanded', 'true'); + } + + toggleButton.classList.toggle('active'); + sidebar.classList.toggle('visible'); +}; + +Rails.delegate(document, '.sidebar__toggle__icon', 'click', () => { + toggleSidebar(); +}); + +Rails.delegate(document, '.sidebar__toggle__icon', 'keydown', (e) => { + if (e.key === ' ' || e.key === 'Enter') { + e.preventDefault(); + toggleSidebar(); + } +}); + +Rails.delegate(document, 'img.custom-emoji', 'mouseover', ({ target }) => { + if (target instanceof HTMLImageElement && target.dataset.original) + target.src = target.dataset.original; +}); +Rails.delegate(document, 'img.custom-emoji', 'mouseout', ({ target }) => { + if (target instanceof HTMLImageElement && target.dataset.static) + target.src = target.dataset.static; +}); + +// Empty the honeypot fields in JS in case something like an extension +// automatically filled them. +Rails.delegate(document, '#registration_new_user,#new_user', 'submit', () => { + [ + 'user_website', + 'user_confirm_password', + 'registration_user_website', + 'registration_user_confirm_password', + ].forEach((id) => { + const field = document.querySelector(`input#${id}`); + if (field) { + field.value = ''; + } + }); +}); + +function main() { + ready(loaded).catch((error) => { + console.error(error); + }); +} + +loadPolyfills() + .then(loadLocale) + .then(main) + .then(loadKeyboardExtensions) + .catch((error) => { + console.error(error); + }); From 4f4132f1a11797bf1aecc66ae5735257845953ae Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 15 Mar 2024 10:26:23 -0400 Subject: [PATCH 204/954] Add diagnostic message for failure during CLI search deploy (#29462) --- lib/mastodon/cli/search.rb | 8 ++++++++ spec/lib/mastodon/cli/search_spec.rb | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/lib/mastodon/cli/search.rb b/lib/mastodon/cli/search.rb index 5901c07776..3a73c9c047 100644 --- a/lib/mastodon/cli/search.rb +++ b/lib/mastodon/cli/search.rb @@ -100,6 +100,14 @@ module Mastodon::CLI progress.finish say("Indexed #{added} records, de-indexed #{removed}", :green, true) + rescue Elasticsearch::Transport::Transport::ServerError => e + fail_with_message <<~ERROR + There was an issue connecting to the search server. Make sure the + server is configured and running correctly, and that the environment + variable settings match what the server is expecting. + + #{e.message} + ERROR end private diff --git a/spec/lib/mastodon/cli/search_spec.rb b/spec/lib/mastodon/cli/search_spec.rb index 8cce2c6ee2..ed3789c3e7 100644 --- a/spec/lib/mastodon/cli/search_spec.rb +++ b/spec/lib/mastodon/cli/search_spec.rb @@ -33,6 +33,17 @@ describe Mastodon::CLI::Search do end end + context 'when server communication raises an error' do + let(:options) { { reset_chewy: true } } + + before { allow(Chewy::Stash::Specification).to receive(:reset!).and_raise(Elasticsearch::Transport::Transport::Errors::InternalServerError) } + + it 'Exits with error message' do + expect { subject } + .to raise_error(Thor::Error, /issue connecting to the search/) + end + end + context 'without options' do before { stub_search_indexes } From be7a68b09590a553d607b1fe99adf6916618d5d3 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 15 Mar 2024 17:06:48 +0100 Subject: [PATCH 205/954] Change Explore icon to compass in advanced interface (#29610) --- app/javascript/mastodon/features/getting_started/index.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/getting_started/index.jsx b/app/javascript/mastodon/features/getting_started/index.jsx index d84c85806e..a686a0a849 100644 --- a/app/javascript/mastodon/features/getting_started/index.jsx +++ b/app/javascript/mastodon/features/getting_started/index.jsx @@ -11,6 +11,7 @@ import { connect } from 'react-redux'; import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; import BookmarksIcon from '@/material-icons/400-24px/bookmarks-fill.svg?react'; +import ExploreIcon from '@/material-icons/400-24px/explore.svg?react'; import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; @@ -19,7 +20,6 @@ import PersonAddIcon from '@/material-icons/400-24px/person_add.svg?react'; import PublicIcon from '@/material-icons/400-24px/public.svg?react'; import SettingsIcon from '@/material-icons/400-24px/settings-fill.svg?react'; import StarIcon from '@/material-icons/400-24px/star.svg?react'; -import TagIcon from '@/material-icons/400-24px/tag.svg?react'; import { fetchFollowRequests } from 'mastodon/actions/accounts'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; @@ -112,7 +112,7 @@ class GettingStarted extends ImmutablePureComponent { if (showTrends) { navItems.push( - , + , ); } From ec19d0a14bd8f5e76293ca52cf67972e01c2135f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 15 Mar 2024 18:36:41 +0100 Subject: [PATCH 206/954] Change mute, block and domain block confirmations in web UI (#29576) --- app/javascript/mastodon/actions/blocks.js | 15 +- .../mastodon/actions/domain_blocks.js | 11 + app/javascript/mastodon/actions/mutes.js | 32 +-- .../mastodon/components/check_box.tsx | 39 +++ .../mastodon/components/status_action_bar.jsx | 2 +- .../mastodon/containers/status_container.jsx | 15 +- .../account_timeline/components/header.jsx | 6 +- .../containers/header_container.jsx | 13 +- .../features/status/components/action_bar.jsx | 2 +- .../mastodon/features/status/index.jsx | 15 +- .../features/ui/components/block_modal.jsx | 151 ++++++------ .../ui/components/domain_block_modal.jsx | 106 ++++++++ .../features/ui/components/modal_root.jsx | 2 + .../features/ui/components/mute_modal.jsx | 228 ++++++++++-------- .../features/ui/util/async-components.js | 4 + app/javascript/mastodon/locales/en.json | 31 ++- app/javascript/mastodon/reducers/blocks.js | 22 -- app/javascript/mastodon/reducers/index.ts | 4 - app/javascript/mastodon/reducers/mutes.js | 31 --- .../400-24px/domain_disabled-fill.svg | 1 + .../400-24px/domain_disabled.svg | 1 + .../material-icons/400-24px/history-fill.svg | 1 + .../material-icons/400-24px/history.svg | 1 + .../400-24px/person_remove-fill.svg | 1 + .../material-icons/400-24px/person_remove.svg | 1 + .../styles/mastodon/components.scss | 223 +++++++++++++++-- app/javascript/styles/mastodon/variables.scss | 11 +- 27 files changed, 620 insertions(+), 349 deletions(-) create mode 100644 app/javascript/mastodon/components/check_box.tsx create mode 100644 app/javascript/mastodon/features/ui/components/domain_block_modal.jsx delete mode 100644 app/javascript/mastodon/reducers/blocks.js delete mode 100644 app/javascript/mastodon/reducers/mutes.js create mode 100644 app/javascript/material-icons/400-24px/domain_disabled-fill.svg create mode 100644 app/javascript/material-icons/400-24px/domain_disabled.svg create mode 100644 app/javascript/material-icons/400-24px/history-fill.svg create mode 100644 app/javascript/material-icons/400-24px/history.svg create mode 100644 app/javascript/material-icons/400-24px/person_remove-fill.svg create mode 100644 app/javascript/material-icons/400-24px/person_remove.svg diff --git a/app/javascript/mastodon/actions/blocks.js b/app/javascript/mastodon/actions/blocks.js index e293657ad3..54296d0905 100644 --- a/app/javascript/mastodon/actions/blocks.js +++ b/app/javascript/mastodon/actions/blocks.js @@ -12,8 +12,6 @@ export const BLOCKS_EXPAND_REQUEST = 'BLOCKS_EXPAND_REQUEST'; export const BLOCKS_EXPAND_SUCCESS = 'BLOCKS_EXPAND_SUCCESS'; export const BLOCKS_EXPAND_FAIL = 'BLOCKS_EXPAND_FAIL'; -export const BLOCKS_INIT_MODAL = 'BLOCKS_INIT_MODAL'; - export function fetchBlocks() { return (dispatch, getState) => { dispatch(fetchBlocksRequest()); @@ -90,11 +88,12 @@ export function expandBlocksFail(error) { export function initBlockModal(account) { return dispatch => { - dispatch({ - type: BLOCKS_INIT_MODAL, - account, - }); - - dispatch(openModal({ modalType: 'BLOCK' })); + dispatch(openModal({ + modalType: 'BLOCK', + modalProps: { + accountId: account.get('id'), + acct: account.get('acct'), + }, + })); }; } diff --git a/app/javascript/mastodon/actions/domain_blocks.js b/app/javascript/mastodon/actions/domain_blocks.js index 718002613f..55c0a6ce9d 100644 --- a/app/javascript/mastodon/actions/domain_blocks.js +++ b/app/javascript/mastodon/actions/domain_blocks.js @@ -1,6 +1,8 @@ import api, { getLinks } from '../api'; import { blockDomainSuccess, unblockDomainSuccess } from "./domain_blocks_typed"; +import { openModal } from './modal'; + export * from "./domain_blocks_typed"; @@ -150,3 +152,12 @@ export function expandDomainBlocksFail(error) { error, }; } + +export const initDomainBlockModal = account => dispatch => dispatch(openModal({ + modalType: 'DOMAIN_BLOCK', + modalProps: { + domain: account.get('acct').split('@')[1], + acct: account.get('acct'), + accountId: account.get('id'), + }, +})); diff --git a/app/javascript/mastodon/actions/mutes.js b/app/javascript/mastodon/actions/mutes.js index fb041078b8..99c113f414 100644 --- a/app/javascript/mastodon/actions/mutes.js +++ b/app/javascript/mastodon/actions/mutes.js @@ -12,10 +12,6 @@ export const MUTES_EXPAND_REQUEST = 'MUTES_EXPAND_REQUEST'; export const MUTES_EXPAND_SUCCESS = 'MUTES_EXPAND_SUCCESS'; export const MUTES_EXPAND_FAIL = 'MUTES_EXPAND_FAIL'; -export const MUTES_INIT_MODAL = 'MUTES_INIT_MODAL'; -export const MUTES_TOGGLE_HIDE_NOTIFICATIONS = 'MUTES_TOGGLE_HIDE_NOTIFICATIONS'; -export const MUTES_CHANGE_DURATION = 'MUTES_CHANGE_DURATION'; - export function fetchMutes() { return (dispatch, getState) => { dispatch(fetchMutesRequest()); @@ -92,26 +88,12 @@ export function expandMutesFail(error) { export function initMuteModal(account) { return dispatch => { - dispatch({ - type: MUTES_INIT_MODAL, - account, - }); - - dispatch(openModal({ modalType: 'MUTE' })); - }; -} - -export function toggleHideNotifications() { - return dispatch => { - dispatch({ type: MUTES_TOGGLE_HIDE_NOTIFICATIONS }); - }; -} - -export function changeMuteDuration(duration) { - return dispatch => { - dispatch({ - type: MUTES_CHANGE_DURATION, - duration, - }); + dispatch(openModal({ + modalType: 'MUTE', + modalProps: { + accountId: account.get('id'), + acct: account.get('acct'), + }, + })); }; } diff --git a/app/javascript/mastodon/components/check_box.tsx b/app/javascript/mastodon/components/check_box.tsx new file mode 100644 index 0000000000..7da8ef0ac5 --- /dev/null +++ b/app/javascript/mastodon/components/check_box.tsx @@ -0,0 +1,39 @@ +import classNames from 'classnames'; + +import DoneIcon from '@/material-icons/400-24px/done.svg?react'; + +import { Icon } from './icon'; + +interface Props { + value: string; + checked: boolean; + name: string; + onChange: (event: React.ChangeEvent) => void; + label: React.ReactNode; +} + +export const CheckBox: React.FC = ({ + name, + value, + checked, + onChange, + label, +}) => { + return ( + + ); +}; diff --git a/app/javascript/mastodon/components/status_action_bar.jsx b/app/javascript/mastodon/components/status_action_bar.jsx index b111a65385..3c6d26e349 100644 --- a/app/javascript/mastodon/components/status_action_bar.jsx +++ b/app/javascript/mastodon/components/status_action_bar.jsx @@ -209,7 +209,7 @@ class StatusActionBar extends ImmutablePureComponent { const { status, onBlockDomain } = this.props; const account = status.get('account'); - onBlockDomain(account.get('acct').split('@')[1]); + onBlockDomain(account); }; handleUnblockDomain = () => { diff --git a/app/javascript/mastodon/containers/status_container.jsx b/app/javascript/mastodon/containers/status_container.jsx index 7a7cd9880f..7bd91c8c9d 100644 --- a/app/javascript/mastodon/containers/status_container.jsx +++ b/app/javascript/mastodon/containers/status_container.jsx @@ -1,4 +1,4 @@ -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, injectIntl } from 'react-intl'; import { connect } from 'react-redux'; @@ -15,7 +15,7 @@ import { directCompose, } from '../actions/compose'; import { - blockDomain, + initDomainBlockModal, unblockDomain, } from '../actions/domain_blocks'; import { @@ -253,15 +253,8 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({ dispatch(toggleStatusCollapse(status.get('id'), isCollapsed)); }, - onBlockDomain (domain) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: {domain}
}} />, - confirm: intl.formatMessage(messages.blockDomainConfirm), - onConfirm: () => dispatch(blockDomain(domain)), - }, - })); + onBlockDomain (account) { + dispatch(initDomainBlockModal(account)); }, onUnblockDomain (domain) { diff --git a/app/javascript/mastodon/features/account_timeline/components/header.jsx b/app/javascript/mastodon/features/account_timeline/components/header.jsx index 7de8d3771b..a2463b8764 100644 --- a/app/javascript/mastodon/features/account_timeline/components/header.jsx +++ b/app/javascript/mastodon/features/account_timeline/components/header.jsx @@ -72,11 +72,7 @@ class Header extends ImmutablePureComponent { }; handleBlockDomain = () => { - const domain = this.props.account.get('acct').split('@')[1]; - - if (!domain) return; - - this.props.onBlockDomain(domain); + this.props.onBlockDomain(this.props.account); }; handleUnblockDomain = () => { diff --git a/app/javascript/mastodon/features/account_timeline/containers/header_container.jsx b/app/javascript/mastodon/features/account_timeline/containers/header_container.jsx index 84a303c37a..071dbdbfb7 100644 --- a/app/javascript/mastodon/features/account_timeline/containers/header_container.jsx +++ b/app/javascript/mastodon/features/account_timeline/containers/header_container.jsx @@ -17,7 +17,7 @@ import { mentionCompose, directCompose, } from '../../../actions/compose'; -import { blockDomain, unblockDomain } from '../../../actions/domain_blocks'; +import { initDomainBlockModal, unblockDomain } from '../../../actions/domain_blocks'; import { openModal } from '../../../actions/modal'; import { initMuteModal } from '../../../actions/mutes'; import { initReport } from '../../../actions/reports'; @@ -140,15 +140,8 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ } }, - onBlockDomain (domain) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: {domain} }} />, - confirm: intl.formatMessage(messages.blockDomainConfirm), - onConfirm: () => dispatch(blockDomain(domain)), - }, - })); + onBlockDomain (account) { + dispatch(initDomainBlockModal(account)); }, onUnblockDomain (domain) { diff --git a/app/javascript/mastodon/features/status/components/action_bar.jsx b/app/javascript/mastodon/features/status/components/action_bar.jsx index c243a49129..a4951260ab 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.jsx +++ b/app/javascript/mastodon/features/status/components/action_bar.jsx @@ -159,7 +159,7 @@ class ActionBar extends PureComponent { const { status, onBlockDomain } = this.props; const account = status.get('account'); - onBlockDomain(account.get('acct').split('@')[1]); + onBlockDomain(account); }; handleUnblockDomain = () => { diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx index a3034bb570..44db9d9c3f 100644 --- a/app/javascript/mastodon/features/status/index.jsx +++ b/app/javascript/mastodon/features/status/index.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, injectIntl } from 'react-intl'; import classNames from 'classnames'; import { Helmet } from 'react-helmet'; @@ -34,7 +34,7 @@ import { directCompose, } from '../../actions/compose'; import { - blockDomain, + initDomainBlockModal, unblockDomain, } from '../../actions/domain_blocks'; import { @@ -463,15 +463,8 @@ class Status extends ImmutablePureComponent { this.props.dispatch(unblockAccount(account.get('id'))); }; - handleBlockDomainClick = domain => { - this.props.dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: {domain} }} />, - confirm: this.props.intl.formatMessage(messages.blockDomainConfirm), - onConfirm: () => this.props.dispatch(blockDomain(domain)), - }, - })); + handleBlockDomainClick = account => { + this.props.dispatch(initDomainBlockModal(account)); }; handleUnblockDomainClick = domain => { diff --git a/app/javascript/mastodon/features/ui/components/block_modal.jsx b/app/javascript/mastodon/features/ui/components/block_modal.jsx index cfac692324..d18adaa5eb 100644 --- a/app/javascript/mastodon/features/ui/components/block_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/block_modal.jsx @@ -1,100 +1,87 @@ import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; +import { useCallback } from 'react'; -import { injectIntl, FormattedMessage } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; -import { connect } from 'react-redux'; +import { useDispatch } from 'react-redux'; -import { blockAccount } from '../../../actions/accounts'; -import { closeModal } from '../../../actions/modal'; -import { initReport } from '../../../actions/reports'; -import { Button } from '../../../components/button'; -import { makeGetAccount } from '../../../selectors'; +import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; +import BlockIcon from '@/material-icons/400-24px/block.svg?react'; +import CampaignIcon from '@/material-icons/400-24px/campaign.svg?react'; +import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; +import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react'; +import { blockAccount } from 'mastodon/actions/accounts'; +import { closeModal } from 'mastodon/actions/modal'; +import { Button } from 'mastodon/components/button'; +import { Icon } from 'mastodon/components/icon'; -const makeMapStateToProps = () => { - const getAccount = makeGetAccount(); +export const BlockModal = ({ accountId, acct }) => { + const dispatch = useDispatch(); - const mapStateToProps = state => ({ - account: getAccount(state, state.getIn(['blocks', 'new', 'account_id'])), - }); + const handleClick = useCallback(() => { + dispatch(closeModal({ modalType: undefined, ignoreFocus: false })); + dispatch(blockAccount(accountId)); + }, [dispatch, accountId]); - return mapStateToProps; -}; + const handleCancel = useCallback(() => { + dispatch(closeModal({ modalType: undefined, ignoreFocus: false })); + }, [dispatch]); -const mapDispatchToProps = dispatch => { - return { - onConfirm(account) { - dispatch(blockAccount(account.get('id'))); - }, + return ( +
+
+
+
+ +
- onBlockAndReport(account) { - dispatch(blockAccount(account.get('id'))); - dispatch(initReport(account)); - }, - - onClose() { - dispatch(closeModal({ - modalType: undefined, - ignoreFocus: false, - })); - }, - }; -}; - -class BlockModal extends PureComponent { - - static propTypes = { - account: PropTypes.object.isRequired, - onClose: PropTypes.func.isRequired, - onBlockAndReport: PropTypes.func.isRequired, - onConfirm: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired, - }; - - handleClick = () => { - this.props.onClose(); - this.props.onConfirm(this.props.account); - }; - - handleSecondary = () => { - this.props.onClose(); - this.props.onBlockAndReport(this.props.account); - }; - - handleCancel = () => { - this.props.onClose(); - }; - - render () { - const { account } = this.props; - - return ( -
-
-

- @{account.get('acct')} }} - /> -

+
+

+
@{acct}
+
-
-
+ +
+
+ - - + +
- ); - } +
+ ); +}; -} +BlockModal.propTypes = { + accountId: PropTypes.string.isRequired, + acct: PropTypes.string.isRequired, +}; -export default connect(makeMapStateToProps, mapDispatchToProps)(injectIntl(BlockModal)); +export default BlockModal; diff --git a/app/javascript/mastodon/features/ui/components/domain_block_modal.jsx b/app/javascript/mastodon/features/ui/components/domain_block_modal.jsx new file mode 100644 index 0000000000..e69db63489 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/domain_block_modal.jsx @@ -0,0 +1,106 @@ +import PropTypes from 'prop-types'; +import { useCallback } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { useDispatch } from 'react-redux'; + +import CampaignIcon from '@/material-icons/400-24px/campaign.svg?react'; +import DomainDisabledIcon from '@/material-icons/400-24px/domain_disabled.svg?react'; +import HistoryIcon from '@/material-icons/400-24px/history.svg?react'; +import PersonRemoveIcon from '@/material-icons/400-24px/person_remove.svg?react'; +import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; +import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react'; +import { blockAccount } from 'mastodon/actions/accounts'; +import { blockDomain } from 'mastodon/actions/domain_blocks'; +import { closeModal } from 'mastodon/actions/modal'; +import { Button } from 'mastodon/components/button'; +import { Icon } from 'mastodon/components/icon'; + +export const DomainBlockModal = ({ domain, accountId, acct }) => { + const dispatch = useDispatch(); + + const handleClick = useCallback(() => { + dispatch(closeModal({ modalType: undefined, ignoreFocus: false })); + dispatch(blockDomain(domain)); + }, [dispatch, domain]); + + const handleSecondaryClick = useCallback(() => { + dispatch(closeModal({ modalType: undefined, ignoreFocus: false })); + dispatch(blockAccount(accountId)); + }, [dispatch, accountId]); + + const handleCancel = useCallback(() => { + dispatch(closeModal({ modalType: undefined, ignoreFocus: false })); + }, [dispatch]); + + return ( +
+
+
+
+ +
+ +
+

+
{domain}
+
+
+ +
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ +
+
+ + +
+ + + + +
+
+
+ ); +}; + +DomainBlockModal.propTypes = { + domain: PropTypes.string.isRequired, + accountId: PropTypes.string.isRequired, + acct: PropTypes.string.isRequired, +}; + +export default DomainBlockModal; diff --git a/app/javascript/mastodon/features/ui/components/modal_root.jsx b/app/javascript/mastodon/features/ui/components/modal_root.jsx index 46f0dc706f..97d7706da4 100644 --- a/app/javascript/mastodon/features/ui/components/modal_root.jsx +++ b/app/javascript/mastodon/features/ui/components/modal_root.jsx @@ -7,6 +7,7 @@ import Base from 'mastodon/components/modal_root'; import { MuteModal, BlockModal, + DomainBlockModal, ReportModal, EmbedModal, ListEditor, @@ -41,6 +42,7 @@ export const MODAL_COMPONENTS = { 'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }), 'MUTE': MuteModal, 'BLOCK': BlockModal, + 'DOMAIN_BLOCK': DomainBlockModal, 'REPORT': ReportModal, 'ACTIONS': () => Promise.resolve({ default: ActionsModal }), 'EMBED': EmbedModal, diff --git a/app/javascript/mastodon/features/ui/components/mute_modal.jsx b/app/javascript/mastodon/features/ui/components/mute_modal.jsx index fa81ea81a3..e9dc1a7c2e 100644 --- a/app/javascript/mastodon/features/ui/components/mute_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/mute_modal.jsx @@ -1,138 +1,154 @@ import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; +import { useCallback, useState } from 'react'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; -import { connect } from 'react-redux'; +import classNames from 'classnames'; -import Toggle from 'react-toggle'; +import { useDispatch } from 'react-redux'; -import { muteAccount } from '../../../actions/accounts'; -import { closeModal } from '../../../actions/modal'; -import { toggleHideNotifications, changeMuteDuration } from '../../../actions/mutes'; -import { Button } from '../../../components/button'; + +import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; +import CampaignIcon from '@/material-icons/400-24px/campaign.svg?react'; +import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; +import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react'; +import VolumeOffIcon from '@/material-icons/400-24px/volume_off.svg?react'; +import { muteAccount } from 'mastodon/actions/accounts'; +import { closeModal } from 'mastodon/actions/modal'; +import { Button } from 'mastodon/components/button'; +import { CheckBox } from 'mastodon/components/check_box'; +import { Icon } from 'mastodon/components/icon'; +import { RadioButton } from 'mastodon/components/radio_button'; const messages = defineMessages({ minutes: { id: 'intervals.full.minutes', defaultMessage: '{number, plural, one {# minute} other {# minutes}}' }, hours: { id: 'intervals.full.hours', defaultMessage: '{number, plural, one {# hour} other {# hours}}' }, days: { id: 'intervals.full.days', defaultMessage: '{number, plural, one {# day} other {# days}}' }, - indefinite: { id: 'mute_modal.indefinite', defaultMessage: 'Indefinite' }, + indefinite: { id: 'mute_modal.indefinite', defaultMessage: 'Until I unmute them' }, + hideFromNotifications: { id: 'mute_modal.hide_from_notifications', defaultMessage: 'Hide from notifications' }, }); -const mapStateToProps = state => { - return { - account: state.getIn(['mutes', 'new', 'account']), - notifications: state.getIn(['mutes', 'new', 'notifications']), - muteDuration: state.getIn(['mutes', 'new', 'duration']), - }; +const RadioButtonLabel = ({ name, value, currentValue, onChange, label }) => ( + +); + +RadioButtonLabel.propTypes = { + name: PropTypes.string, + value: PropTypes.oneOf([PropTypes.string, PropTypes.number, PropTypes.bool]), + currentValue: PropTypes.oneOf([PropTypes.string, PropTypes.number, PropTypes.bool]), + checked: PropTypes.bool, + onChange: PropTypes.func, + label: PropTypes.node, }; -const mapDispatchToProps = dispatch => { - return { - onConfirm(account, notifications, muteDuration) { - dispatch(muteAccount(account.get('id'), notifications, muteDuration)); - }, +export const MuteModal = ({ accountId, acct }) => { + const intl = useIntl(); + const dispatch = useDispatch(); + const [notifications, setNotifications] = useState(true); + const [muteDuration, setMuteDuration] = useState('0'); + const [expanded, setExpanded] = useState(false); - onClose() { - dispatch(closeModal({ - modalType: undefined, - ignoreFocus: false, - })); - }, + const handleClick = useCallback(() => { + dispatch(closeModal({ modalType: undefined, ignoreFocus: false })); + dispatch(muteAccount(accountId, notifications, muteDuration)); + }, [dispatch, accountId, notifications, muteDuration]); - onToggleNotifications() { - dispatch(toggleHideNotifications()); - }, + const handleCancel = useCallback(() => { + dispatch(closeModal({ modalType: undefined, ignoreFocus: false })); + }, [dispatch]); - onChangeMuteDuration(e) { - dispatch(changeMuteDuration(e.target.value)); - }, - }; -}; + const handleToggleNotifications = useCallback(({ target }) => { + setNotifications(target.checked); + }, [setNotifications]); -class MuteModal extends PureComponent { + const handleChangeMuteDuration = useCallback(({ target }) => { + setMuteDuration(target.value); + }, [setMuteDuration]); - static propTypes = { - account: PropTypes.object.isRequired, - notifications: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired, - onConfirm: PropTypes.func.isRequired, - onToggleNotifications: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired, - muteDuration: PropTypes.number.isRequired, - onChangeMuteDuration: PropTypes.func.isRequired, - }; + const handleToggleSettings = useCallback(() => { + setExpanded(!expanded); + }, [expanded, setExpanded]); - handleClick = () => { - this.props.onClose(); - this.props.onConfirm(this.props.account, this.props.notifications, this.props.muteDuration); - }; - - handleCancel = () => { - this.props.onClose(); - }; - - toggleNotifications = () => { - this.props.onToggleNotifications(); - }; - - changeMuteDuration = (e) => { - this.props.onChangeMuteDuration(e); - }; - - render () { - const { account, notifications, muteDuration, intl } = this.props; - - return ( -
-
-

- @{account.get('acct')} }} - /> -

-

- -

-
- - + return ( +
+
+
+
+
-
- : - +
+

+
@{acct}
-
-
+ +
+
+
+ + + + +
+ +
+ +
+
+ +
+ + +
+ + - + +
- ); - } +
+ ); +}; -} +MuteModal.propTypes = { + accountId: PropTypes.string.isRequired, + acct: PropTypes.string.isRequired, +}; -export default connect(mapStateToProps, mapDispatchToProps)(injectIntl(MuteModal)); +export default MuteModal; diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js index de9b6b4010..e1f5bfdaf6 100644 --- a/app/javascript/mastodon/features/ui/util/async-components.js +++ b/app/javascript/mastodon/features/ui/util/async-components.js @@ -118,6 +118,10 @@ export function BlockModal () { return import(/* webpackChunkName: "modals/block_modal" */'../components/block_modal'); } +export function DomainBlockModal () { + return import(/* webpackChunkName: "modals/domain_block_modal" */'../components/domain_block_modal'); +} + export function ReportModal () { return import(/* webpackChunkName: "modals/report_modal" */'../components/report_modal'); } diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index e05cf8c4c1..f893c98a3c 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -89,6 +89,11 @@ "announcement.announcement": "Announcement", "attachments_list.unprocessed": "(unprocessed)", "audio.hide": "Hide audio", + "block_modal.they_cant_mention": "They can't mention or follow you.", + "block_modal.they_cant_see_posts": "They can't see your posts and you won't see theirs.", + "block_modal.they_will_know": "They can see that they're blocked.", + "block_modal.title": "Block user?", + "block_modal.you_wont_see_mentions": "You won't see posts that mention them.", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.copy_stacktrace": "Copy error report", "bundle_column_error.error.body": "The requested page could not be rendered. It could be due to a bug in our code, or a browser compatibility issue.", @@ -160,9 +165,7 @@ "compose_form.spoiler.unmarked": "Add content warning", "compose_form.spoiler_placeholder": "Content warning (optional)", "confirmation_modal.cancel": "Cancel", - "confirmations.block.block_and_report": "Block & Report", "confirmations.block.confirm": "Block", - "confirmations.block.message": "Are you sure you want to block {name}?", "confirmations.cancel_follow_request.confirm": "Withdraw request", "confirmations.cancel_follow_request.message": "Are you sure you want to withdraw your request to follow {name}?", "confirmations.delete.confirm": "Delete", @@ -171,15 +174,13 @@ "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.discard_edit_media.confirm": "Discard", "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", - "confirmations.domain_block.confirm": "Block entire domain", + "confirmations.domain_block.confirm": "Block server", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", "confirmations.edit.confirm": "Edit", "confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.logout.confirm": "Log out", "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Mute", - "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.", - "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.", "confirmations.reply.confirm": "Reply", @@ -205,6 +206,14 @@ "dismissable_banner.explore_statuses": "These are posts from across the social web that are gaining traction today. Newer posts with more boosts and favorites are ranked higher.", "dismissable_banner.explore_tags": "These are hashtags that are gaining traction on the social web today. Hashtags that are used by more different people are ranked higher.", "dismissable_banner.public_timeline": "These are the most recent public posts from people on the social web that people on {domain} follow.", + "domain_block_modal.block": "Block server", + "domain_block_modal.block_account_instead": "Block @{name} instead", + "domain_block_modal.they_can_interact_with_old_posts": "People from this server can interact with your old posts.", + "domain_block_modal.they_cant_follow": "Nobody from this server can follow you.", + "domain_block_modal.they_wont_know": "They won't know they've been blocked.", + "domain_block_modal.title": "Block domain?", + "domain_block_modal.you_will_lose_followers": "All your followers from this server will be removed.", + "domain_block_modal.you_wont_see_posts": "You won't see posts or notifications from users on this server.", "domain_pill.activitypub_lets_connect": "It lets you connect and interact with people not just on Mastodon, but across different social apps too.", "domain_pill.activitypub_like_language": "ActivityPub is like the language Mastodon speaks with other social networks.", "domain_pill.server": "Server", @@ -415,9 +424,15 @@ "loading_indicator.label": "Loading…", "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}", "moved_to_account_banner.text": "Your account {disabledAccount} is currently disabled because you moved to {movedToAccount}.", - "mute_modal.duration": "Duration", - "mute_modal.hide_notifications": "Hide notifications from this user?", - "mute_modal.indefinite": "Indefinite", + "mute_modal.hide_from_notifications": "Hide from notifications", + "mute_modal.hide_options": "Hide options", + "mute_modal.indefinite": "Until I unmute them", + "mute_modal.show_options": "Show options", + "mute_modal.they_can_mention_and_follow": "They can mention and follow you, but you won't see them.", + "mute_modal.they_wont_know": "They won't know they've been muted.", + "mute_modal.title": "Mute user?", + "mute_modal.you_wont_see_mentions": "You won't see posts that mention them.", + "mute_modal.you_wont_see_posts": "They can still see your posts, but you won't see theirs.", "navigation_bar.about": "About", "navigation_bar.advanced_interface": "Open in advanced web interface", "navigation_bar.blocks": "Blocked users", diff --git a/app/javascript/mastodon/reducers/blocks.js b/app/javascript/mastodon/reducers/blocks.js deleted file mode 100644 index 1b65071634..0000000000 --- a/app/javascript/mastodon/reducers/blocks.js +++ /dev/null @@ -1,22 +0,0 @@ -import Immutable from 'immutable'; - -import { - BLOCKS_INIT_MODAL, -} from '../actions/blocks'; - -const initialState = Immutable.Map({ - new: Immutable.Map({ - account_id: null, - }), -}); - -export default function mutes(state = initialState, action) { - switch (action.type) { - case BLOCKS_INIT_MODAL: - return state.withMutations((state) => { - state.setIn(['new', 'account_id'], action.account.get('id')); - }); - default: - return state; - } -} diff --git a/app/javascript/mastodon/reducers/index.ts b/app/javascript/mastodon/reducers/index.ts index 51a76d191e..3d42cc83f8 100644 --- a/app/javascript/mastodon/reducers/index.ts +++ b/app/javascript/mastodon/reducers/index.ts @@ -7,7 +7,6 @@ import { accountsReducer } from './accounts'; import accounts_map from './accounts_map'; import alerts from './alerts'; import announcements from './announcements'; -import blocks from './blocks'; import boosts from './boosts'; import compose from './compose'; import contexts from './contexts'; @@ -26,7 +25,6 @@ import markers from './markers'; import media_attachments from './media_attachments'; import meta from './meta'; import { modalReducer } from './modal'; -import mutes from './mutes'; import { notificationPolicyReducer } from './notification_policy'; import { notificationRequestsReducer } from './notification_requests'; import notifications from './notifications'; @@ -62,8 +60,6 @@ const reducers = { relationships: relationshipsReducer, settings, push_notifications, - mutes, - blocks, boosts, server, contexts, diff --git a/app/javascript/mastodon/reducers/mutes.js b/app/javascript/mastodon/reducers/mutes.js deleted file mode 100644 index a9eb61ff83..0000000000 --- a/app/javascript/mastodon/reducers/mutes.js +++ /dev/null @@ -1,31 +0,0 @@ -import Immutable from 'immutable'; - -import { - MUTES_INIT_MODAL, - MUTES_TOGGLE_HIDE_NOTIFICATIONS, - MUTES_CHANGE_DURATION, -} from '../actions/mutes'; - -const initialState = Immutable.Map({ - new: Immutable.Map({ - account: null, - notifications: true, - duration: 0, - }), -}); - -export default function mutes(state = initialState, action) { - switch (action.type) { - case MUTES_INIT_MODAL: - return state.withMutations((state) => { - state.setIn(['new', 'account'], action.account); - state.setIn(['new', 'notifications'], true); - }); - case MUTES_TOGGLE_HIDE_NOTIFICATIONS: - return state.updateIn(['new', 'notifications'], (old) => !old); - case MUTES_CHANGE_DURATION: - return state.setIn(['new', 'duration'], Number(action.duration)); - default: - return state; - } -} diff --git a/app/javascript/material-icons/400-24px/domain_disabled-fill.svg b/app/javascript/material-icons/400-24px/domain_disabled-fill.svg new file mode 100644 index 0000000000..2f16593d38 --- /dev/null +++ b/app/javascript/material-icons/400-24px/domain_disabled-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/domain_disabled.svg b/app/javascript/material-icons/400-24px/domain_disabled.svg new file mode 100644 index 0000000000..2f16593d38 --- /dev/null +++ b/app/javascript/material-icons/400-24px/domain_disabled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/history-fill.svg b/app/javascript/material-icons/400-24px/history-fill.svg new file mode 100644 index 0000000000..2d8124b474 --- /dev/null +++ b/app/javascript/material-icons/400-24px/history-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/history.svg b/app/javascript/material-icons/400-24px/history.svg new file mode 100644 index 0000000000..2d8124b474 --- /dev/null +++ b/app/javascript/material-icons/400-24px/history.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/person_remove-fill.svg b/app/javascript/material-icons/400-24px/person_remove-fill.svg new file mode 100644 index 0000000000..239c7a49dc --- /dev/null +++ b/app/javascript/material-icons/400-24px/person_remove-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/person_remove.svg b/app/javascript/material-icons/400-24px/person_remove.svg new file mode 100644 index 0000000000..725da3649b --- /dev/null +++ b/app/javascript/material-icons/400-24px/person_remove.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 8e0859038d..805ffb963a 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -106,17 +106,17 @@ } &.button-secondary { - color: $ui-button-secondary-color; + color: $highlight-text-color; background: transparent; padding: 6px 17px; - border: 1px solid $ui-button-secondary-border-color; + border: 1px solid $highlight-text-color; &:active, &:focus, &:hover { - border-color: $ui-button-secondary-focus-background-color; - color: $ui-button-secondary-focus-color; - background-color: $ui-button-secondary-focus-background-color; + border-color: lighten($highlight-text-color, 4%); + color: lighten($highlight-text-color, 4%); + background-color: transparent; text-decoration: none; } @@ -5480,6 +5480,10 @@ a.status-card { pointer-events: auto; user-select: text; display: flex; + + @media screen and (max-width: $no-gap-breakpoint) { + margin-top: auto; + } } .video-modal .video-player { @@ -5811,6 +5815,145 @@ a.status-card { margin-inline-start: 10px; } +.safety-action-modal { + width: 600px; + flex-direction: column; + + &__top, + &__bottom { + display: flex; + gap: 8px; + padding: 24px; + flex-direction: column; + background: var(--modal-background-color); + backdrop-filter: var(--background-filter); + border: 1px solid var(--modal-border-color); + } + + &__top { + border-radius: 16px 16px 0 0; + border-bottom: 0; + gap: 16px; + } + + &__bottom { + border-radius: 0 0 16px 16px; + border-top: 0; + + @media screen and (max-width: $no-gap-breakpoint) { + border-radius: 0; + border-bottom: 0; + padding-bottom: 32px; + } + } + + &__header { + display: flex; + gap: 16px; + align-items: center; + font-size: 14px; + line-height: 20px; + color: $darker-text-color; + + &__icon { + border-radius: 64px; + background: $ui-highlight-color; + color: $white; + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + flex-shrink: 0; + + .icon { + width: 24px; + height: 24px; + } + } + + h1 { + font-size: 22px; + line-height: 28px; + color: $primary-text-color; + } + } + + &__bullet-points { + display: flex; + flex-direction: column; + gap: 8px; + font-size: 16px; + line-height: 24px; + + & > div { + display: flex; + gap: 16px; + align-items: center; + } + + &__icon { + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + + .icon { + width: 24px; + height: 24px; + } + } + } + + &__field-group { + display: flex; + flex-direction: column; + + label { + display: flex; + gap: 16px; + align-items: center; + font-size: 16px; + line-height: 24px; + height: 32px; + padding: 0 12px; + } + } + + &__bottom { + padding-top: 0; + + &__collapsible { + display: none; + flex-direction: column; + gap: 16px; + } + + &.active { + background: var(--modal-background-variant-color); + padding-top: 24px; + + .safety-action-modal__bottom__collapsible { + display: flex; + } + } + } + + &__actions { + display: flex; + align-items: center; + gap: 8px; + justify-content: flex-end; + + .link-button { + padding: 10px 12px; + font-weight: 600; + } + } +} + .boost-modal, .confirmation-modal, .report-modal, @@ -7113,7 +7256,8 @@ a.status-card { display: flex; } -.radio-button { +.radio-button, +.check-box { font-size: 14px; position: relative; display: inline-flex; @@ -7132,17 +7276,19 @@ a.status-card { } &__input { - display: block; + display: flex; + align-items: center; + justify-content: center; position: relative; border: 2px solid $secondary-text-color; box-sizing: border-box; - width: 18px; - height: 18px; + width: 20px; + height: 20px; flex: 0 0 auto; border-radius: 50%; &.checked { - border-color: $secondary-text-color; + border-color: $ui-highlight-color; &::before { position: absolute; @@ -7151,9 +7297,31 @@ a.status-card { content: ''; display: block; border-radius: 50%; - width: 10px; - height: 10px; - background: $secondary-text-color; + width: 12px; + height: 12px; + background: $ui-highlight-color; + } + } + + .icon { + width: 18px; + height: 18px; + } + } +} + +.check-box { + &__input { + width: 18px; + height: 18px; + border-radius: 2px; + + &.checked { + background: $ui-highlight-color; + color: $white; + + &::before { + display: none; } } } @@ -8632,22 +8800,36 @@ noscript { } } +.safety-action-modal, .interaction-modal { max-width: 90vw; width: 600px; - background: var(--modal-background-color); - border: 1px solid var(--modal-border-color); - border-radius: 8px; +} + +.interaction-modal { overflow: visible; position: relative; display: block; - padding: 40px; + border-radius: 16px; + background: var(--modal-background-color); + backdrop-filter: var(--background-filter); + border: 1px solid var(--modal-border-color); + padding: 24px; + + @media screen and (max-width: $no-gap-breakpoint) { + border-radius: 16px 16px 0 0; + border-bottom: 0; + padding-bottom: 32px; + } h3 { font-size: 22px; line-height: 33px; font-weight: 700; - text-align: center; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; } p { @@ -8668,7 +8850,9 @@ noscript { &__icon { color: $highlight-text-color; - margin: 0 5px; + display: flex; + align-items: center; + justify-content: center; } &__lead { @@ -8701,6 +8885,7 @@ noscript { border: 0; padding: 15px - 4px 15px - 6px; flex: 1 1 auto; + min-width: 0; &::placeholder { color: lighten($darker-text-color, 4%); diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss index 2b2a295791..58b9dd9b61 100644 --- a/app/javascript/styles/mastodon/variables.scss +++ b/app/javascript/styles/mastodon/variables.scss @@ -46,10 +46,10 @@ $ui-button-focus-background-color: $blurple-600 !default; $ui-button-focus-outline-color: $blurple-400 !default; $ui-button-focus-outline: solid 2px $ui-button-focus-outline-color !default; -$ui-button-secondary-color: $grey-100 !default; -$ui-button-secondary-border-color: $grey-100 !default; -$ui-button-secondary-focus-background-color: $grey-600 !default; -$ui-button-secondary-focus-color: $white !default; +$ui-button-secondary-color: $blurple-500 !default; +$ui-button-secondary-border-color: $blurple-500 !default; +$ui-button-secondary-focus-border-color: $blurple-300 !default; +$ui-button-secondary-focus-color: $blurple-300 !default; $ui-button-tertiary-color: $blurple-300 !default; $ui-button-tertiary-border-color: $blurple-300 !default; @@ -98,7 +98,8 @@ $font-monospace: 'mastodon-font-monospace' !default; --dropdown-background-color: #{rgba(darken($ui-base-color, 8%), 0.9)}; --dropdown-shadow: 0 20px 25px -5px #{rgba($base-shadow-color, 0.25)}, 0 8px 10px -6px #{rgba($base-shadow-color, 0.25)}; - --modal-background-color: #{darken($ui-base-color, 4%)}; + --modal-background-color: #{rgba(darken($ui-base-color, 8%), 0.7)}; + --modal-background-variant-color: #{rgba($ui-base-color, 0.7)}; --modal-border-color: #{lighten($ui-base-color, 4%)}; --background-border-color: #{lighten($ui-base-color, 4%)}; --background-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%); From d702a03a0c35fc631a0fa456532946e6751cbbfd Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 15 Mar 2024 20:09:21 +0100 Subject: [PATCH 207/954] =?UTF-8?q?Add=20=E2=80=9CLearn=20more=E2=80=9D=20?= =?UTF-8?q?on=20block=20modal=20to=20inform=20of=20federation=20caveats=20?= =?UTF-8?q?(#29614)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features/ui/components/block_modal.jsx | 33 +++++++++++++++++-- app/javascript/mastodon/locales/en.json | 3 ++ .../styles/mastodon/components.scss | 9 +++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/ui/components/block_modal.jsx b/app/javascript/mastodon/features/ui/components/block_modal.jsx index d18adaa5eb..fc9233a9cc 100644 --- a/app/javascript/mastodon/features/ui/components/block_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/block_modal.jsx @@ -1,8 +1,10 @@ import PropTypes from 'prop-types'; -import { useCallback } from 'react'; +import { useCallback, useState } from 'react'; import { FormattedMessage } from 'react-intl'; +import classNames from 'classnames'; + import { useDispatch } from 'react-redux'; import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; @@ -17,6 +19,9 @@ import { Icon } from 'mastodon/components/icon'; export const BlockModal = ({ accountId, acct }) => { const dispatch = useDispatch(); + const [expanded, setExpanded] = useState(false); + + const domain = acct.split('@')[1]; const handleClick = useCallback(() => { dispatch(closeModal({ modalType: undefined, ignoreFocus: false })); @@ -27,6 +32,10 @@ export const BlockModal = ({ accountId, acct }) => { dispatch(closeModal({ modalType: undefined, ignoreFocus: false })); }, [dispatch]); + const handleToggleLearnMore = useCallback(() => { + setExpanded(!expanded); + }, [expanded, setExpanded]); + return (
@@ -64,8 +73,28 @@ export const BlockModal = ({ accountId, acct }) => {
-
+
+ {domain && ( +
+
+ {domain} }} + /> +
+
+ )} +
+ {domain && ( + + )} + +
+ diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index f893c98a3c..376dfb7e4b 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -89,6 +89,9 @@ "announcement.announcement": "Announcement", "attachments_list.unprocessed": "(unprocessed)", "audio.hide": "Hide audio", + "block_modal.remote_users_caveat": "We will ask the server {domain} to respect your decision. However, compliance is not guaranteed since some servers may handle blocks differently. Public posts may still be visible to non-logged-in users.", + "block_modal.show_less": "Show less", + "block_modal.show_more": "Show more", "block_modal.they_cant_mention": "They can't mention or follow you.", "block_modal.they_cant_see_posts": "They can't see your posts and you won't see theirs.", "block_modal.they_will_know": "They can see that they're blocked.", diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 805ffb963a..8b7e5f5e84 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -5922,6 +5922,15 @@ a.status-card { } } + &__caveats { + font-size: 14px; + padding: 0 12px; + + strong { + font-weight: 500; + } + } + &__bottom { padding-top: 0; From 726e7ad0248495951c767197c06dc7127945569f Mon Sep 17 00:00:00 2001 From: Claire Date: Sat, 16 Mar 2024 02:11:59 +0100 Subject: [PATCH 208/954] Fix extra separator besides favourite count on private posts (#29605) --- .../mastodon/features/status/components/detailed_status.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/status/components/detailed_status.jsx b/app/javascript/mastodon/features/status/components/detailed_status.jsx index 45935716ca..8843619bc9 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.jsx +++ b/app/javascript/mastodon/features/status/components/detailed_status.jsx @@ -304,7 +304,7 @@ class DetailedStatus extends ImmutablePureComponent {
{reblogLink} - · + {reblogLink && <>·} {favouriteLink}
From 82c2af0356ff888e9665b5b08fda58c7722be637 Mon Sep 17 00:00:00 2001 From: Claire Date: Sat, 16 Mar 2024 17:38:20 +0100 Subject: [PATCH 209/954] Fix `user_mailer.welcome.hashtags_recent_count` not having plural form (#29607) --- app/views/application/mailer/_hashtag.html.haml | 2 +- app/views/user_mailer/welcome.text.erb | 2 +- config/locales/en.yml | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/views/application/mailer/_hashtag.html.haml b/app/views/application/mailer/_hashtag.html.haml index 524fd7e274..fcedfa80a5 100644 --- a/app/views/application/mailer/_hashtag.html.haml +++ b/app/views/application/mailer/_hashtag.html.haml @@ -17,4 +17,4 @@ %span.email-mini-hashtag-img-span = image_tag full_asset_url(account.avatar.url), alt: '', width: 16, height: 16 %td - %p= t('user_mailer.welcome.hashtags_recent_count', people: number_with_delimiter(hashtag.history.aggregate(2.days.ago.to_date..Time.zone.today).accounts), days: 2) + %p= t('user_mailer.welcome.hashtags_recent_count', people: number_with_delimiter(hashtag.history.aggregate(2.days.ago.to_date..Time.zone.today).accounts)) diff --git a/app/views/user_mailer/welcome.text.erb b/app/views/user_mailer/welcome.text.erb index 150944605f..d9da2997da 100644 --- a/app/views/user_mailer/welcome.text.erb +++ b/app/views/user_mailer/welcome.text.erb @@ -53,7 +53,7 @@ <%= t('user_mailer.welcome.hashtags_subtitle') %> <%- @tags.each do |tag| %> -* #<%= tag.display_name %> · <%= t('user_mailer.welcome.hashtags_recent_count', people: number_with_delimiter(tag.history.aggregate(2.days.ago.to_date..Time.zone.today).accounts), days: 2) %> +* #<%= tag.display_name %> · <%= t('user_mailer.welcome.hashtags_recent_count', people: number_with_delimiter(tag.history.aggregate(2.days.ago.to_date..Time.zone.today).accounts)) %> <%= tag_url(tag) %> <%- end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 8199fa52c7..c874a712da 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1868,7 +1868,9 @@ en: follows_subtitle: Follow well-known accounts follows_title: Who to follow follows_view_more: View more people to follow - hashtags_recent_count: "%{people} people in the past %{days} days" + hashtags_recent_count: + one: "%{people} person in the past 2 days" + other: "%{people} people in the past 2 days" hashtags_subtitle: Explore what’s trending since past 2 days hashtags_title: Trending hashtags hashtags_view_more: View more trending hashtags From 04817e965a4a18d345c432cd416e4ec57165a8ed Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 09:47:48 +0100 Subject: [PATCH 210/954] New Crowdin Translations (automated) (#29623) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/af.json | 3 - app/javascript/mastodon/locales/an.json | 8 --- app/javascript/mastodon/locales/ar.json | 8 --- app/javascript/mastodon/locales/ast.json | 5 -- app/javascript/mastodon/locales/be.json | 47 ++++++++++--- app/javascript/mastodon/locales/bg.json | 65 +++++++++++++++--- app/javascript/mastodon/locales/bn.json | 8 --- app/javascript/mastodon/locales/br.json | 12 ++-- app/javascript/mastodon/locales/bs.json | 1 - app/javascript/mastodon/locales/ca.json | 50 +++++++++++--- app/javascript/mastodon/locales/ckb.json | 8 --- app/javascript/mastodon/locales/co.json | 8 --- app/javascript/mastodon/locales/cs.json | 8 --- app/javascript/mastodon/locales/cy.json | 8 --- app/javascript/mastodon/locales/da.json | 45 ++++++++++--- app/javascript/mastodon/locales/de.json | 49 +++++++++++--- app/javascript/mastodon/locales/el.json | 8 --- app/javascript/mastodon/locales/en-GB.json | 8 --- app/javascript/mastodon/locales/eo.json | 8 --- app/javascript/mastodon/locales/es-AR.json | 47 ++++++++++--- app/javascript/mastodon/locales/es-MX.json | 47 ++++++++++--- app/javascript/mastodon/locales/es.json | 49 +++++++++++--- app/javascript/mastodon/locales/et.json | 21 +++--- app/javascript/mastodon/locales/eu.json | 47 ++++++++++--- app/javascript/mastodon/locales/fa.json | 8 --- app/javascript/mastodon/locales/fi.json | 49 +++++++++++--- app/javascript/mastodon/locales/fil.json | 3 - app/javascript/mastodon/locales/fo.json | 47 ++++++++++--- app/javascript/mastodon/locales/fr-CA.json | 10 +-- app/javascript/mastodon/locales/fr.json | 10 +-- app/javascript/mastodon/locales/fy.json | 8 --- app/javascript/mastodon/locales/ga.json | 8 --- app/javascript/mastodon/locales/gd.json | 68 ++++++++++++++++--- app/javascript/mastodon/locales/gl.json | 8 --- app/javascript/mastodon/locales/he.json | 47 ++++++++++--- app/javascript/mastodon/locales/hi.json | 33 ++++++--- app/javascript/mastodon/locales/hr.json | 7 -- app/javascript/mastodon/locales/hu.json | 55 +++++++++++---- app/javascript/mastodon/locales/hy.json | 8 --- app/javascript/mastodon/locales/ia.json | 7 +- app/javascript/mastodon/locales/id.json | 8 --- app/javascript/mastodon/locales/ie.json | 14 ++-- app/javascript/mastodon/locales/ig.json | 1 - app/javascript/mastodon/locales/io.json | 8 --- app/javascript/mastodon/locales/is.json | 47 ++++++++++--- app/javascript/mastodon/locales/it.json | 8 --- app/javascript/mastodon/locales/ja.json | 10 +-- app/javascript/mastodon/locales/ka.json | 4 -- app/javascript/mastodon/locales/kab.json | 34 +++++++--- app/javascript/mastodon/locales/kk.json | 6 -- app/javascript/mastodon/locales/kn.json | 1 - app/javascript/mastodon/locales/ko.json | 47 ++++++++++--- app/javascript/mastodon/locales/ku.json | 8 --- app/javascript/mastodon/locales/kw.json | 8 --- app/javascript/mastodon/locales/la.json | 1 - app/javascript/mastodon/locales/lad.json | 17 ++--- app/javascript/mastodon/locales/lt.json | 21 +++--- app/javascript/mastodon/locales/lv.json | 10 +-- app/javascript/mastodon/locales/mk.json | 5 -- app/javascript/mastodon/locales/ml.json | 5 -- app/javascript/mastodon/locales/mr.json | 1 - app/javascript/mastodon/locales/ms.json | 8 --- app/javascript/mastodon/locales/my.json | 8 --- app/javascript/mastodon/locales/ne.json | 4 ++ app/javascript/mastodon/locales/nl.json | 65 +++++++++++++----- app/javascript/mastodon/locales/nn.json | 24 ++++--- app/javascript/mastodon/locales/no.json | 8 --- app/javascript/mastodon/locales/oc.json | 8 --- app/javascript/mastodon/locales/pa.json | 3 - app/javascript/mastodon/locales/pl.json | 47 ++++++++++--- app/javascript/mastodon/locales/pt-BR.json | 21 +++--- app/javascript/mastodon/locales/pt-PT.json | 8 --- app/javascript/mastodon/locales/ro.json | 8 --- app/javascript/mastodon/locales/ru.json | 8 --- app/javascript/mastodon/locales/ry.json | 39 ++++++++++- app/javascript/mastodon/locales/sa.json | 8 --- app/javascript/mastodon/locales/sc.json | 8 --- app/javascript/mastodon/locales/sco.json | 8 --- app/javascript/mastodon/locales/si.json | 6 -- app/javascript/mastodon/locales/sk.json | 9 +-- app/javascript/mastodon/locales/sl.json | 47 ++++++++++--- app/javascript/mastodon/locales/sq.json | 50 +++++++++++--- app/javascript/mastodon/locales/sr-Latn.json | 8 --- app/javascript/mastodon/locales/sr.json | 38 ++++++++--- app/javascript/mastodon/locales/sv.json | 31 ++++++--- app/javascript/mastodon/locales/szl.json | 1 - app/javascript/mastodon/locales/ta.json | 6 -- app/javascript/mastodon/locales/tai.json | 1 - app/javascript/mastodon/locales/te.json | 4 -- app/javascript/mastodon/locales/th.json | 50 +++++++++++--- app/javascript/mastodon/locales/tok.json | 7 -- app/javascript/mastodon/locales/tr.json | 47 ++++++++++--- app/javascript/mastodon/locales/tt.json | 7 -- app/javascript/mastodon/locales/ug.json | 1 - app/javascript/mastodon/locales/uk.json | 8 --- app/javascript/mastodon/locales/ur.json | 6 -- app/javascript/mastodon/locales/uz.json | 8 --- app/javascript/mastodon/locales/vi.json | 50 +++++++++++--- app/javascript/mastodon/locales/zgh.json | 2 - app/javascript/mastodon/locales/zh-CN.json | 49 +++++++++++--- app/javascript/mastodon/locales/zh-HK.json | 70 +++++++++++++++++--- app/javascript/mastodon/locales/zh-TW.json | 49 +++++++++++--- config/locales/be.yml | 6 +- config/locales/bg.yml | 4 +- config/locales/ca.yml | 8 ++- config/locales/cy.yml | 1 - config/locales/da.yml | 4 +- config/locales/de.yml | 6 +- config/locales/es-AR.yml | 4 +- config/locales/es-MX.yml | 1 - config/locales/es.yml | 4 +- config/locales/et.yml | 1 - config/locales/eu.yml | 4 +- config/locales/fi.yml | 10 +-- config/locales/fo.yml | 1 - config/locales/fr-CA.yml | 1 - config/locales/fr.yml | 1 - config/locales/fy.yml | 1 - config/locales/gd.yml | 12 ++-- config/locales/gl.yml | 1 - config/locales/he.yml | 6 +- config/locales/hu.yml | 12 ++-- config/locales/ie.yml | 1 - config/locales/is.yml | 4 +- config/locales/it.yml | 1 - config/locales/ja.yml | 1 - config/locales/kab.yml | 3 + config/locales/ko.yml | 4 +- config/locales/lad.yml | 2 +- config/locales/lt.yml | 1 - config/locales/nl.yml | 44 ++++++------ config/locales/nn.yml | 1 - config/locales/no.yml | 1 - config/locales/pl.yml | 6 +- config/locales/pt-PT.yml | 1 - config/locales/ro.yml | 39 +++++++++++ config/locales/simple_form.de.yml | 2 +- config/locales/simple_form.hu.yml | 6 +- config/locales/simple_form.kab.yml | 5 +- config/locales/simple_form.pt-BR.yml | 3 + config/locales/simple_form.zh-HK.yml | 4 ++ config/locales/sl.yml | 1 - config/locales/sq.yml | 4 +- config/locales/sr-Latn.yml | 1 - config/locales/sr.yml | 5 +- config/locales/sv.yml | 4 +- config/locales/th.yml | 3 +- config/locales/tr.yml | 4 +- config/locales/vi.yml | 1 - config/locales/zh-CN.yml | 3 +- config/locales/zh-HK.yml | 41 ++++++++++++ config/locales/zh-TW.yml | 3 +- 152 files changed, 1533 insertions(+), 800 deletions(-) diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json index baa7e7bf70..e4f7f12b0e 100644 --- a/app/javascript/mastodon/locales/af.json +++ b/app/javascript/mastodon/locales/af.json @@ -119,9 +119,7 @@ "compose_form.spoiler.marked": "Verwyder inhoudswaarskuwing", "compose_form.spoiler.unmarked": "Voeg inhoudswaarskuwing by", "confirmation_modal.cancel": "Kanselleer", - "confirmations.block.block_and_report": "Blokkeer en rapporteer", "confirmations.block.confirm": "Blokkeer", - "confirmations.block.message": "Is jy seker jy wil {name} blokkeer?", "confirmations.cancel_follow_request.confirm": "Herroep versoek", "confirmations.cancel_follow_request.message": "Is jy seker jy wil jou versoek om {name} te volg, terugtrek?", "confirmations.delete.confirm": "Wis uit", @@ -129,7 +127,6 @@ "confirmations.delete_list.confirm": "Wis uit", "confirmations.delete_list.message": "Is jy seker jy wil hierdie lys permanent verwyder?", "confirmations.discard_edit_media.confirm": "Gooi weg", - "confirmations.domain_block.confirm": "Blokkeer die hele domein", "confirmations.logout.confirm": "Teken Uit", "confirmations.logout.message": "Is jy seker jy wil uitteken?", "confirmations.reply.confirm": "Antwoord", diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json index 31642e604b..3f1fd376ff 100644 --- a/app/javascript/mastodon/locales/an.json +++ b/app/javascript/mastodon/locales/an.json @@ -132,9 +132,7 @@ "compose_form.spoiler.marked": "Texto amagau dimpués de l'alvertencia", "compose_form.spoiler.unmarked": "Texto no amagau", "confirmation_modal.cancel": "Cancelar", - "confirmations.block.block_and_report": "Blocar y Denunciar", "confirmations.block.confirm": "Blocar", - "confirmations.block.message": "Yes seguro que quiers blocar a {name}?", "confirmations.cancel_follow_request.confirm": "Retirar solicitut", "confirmations.cancel_follow_request.message": "Yes seguro que deseyas retirar la tuya solicitut pa seguir a {name}?", "confirmations.delete.confirm": "Eliminar", @@ -143,13 +141,10 @@ "confirmations.delete_list.message": "Seguro que quiers borrar esta lista permanentment?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tiens cambios sin alzar en a descripción u vista previa d'o fichero audiovisual, descartar-los de totz modos?", - "confirmations.domain_block.confirm": "Amagar dominio entero", "confirmations.domain_block.message": "Yes seguro que quiers blocar lo dominio {domain} entero? En cheneral ye prou, y preferible, fer uns quantos bloqueyos y silenciaus concretos. Los tuyos seguidros d'ixe dominio serán eliminaus.", "confirmations.logout.confirm": "Zarrar sesión", "confirmations.logout.message": "Yes seguro de querer zarrar la sesión?", "confirmations.mute.confirm": "Silenciar", - "confirmations.mute.explanation": "Esto amagará las publicacions d'ells y en as qualas los has mencionau, pero les permitirá veyer los tuyos mensaches y seguir-te.", - "confirmations.mute.message": "Yes seguro que quiers silenciar a {name}?", "confirmations.redraft.confirm": "Borrar y tornar ta borrador", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Responder sobrescribirá lo mensache que yes escribindo. Yes seguro que deseyas continar?", @@ -323,9 +318,6 @@ "load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}", "media_gallery.toggle_visible": "{number, plural, one {Amaga la imachen} other {Amaga las imáchens}}", "moved_to_account_banner.text": "La tuya cuenta {disabledAccount} ye actualment deshabilitada perque t'has mudau a {movedToAccount}.", - "mute_modal.duration": "Duración", - "mute_modal.hide_notifications": "Amagar notificacions d'este usuario?", - "mute_modal.indefinite": "Indefinida", "navigation_bar.about": "Sobre", "navigation_bar.blocks": "Usuarios blocaus", "navigation_bar.bookmarks": "Marcadors", diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 17071aae48..747c47960f 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "إضافة تحذير للمحتوى", "compose_form.spoiler_placeholder": "تحذير المحتوى (اختياري)", "confirmation_modal.cancel": "إلغاء", - "confirmations.block.block_and_report": "حظره والإبلاغ عنه", "confirmations.block.confirm": "حظر", - "confirmations.block.message": "هل أنتَ مُتأكدٌ أنكَ تُريدُ حَظرَ {name}؟", "confirmations.cancel_follow_request.confirm": "إلغاء الطلب", "confirmations.cancel_follow_request.message": "متأكد من أنك تريد إلغاء طلب متابعتك لـ {name}؟", "confirmations.delete.confirm": "حذف", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "هل أنتَ مُتأكدٌ أنكَ تُريدُ حَذفَ هذِهِ القائمة بشكلٍ دائم؟", "confirmations.discard_edit_media.confirm": "تجاهل", "confirmations.discard_edit_media.message": "لديك تغييرات غير محفوظة لوصف الوسائط أو معاينتها، أتريد تجاهلها على أي حال؟", - "confirmations.domain_block.confirm": "حظر اِسم النِّطاق بشكلٍ كامل", "confirmations.domain_block.message": "متأكد من أنك تود حظر اسم النطاق {domain} بالكامل ؟ في غالب الأحيان يُستَحسَن كتم أو حظر بعض الحسابات بدلا من حظر نطاق بالكامل.\nلن تتمكن مِن رؤية محتوى هذا النطاق لا على خيوطك العمومية و لا في إشعاراتك. سوف يتم كذلك إزالة كافة متابعيك المنتمين إلى هذا النطاق.", "confirmations.edit.confirm": "تعديل", "confirmations.edit.message": "التعديل في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد تحريرها. متأكد من أنك تريد المواصلة؟", "confirmations.logout.confirm": "خروج", "confirmations.logout.message": "متأكد من أنك تريد الخروج؟", "confirmations.mute.confirm": "أكتم", - "confirmations.mute.explanation": "هذا سيخفي المنشورات عنهم وتلك المشار فيها إليهم، لكنه سيسمح لهم برؤية منشوراتك ومتابعتك.", - "confirmations.mute.message": "هل أنت متأكد أنك تريد كتم {name} ؟", "confirmations.redraft.confirm": "إزالة وإعادة الصياغة", "confirmations.redraft.message": "هل أنت متأكد من أنك تريد حذف هذا المنشور و إعادة صياغته؟ سوف تفقد جميع الإعجابات و الترقيات أما الردود المتصلة به فستُصبِح يتيمة.", "confirmations.reply.confirm": "رد", @@ -399,9 +394,6 @@ "loading_indicator.label": "جاري التحميل…", "media_gallery.toggle_visible": "{number, plural, zero {} one {اخف الصورة} two {اخف الصورتين} few {اخف الصور} many {اخف الصور} other {اخف الصور}}", "moved_to_account_banner.text": "حسابك {disabledAccount} معطل حاليًا لأنك انتقلت إلى {movedToAccount}.", - "mute_modal.duration": "المدة", - "mute_modal.hide_notifications": "هل تود إخفاء الإخطارات القادمة من هذا المستخدم ؟", - "mute_modal.indefinite": "إلى أجل غير مسمى", "navigation_bar.about": "عن", "navigation_bar.advanced_interface": "افتحه في واجهة الويب المتقدمة", "navigation_bar.blocks": "الحسابات المحجوبة", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index de5e310d5a..b5015c75d8 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -112,16 +112,13 @@ "compose_form.poll.type": "Estilu", "compose_form.publish_form": "Artículu nuevu", "confirmation_modal.cancel": "Encaboxar", - "confirmations.block.block_and_report": "Bloquiar ya informar", "confirmations.block.confirm": "Bloquiar", - "confirmations.block.message": "¿De xuru que quies bloquiar a {name}?", "confirmations.cancel_follow_request.confirm": "Retirala", "confirmations.cancel_follow_request.message": "¿De xuru que quies retirar la solicitú pa siguir a {name}?", "confirmations.delete.confirm": "Desaniciar", "confirmations.delete.message": "¿De xuru que quies desaniciar esti artículu?", "confirmations.delete_list.confirm": "Desaniciar", "confirmations.discard_edit_media.confirm": "Escartar", - "confirmations.domain_block.confirm": "Bloquiar tol dominiu", "confirmations.edit.message": "La edición va sobrescribir el mensaxe que tas escribiendo. ¿De xuru que quies siguir?", "confirmations.logout.confirm": "Zarrar la sesión", "confirmations.logout.message": "¿De xuru que quies zarrar la sesión?", @@ -277,8 +274,6 @@ "lists.subheading": "Les tos llistes", "load_pending": "{count, plural, one {# elementu nuevu} other {# elementos nuevos}}", "media_gallery.toggle_visible": "{number, plural, one {Anubrir la imaxe} other {Anubrir les imáxenes}}", - "mute_modal.duration": "Duración", - "mute_modal.hide_notifications": "¿Quies anubrir los avisos d'esti perfil?", "navigation_bar.about": "Tocante a", "navigation_bar.blocks": "Perfiles bloquiaos", "navigation_bar.bookmarks": "Marcadores", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 21e2622ba9..1ff94eca6c 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -89,6 +89,14 @@ "announcement.announcement": "Аб'ява", "attachments_list.unprocessed": "(неапрацаваны)", "audio.hide": "Схаваць аўдыя", + "block_modal.remote_users_caveat": "Мы папросім сервер {domain} паважаць ваш выбар. Аднак гэта не гарантуецца, паколькі некаторыя серверы могуць апрацоўваць блакіроўкі іншым чынам. Публічныя паведамленні могуць заставацца бачнымі для ананімных карыстальнікаў.", + "block_modal.show_less": "Паказаць меньш", + "block_modal.show_more": "Паказаць больш", + "block_modal.they_cant_mention": "Карыстальнік не зможа згадваць або сачыць за вамі.", + "block_modal.they_cant_see_posts": "Карыстальнік не будзе бачыць вашых допісаў, а вы — карыстальніка.", + "block_modal.they_will_know": "Карыстальнік убачыць, што адбылася блакіроўка.", + "block_modal.title": "Заблакіраваць карыстальніка?", + "block_modal.you_wont_see_mentions": "Вы не ўбачыце паведамленняў са згадваннем карыстальніка.", "boost_modal.combo": "Націсніце {combo}, каб прапусціць наступным разам", "bundle_column_error.copy_stacktrace": "Скапіраваць справаздачу пра памылку", "bundle_column_error.error.body": "Запытаная старонка не можа быць адлюстраваная. Гэта магло стацца праз хібу ў нашым кодзе, або праз памылку сумяшчальнасці з браўзерам.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Дадаць папярэджанне аб змесціве", "compose_form.spoiler_placeholder": "Папярэджанне аб змесціве (неабавязкова)", "confirmation_modal.cancel": "Скасаваць", - "confirmations.block.block_and_report": "Заблакіраваць і паскардзіцца", "confirmations.block.confirm": "Заблакіраваць", - "confirmations.block.message": "Вы ўпэўненыя што хочаце заблакіраваць {name}?", "confirmations.cancel_follow_request.confirm": "Скасаваць запыт", "confirmations.cancel_follow_request.message": "Сапраўды хочаце скасаваць свой запыт на падпіску на {name}?", "confirmations.delete.confirm": "Выдаліць", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Вы ўпэўненыя, што хочаце беззваротна выдаліць гэты чарнавік?", "confirmations.discard_edit_media.confirm": "Адмяніць", "confirmations.discard_edit_media.message": "У вас ёсць незахаваныя змены ў апісанні або прэв'ю, усе роўна скасаваць іх?", - "confirmations.domain_block.confirm": "Заблакіраваць дамен цалкам", + "confirmations.domain_block.confirm": "Заблакіраваць сервер", "confirmations.domain_block.message": "Вы абсалютна дакладна ўпэўнены, што хочаце заблакіраваць {domain} зусім? У большасці выпадкаў, дастаткова некалькіх мэтавых блакіровак ці ігнараванняў. Вы перастанеце бачыць змесціва з гэтага дамену ва ўсіх стужках і апавяшчэннях. Вашы падпіскі з гэтага дамену будуць выдаленыя.", "confirmations.edit.confirm": "Рэдагаваць", "confirmations.edit.message": "Калі вы зменіце зараз, гэта ператрэ паведамленне, якое вы пішаце. Вы ўпэўнены, што хочаце працягнуць?", "confirmations.logout.confirm": "Выйсці", "confirmations.logout.message": "Вы ўпэўненыя, што хочаце выйсці?", "confirmations.mute.confirm": "Ігнараваць", - "confirmations.mute.explanation": "Гэта схавае допісы ад гэтага карыстальніка і пра яго, але ўсё яшчэ дазволіць яму чытаць вашыя допісы і быць падпісаным на вас.", - "confirmations.mute.message": "Вы ўпэўненыя, што хочаце ігнараваць {name}?", "confirmations.redraft.confirm": "Выдаліць і перапісаць", "confirmations.redraft.message": "Вы ўпэўнены, што хочаце выдаліць допіс і перапісаць яго? Упадабанні і пашырэнні згубяцца, а адказы да арыгінальнага допісу асірацеюць.", "confirmations.reply.confirm": "Адказаць", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Допісы з гэтага і іншых сервераў дэцэнтралізаванай сеткі, якія набіраюць папулярнасць прама зараз.", "dismissable_banner.explore_tags": "Гэтыя хэштэгі зараз набіраюць папулярнасць сярод людзей на гэтым і іншых серверах дэцэнтралізаванай сеткі", "dismissable_banner.public_timeline": "Гэта апошнія публічныя допісы людзей з усей сеткі, за якімі сочаць карыстальнікі {domain}.", + "domain_block_modal.block": "Заблакіраваць сервер", + "domain_block_modal.block_account_instead": "Заблакіраваць @{name} замест гэтага", + "domain_block_modal.they_can_interact_with_old_posts": "Людзі з гэтага сервера змогуць узаемадзейнічаць з вашымі старымі допісамі.", + "domain_block_modal.they_cant_follow": "Ніхто з гэтага сервера не зможа падпісацца на вас.", + "domain_block_modal.they_wont_know": "Карыстальнік не будзе ведаць пра блакіроўку.", + "domain_block_modal.title": "Заблакіраваць дамен?", + "domain_block_modal.you_will_lose_followers": "Усе падпісчыкі з гэтага сервера будуць выдаленыя.", + "domain_block_modal.you_wont_see_posts": "Вы не ўбачыце допісаў і апавяшчэнняў ад карыстальнікаў з гэтага сервера.", + "domain_pill.activitypub_lets_connect": "Ён дазваляе вам узаемадзейнічаць не толькі з карыстальнікамі Mastodon, але і розных іншых сацыяльных платформ.", + "domain_pill.activitypub_like_language": "ActivityPub — гэта мова, на якой Mastodon размаўляе з іншымі сацыяльнымі сеткамі.", + "domain_pill.server": "Сервер", + "domain_pill.their_handle": "Ідэнтыфікатар карыстальніка:", + "domain_pill.their_server": "Лічбавы дом, дзе захоўваюцца ўсе допісы.", + "domain_pill.their_username": "Унікальны ідэнтыфікатар карыстальніка на серверы. Можна знайсці карыстальнікаў з аднолькавым іменем карыстальніка на розных серверах.", + "domain_pill.username": "Імя карыстальніка", + "domain_pill.whats_in_a_handle": "Што такое ідэнтыфікатар карыстальніка?", + "domain_pill.who_they_are": "Паколькі ідэнтыфікатары кажуць аб тым, хто гэты чалавек і якім серверам ён карыстаецца, вы можаце ўзаемадзейнічаць з карыстальнікамі .", + "domain_pill.who_you_are": "Паколькі ваш ідэнтыфікатар кажа аб тым, хто вы і дзе знаходзіцеся, людзі могуць узаемадзейнічаць з вамі ў сацыяльнай сетцы .", + "domain_pill.your_handle": "Ваш ідэнтыфікатар:", + "domain_pill.your_server": "Ваш лічбавы дом, дзе захоўваюцца ўсе вашыя допісы. Не падабаецца гэты сервер? Змяніце сервер у любы час з захаваннем сваіх падпісчыкаў.", + "domain_pill.your_username": "Ваш унікальны ідэнтыфікатар на гэтым серверы. Можна знайсці карыстальнікаў з аднолькавым іменем карыстальніка на розных серверах.", "embed.instructions": "Убудуйце гэты пост на свой сайт, скапіраваўшы прыведзены ніжэй код", "embed.preview": "Вось як гэта будзе выглядаць:", "emoji_button.activity": "Актыўнасць", @@ -402,9 +427,15 @@ "loading_indicator.label": "Загрузка…", "media_gallery.toggle_visible": "{number, plural, one {Схаваць відарыс} other {Схаваць відарысы}}", "moved_to_account_banner.text": "Ваш уліковы запіс {disabledAccount} зараз адключаны таму што вы перанесены на {movedToAccount}.", - "mute_modal.duration": "Працягласць", - "mute_modal.hide_notifications": "Схаваць апавяшчэнні ад гэтага карыстальніка?", - "mute_modal.indefinite": "Бестэрмінова", + "mute_modal.hide_from_notifications": "Схаваць з апавяшчэнняў", + "mute_modal.hide_options": "Схаваць опцыі", + "mute_modal.indefinite": "Пакуль я не прыбяру ігнараванне", + "mute_modal.show_options": "Паказаць опцыі", + "mute_modal.they_can_mention_and_follow": "Карыстальнік зможа згадваць вас і падпісацца на вас, але вы гэтага не ўбачыце.", + "mute_modal.they_wont_know": "Карыстальнік не будзе ведаць пра ігнараванне.", + "mute_modal.title": "Ігнараваць карыстальніка?", + "mute_modal.you_wont_see_mentions": "Вы не ўбачыце паведамленняў са згадваннем карыстальніка.", + "mute_modal.you_wont_see_posts": "Карыстальнік па-ранейшаму будзе бачыць вашыя паведамленні, але вы не будзеце паведамленні карыстальніка.", "navigation_bar.about": "Пра нас", "navigation_bar.advanced_interface": "Адкрыць у пашыраным вэб-інтэрфейсе", "navigation_bar.blocks": "Заблакаваныя карыстальнікі", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index ab6468d8e8..adc974bee8 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -89,6 +89,14 @@ "announcement.announcement": "Оповестяване", "attachments_list.unprocessed": "(необработено)", "audio.hide": "Скриване на звука", + "block_modal.remote_users_caveat": "Ще поискаме сървърът {domain} да почита решението ви. Съгласието обаче не се гарантира откак някои сървъри могат да боравят с блоковете по различен начин. Обществените публикации още може да се виждат от невлезли в системата потребители.", + "block_modal.show_less": "Повече на показ", + "block_modal.show_more": "По-малко на показ", + "block_modal.they_cant_mention": "Те не могат да ви споменават или последват.", + "block_modal.they_cant_see_posts": "Те не могат да виждат публикациите ви, а и вие не можете да виждате техните.", + "block_modal.they_will_know": "Те могат да видят, че са блокирани.", + "block_modal.title": "Блокирате ли потребителя?", + "block_modal.you_wont_see_mentions": "Няма да виждате публикациите, които ги споменават.", "boost_modal.combo": "Можете да натиснете {combo}, за да пропуснете това следващия път", "bundle_column_error.copy_stacktrace": "Копиране на доклада за грешката", "bundle_column_error.error.body": "Заявената страница не може да се изобрази. Това може да е заради грешка в кода ни или проблем със съвместимостта на браузъра.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Добавяне на предупреждение за съдържание", "compose_form.spoiler_placeholder": "Предупреждение за съдържание (по избор)", "confirmation_modal.cancel": "Отказ", - "confirmations.block.block_and_report": "Блокиране и докладване", "confirmations.block.confirm": "Блокиране", - "confirmations.block.message": "Наистина ли искате да блокирате {name}?", "confirmations.cancel_follow_request.confirm": "Оттегляне на заявката", "confirmations.cancel_follow_request.message": "Наистина ли искате да оттеглите заявката си за последване на {name}?", "confirmations.delete.confirm": "Изтриване", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Наистина ли искате да изтриете завинаги списъка?", "confirmations.discard_edit_media.confirm": "Отхвърляне", "confirmations.discard_edit_media.message": "Не сте запазили промени на описанието или огледа на мултимедията, отхвърляте ли ги?", - "confirmations.domain_block.confirm": "Блокиране на целия домейн", + "confirmations.domain_block.confirm": "Блокиране на сървър", "confirmations.domain_block.message": "Наистина ли искате да блокирате целия {domain}? В повечето случаи няколко блокирания или заглушавания са достатъчно и за предпочитане. Няма да виждате съдържание от домейна из публични часови оси или известията си. Вашите последователи от този домейн ще се премахнат.", "confirmations.edit.confirm": "Редактиране", "confirmations.edit.message": "Редактирането сега ще замени съобщението, което в момента съставяте. Сигурни ли сте, че искате да продължите?", "confirmations.logout.confirm": "Излизане", "confirmations.logout.message": "Наистина ли искате да излезете?", "confirmations.mute.confirm": "Заглушаване", - "confirmations.mute.explanation": "Това ще скрие публикациите от тях и публикации, които ги споменават, но все още ще им позволява да виждат публикациите ви и да ви следват.", - "confirmations.mute.message": "Наистина ли искате да заглушите {name}?", "confirmations.redraft.confirm": "Изтриване и преработване", "confirmations.redraft.message": "Наистина ли искате да изтриете тази публикация и да я направите чернова? Означаванията като любими и подсилванията ще се изгубят, а и отговорите към първоначалната публикация ще осиротеят.", "confirmations.reply.confirm": "Отговор", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Има публикации през социалната мрежа, които днес набират популярност. По-новите публикации с повече подсилвания и любими са класирани по-високо.", "dismissable_banner.explore_tags": "Тези хаштагове сега набират популярност сред хората в този и други сървъри на децентрализирата мрежа.", "dismissable_banner.public_timeline": "Ето най-новите обществени публикации от хора в социална мрежа, която хората в {domain} следват.", + "domain_block_modal.block": "Блокиране на сървър", + "domain_block_modal.block_account_instead": "Вместо това блокиране на @{name}", + "domain_block_modal.they_can_interact_with_old_posts": "Хората от този сървър могат да взаимодействат с ваши стари публикации.", + "domain_block_modal.they_cant_follow": "Никого от този сървър не може да ви последва.", + "domain_block_modal.they_wont_know": "Няма да узнаят, че са били блокирани.", + "domain_block_modal.title": "Блокирате ли домейн?", + "domain_block_modal.you_will_lose_followers": "Всичките ви последователи от този сървър ще се премахнат.", + "domain_block_modal.you_wont_see_posts": "Няма да виждате публикации или известия от потребителите на този сървър.", + "domain_pill.activitypub_lets_connect": "Позволява ви да се свързвате и взаимодействате с хора не само в Mastodon, но и през различни социални приложения.", + "domain_pill.activitypub_like_language": "ActivityPub е като език на Mastodon, говорещ с други социални мрежи.", + "domain_pill.server": "Сървър", + "domain_pill.their_handle": "Тяхната ръчка:", + "domain_pill.their_server": "Цифровият им дом, където живеят всичките им публикации.", + "domain_pill.their_username": "Неповторимият им идентификатор на сървъра им. Възможно е да се намерят потребители със същото потребителско име на други сървъри.", + "domain_pill.username": "Потребителско име", + "domain_pill.whats_in_a_handle": "Какво е в ръчката?", + "domain_pill.who_they_are": "Откак ръчките казват кой кой е и къде е, то може да взаимодействате с хора през социаното уебпространство на .", + "domain_pill.who_you_are": "Тъй като вашата ръчка казва кои сте и къде сте, то може да взаимодействате с хора през социаното уебпространство на .", + "domain_pill.your_handle": "Вашата ръчка:", + "domain_pill.your_server": "Цифровият ви дом, където живеят всичките ви публикации. Не харесвате ли този? Прехвърляте се на сървъри по всяко време и докарвате последователите си също.", + "domain_pill.your_username": "Неповторимият ви идентификатор на този сървър. Възможно е да се намерят потребители със същото потребителско име на други сървъри.", "embed.instructions": "Вградете публикацията в уебсайта си, копирайки кода долу.", "embed.preview": "Ето как ще изглежда:", "emoji_button.activity": "Дейност", @@ -241,6 +266,7 @@ "empty_column.list": "Все още списъкът е празен. Членуващите на списъка, публикуващи нови публикации, ще се появят тук.", "empty_column.lists": "Все още нямате списъци. Когато създадете такъв, той ще се покаже тук.", "empty_column.mutes": "Още не сте заглушавали потребители.", + "empty_column.notification_requests": "Всичко е чисто! Тук няма нищо. Получавайки нови известия, те ще се появят тук според настройките ви.", "empty_column.notifications": "Все още нямате известия. Взаимодействайте с другите, за да започнете разговора.", "empty_column.public": "Тук няма нищо! Публикувайте нещо или последвайте потребители от други сървъри, за да го напълните", "error.unexpected_crash.explanation": "Поради грешка в нашия код или проблем със съвместимостта на браузъра, тази страница не може да се покаже правилно.", @@ -271,6 +297,8 @@ "filter_modal.select_filter.subtitle": "Изберете съществуваща категория или създайте нова", "filter_modal.select_filter.title": "Филтриране на публ.", "filter_modal.title.status": "Филтриране на публ.", + "filtered_notifications_banner.pending_requests": "Известията от {count, plural, =0 {никого, когото може да познавате} one {едно лице, което може да познавате} other {# души, които може да познавате}}", + "filtered_notifications_banner.title": "Филтрирани известия", "firehose.all": "Всичко", "firehose.local": "Този сървър", "firehose.remote": "Други сървъри", @@ -399,9 +427,15 @@ "loading_indicator.label": "Зареждане…", "media_gallery.toggle_visible": "Скриване на {number, plural, one {изображение} other {изображения}}", "moved_to_account_banner.text": "Вашият акаунт {disabledAccount} сега е изключен, защото се преместихте в {movedToAccount}.", - "mute_modal.duration": "Времетраене", - "mute_modal.hide_notifications": "Скриване на известия от този потребител?", - "mute_modal.indefinite": "Неопределено", + "mute_modal.hide_from_notifications": "Скриване от известията", + "mute_modal.hide_options": "Скриване на възможностите", + "mute_modal.indefinite": "Докато премахна заглушаването им", + "mute_modal.show_options": "Показване на възможностите", + "mute_modal.they_can_mention_and_follow": "Могат да ви споменават и последват, но няма да ги виждате.", + "mute_modal.they_wont_know": "Няма да узнаят, че са били заглушени.", + "mute_modal.title": "Заглушавате ли потребител?", + "mute_modal.you_wont_see_mentions": "Няма да виждате споменаващи ги публикации.", + "mute_modal.you_wont_see_posts": "Още могат да виждат публикациите ви, но вие техните не.", "navigation_bar.about": "Относно", "navigation_bar.advanced_interface": "Отваряне в разширен уебинтерфейс", "navigation_bar.blocks": "Блокирани потребители", @@ -439,7 +473,10 @@ "notification.reblog": "{name} подсили ваша публикация", "notification.status": "{name} току-що публикува", "notification.update": "{name} промени публикация", + "notification_requests.accept": "Приемам", + "notification_requests.dismiss": "Отхвърлям", "notification_requests.notifications_from": "Известия от {name}", + "notification_requests.title": "Филтрирани известия", "notifications.clear": "Изчистване на известията", "notifications.clear_confirmation": "Наистина ли искате да изчистите завинаги всичките си известия?", "notifications.column_settings.admin.report": "Нови доклади:", @@ -471,7 +508,14 @@ "notifications.permission_denied": "Известията на работния плот не са налични поради предварително отказана заявка за разрешение в браузъра", "notifications.permission_denied_alert": "Известията на работния плот не могат да се включат, тъй като разрешението на браузъра е отказвано преди", "notifications.permission_required": "Известията на работния плот ги няма, щото няма дадено нужното позволение.", + "notifications.policy.filter_new_accounts.hint": "Сътворено през {days, plural, one {последния ден} other {последните # дена}}", "notifications.policy.filter_new_accounts_title": "Нови акаунти", + "notifications.policy.filter_not_followers_hint": "Включително хора, които са ви последвали по-малко от {days, plural, one {ден} other {# дни}}", + "notifications.policy.filter_not_followers_title": "Хора, които не ви следват", + "notifications.policy.filter_not_following_hint": "Докато не ги одобрите ръчно", + "notifications.policy.filter_not_following_title": "Хора, които не следвате", + "notifications.policy.filter_private_mentions_title": "Непоискани частни споменавания", + "notifications.policy.title": "Да се филтрират известия от…", "notifications_permission_banner.enable": "Включване на известията на работния плот", "notifications_permission_banner.how_to_control": "За да получавате известия, когато Mastodon не е отворен, включете известията на работния плот. Може да управлявате точно кои видове взаимодействия пораждат известия на работния плот чрез бутона {icon} по-горе, след като бъдат включени.", "notifications_permission_banner.title": "Никога не пропускайте нищо", @@ -609,7 +653,7 @@ "search.quick_action.go_to_hashtag": "Към хаштаг {x}", "search.quick_action.open_url": "Отваряне на URL адреса в Mastodon", "search.quick_action.status_search": "Съвпадение на публикации {x}", - "search.search_or_paste": "Търсене или поставяне на URL адрес", + "search.search_or_paste": "Търсене/поставяне на URL", "search_popout.full_text_search_disabled_message": "Не е достъпно на {domain}.", "search_popout.full_text_search_logged_out_message": "Достъпно само при влизане в системата.", "search_popout.language_code": "Код на езика по ISO", @@ -648,9 +692,11 @@ "status.direct": "Частно споменаване на @{name}", "status.direct_indicator": "Частно споменаване", "status.edit": "Редактиране", + "status.edited": "Последно редактирано на {date}", "status.edited_x_times": "Редактирано {count, plural,one {{count} път} other {{count} пъти}}", "status.embed": "Вграждане", "status.favourite": "Любимо", + "status.favourites": "{count, plural, one {любимо} other {любими}}", "status.filter": "Филтриране на публ.", "status.filtered": "Филтрирано", "status.hide": "Скриване на публ.", @@ -671,6 +717,7 @@ "status.reblog": "Подсилване", "status.reblog_private": "Подсилване с оригиналната видимост", "status.reblogged_by": "{name} подсили", + "status.reblogs": "{count, plural, one {подсилване} other {подсилвания}}", "status.reblogs.empty": "Още никого не е подсилвал публикацията. Подсилващият ще се покаже тук.", "status.redraft": "Изтриване и преначертаване", "status.remove_bookmark": "Премахване на отметката", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index 85f1598889..797b93e243 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -148,9 +148,7 @@ "compose_form.spoiler.marked": "সতর্কতার পিছনে লেখানটি লুকানো আছে", "compose_form.spoiler.unmarked": "লেখাটি লুকানো নেই", "confirmation_modal.cancel": "বাতিল করুন", - "confirmations.block.block_and_report": "ব্লক করুন এবং রিপোর্ট করুন", "confirmations.block.confirm": "ব্লক করুন", - "confirmations.block.message": "আপনি কি নিশ্চিত {name} কে ব্লক করতে চান?", "confirmations.cancel_follow_request.confirm": "অনুরোধ বাতিল করুন", "confirmations.cancel_follow_request.message": "আপনি কি নিশ্চিত যে আপনি {name} কে অনুসরণ করার অনুরোধ প্রত্যাহার করতে চান?", "confirmations.delete.confirm": "মুছে ফেলুন", @@ -159,15 +157,12 @@ "confirmations.delete_list.message": "আপনি কি নিশ্চিত যে আপনি এই তালিকাটি স্থায়িভাবে মুছে ফেলতে চান ?", "confirmations.discard_edit_media.confirm": "বাতিল করো", "confirmations.discard_edit_media.message": "মিডিয়া Description বা Preview তে আপনার আপনার অসংরক্ষিত পরিবর্তন আছে, সেগুলো বাতিল করবেন?", - "confirmations.domain_block.confirm": "এই ডোমেন থেকে সব লুকান", "confirmations.domain_block.message": "আপনি কি সত্যিই সত্যই নিশ্চিত যে আপনি পুরো {domain}'টি ব্লক করতে চান? বেশিরভাগ ক্ষেত্রে কয়েকটি লক্ষ্যযুক্ত ব্লক বা নীরবতা যথেষ্ট এবং পছন্দসই। আপনি কোনও পাবলিক টাইমলাইন বা আপনার বিজ্ঞপ্তিগুলিতে সেই ডোমেন থেকে সামগ্রী দেখতে পাবেন না। সেই ডোমেন থেকে আপনার অনুসরণকারীদের সরানো হবে।", "confirmations.edit.confirm": "সম্পাদন", "confirmations.edit.message": "এখন সম্পাদনা করলে আপনি যে মেসেজ লিখছেন তা overwrite করবে, চালিয়ে যেতে চান?", "confirmations.logout.confirm": "প্রস্থান", "confirmations.logout.message": "আপনি লগ আউট করতে চান?", "confirmations.mute.confirm": "সরিয়ে ফেলুন", - "confirmations.mute.explanation": "এটি তাদের কাছ থেকে পোস্ট এবং তাদেরকে মেনশন করা পোস্টগুলি হাইড করবে, তবুও তাদেরকে এটি আপনার পোস্ট গুলো দেখতে দিবে ও তারা আপনাকে অনুসরন করতে পারবে।.", - "confirmations.mute.message": "আপনি কি নিশ্চিত {name} সরিয়ে ফেলতে চান ?", "confirmations.redraft.confirm": "মুছে ফেলুন এবং আবার সম্পাদন করুন", "confirmations.reply.confirm": "মতামত", "confirmations.reply.message": "এখন মতামত লিখতে গেলে আপনার এখন যেটা লিখছেন সেটা মুছে যাবে। আপনি নি নিশ্চিত এটা করতে চান ?", @@ -302,9 +297,6 @@ "lists.subheading": "আপনার তালিকা", "load_pending": "{count, plural, one {# নতুন জিনিস} other {# নতুন জিনিস}}", "media_gallery.toggle_visible": "দৃশ্যতার অবস্থা বদলান", - "mute_modal.duration": "সময়কাল", - "mute_modal.hide_notifications": "এই ব্যবহারকারীর প্রজ্ঞাপন বন্ধ করবেন ?", - "mute_modal.indefinite": "অনির্দিষ্ট", "navigation_bar.about": "পরিচিতি", "navigation_bar.blocks": "বন্ধ করা ব্যবহারকারী", "navigation_bar.bookmarks": "বুকমার্ক", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index 77d42f3536..609e7f7158 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -87,6 +87,8 @@ "announcement.announcement": "Kemennad", "attachments_list.unprocessed": "(ket meret)", "audio.hide": "Kuzhat ar c'hleved", + "block_modal.show_less": "Diskouez nebeutoc'h", + "block_modal.show_more": "Diskouez muioc'h", "boost_modal.combo": "Ar wezh kentañ e c'halliot gwaskañ war {combo} evit tremen hebiou", "bundle_column_error.copy_stacktrace": "Eilañ an danevell fazi", "bundle_column_error.error.body": "N'haller ket skrammañ ar bajenn goulennet. Gallout a ra bezañ abalamour d'ur beug er c'hod pe d'ur gudenn keverlec'hded gant ar merdeer.", @@ -157,9 +159,7 @@ "compose_form.spoiler.marked": "Kuzhet eo an destenn a-dreñv ur c'hemenn", "compose_form.spoiler.unmarked": "N'eo ket kuzhet an destenn", "confirmation_modal.cancel": "Nullañ", - "confirmations.block.block_and_report": "Berzañ ha Disklêriañ", "confirmations.block.confirm": "Stankañ", - "confirmations.block.message": "Ha sur oc'h e fell deoc'h stankañ {name} ?", "confirmations.cancel_follow_request.confirm": "Nullañ ar reked", "confirmations.cancel_follow_request.message": "Ha sur oc'h e fell deoc'h nullañ ho reked evit heuliañ {name} ?", "confirmations.delete.confirm": "Dilemel", @@ -168,14 +168,11 @@ "confirmations.delete_list.message": "Ha sur eo hoc'h eus c'hoant da zilemel ar roll-mañ da vat ?", "confirmations.discard_edit_media.confirm": "Nac'hañ", "confirmations.discard_edit_media.message": "Bez ez eus kemmoù n'int ket enrollet e deskrivadur ar media pe ar rakwel, nullañ anezho evelato?", - "confirmations.domain_block.confirm": "Berzañ an domani a-bezh", "confirmations.domain_block.message": "Ha sur oc'h e fell deoc'h berzañ an {domain} a-bezh? Peurvuiañ eo trawalc'h berzañ pe mudañ un nebeud implijer·ezed·ien. Ne welot danvez ebet o tont eus an domani-mañ. Dilamet e vo ar c'houmanantoù war an domani-mañ.", "confirmations.edit.confirm": "Kemmañ", "confirmations.logout.confirm": "Digevreañ", "confirmations.logout.message": "Ha sur oc'h e fell deoc'h digevreañ ?", "confirmations.mute.confirm": "Kuzhat", - "confirmations.mute.explanation": "Kement-se a guzho an toudoù skrivet gantañ·i hag ar re a veneg anezhañ·i, met ne viro ket outañ·i a welet ho toudoù nag a heuliañ ac'hanoc'h.", - "confirmations.mute.message": "Ha sur oc'h e fell deoc'h kuzhaat {name} ?", "confirmations.redraft.confirm": "Diverkañ ha skrivañ en-dro", "confirmations.reply.confirm": "Respont", "confirmations.reply.message": "Respont bremañ a zilamo ar gemennadenn emaoc'h o skrivañ. Sur e oc'h e fell deoc'h kenderc'hel ganti?", @@ -198,6 +195,8 @@ "dismissable_banner.dismiss": "Diverkañ", "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", + "domain_pill.server": "Dafariad", + "domain_pill.username": "Anv-implijer", "embed.instructions": "Enframmit an toud-mañ en ho lec'hienn en ur eilañ ar c'hod amañ-dindan.", "embed.preview": "Setu penaos e teuio war wel :", "emoji_button.activity": "Obererezh", @@ -366,9 +365,6 @@ "load_pending": "{count, plural, one {# dra nevez} other {# dra nevez}}", "loading_indicator.label": "O kargañ…", "media_gallery.toggle_visible": "{number, plural, one {Kuzhat ar skeudenn} other {Kuzhat ar skeudenn}}", - "mute_modal.duration": "Padelezh", - "mute_modal.hide_notifications": "Kuzhat kemenadennoù eus an implijer-se ?", - "mute_modal.indefinite": "Amstrizh", "navigation_bar.about": "Diwar-benn", "navigation_bar.blocks": "Implijer·ezed·ien berzet", "navigation_bar.bookmarks": "Sinedoù", diff --git a/app/javascript/mastodon/locales/bs.json b/app/javascript/mastodon/locales/bs.json index c978a8b01f..d06054ee58 100644 --- a/app/javascript/mastodon/locales/bs.json +++ b/app/javascript/mastodon/locales/bs.json @@ -11,7 +11,6 @@ "compose_form.spoiler.marked": "Text is hidden behind warning", "compose_form.spoiler.unmarked": "Text is not hidden", "confirmations.delete.message": "Are you sure you want to delete this status?", - "confirmations.domain_block.confirm": "Hide entire domain", "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", "embed.instructions": "Embed this status on your website by copying the code below.", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index fde638411e..e0d62c78bb 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -89,6 +89,14 @@ "announcement.announcement": "Anunci", "attachments_list.unprocessed": "(sense processar)", "audio.hide": "Amaga l'àudio", + "block_modal.remote_users_caveat": "Li demanarem al servidor {domain} que respecti la vostra decisió, tot i que no podem garantir-ho, ja que alguns servidors gestionen de forma diferent els blocatges. És possible que els usuaris no autenticats puguin veure les publicacions públiques.", + "block_modal.show_less": "Mostra'n menys", + "block_modal.show_more": "Mostra'n més", + "block_modal.they_cant_mention": "No us poden esmentar, ni seguir.", + "block_modal.they_cant_see_posts": "No poden veure les vostres publicacions, ni vosaltres les seves.", + "block_modal.they_will_know": "Poden veure que els heu blocat.", + "block_modal.title": "Bloquem l'usuari?", + "block_modal.you_wont_see_mentions": "No veureu publicacions que l'esmentin.", "boost_modal.combo": "Pots prémer {combo} per a evitar-ho el pròxim cop", "bundle_column_error.copy_stacktrace": "Copia l'informe d'error", "bundle_column_error.error.body": "No s'ha pogut renderitzar la pàgina sol·licitada. Podria ser per un error en el nostre codi o per un problema de compatibilitat del navegador.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Afegeix avís de contingut", "compose_form.spoiler_placeholder": "Avís de contingut (opcional)", "confirmation_modal.cancel": "Cancel·la", - "confirmations.block.block_and_report": "Bloca i denuncia", "confirmations.block.confirm": "Bloca", - "confirmations.block.message": "Segur que vols blocar a {name}?", "confirmations.cancel_follow_request.confirm": "Retirar la sol·licitud", "confirmations.cancel_follow_request.message": "Segur que vols retirar la sol·licitud de seguiment de {name}?", "confirmations.delete.confirm": "Elimina", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Segur que vols suprimir permanentment aquesta llista?", "confirmations.discard_edit_media.confirm": "Descarta", "confirmations.discard_edit_media.message": "Tens canvis no desats en la descripció del contingut o en la previsualització, els vols descartar?", - "confirmations.domain_block.confirm": "Bloca el domini sencer", + "confirmations.domain_block.confirm": "Bloca el servidor", "confirmations.domain_block.message": "Segur que vols blocar {domain} del tot? En la majoria dels casos, només amb blocar o silenciar uns pocs comptes n'hi ha prou i és millor. No veuràs el contingut d’aquest domini en cap de les línies de temps ni en les notificacions. S'eliminaran els teus seguidors d’aquest domini.", "confirmations.edit.confirm": "Edita", "confirmations.edit.message": "Editant ara sobreescriuràs el missatge que estàs editant. Segur que vols continuar?", "confirmations.logout.confirm": "Tanca la sessió", "confirmations.logout.message": "Segur que vols tancar la sessió?", "confirmations.mute.confirm": "Silencia", - "confirmations.mute.explanation": "Això amagarà els tuts d'ells i els d'els que els mencionin, però encara els permetrà veure els teus tuts i seguir-te.", - "confirmations.mute.message": "Segur que vols silenciar {name}?", "confirmations.redraft.confirm": "Esborra i reescriu", "confirmations.redraft.message": "Segur que vols eliminar aquest tut i tornar a escriure'l? Es perdran tots els impulsos i els favorits, i les respostes al tut original quedaran aïllades.", "confirmations.reply.confirm": "Respon", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Aquests son els tuts de la xarxa descentralitzada que guanyen atenció ara mateix. Els tuts més nous amb més impulsos i favorits tenen millor rànquing.", "dismissable_banner.explore_tags": "Aquestes etiquetes estan guanyant ara mateix l'atenció dels usuaris d'aquest i altres servidors de la xarxa descentralitzada.", "dismissable_banner.public_timeline": "Aquests son els tuts públics més recents de les persones a la web social que les persones de {domain} segueixen.", + "domain_block_modal.block": "Bloca el servidor", + "domain_block_modal.block_account_instead": "En lloc d'això, bloca @{name}", + "domain_block_modal.they_can_interact_with_old_posts": "Els usuaris d'aquest servidor poden interactuar amb les vostres publicacions antigues.", + "domain_block_modal.they_cant_follow": "Ningú d'aquest servidor us pot seguir.", + "domain_block_modal.they_wont_know": "No sabran que són blocats.", + "domain_block_modal.title": "Bloquem el domini?", + "domain_block_modal.you_will_lose_followers": "S'eliminaran tots els vostres seguidors d'aquest servidor.", + "domain_block_modal.you_wont_see_posts": "No veureu ni les publicacions ni les notificacions dels usuaris d'aquest servidor.", + "domain_pill.activitypub_lets_connect": "Us permet connectar i interactuar amb persones a Mastodon i també a d'altres apps socials.", + "domain_pill.activitypub_like_language": "ActivityPub és el llenguatge que Mastodon parla amb altres xarxes socials.", + "domain_pill.server": "Servidor", + "domain_pill.their_handle": "El seu identificador:", + "domain_pill.their_server": "La seva llar digital, on són totes les seves publicacions.", + "domain_pill.their_username": "El seu identificador únic al servidor. És possible que hi hagi usuaris amb el mateix nom d'usuari a diferents servidors.", + "domain_pill.username": "Nom d'usuari", + "domain_pill.whats_in_a_handle": "Què constitueix un identificador?", + "domain_pill.who_they_are": "Com que un identificador expressa qui i on s'és, podeu interactuar amb persones d'arreu de les .", + "domain_pill.who_you_are": "Com que un identificador expressa qui i on sou, les persones d'arreu de les poden interactuar amb vosaltres.", + "domain_pill.your_handle": "El vostre identificador:", + "domain_pill.your_server": "La vostra llar digital, on són totes les vostres publicacions. No us agrada aquesta? Canvieu de servidor quan vulgueu i emporteu-vos els vostres seguidors.", + "domain_pill.your_username": "El vostre identificador únic en aquest servidor. Hi pot haver usuaris amb el mateix nom a diferents servidors.", "embed.instructions": "Incrusta aquest tut a la teva pàgina web copiant el codi següent.", "embed.preview": "Aquest aspecte tindrà:", "emoji_button.activity": "Activitat", @@ -402,9 +427,15 @@ "loading_indicator.label": "Es carrega…", "media_gallery.toggle_visible": "{number, plural, one {Amaga la imatge} other {Amaga les imatges}}", "moved_to_account_banner.text": "El teu compte {disabledAccount} està desactivat perquè l'has mogut a {movedToAccount}.", - "mute_modal.duration": "Durada", - "mute_modal.hide_notifications": "Amagar les notificacions d'aquest usuari?", - "mute_modal.indefinite": "Indefinit", + "mute_modal.hide_from_notifications": "Amaga de les notificacions", + "mute_modal.hide_options": "Amaga les opcions", + "mute_modal.indefinite": "Fins que els deixi de silenciar", + "mute_modal.show_options": "Mostra les opcions", + "mute_modal.they_can_mention_and_follow": "Us poden esmentar i seguir, però no els veureu.", + "mute_modal.they_wont_know": "No sabran que són silenciats.", + "mute_modal.title": "Silenciem l'usuari?", + "mute_modal.you_wont_see_mentions": "No veureu publicacions que els esmentin.", + "mute_modal.you_wont_see_posts": "Encara poden veure les vostres publicacions, però no veureu les seves.", "navigation_bar.about": "Quant a", "navigation_bar.advanced_interface": "Obre en la interfície web avançada", "navigation_bar.blocks": "Usuaris blocats", @@ -662,9 +693,11 @@ "status.direct": "Menciona privadament @{name}", "status.direct_indicator": "Menció privada", "status.edit": "Edita", + "status.edited": "Darrera edició {date}", "status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}", "status.embed": "Incrusta", "status.favourite": "Favorit", + "status.favourites": "{count, plural, one {# favorit} other {# favorits}}", "status.filter": "Filtra aquest tut", "status.filtered": "Filtrada", "status.hide": "Amaga el tut", @@ -685,6 +718,7 @@ "status.reblog": "Impulsa", "status.reblog_private": "Impulsa amb la visibilitat original", "status.reblogged_by": "impulsat per {name}", + "status.reblogs": "{count, plural, one {# impuls} other {# impulsos}}", "status.reblogs.empty": "Encara no ha impulsat ningú aquest tut. Quan algú ho faci, apareixerà aquí.", "status.redraft": "Esborra i reescriu", "status.remove_bookmark": "Elimina el marcador", diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json index 27526e3454..c3c365b3a1 100644 --- a/app/javascript/mastodon/locales/ckb.json +++ b/app/javascript/mastodon/locales/ckb.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "دەق شاراوە نییە", "compose_form.spoiler_placeholder": "ئاگادارکردنەوەی ناوەڕۆک (ئیختیاری)", "confirmation_modal.cancel": "هەڵوەشاندنەوه", - "confirmations.block.block_and_report": "بلۆک & گوزارشت", "confirmations.block.confirm": "بلۆک", - "confirmations.block.message": "ئایا دڵنیایت لەوەی دەتەوێت {name} بلۆک بکەیت?", "confirmations.cancel_follow_request.confirm": "داواکاری کشانەوە", "confirmations.cancel_follow_request.message": "ئایا دڵنیای کە دەتەوێت داواکارییەکەت بۆ شوێنکەوتنی {ناو} بکشێنیتەوە؟", "confirmations.delete.confirm": "سڕینەوە", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی ئەم لیستە بسڕیتەوە?", "confirmations.discard_edit_media.confirm": "ڕەتکردنەوە", "confirmations.discard_edit_media.message": "گۆڕانکاریت لە وەسف یان پێشبینی میدیادا هەڵنەگیراوە، بەهەر حاڵ فڕێیان بدە؟", - "confirmations.domain_block.confirm": "بلۆککردنی هەموو دۆمەینەکە", "confirmations.domain_block.message": "ئایا بەڕاستی، بەڕاستی تۆ دەتەوێت هەموو {domain} بلۆک بکەیت؟ لە زۆربەی حاڵەتەکاندا چەند بلۆکێکی ئامانجدار یان بێدەنگەکان پێویست و پەسەندن. تۆ ناوەڕۆک ێک نابینیت لە دۆمەینەکە لە هیچ هێڵی کاتی گشتی یان ئاگانامەکانت. شوێنکەوتوانی تۆ لەو دۆمەینەوە لادەبرێن.", "confirmations.edit.confirm": "دەستکاری", "confirmations.edit.message": "دەستکاری کردنی ئێستا: دەبێتە هۆی نووسینەوەی ئەو پەیامەی، کە ئێستا داتدەڕشت. ئایا دڵنیای، کە دەتەوێت بەردەوام بیت؟", "confirmations.logout.confirm": "چوونە دەرەوە", "confirmations.logout.message": "ئایا دڵنیایت لەوەی دەتەوێت بچیتە دەرەوە?", "confirmations.mute.confirm": "بێدەنگ", - "confirmations.mute.explanation": "ئەمەش دەبێتە هۆی شاردنەوەی پۆستەکان یان ئەو بابەتانەی کە ئاماژەیان پێ دەکات ، بەڵام هێشتا ڕێگەیان پێ دەدات کە پۆستەکانتان ببینن و شوێنتان بکەون.", - "confirmations.mute.message": "ئایا دڵنیایت لەوەی دەتەوێت بیلێیت {name}?", "confirmations.redraft.confirm": "سڕینەوە & دووبارە ڕەشکردنەوە", "confirmations.redraft.message": "دڵنیای دەتەوێت ئەم پۆستە بسڕیتەوە و دووبارە دایبڕێژیتەوە؟ فەڤۆریت و بووستەکان لەدەست دەچن، وەڵامەکانی پۆستە ئەسڵیەکەش هەتیو دەبن.", "confirmations.reply.confirm": "وەڵام", @@ -370,9 +365,6 @@ "load_pending": "{count, plural, one {# بەڕگەی نوێ} other {# بەڕگەی نوێ}}", "media_gallery.toggle_visible": "شاردنەوەی {number, plural, one {image} other {images}}", "moved_to_account_banner.text": "ئەکاونتەکەت {disabledAccount} لە ئێستادا لەکارخراوە چونکە تۆ چوویتە {movedToAccount}.", - "mute_modal.duration": "ماوە", - "mute_modal.hide_notifications": "شاردنەوەی ئاگانامەکان لەم بەکارهێنەرە؟ ", - "mute_modal.indefinite": "نادیار", "navigation_bar.about": "دەربارە", "navigation_bar.blocks": "بەکارهێنەرە بلۆککراوەکان", "navigation_bar.bookmarks": "نیشانکراوەکان", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index e547382a7c..be4cce2692 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -86,21 +86,16 @@ "compose_form.spoiler.marked": "Testu piattatu daret'à un'avertimentu", "compose_form.spoiler.unmarked": "Testu micca piattatu", "confirmation_modal.cancel": "Annullà", - "confirmations.block.block_and_report": "Bluccà è signalà", "confirmations.block.confirm": "Bluccà", - "confirmations.block.message": "Site sicuru·a che vulete bluccà @{name}?", "confirmations.delete.confirm": "Toglie", "confirmations.delete.message": "Site sicuru·a che vulete sguassà stu statutu?", "confirmations.delete_list.confirm": "Toglie", "confirmations.delete_list.message": "Site sicuru·a che vulete toglie sta lista?", "confirmations.discard_edit_media.confirm": "Scartà", - "confirmations.domain_block.confirm": "Piattà tuttu u duminiu", "confirmations.domain_block.message": "Site veramente sicuru·a che vulete piattà tuttu à {domain}? Saria forse abbastanza di bluccà ò piattà alcuni conti da quallà. Ùn viderete più nunda da quallà indè e linee pubbliche o e nutificazione. I vostri abbunati da stu duminiu saranu tolti.", "confirmations.logout.confirm": "Scunnettassi", "confirmations.logout.message": "Site sicuru·a che vulete scunnettà vi?", "confirmations.mute.confirm": "Piattà", - "confirmations.mute.explanation": "Quessu hà da piattà i statuti da sta persona è i posti chì a mintuvanu, ma ellu·a puderà sempre vede i vostri statuti è siguità vi.", - "confirmations.mute.message": "Site sicuru·a che vulete piattà @{name}?", "confirmations.redraft.confirm": "Sguassà è riscrive", "confirmations.reply.confirm": "Risponde", "confirmations.reply.message": "Risponde avà sguasserà u missaghju chì scrivite. Site sicuru·a chì vulete cuntinuà?", @@ -226,9 +221,6 @@ "lists.subheading": "E vo liste", "load_pending": "{count, plural, one {# entrata nova} other {# entrate nove}}", "media_gallery.toggle_visible": "Piattà {number, plural, one {ritrattu} other {ritratti}}", - "mute_modal.duration": "Durata", - "mute_modal.hide_notifications": "Piattà nutificazione da st'utilizatore?", - "mute_modal.indefinite": "Indifinita", "navigation_bar.blocks": "Utilizatori bluccati", "navigation_bar.bookmarks": "Segnalibri", "navigation_bar.community_timeline": "Linea pubblica lucale", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 5a8493fa07..273e8bf499 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Přidat varování o obsahu", "compose_form.spoiler_placeholder": "Upozornění na obsah (nepovinné)", "confirmation_modal.cancel": "Zrušit", - "confirmations.block.block_and_report": "Blokovat a nahlásit", "confirmations.block.confirm": "Blokovat", - "confirmations.block.message": "Opravdu chcete blokovat {name}?", "confirmations.cancel_follow_request.confirm": "Zrušit žádost", "confirmations.cancel_follow_request.message": "Opravdu chcete zrušit svou žádost o sledování {name}?", "confirmations.delete.confirm": "Smazat", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Opravdu chcete tento seznam navždy smazat?", "confirmations.discard_edit_media.confirm": "Zahodit", "confirmations.discard_edit_media.message": "Máte neuložené změny popisku médií nebo náhledu, chcete je přesto zahodit?", - "confirmations.domain_block.confirm": "Blokovat celou doménu", "confirmations.domain_block.message": "Opravdu chcete blokovat celou doménu {domain}? Ve většině případů stačí blokovat nebo skrýt pár konkrétních uživatelů, což také doporučujeme. Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledující z této domény budou odstraněni.", "confirmations.edit.confirm": "Upravit", "confirmations.edit.message": "Editovat teď znamená přepsání zprávy, kterou právě tvoříte. Opravdu chcete pokračovat?", "confirmations.logout.confirm": "Odhlásit se", "confirmations.logout.message": "Opravdu se chcete odhlásit?", "confirmations.mute.confirm": "Skrýt", - "confirmations.mute.explanation": "Tohle skryje uživatelovy příspěvky a příspěvky, které ho zmiňují, ale uživatel stále uvidí vaše příspěvky a může vás sledovat.", - "confirmations.mute.message": "Opravdu chcete skrýt uživatele {name}?", "confirmations.redraft.confirm": "Smazat a přepsat", "confirmations.redraft.message": "Jste si jistí, že chcete odstranit tento příspěvek a vytvořit z něj koncept? Oblíbené a boosty budou ztraceny a odpovědi na původní příspěvek ztratí kontext.", "confirmations.reply.confirm": "Odpovědět", @@ -399,9 +394,6 @@ "loading_indicator.label": "Načítání…", "media_gallery.toggle_visible": "{number, plural, one {Skrýt obrázek} few {Skrýt obrázky} many {Skrýt obrázky} other {Skrýt obrázky}}", "moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálně deaktivován, protože jste se přesunul/a na {movedToAccount}.", - "mute_modal.duration": "Trvání", - "mute_modal.hide_notifications": "Skrýt oznámení od tohoto uživatele?", - "mute_modal.indefinite": "Neomezeně", "navigation_bar.about": "O aplikaci", "navigation_bar.advanced_interface": "Otevřít pokročilé webové rozhraní", "navigation_bar.blocks": "Blokovaní uživatelé", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 0106df1877..d2731b6294 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Ychwanegu rhybudd cynnwys", "compose_form.spoiler_placeholder": "Rhybudd cynnwys (dewisol)", "confirmation_modal.cancel": "Diddymu", - "confirmations.block.block_and_report": "Rhwystro ac Adrodd", "confirmations.block.confirm": "Blocio", - "confirmations.block.message": "Ydych chi'n siŵr eich bod eisiau blocio {name}?", "confirmations.cancel_follow_request.confirm": "Tynnu'r cais yn ôl", "confirmations.cancel_follow_request.message": "Ydych chi'n siŵr eich bod am dynnu'ch cais i ddilyn {name} yn ôl?", "confirmations.delete.confirm": "Dileu", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Ydych chi'n siŵr eich bod eisiau dileu'r rhestr hwn am byth?", "confirmations.discard_edit_media.confirm": "Dileu", "confirmations.discard_edit_media.message": "Mae gennych newidiadau heb eu cadw i'r disgrifiad cyfryngau neu'r rhagolwg - eu dileu beth bynnag?", - "confirmations.domain_block.confirm": "Blocio parth cyfan", "confirmations.domain_block.message": "Ydych chi wir, wir eisiau blocio'r holl {domain}? Fel arfer, mae blocio neu dewi pobl penodol yn broses mwy effeithiol. Fyddwch chi ddim yn gweld cynnwys o'r parth hwnnw mewn ffrydiau cyhoeddus neu yn eich hysbysiadau. Bydd eich dilynwyr o'r parth hwnnw yn cael eu ddileu.", "confirmations.edit.confirm": "Golygu", "confirmations.edit.message": "Bydd golygu nawr yn trosysgrifennu'r neges rydych yn ei ysgrifennu ar hyn o bryd. Ydych chi'n siŵr eich bod eisiau gwneud hyn?", "confirmations.logout.confirm": "Allgofnodi", "confirmations.logout.message": "Ydych chi'n siŵr eich bod am allgofnodi?", "confirmations.mute.confirm": "Tewi", - "confirmations.mute.explanation": "Bydd hyn yn cuddio postiadau oddi wrthyn nhw a phostiadau sydd yn sôn amdanyn nhw, ond bydd hyn dal yn gadael iddyn nhw gweld eich postiadau a'ch dilyn.", - "confirmations.mute.message": "Ydych chi wir eisiau tewi {name}?", "confirmations.redraft.confirm": "Dileu ac ailddrafftio", "confirmations.redraft.message": "Ydych chi'n siŵr eich bod am ddileu'r postiad hwn a'i ailddrafftio? Bydd ffefrynnau a hybiau'n cael eu colli, a bydd atebion i'r post gwreiddiol yn mynd yn amddifad.", "confirmations.reply.confirm": "Ateb", @@ -401,9 +396,6 @@ "loading_indicator.label": "Yn llwytho…", "media_gallery.toggle_visible": "{number, plural, one {Cuddio delwedd} other {Cuddio delwedd}}", "moved_to_account_banner.text": "Ar hyn y bryd, mae eich cyfrif {disabledAccount} wedi ei analluogi am i chi symud i {movedToAccount}.", - "mute_modal.duration": "Hyd", - "mute_modal.hide_notifications": "Cuddio hysbysiadau gan y defnyddiwr hwn?", - "mute_modal.indefinite": "Parhaus", "navigation_bar.about": "Ynghylch", "navigation_bar.advanced_interface": "Agor mewn rhyngwyneb gwe uwch", "navigation_bar.blocks": "Defnyddwyr wedi eu blocio", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index df17791f1d..bff044e7d6 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -89,6 +89,14 @@ "announcement.announcement": "Bekendtgørelse", "attachments_list.unprocessed": "(ubehandlet)", "audio.hide": "Skjul lyd", + "block_modal.remote_users_caveat": "Serveren {domain} vil blive bedt om at respektere din beslutning. Overholdelse er dog ikke garanteret, da nogle servere kan håndtere blokke forskelligt. Offentlige indlæg kan stadig være synlige for ikke-indloggede brugere.", + "block_modal.show_less": "Vis mindre", + "block_modal.show_more": "Vis flere", + "block_modal.they_cant_mention": "Vedkommende kan ikke nævne eller følge dig.", + "block_modal.they_cant_see_posts": "Vedkommende kan ikke se dine indlæg, og du vil ikke se vedkommendes.", + "block_modal.they_will_know": "Vedkommende kan se den aktive blokering.", + "block_modal.title": "Blokér bruger?", + "block_modal.you_wont_see_mentions": "Du vil ikke se indlæg, som nævner vedkommende.", "boost_modal.combo": "Du kan trykke {combo} for at springe dette over næste gang", "bundle_column_error.copy_stacktrace": "Kopiér fejlrapport", "bundle_column_error.error.body": "Den anmodede side kunne ikke gengives. Dette kan skyldes flere typer fejl.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Tilføj indholdsadvarsel", "compose_form.spoiler_placeholder": "Indholdsadvarsel (valgfri)", "confirmation_modal.cancel": "Afbryd", - "confirmations.block.block_and_report": "Blokér og Anmeld", "confirmations.block.confirm": "Blokér", - "confirmations.block.message": "Er du sikker på, at du vil blokere {name}?", "confirmations.cancel_follow_request.confirm": "Annullér anmodning", "confirmations.cancel_follow_request.message": "Er du sikker på, at anmodningen om at følge {name} skal annulleres?", "confirmations.delete.confirm": "Slet", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Er du sikker på, at du vil slette denne liste permanent?", "confirmations.discard_edit_media.confirm": "Kassér", "confirmations.discard_edit_media.message": "Der er ugemte ændringer i mediebeskrivelsen eller forhåndsvisningen, kassér dem alligevel?", - "confirmations.domain_block.confirm": "Blokér hele domænet", + "confirmations.domain_block.confirm": "Blokér server", "confirmations.domain_block.message": "Er du fuldstændig sikker på, at du vil blokere hele {domain}-domænet? Oftest vil nogle få målrettede blokeringer eller skjulninger være tilstrækkelige og at foretrække. Du vil ikke se indhold fra dette domæne i nogle offentlige tidslinjer eller i dine notifikationer, og dine følgere herfra fjernes ligeledes.", "confirmations.edit.confirm": "Redigér", "confirmations.edit.message": "Redigeres nu, overskrive den besked, der forfattes pt. Fortsæt alligevel?", "confirmations.logout.confirm": "Log ud", "confirmations.logout.message": "Er du sikker på, at du vil logge ud?", "confirmations.mute.confirm": "Skjul (mute)", - "confirmations.mute.explanation": "Dette skjuler indlæg fra (og om) dem, men lader dem fortsat se dine indlæg og følge dig.", - "confirmations.mute.message": "Er du sikker på, at du vil skjule {name}?", "confirmations.redraft.confirm": "Slet og omformulér", "confirmations.redraft.message": "Sikker på, at dette indlæg skal slettes og omskrives? Favoritter og boosts går tabt, og svar til det oprindelige indlæg mister tilknytningen.", "confirmations.reply.confirm": "Svar", @@ -205,6 +209,25 @@ "dismissable_banner.explore_statuses": "Disse indlæg fra diverse sociale netværk vinder fodfæste i dag. Nyere indlæg med flere boosts og favoritter rangeres højere.", "dismissable_banner.explore_tags": "Disse hashtages vinder lige nu fodfæste blandt folk på denne og andre servere i det decentraliserede netværk.", "dismissable_banner.public_timeline": "Dette er de seneste offentlige indlæg fra folk på det sociale netværk, som folk på {domain} følger.", + "domain_block_modal.block": "Blokér server", + "domain_block_modal.block_account_instead": "Blokér i stedet @{name}", + "domain_block_modal.they_can_interact_with_old_posts": "Folk fra denne server kan interagere med de gamle indlæg.", + "domain_block_modal.they_cant_follow": "Ingen fra denne server kan følge dig.", + "domain_block_modal.they_wont_know": "Vedkommende ser ikke den aktive blokering.", + "domain_block_modal.title": "Blokér domæne?", + "domain_block_modal.you_will_lose_followers": "Alle følgerne fra denne server fjernes.", + "domain_block_modal.you_wont_see_posts": "Indlæg eller notifikationer fra brugere på denne server vises ikke.", + "domain_pill.activitypub_lets_connect": "Det muliggør at komme i forbindelse og interagere med folk ikke kun på Mastodon, men også på tværs af forskellige sociale apps.", + "domain_pill.activitypub_like_language": "ActivityPub er \"sproget\", Mastodon taler med andre sociale netværk.", + "domain_pill.server": "Server", + "domain_pill.their_handle": "Deres handle:", + "domain_pill.username": "Brugernavn", + "domain_pill.whats_in_a_handle": "Hvad er der i et handle (@brugernavn)?", + "domain_pill.who_they_are": "Da et handle fortæller, hvem nogen er, og hvor de er, kan man interagere med folk på tværs af det sociale net af .", + "domain_pill.who_you_are": "Da et handle fortæller, hvem man er, og hvor man er, kan man interagere med folk på tværs af det sociale net af .", + "domain_pill.your_handle": "Dit handle:", + "domain_pill.your_server": "Dit digitale hjem, hvor alle dine indlæg lever. Synes ikke om denne? Overfør til enhver tid servere samt tilhængere også.", + "domain_pill.your_username": "Din entydige identifikator på denne server. Det er muligt at finde brugere med samme brugernavn på forskellige servere.", "embed.instructions": "Indlejr dette indlæg på dit websted ved at kopiere nedenstående kode.", "embed.preview": "Sådan kommer det til at se ud:", "emoji_button.activity": "Aktivitet", @@ -402,9 +425,15 @@ "loading_indicator.label": "Indlæser…", "media_gallery.toggle_visible": "{number, plural, one {Skjul billede} other {Skjul billeder}}", "moved_to_account_banner.text": "Din konto {disabledAccount} er pt. deaktiveret, da du flyttede til {movedToAccount}.", - "mute_modal.duration": "Varighed", - "mute_modal.hide_notifications": "Skjul notifikationer fra denne bruger?", - "mute_modal.indefinite": "Tidsubegrænset", + "mute_modal.hide_from_notifications": "Skjul fra notifikationer", + "mute_modal.hide_options": "Skjul valgmuligheder", + "mute_modal.indefinite": "Indtil jeg fjerner tavsgørelsen", + "mute_modal.show_options": "Vis valgmuligheder", + "mute_modal.they_can_mention_and_follow": "Vedkommende kan nævne og følge dig, men vil ikke blive vist.", + "mute_modal.they_wont_know": "Vedkommende ser ikke den aktive tavsgørelse.", + "mute_modal.title": "Tavsgør bruger?", + "mute_modal.you_wont_see_mentions": "Indlæg, som nævner vedkommende, vises ikke.", + "mute_modal.you_wont_see_posts": "Vedkommende kan stadig se dine indlæg, med vedkommendes vise ikke.", "navigation_bar.about": "Om", "navigation_bar.advanced_interface": "Åbn i avanceret webgrænseflade", "navigation_bar.blocks": "Blokerede brugere", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 17e1ca1dd0..412ef31b07 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -89,6 +89,14 @@ "announcement.announcement": "Ankündigung", "attachments_list.unprocessed": "(ausstehend)", "audio.hide": "Audio ausblenden", + "block_modal.remote_users_caveat": "Wir werden den Server {domain} bitten, deine Entscheidung zu respektieren. Allerdings kann nicht garantiert werden, dass sie eingehalten wird, weil einige Server Blockierungen unterschiedlich handhaben können. Öffentliche Beiträge können für nicht angemeldete Nutzer*innen weiterhin sichtbar sein.", + "block_modal.show_less": "Weniger anzeigen", + "block_modal.show_more": "Mehr anzeigen", + "block_modal.they_cant_mention": "Das Profil wird dich nicht erwähnen oder dir folgen können.", + "block_modal.they_cant_see_posts": "Deine Beiträge können nicht mehr angesehen werden und du wirst deren Beiträge nicht mehr sehen.", + "block_modal.they_will_know": "Es wird erkennbar sein, dass dieses Profil blockiert wurde.", + "block_modal.title": "Profil blockieren?", + "block_modal.you_wont_see_mentions": "Du wirst keine Beiträge sehen, die dieses Profil erwähnen.", "boost_modal.combo": "Mit {combo} wird dieses Fenster beim nächsten Mal nicht mehr angezeigt", "bundle_column_error.copy_stacktrace": "Fehlerbericht kopieren", "bundle_column_error.error.body": "Die angeforderte Seite konnte nicht dargestellt werden. Dies könnte auf einen Fehler in unserem Code oder auf ein Browser-Kompatibilitätsproblem zurückzuführen sein.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Inhaltswarnung hinzufügen", "compose_form.spoiler_placeholder": "Inhaltswarnung (optional)", "confirmation_modal.cancel": "Abbrechen", - "confirmations.block.block_and_report": "Blockieren und melden", "confirmations.block.confirm": "Blockieren", - "confirmations.block.message": "Möchtest du {name} wirklich blockieren?", "confirmations.cancel_follow_request.confirm": "Anfrage zurückziehen", "confirmations.cancel_follow_request.message": "Möchtest du deine Anfrage, {name} zu folgen, wirklich zurückziehen?", "confirmations.delete.confirm": "Löschen", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Möchtest du diese Liste für immer löschen?", "confirmations.discard_edit_media.confirm": "Verwerfen", "confirmations.discard_edit_media.message": "Du hast Änderungen an der Medienbeschreibung oder -vorschau vorgenommen, die noch nicht gespeichert sind. Trotzdem verwerfen?", - "confirmations.domain_block.confirm": "Domain blockieren", + "confirmations.domain_block.confirm": "Server blockieren", "confirmations.domain_block.message": "Möchtest du die gesamte Domain {domain} wirklich blockieren? In den meisten Fällen reichen ein paar gezielte Blockierungen oder Stummschaltungen aus. Du wirst den Inhalt von dieser Domain nicht in irgendwelchen öffentlichen Timelines oder den Benachrichtigungen finden. Auch deine Follower von dieser Domain werden entfernt.", "confirmations.edit.confirm": "Bearbeiten", "confirmations.edit.message": "Das Bearbeiten überschreibt die Nachricht, die du gerade verfasst. Möchtest du wirklich fortfahren?", "confirmations.logout.confirm": "Abmelden", "confirmations.logout.message": "Möchtest du dich wirklich abmelden?", "confirmations.mute.confirm": "Stummschalten", - "confirmations.mute.explanation": "Dies wird Beiträge von dieser Person und Beiträge, die diese Person erwähnen, ausblenden, aber es wird der Person trotzdem erlauben, deine Beiträge zu sehen und dir zu folgen.", - "confirmations.mute.message": "Möchtest du {name} wirklich stummschalten?", "confirmations.redraft.confirm": "Löschen und neu erstellen", "confirmations.redraft.message": "Möchtest du diesen Beitrag wirklich löschen und neu verfassen? Favoriten und geteilte Beiträge gehen verloren, und Antworten auf den ursprünglichen Beitrag verlieren den Zusammenhang.", "confirmations.reply.confirm": "Antworten", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Diese Beiträge stammen aus dem gesamten sozialen Netzwerk und gewinnen derzeit an Reichweite. Neuere Beiträge, die häufiger geteilt und favorisiert wurden, werden höher eingestuft.", "dismissable_banner.explore_tags": "Das sind Hashtags, die derzeit an Reichweite gewinnen. Hashtags, die von vielen verschiedenen Profilen verwendet werden, werden höher eingestuft.", "dismissable_banner.public_timeline": "Das sind die neuesten öffentlichen Beiträge von Profilen im sozialen Netzwerk, denen Leute auf {domain} folgen.", + "domain_block_modal.block": "Server blockieren", + "domain_block_modal.block_account_instead": "Stattdessen @{name} blockieren", + "domain_block_modal.they_can_interact_with_old_posts": "Profile von diesem Server werden mit deinen älteren Beiträgen interagieren können.", + "domain_block_modal.they_cant_follow": "Niemand von diesem Server wird dir folgen können.", + "domain_block_modal.they_wont_know": "Es wird nicht erkennbar sein, dass diese Domain blockiert wurde.", + "domain_block_modal.title": "Domain blockieren?", + "domain_block_modal.you_will_lose_followers": "Alle Follower von diesem Server werden entfernt.", + "domain_block_modal.you_wont_see_posts": "Du wirst keine Beiträge oder Benachrichtigungen von Profilen auf diesem Server sehen.", + "domain_pill.activitypub_lets_connect": "Somit kannst du dich nicht nur auf Mastodon mit Leuten verbinden und mit ihnen interagieren, sondern über alle sozialen Apps hinweg.", + "domain_pill.activitypub_like_language": "ActivityPub ist sozusagen die Sprache, die Mastodon mit anderen sozialen Netzwerken spricht.", + "domain_pill.server": "Server", + "domain_pill.their_handle": "Deren Adresse:", + "domain_pill.their_server": "Deren digitales Zuhause. Hier „leben“ alle Beiträge von diesem Profil.", + "domain_pill.their_username": "Deren eindeutigen Identität auf dem betreffenden Server. Es ist möglich, Profile mit dem gleichen Profilnamen auf verschiedenen Servern zu finden.", + "domain_pill.username": "Profilname", + "domain_pill.whats_in_a_handle": "Was ist Teil der Adresse?", + "domain_pill.who_they_are": "Adressen teilen mit, wer jemand ist und wo sich jemand aufhält. Daher kannst du mit Leuten im gesamten Social Web interagieren, wenn es eine durch ist.", + "domain_pill.who_you_are": "Deine Adresse teilt mit, wer du bist und wo du dich aufhältst. Daher können andere Leute im gesamten Social Web mit dir interagieren, wenn es eine durch ist.", + "domain_pill.your_handle": "Deine Adresse:", + "domain_pill.your_server": "Dein digitales Zuhause. Hier „leben“ alle Beiträge von dir. Dir gefällt es hier nicht? Du kannst jederzeit den Server wechseln und ebenso deine Follower übertragen.", + "domain_pill.your_username": "Deine eindeutige Identität auf diesem Server. Es ist möglich, Profile mit dem gleichen Profilnamen auf verschiedenen Servern zu finden.", "embed.instructions": "Du kannst diesen Beitrag außerhalb des Fediverse (z. B. auf deiner Website) einbetten, indem du diesen iFrame-Code einfügst.", "embed.preview": "Vorschau:", "emoji_button.activity": "Aktivitäten", @@ -284,7 +309,7 @@ "follow_suggestions.dismiss": "Nicht mehr anzeigen", "follow_suggestions.hints.featured": "Dieses Profil wurde vom {domain}-Team ausgewählt.", "follow_suggestions.hints.friends_of_friends": "Dieses Profil ist bei deinen Followern beliebt.", - "follow_suggestions.hints.most_followed": "Dieses Profil wird von den meisten auf {domain} gefolgt.", + "follow_suggestions.hints.most_followed": "Dieses Profil ist eines der am meisten gefolgten auf {domain}.", "follow_suggestions.hints.most_interactions": "Dieses Profil erhielt auf {domain} in letzter Zeit viel Aufmerksamkeit.", "follow_suggestions.hints.similar_to_recently_followed": "Dieses Profil ähnelt den Profilen, denen du in letzter Zeit gefolgt hast.", "follow_suggestions.personalized_suggestion": "Persönliche Empfehlung", @@ -402,9 +427,15 @@ "loading_indicator.label": "Wird geladen …", "media_gallery.toggle_visible": "{number, plural, one {Medium ausblenden} other {Medien ausblenden}}", "moved_to_account_banner.text": "Dein Konto {disabledAccount} ist derzeit deaktiviert, weil du zu {movedToAccount} umgezogen bist.", - "mute_modal.duration": "Dauer", - "mute_modal.hide_notifications": "Benachrichtigungen dieses Profils ausblenden?", - "mute_modal.indefinite": "Unbegrenzt", + "mute_modal.hide_from_notifications": "Benachrichtigungen ausblenden", + "mute_modal.hide_options": "Einstellungen ausblenden", + "mute_modal.indefinite": "Bis ich die Stummschaltung aufhebe", + "mute_modal.show_options": "Einstellungen anzeigen", + "mute_modal.they_can_mention_and_follow": "Das Profil wird dich weiterhin erwähnen und dir folgen können, aber du wirst davon nichts sehen.", + "mute_modal.they_wont_know": "Es wird nicht erkennbar sein, dass dieses Profil stummgeschaltet wurde.", + "mute_modal.title": "Profil stummschalten?", + "mute_modal.you_wont_see_mentions": "Du wirst keine Beiträge sehen, die dieses Profil erwähnen.", + "mute_modal.you_wont_see_posts": "Deine Beiträge können weiterhin angesehen werden, aber du wirst deren Beiträge nicht mehr sehen.", "navigation_bar.about": "Über", "navigation_bar.advanced_interface": "Im erweiterten Webinterface öffnen", "navigation_bar.blocks": "Blockierte Profile", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index c8d90bf0c5..937bb5d027 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -154,9 +154,7 @@ "compose_form.spoiler.unmarked": "Προσθήκη προειδοποίησης περιεχομένου", "compose_form.spoiler_placeholder": "Προειδοποίηση περιεχομένου (προαιρετική)", "confirmation_modal.cancel": "Άκυρο", - "confirmations.block.block_and_report": "Αποκλεισμός & Αναφορά", "confirmations.block.confirm": "Αποκλεισμός", - "confirmations.block.message": "Σίγουρα θες να αποκλείσεις {name};", "confirmations.cancel_follow_request.confirm": "Απόσυρση αιτήματος", "confirmations.cancel_follow_request.message": "Είσαι σίγουρος/η ότι θέλεις να αποσύρεις το αίτημά σου να ακολουθείς τον/την {name};", "confirmations.delete.confirm": "Διαγραφή", @@ -165,15 +163,12 @@ "confirmations.delete_list.message": "Σίγουρα θες να διαγράψεις οριστικά αυτή τη λίστα;", "confirmations.discard_edit_media.confirm": "Απόρριψη", "confirmations.discard_edit_media.message": "Έχεις μη αποθηκευμένες αλλαγές στην περιγραφή πολυμέσων ή στην προεπισκόπηση, απόρριψη ούτως ή άλλως;", - "confirmations.domain_block.confirm": "Αποκλεισμός ολόκληρου του τομέα", "confirmations.domain_block.message": "Σίγουρα θες να αποκλείσεις ολόκληρο τον {domain}; Συνήθως μερικοί συγκεκρίμένοι αποκλεισμοί ή σιγάσεις επαρκούν και προτιμούνται. Δεν θα βλέπεις περιεχόμενο από αυτό τον τομέα σε καμία δημόσια ροή ή στις ειδοποιήσεις σου. Όσους ακόλουθους έχεις αυτό αυτό τον τομέα θα αφαιρεθούν.", "confirmations.edit.confirm": "Επεξεργασία", "confirmations.edit.message": "Αν το επεξεργαστείς τώρα θα αντικατασταθεί το μήνυμα που συνθέτεις. Είσαι σίγουρος ότι θέλεις να συνεχίσεις;", "confirmations.logout.confirm": "Αποσύνδεση", "confirmations.logout.message": "Σίγουρα θέλεις να αποσυνδεθείς;", "confirmations.mute.confirm": "Αποσιώπηση", - "confirmations.mute.explanation": "Αυτό θα κρύψει τις δημοσιεύσεις τους και τις δημοσιεύσεις που τους αναφέρουν, αλλά θα συνεχίσουν να μπορούν να βλέπουν τις δημοσιεύσεις σου και να σε ακολουθούν.", - "confirmations.mute.message": "Σίγουρα θες να αποσιωπήσεις {name};", "confirmations.redraft.confirm": "Διαγραφή & ξαναγράψιμο", "confirmations.redraft.message": "Σίγουρα θέλεις να σβήσεις αυτή την ανάρτηση και να την ξαναγράψεις; Οι προτιμήσεις και προωθήσεις θα χαθούν και οι απαντήσεις στην αρχική ανάρτηση θα μείνουν ορφανές.", "confirmations.reply.confirm": "Απάντησε", @@ -366,9 +361,6 @@ "loading_indicator.label": "Φόρτωση…", "media_gallery.toggle_visible": "{number, plural, one {Απόκρυψη εικόνας} other {Απόκρυψη εικόνων}}", "moved_to_account_banner.text": "Ο λογαριασμός σου {disabledAccount} είναι προσωρινά απενεργοποιημένος επειδή μεταφέρθηκες στον {movedToAccount}.", - "mute_modal.duration": "Διάρκεια", - "mute_modal.hide_notifications": "Απόκρυψη ειδοποιήσεων αυτού του χρήστη;", - "mute_modal.indefinite": "Επ᾽ αόριστον", "navigation_bar.about": "Σχετικά με", "navigation_bar.blocks": "Αποκλεισμένοι χρήστες", "navigation_bar.bookmarks": "Σελιδοδείκτες", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index c9b280f84e..228a16def2 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Add content warning", "compose_form.spoiler_placeholder": "Content warning (optional)", "confirmation_modal.cancel": "Cancel", - "confirmations.block.block_and_report": "Block & Report", "confirmations.block.confirm": "Block", - "confirmations.block.message": "Are you sure you want to block {name}?", "confirmations.cancel_follow_request.confirm": "Withdraw request", "confirmations.cancel_follow_request.message": "Are you sure you want to withdraw your request to follow {name}?", "confirmations.delete.confirm": "Delete", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.discard_edit_media.confirm": "Discard", "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", - "confirmations.domain_block.confirm": "Block entire domain", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", "confirmations.edit.confirm": "Edit", "confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.logout.confirm": "Log out", "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Mute", - "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.", - "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", "confirmations.reply.confirm": "Reply", @@ -393,9 +388,6 @@ "loading_indicator.label": "Loading…", "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}", "moved_to_account_banner.text": "Your account {disabledAccount} is currently disabled because you moved to {movedToAccount}.", - "mute_modal.duration": "Duration", - "mute_modal.hide_notifications": "Hide notifications from this user?", - "mute_modal.indefinite": "Indefinite", "navigation_bar.about": "About", "navigation_bar.advanced_interface": "Open in advanced web interface", "navigation_bar.blocks": "Blocked users", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 1fb4e2bd11..6e7885f485 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -152,9 +152,7 @@ "compose_form.spoiler.marked": "Forigi la averton de enhavo", "compose_form.spoiler.unmarked": "Aldoni averton de enhavo", "confirmation_modal.cancel": "Nuligi", - "confirmations.block.block_and_report": "Bloki kaj raporti", "confirmations.block.confirm": "Bloki", - "confirmations.block.message": "Ĉu vi certas, ke vi volas bloki {name}?", "confirmations.cancel_follow_request.confirm": "Eksigi peton", "confirmations.cancel_follow_request.message": "Ĉu vi certas ke vi volas eksigi vian peton por sekvi {name}?", "confirmations.delete.confirm": "Forigi", @@ -163,15 +161,12 @@ "confirmations.delete_list.message": "Ĉu vi certas, ke vi volas porĉiame forigi ĉi tiun liston?", "confirmations.discard_edit_media.confirm": "Forĵeti", "confirmations.discard_edit_media.message": "Vi havas nekonservitajn ŝanĝojn de la priskribo aŭ la antaŭmontro de la plurmedio, ĉu vi forĵetu ilin malgraŭe?", - "confirmations.domain_block.confirm": "Bloki la tutan domajnon", "confirmations.domain_block.message": "Ĉu vi vere, vere certas, ke vi volas tute bloki {domain}? Plej ofte, trafa blokado kaj silentigado sufiĉas kaj preferindas. Vi ne vidos enhavon de tiu domajno en publika templinio aŭ en viaj sciigoj. Viaj sekvantoj de tiu domajno estos forigitaj.", "confirmations.edit.confirm": "Redakti", "confirmations.edit.message": "Redakti nun anstataŭigos la skribatan afiŝon. Ĉu vi certas, ke vi volas daŭrigi?", "confirmations.logout.confirm": "Adiaŭi", "confirmations.logout.message": "Ĉu vi certas ke vi volas adiaŭi?", "confirmations.mute.confirm": "Silentigi", - "confirmations.mute.explanation": "Tio kaŝos la mesaĝojn de la uzanto kaj la mesaĝojn kiuj mencias rin, sed ri ankoraŭ rajtos vidi viajn mesaĝojn kaj sekvi vin.", - "confirmations.mute.message": "Ĉu vi certas, ke vi volas silentigi {name}?", "confirmations.redraft.confirm": "Forigi kaj reskribi", "confirmations.redraft.message": "Ĉu vi certas ke vi volas forigi tiun afiŝon kaj reskribi ĝin? Ĉiuj diskonigoj kaj stelumoj estos perditaj, kaj respondoj al la originala mesaĝo estos senparentaj.", "confirmations.reply.confirm": "Respondi", @@ -380,9 +375,6 @@ "loading_indicator.label": "Ŝargado…", "media_gallery.toggle_visible": "{number, plural, one {Kaŝi la bildon} other {Kaŝi la bildojn}}", "moved_to_account_banner.text": "Via konto {disabledAccount} estas malvalidigita ĉar vi movis ĝin al {movedToAccount}.", - "mute_modal.duration": "Daŭro", - "mute_modal.hide_notifications": "Ĉu vi volas kaŝi la sciigojn de ĉi tiu uzanto?", - "mute_modal.indefinite": "Nedifinita", "navigation_bar.about": "Pri", "navigation_bar.advanced_interface": "Malfermi altnivelan retpaĝan interfacon", "navigation_bar.blocks": "Blokitaj uzantoj", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index a573419f40..53144cfcbf 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -89,6 +89,14 @@ "announcement.announcement": "Anuncio", "attachments_list.unprocessed": "[sin procesar]", "audio.hide": "Ocultar audio", + "block_modal.remote_users_caveat": "Le pediremos al servidor {domain} que respete tu decisión. Sin embargo, el cumplimiento no está garantizado, ya que algunos servidores pueden manejar los bloqueos de forma diferente. Los mensajes públicos todavía podrían estar visibles para los usuarios no conectados.", + "block_modal.show_less": "Mostrar menos", + "block_modal.show_more": "Mostrar más", + "block_modal.they_cant_mention": "No pueden mencionarte ni seguirte.", + "block_modal.they_cant_see_posts": "No pueden ver tus mensajes y vos no verás los suyos.", + "block_modal.they_will_know": "Pueden ver que están bloqueados.", + "block_modal.title": "¿Bloquear usuario?", + "block_modal.you_wont_see_mentions": "No verás mensajes que los mencionen.", "boost_modal.combo": "Podés hacer clic en {combo} para saltar esto la próxima vez", "bundle_column_error.copy_stacktrace": "Copiar informe de error", "bundle_column_error.error.body": "La página solicitada no pudo ser cargada. Podría deberse a un error de programación en nuestro código o a un problema de compatibilidad con el navegador web.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Agregar advertencia de contenido", "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "confirmation_modal.cancel": "Cancelar", - "confirmations.block.block_and_report": "Bloquear y denunciar", "confirmations.block.confirm": "Bloquear", - "confirmations.block.message": "¿Estás seguro que querés bloquear a {name}?", "confirmations.cancel_follow_request.confirm": "Retirar solicitud", "confirmations.cancel_follow_request.message": "¿Estás seguro que querés retirar tu solicitud para seguir a {name}?", "confirmations.delete.confirm": "Eliminar", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "¿Estás seguro que querés eliminar permanentemente esta lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tenés cambios sin guardar en la descripción de medios o en la vista previa, ¿querés descartarlos de todos modos?", - "confirmations.domain_block.confirm": "Bloquear dominio entero", + "confirmations.domain_block.confirm": "Bloquear servidor", "confirmations.domain_block.message": "¿Estás completamente seguro que querés bloquear el {domain} entero? En la mayoría de los casos, unos cuantos bloqueos y silenciados puntuales son suficientes y preferibles. No vas a ver contenido de ese dominio en ninguna de tus líneas temporales o en tus notificaciones. Tus seguidores de ese dominio serán quitados.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?", "confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.message": "¿Estás seguro que querés cerrar la sesión?", "confirmations.mute.confirm": "Silenciar", - "confirmations.mute.explanation": "Se ocultarán los mensajes de esta cuenta y los mensajes de otras cuentas que mencionen a ésta, pero todavía esta cuenta podrá ver tus mensajes o seguirte.", - "confirmations.mute.message": "¿Estás seguro que querés silenciar a {name}?", "confirmations.redraft.confirm": "Eliminar mensaje original y editarlo", "confirmations.redraft.message": "¿Estás seguro que querés eliminar este mensaje y volver a editarlo? Se perderán las veces marcadas como favorito y sus adhesiones, y las respuestas al mensaje original quedarán huérfanas.", "confirmations.reply.confirm": "Responder", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Estos son los mensajes que están ganando popularidad en la web social, hoy mismo. Los mensajes más recientes con más adhesiones y marcados como favoritos obtienen más exposición.", "dismissable_banner.explore_tags": "Estas son etiquetas que están ganando popularidad en la web social, hoy mismo. Las etiquetas que son usadas por diferentes cuentas obtienen más exposición.", "dismissable_banner.public_timeline": "Estos son los mensajes públicos más recientes de cuentas en la web social que las personas en {domain} siguen.", + "domain_block_modal.block": "Bloquear servidor", + "domain_block_modal.block_account_instead": "Bloquear @{name} en su lugar", + "domain_block_modal.they_can_interact_with_old_posts": "Las cuentas de este servidor pueden interactuar con tus mensajes antiguos.", + "domain_block_modal.they_cant_follow": "Nadie de este servidor puede seguirte.", + "domain_block_modal.they_wont_know": "No sabrán que fueron bloqueados.", + "domain_block_modal.title": "¿Bloquear dominio?", + "domain_block_modal.you_will_lose_followers": "Se eliminarán todos tus seguidores de este servidor.", + "domain_block_modal.you_wont_see_posts": "No verás mensajes ni notificaciones de usuarios en este servidor.", + "domain_pill.activitypub_lets_connect": "Te permite conectar e interactuar con cuentas no solo en Mastodon, sino también a través de diferentes aplicaciones sociales.", + "domain_pill.activitypub_like_language": "ActivityPub es como el idioma que Mastodon habla con otras redes sociales.", + "domain_pill.server": "Servidor", + "domain_pill.their_handle": "Su alias:", + "domain_pill.their_server": "Su hogar digital, donde residen todoas sus mensajes.", + "domain_pill.their_username": "Su identificador único en su servidor. Es posible encontrar cuentas con el mismo nombre de usuario en diferentes servidores.", + "domain_pill.username": "Nombre de usuario", + "domain_pill.whats_in_a_handle": "¿En qué consiste el alias?", + "domain_pill.who_they_are": "Los alias indican quiénes son y dónde se encuentran, y gracias a ellos podés interactuar con otras cuentas a través de las redes sociales compatibles con .", + "domain_pill.who_you_are": "Los alias dicen quién sos y dónde estás, y gracias a ellos podés interactuar con otras cuentas a través de las redes sociales compatibles con .", + "domain_pill.your_handle": "Tu alias:", + "domain_pill.your_server": "Tu hogar digital, donde residen todos tus mensajes. ¿No te gusta este sitio? Mudate a otro servidor en cualquier momento y llevate a tus seguidores.", + "domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar cuentas con el mismo nombre de usuario en diferentes servidores.", "embed.instructions": "Insertá este mensaje a tu sitio web copiando el código de abajo.", "embed.preview": "Así es cómo se verá:", "emoji_button.activity": "Actividad", @@ -402,9 +427,15 @@ "loading_indicator.label": "Cargando…", "media_gallery.toggle_visible": "Ocultar {number, plural, one {imagen} other {imágenes}}", "moved_to_account_banner.text": "Tu cuenta {disabledAccount} está actualmente deshabilitada porque te mudaste a {movedToAccount}.", - "mute_modal.duration": "Duración", - "mute_modal.hide_notifications": "¿Querés ocultar las notificaciones de este usuario?", - "mute_modal.indefinite": "Indefinida", + "mute_modal.hide_from_notifications": "Ocultar de las notificaciones", + "mute_modal.hide_options": "Ocultar opciones", + "mute_modal.indefinite": "Hasta que deje de silenciarlos", + "mute_modal.show_options": "Mostrar opciones", + "mute_modal.they_can_mention_and_follow": "Pueden mencionarte y seguirte, pero no verás nada de ellos.", + "mute_modal.they_wont_know": "No sabrán que fueron silenciados.", + "mute_modal.title": "¿Silenciar usuario?", + "mute_modal.you_wont_see_mentions": "No verás mensajes que los mencionen.", + "mute_modal.you_wont_see_posts": "Todavía pueden ver tus mensajes, pero vos no verás los suyos.", "navigation_bar.about": "Información", "navigation_bar.advanced_interface": "Abrir en interface web avanzada", "navigation_bar.blocks": "Usuarios bloqueados", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 7df5a384a8..00dcb81461 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -89,6 +89,14 @@ "announcement.announcement": "Anuncio", "attachments_list.unprocessed": "(sin procesar)", "audio.hide": "Ocultar audio", + "block_modal.remote_users_caveat": "Le pediremos al servidor {domain} que respete tu decisión. Sin embargo, el cumplimiento no está garantizado ya que algunos servidores pueden manejar bloques de forma diferente. Las publicaciones públicas pueden ser todavía visibles para los usuarios no conectados.", + "block_modal.show_less": "Mostrar menos", + "block_modal.show_more": "Mostrar más", + "block_modal.they_cant_mention": "No pueden mencionarte ni seguirte.", + "block_modal.they_cant_see_posts": "No pueden ver tus publicaciones y tú no verás las de ellos.", + "block_modal.they_will_know": "Pueden ver que están bloqueados.", + "block_modal.title": "¿Bloquear usuario?", + "block_modal.you_wont_see_mentions": "No verás publicaciones que los mencionen.", "boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez", "bundle_column_error.copy_stacktrace": "Copiar informe de error", "bundle_column_error.error.body": "La página solicitada no pudo ser renderizada. Podría deberse a un error en nuestro código o a un problema de compatibilidad con el navegador.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Texto no oculto", "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "confirmation_modal.cancel": "Cancelar", - "confirmations.block.block_and_report": "Bloquear y Denunciar", "confirmations.block.confirm": "Bloquear", - "confirmations.block.message": "¿Estás seguro de querer bloquear a {name}?", "confirmations.cancel_follow_request.confirm": "Retirar solicitud", "confirmations.cancel_follow_request.message": "¿Estás seguro de que deseas retirar tu solicitud para seguir a {name}?", "confirmations.delete.confirm": "Eliminar", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo, ¿deseas descartarlos de cualquier manera?", - "confirmations.domain_block.confirm": "Ocultar dominio entero", + "confirmations.domain_block.confirm": "Bloquear servidor", "confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio {domain} entero? En general unos cuantos bloqueos y silenciados concretos es suficiente y preferible.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", "confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.message": "¿Estás seguro de querer cerrar la sesión?", "confirmations.mute.confirm": "Silenciar", - "confirmations.mute.explanation": "Esto esconderá las publicaciones de ellos y en las que los has mencionado, pero les permitirá ver tus mensajes y seguirte.", - "confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?", "confirmations.redraft.confirm": "Borrar y volver a borrador", "confirmations.redraft.message": "¿Estás seguro que quieres borrar esta publicación y editarla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán separadas.", "confirmations.reply.confirm": "Responder", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Estas son las publicaciones que están en tendencia en la red ahora. Las publicaciones recientes con más impulsos y favoritos se muestran más arriba.", "dismissable_banner.explore_tags": "Se trata de hashtags que están ganando adeptos en las redes sociales hoy en día. Los hashtags que son utilizados por más personas diferentes se clasifican mejor.", "dismissable_banner.public_timeline": "Estos son los toots públicos más recientes de personas en la web social a las que sigue la gente en {domain}.", + "domain_block_modal.block": "Bloquear servidor", + "domain_block_modal.block_account_instead": "Bloquear @{name} en su lugar", + "domain_block_modal.they_can_interact_with_old_posts": "Las personas de este servidor pueden interactuar con tus publicaciones antiguas.", + "domain_block_modal.they_cant_follow": "Nadie de este servidor puede seguirte.", + "domain_block_modal.they_wont_know": "No sabrán que han sido bloqueados.", + "domain_block_modal.title": "¿Bloquear dominio?", + "domain_block_modal.you_will_lose_followers": "Todos tus seguidores de este servidor serán eliminados.", + "domain_block_modal.you_wont_see_posts": "No verás publicaciones ni notificaciones de usuarios en este servidor.", + "domain_pill.activitypub_lets_connect": "Te permite conectar e interactuar con personas no sólo en Mastodon, sino también a través de diferentes aplicaciones sociales.", + "domain_pill.activitypub_like_language": "ActivityPub es como el idioma que Mastodon habla con otras redes sociales.", + "domain_pill.server": "Servidor", + "domain_pill.their_handle": "Su alias:", + "domain_pill.their_server": "Su hogar digital, donde residen todas sus publicaciones.", + "domain_pill.their_username": "Su identificador único en su servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.", + "domain_pill.username": "Nombre de usuario", + "domain_pill.whats_in_a_handle": "¿En qué consiste el alias?", + "domain_pill.who_they_are": "Los alias indican quiénes son y dónde se encuentran, puedes interactuar con personas a través de las redes sociales de .", + "domain_pill.who_you_are": "Los alias indican quién eres y dónde te encuentras, las personas pueden interactuar contigo a través de las redes sociales de .", + "domain_pill.your_handle": "Tu alias:", + "domain_pill.your_server": "Tu hogar digital, donde residen todas tus publicaciones. ¿No te gusta este sitio? Muévete a otro servidor en cualquier momento y llévate a tus seguidores.", + "domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.", "embed.instructions": "Añade este toot a tu sitio web con el siguiente código.", "embed.preview": "Así es como se verá:", "emoji_button.activity": "Actividad", @@ -402,9 +427,15 @@ "loading_indicator.label": "Cargando…", "media_gallery.toggle_visible": "Cambiar visibilidad", "moved_to_account_banner.text": "Tu cuenta {disabledAccount} está actualmente deshabilitada porque te has mudado a {movedToAccount}.", - "mute_modal.duration": "Duración", - "mute_modal.hide_notifications": "Ocultar notificaciones de este usuario?", - "mute_modal.indefinite": "Indefinida", + "mute_modal.hide_from_notifications": "Ocultar de las notificaciones", + "mute_modal.hide_options": "Ocultar opciones", + "mute_modal.indefinite": "Hasta que deje de silenciarlos", + "mute_modal.show_options": "Mostrar opciones", + "mute_modal.they_can_mention_and_follow": "Pueden mencionarte y seguirte, pero no verás nada de ellos.", + "mute_modal.they_wont_know": "No sabrán que han sido silenciados.", + "mute_modal.title": "¿Silenciar usuario?", + "mute_modal.you_wont_see_mentions": "No verás publicaciones que los mencionen.", + "mute_modal.you_wont_see_posts": "Todavía pueden ver tus publicaciones, pero tú no verás las de ellos.", "navigation_bar.about": "Acerca de", "navigation_bar.advanced_interface": "Abrir en interfaz web avanzada", "navigation_bar.blocks": "Usuarios bloqueados", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 5ba7179cba..728f4d05fc 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -89,6 +89,14 @@ "announcement.announcement": "Anuncio", "attachments_list.unprocessed": "(sin procesar)", "audio.hide": "Ocultar audio", + "block_modal.remote_users_caveat": "Le pediremos al servidor {domain} que respete tu decisión. Sin embargo, el cumplimiento no está garantizado, ya que algunos servidores pueden manejar bloqueos de forma distinta. Los mensajes públicos pueden ser todavía visibles para los usuarios que no hayan iniciado sesión.", + "block_modal.show_less": "Mostrar menos", + "block_modal.show_more": "Mostrar más", + "block_modal.they_cant_mention": "No pueden mencionarte ni seguirte.", + "block_modal.they_cant_see_posts": "No pueden ver tus publicaciones y tú no verás las suyas.", + "block_modal.they_will_know": "Pueden ver que están bloqueados.", + "block_modal.title": "¿Bloquear usuario?", + "block_modal.you_wont_see_mentions": "No verás mensajes que los mencionen.", "boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez", "bundle_column_error.copy_stacktrace": "Copiar informe de error", "bundle_column_error.error.body": "La página solicitada no pudo ser renderizada. Podría deberse a un error en nuestro código o a un problema de compatibilidad con el navegador.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Añadir advertencia de contenido", "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "confirmation_modal.cancel": "Cancelar", - "confirmations.block.block_and_report": "Bloquear y Reportar", "confirmations.block.confirm": "Bloquear", - "confirmations.block.message": "¿Estás seguro de que quieres bloquear a {name}?", "confirmations.cancel_follow_request.confirm": "Retirar solicitud", "confirmations.cancel_follow_request.message": "¿Estás seguro de que deseas retirar tu solicitud para seguir a {name}?", "confirmations.delete.confirm": "Eliminar", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo audiovisual, ¿descartarlos de todos modos?", - "confirmations.domain_block.confirm": "Bloquear todo el dominio", + "confirmations.domain_block.confirm": "Bloquear servidor", "confirmations.domain_block.message": "¿Seguro que quieres bloquear todo el dominio {domain}? En general, unos cuantos bloqueos y silenciados concretos es suficiente y preferible. No verás contenido del dominio en ninguna cronología pública ni en tus notificaciones. Se eliminarán tus seguidores procedentes de ese dominio.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar ahora reemplazará el mensaje que estás escribiendo. ¿Seguro que quieres proceder?", "confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.message": "¿Seguro que quieres cerrar la sesión?", "confirmations.mute.confirm": "Silenciar", - "confirmations.mute.explanation": "Esto esconderá sus publicaciones y las publicaciones que los mencionen, pero podrán seguir viendo tus mensajes y seguirte.", - "confirmations.mute.message": "¿Seguro que quieres silenciar a {name}?", "confirmations.redraft.confirm": "Borrar y volver a borrador", "confirmations.redraft.message": "¿Estás seguro de querer borrar esta publicación y reescribirla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán sin contexto.", "confirmations.reply.confirm": "Responder", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Estas son las publicaciones que están ganando popularidad en la web social hoy. Las publicaciones recientes con más impulsos y favoritos obtienen más exposición.", "dismissable_banner.explore_tags": "Estas son las etiquetas que están ganando popularidad hoy en la red. Etiquetas que se usan por personas diferentes se puntúan más alto.", "dismissable_banner.public_timeline": "Estas son las publicaciones más recientes de personas en el Fediverso que siguen las personas de {domain}.", + "domain_block_modal.block": "Bloquear servidor", + "domain_block_modal.block_account_instead": "Bloquear @{name} en su lugar", + "domain_block_modal.they_can_interact_with_old_posts": "Las personas de este servidor pueden interactuar con tus publicaciones antiguas.", + "domain_block_modal.they_cant_follow": "Nadie de este servidor puede seguirte.", + "domain_block_modal.they_wont_know": "No sabrán que han sido bloqueados.", + "domain_block_modal.title": "¿Bloquear dominio?", + "domain_block_modal.you_will_lose_followers": "Se eliminarán todos tus seguidores de este servidor.", + "domain_block_modal.you_wont_see_posts": "No verás mensajes ni notificaciones de usuarios en este servidor.", + "domain_pill.activitypub_lets_connect": "Te permite conectar e interactuar con personas no sólo en Mastodon, sino también a través de diferentes aplicaciones sociales.", + "domain_pill.activitypub_like_language": "ActivityPub es como el idioma que Mastodon habla con otras redes sociales.", + "domain_pill.server": "Servidor", + "domain_pill.their_handle": "Su alias:", + "domain_pill.their_server": "Su hogar digital, donde residen todas sus publicaciones.", + "domain_pill.their_username": "Su identificador único en su servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.", + "domain_pill.username": "Nombre de usuario", + "domain_pill.whats_in_a_handle": "¿En qué consiste el alias?", + "domain_pill.who_they_are": "Los alias indican quiénes son y dónde se encuentran, y gracias a ellos puedes interactuar con personas a través de las redes sociales compatibles con .", + "domain_pill.who_you_are": "Los alias indican quién eres y dónde te encuentras, y gracias a ellos puedes interactuar con personas a través de las redes sociales compatibles con .", + "domain_pill.your_handle": "Tu alias:", + "domain_pill.your_server": "Tu hogar digital, donde residen todas tus publicaciones. ¿No te gusta este sitio? Muévete a otro servidor en cualquier momento y llévate a tus seguidores.", + "domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.", "embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.", "embed.preview": "Así es como se verá:", "emoji_button.activity": "Actividad", @@ -402,9 +427,15 @@ "loading_indicator.label": "Cargando…", "media_gallery.toggle_visible": "Cambiar visibilidad", "moved_to_account_banner.text": "Tu cuenta {disabledAccount} está actualmente deshabilitada porque te has mudado a {movedToAccount}.", - "mute_modal.duration": "Duración", - "mute_modal.hide_notifications": "¿Ocultar notificaciones de este usuario?", - "mute_modal.indefinite": "Indefinida", + "mute_modal.hide_from_notifications": "Ocultar de las notificaciones", + "mute_modal.hide_options": "Ocultar opciones", + "mute_modal.indefinite": "Hasta que deje de silenciarlos", + "mute_modal.show_options": "Mostrar opciones", + "mute_modal.they_can_mention_and_follow": "Pueden mencionarte y seguirte, pero no verás nada de ellos.", + "mute_modal.they_wont_know": "No sabrán que han sido silenciados.", + "mute_modal.title": "¿Silenciar usuario?", + "mute_modal.you_wont_see_mentions": "No verás mensajes que los mencionen.", + "mute_modal.you_wont_see_posts": "Todavía pueden ver tus publicaciones, pero tú no verás las suyas.", "navigation_bar.about": "Acerca de", "navigation_bar.advanced_interface": "Abrir en la interfaz web avanzada", "navigation_bar.blocks": "Usuarios bloqueados", @@ -483,7 +514,7 @@ "notifications.policy.filter_not_followers_title": "Personas que no te siguen", "notifications.policy.filter_not_following_hint": "Hasta que las apruebes manualmente", "notifications.policy.filter_not_following_title": "Personas que no sigues", - "notifications.policy.filter_private_mentions_hint": "Filtrada, a menos que sea en respuesta a tu propia mención, o si sigues al remitente", + "notifications.policy.filter_private_mentions_hint": "Filtradas a menos que sea en respuesta a tu propia mención, o si sigues al remitente", "notifications.policy.filter_private_mentions_title": "Menciones privadas no solicitadas", "notifications.policy.title": "Filtrar notificaciones de…", "notifications_permission_banner.enable": "Habilitar notificaciones de escritorio", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 69c59f101a..f617ced6ea 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -89,6 +89,10 @@ "announcement.announcement": "Teadaanne", "attachments_list.unprocessed": "(töötlemata)", "audio.hide": "Peida audio", + "block_modal.remote_users_caveat": "Serverile {domain} edastatakse palve otsust järgida. Ometi pole see tagatud, kuna mõned serverid võivad blokeeringuid käsitleda omal moel. Avalikud postitused võivad tuvastamata kasutajatele endiselt näha olla.", + "block_modal.show_less": "Kuva vähem", + "block_modal.show_more": "Kuva rohkem", + "block_modal.title": "Blokeeri kasutaja?", "boost_modal.combo": "Vajutades {combo}, saab selle edaspidi vahele jätta", "bundle_column_error.copy_stacktrace": "Kopeeri veateade", "bundle_column_error.error.body": "Soovitud lehte ei õnnestunud esitada. See võib olla meie koodiviga või probleem brauseri ühilduvusega.", @@ -160,9 +164,7 @@ "compose_form.spoiler.unmarked": "Märgi sisu tundlikuks", "compose_form.spoiler_placeholder": "Sisuhoiatus (valikuline)", "confirmation_modal.cancel": "Katkesta", - "confirmations.block.block_and_report": "Blokeeri ja teata", "confirmations.block.confirm": "Blokeeri", - "confirmations.block.message": "Oled kindel, et soovid blokeerida {name}?", "confirmations.cancel_follow_request.confirm": "Tühista taotlus", "confirmations.cancel_follow_request.message": "Oled kindel, et soovid kasutaja {name} jälgimistaotluse tagasi võtta?", "confirmations.delete.confirm": "Kustuta", @@ -171,15 +173,13 @@ "confirmations.delete_list.message": "Oled kindel, et soovid selle loetelu pöördumatult kustutada?", "confirmations.discard_edit_media.confirm": "Hülga", "confirmations.discard_edit_media.message": "Sul on salvestamata muudatusi meediakirjelduses või eelvaates, kas hülgad need?", - "confirmations.domain_block.confirm": "Peida terve domeen", + "confirmations.domain_block.confirm": "Blokeeri server", "confirmations.domain_block.message": "Oled ikka päris-päris kindel, et soovid blokeerida terve {domain}? Enamikel juhtudel piisab mõnest sihitud blokist või vaigistusest, mis on eelistatavam. Sa ei näe selle domeeni sisu ühelgi avalikul ajajoonel või enda teadetes. Su jälgijad sellest domeenist eemaldatakse.", "confirmations.edit.confirm": "Muuda", "confirmations.edit.message": "Muutes praegu kirjutatakse hetkel loodav sõnum üle. Kas oled kindel, et soovid jätkata?", "confirmations.logout.confirm": "Välju", "confirmations.logout.message": "Kas oled kindel, et soovid välja logida?", "confirmations.mute.confirm": "Vaigista", - "confirmations.mute.explanation": "See peidab tema postitused ning postitused, milles teda mainitakse, kuid lubab tal ikkagi sinu postitusi näha ning sind jälgida.", - "confirmations.mute.message": "Oled kindel, et soovid {name} vaigistada?", "confirmations.redraft.confirm": "Kustuta & taasalusta", "confirmations.redraft.message": "Kindel, et soovid postituse kustutada ja võtta uue aluseks? Lemmikuks märkimised ja jagamised lähevad kaotsi ning vastused jäävad ilma algse postituseta.", "confirmations.reply.confirm": "Vasta", @@ -205,6 +205,9 @@ "dismissable_banner.explore_statuses": "Need postitused üle sotsiaalse võrgu koguvad praegu tähelepanu. Uued postitused, millel on rohkem jagamisi ja lemmikuks märkimisi, on kõrgemal kohal.", "dismissable_banner.explore_tags": "Need sildid siit ja teistes serveritest detsentraliseeritud võrgus koguvad tähelepanu just praegu selles serveris.", "dismissable_banner.public_timeline": "Need on kõige uuemad avalikud postitused inimestelt sotsiaalvõrgustikus, mida {domain} inimesed jälgivad.", + "domain_block_modal.block": "Blokeeri server", + "domain_pill.server": "Server", + "domain_pill.username": "Kasutajanimi", "embed.instructions": "Lisa see postitus oma veebilehele, kopeerides alloleva koodi.", "embed.preview": "Nii näeb see välja:", "emoji_button.activity": "Tegevus", @@ -400,9 +403,8 @@ "loading_indicator.label": "Laadimine…", "media_gallery.toggle_visible": "{number, plural, one {Varja pilt} other {Varja pildid}}", "moved_to_account_banner.text": "Kontot {disabledAccount} ei ole praegu võimalik kasutada, sest kolisid kontole {movedToAccount}.", - "mute_modal.duration": "Kestus", - "mute_modal.hide_notifications": "Kas peita teated sellelt kasutajalt?", - "mute_modal.indefinite": "Lõpmatu", + "mute_modal.hide_options": "Peida valikud", + "mute_modal.show_options": "Kuva valikud", "navigation_bar.about": "Teave", "navigation_bar.advanced_interface": "Ava kohandatud veebiliides", "navigation_bar.blocks": "Blokeeritud kasutajad", @@ -440,6 +442,8 @@ "notification.reblog": "{name} jagas edasi postitust", "notification.status": "{name} just postitas", "notification.update": "{name} muutis postitust", + "notification_requests.accept": "Nõus", + "notification_requests.dismiss": "Hülga", "notifications.clear": "Puhasta teated", "notifications.clear_confirmation": "Oled kindel, et soovid püsivalt kõik oma teated eemaldada?", "notifications.column_settings.admin.report": "Uued teavitused:", @@ -471,6 +475,7 @@ "notifications.permission_denied": "Töölauamärguanded pole saadaval, kuna eelnevalt keelduti lehitsejale teavituste luba andmast", "notifications.permission_denied_alert": "Töölaua märguandeid ei saa lubada, kuna brauseri luba on varem keeldutud", "notifications.permission_required": "Töölaua märguanded ei ole saadaval, kuna vajalik luba pole antud.", + "notifications.policy.filter_new_accounts_title": "Uued kontod", "notifications_permission_banner.enable": "Luba töölaua märguanded", "notifications_permission_banner.how_to_control": "Et saada teateid, ajal mil Mastodon pole avatud, luba töölauamärguanded. Saad täpselt määrata, mis tüüpi tegevused tekitavad märguandeid, kasutates peale teadaannete sisse lülitamist üleval olevat nuppu {icon}.", "notifications_permission_banner.title": "Ära jää millestki ilma", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 90b691ceb6..aae678a7d6 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -89,6 +89,14 @@ "announcement.announcement": "Iragarpena", "attachments_list.unprocessed": "(prozesatu gabe)", "audio.hide": "Ezkutatu audioa", + "block_modal.remote_users_caveat": "{domain} zerbitzariari zure erabakia errespeta dezan eskatuko diogu. Halere, araua beteko den ezin da bermatu, zerbitzari batzuk modu desberdinean kudeatzen baitituzte blokeoak. Baliteke argitalpen publikoak saioa hasi ez duten erabiltzaileentzat ikusgai egotea.", + "block_modal.show_less": "Erakutsi gutxiago", + "block_modal.show_more": "Erakutsi gehiago", + "block_modal.they_cant_mention": "Ezin zaitu aipatu ezta jarraitu ere.", + "block_modal.they_cant_see_posts": "Ezin ditu zure bidalketak ikusi eta zuk ez dituzu bereak ikusiko.", + "block_modal.they_will_know": "Ezin du ikusi blokeatuta duzunik.", + "block_modal.title": "Erabiltzailea blokeatu nahi duzu?", + "block_modal.you_wont_see_mentions": "Ez duzu ikusiko bera aipatzen duen argitalpenik.", "boost_modal.combo": "{combo} sakatu dezakezu hurrengoan hau saltatzeko", "bundle_column_error.copy_stacktrace": "Kopiatu errore-txostena", "bundle_column_error.error.body": "Eskatutako orria ezin izan da bistaratu. Kodeko errore bategatik izan daiteke edo nabigatzailearen bateragarritasun arazo bategatik.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Testua ez dago ezkutatuta", "compose_form.spoiler_placeholder": "Edukiaren abisua (aukerakoa)", "confirmation_modal.cancel": "Utzi", - "confirmations.block.block_and_report": "Blokeatu eta salatu", "confirmations.block.confirm": "Blokeatu", - "confirmations.block.message": "Ziur {name} blokeatu nahi duzula?", "confirmations.cancel_follow_request.confirm": "Baztertu eskaera", "confirmations.cancel_follow_request.message": "Ziur {name} jarraitzeko eskaera bertan behera utzi nahi duzula?", "confirmations.delete.confirm": "Ezabatu", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Ziur behin betiko ezabatu nahi duzula zerrenda hau?", "confirmations.discard_edit_media.confirm": "Baztertu", "confirmations.discard_edit_media.message": "Multimediaren deskribapen edo aurrebistan gorde gabeko aldaketak daude, baztertu nahi dituzu?", - "confirmations.domain_block.confirm": "Ezkutatu domeinu osoa", + "confirmations.domain_block.confirm": "Blokeatu zerbitzaria", "confirmations.domain_block.message": "Ziur, erabat ziur, {domain} domeinu osoa blokeatu nahi duzula? Gehienetan gutxi batzuk blokeatu edo mututzearekin nahikoa da. Ez duzu domeinu horretako edukirik ikusiko denbora lerroetan edo jakinarazpenetan. Domeinu horretako zure jarraitzaileak kenduko dira ere.", "confirmations.edit.confirm": "Editatu", "confirmations.edit.message": "Orain editatzen baduzu, une honetan idazten ari zaren mezua gainidatziko da. Ziur jarraitu nahi duzula?", "confirmations.logout.confirm": "Amaitu saioa", "confirmations.logout.message": "Ziur saioa amaitu nahi duzula?", "confirmations.mute.confirm": "Mututu", - "confirmations.mute.explanation": "Honek horko bidalketak eta aipamena egiten dietenak ezkutatuko ditu, baina beraiek zure bidalketak ikusi ahal izango dituzte eta zuri jarraitu.", - "confirmations.mute.message": "Ziur {name} mututu nahi duzula?", "confirmations.redraft.confirm": "Ezabatu eta berridatzi", "confirmations.redraft.message": "Ziur argitalpen hau ezabatu eta zirriborroa berriro egitea nahi duzula? Gogokoak eta bultzadak galduko dira, eta jatorrizko argitalpenaren erantzunak zurtz geratuko dira.", "confirmations.reply.confirm": "Erantzun", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Hauek dira gaur egun lekua hartzen ari diren sare sozial osoaren argitalpenak. Bultzada eta gogoko gehien dituzten argitalpen berrienek sailkapen altuagoa dute.", "dismissable_banner.explore_tags": "Traola hauek daude bogan orain zerbitzari honetan eta sare deszentralizatuko besteetan.", "dismissable_banner.public_timeline": "Hauek dira {domain}-(e)ko jendeak web sozialean jarraitzen dituen jendearen azkeneko argitalpen publikoak.", + "domain_block_modal.block": "Blokeatu zerbitzaria", + "domain_block_modal.block_account_instead": "Blokeatu @{name} bestela", + "domain_block_modal.they_can_interact_with_old_posts": "Zerbitzari honetako jendea zure argitalpen zaharrekin elkarreragin dezake.", + "domain_block_modal.they_cant_follow": "Zerbitzari honetako inork ezin zaitu jarraitu.", + "domain_block_modal.they_wont_know": "Ez dute jakingo blokeatuak izan direnik.", + "domain_block_modal.title": "Domeinua blokeatu nahi duzu?", + "domain_block_modal.you_will_lose_followers": "Zerbitzari honetako jarraitzaile guztiak kenduko dira.", + "domain_block_modal.you_wont_see_posts": "Ez dituzu zerbitzari honetako erabiltzaileen argitalpenik edota jakinarazpenik ikusiko.", + "domain_pill.activitypub_lets_connect": "Mastodon-en ez ezik, beste sare sozialen aplikazioetako jendearekin konektatzea eta harremanetan jartzea uzten dizu.", + "domain_pill.activitypub_like_language": "ActivityPub, Mastodon-ek beste sare sozialekin hitz egiteko erabiltzen duen hizkuntza bezalakoxea da.", + "domain_pill.server": "Zerbitzaria", + "domain_pill.their_handle": "Bere helbidea:", + "domain_pill.their_server": "Bere etxe digitala, non bere argitalpenak dauden.", + "domain_pill.their_username": "Zerbitzarian duen identifikatzaile bakarra. Baliteke erabiltzaile-izen bera duten erabiltzaileak zerbitzari desberdinetan aurkitzea.", + "domain_pill.username": "Erabiltzaile-izena", + "domain_pill.whats_in_a_handle": "Zer dago helbide batean?", + "domain_pill.who_they_are": "Helbideek norbait nor den eta non dagoen adierazten dute, sare sozialeko jendearekin jar zaitezke harremanetan.", + "domain_pill.who_you_are": "Zure helbideak nor zaren eta non zauden adierazten duenez, jendea sare sozialen bitartez jar daiteke zurekin harremanetan.", + "domain_pill.your_handle": "Zure helbidea:", + "domain_pill.your_server": "Zure etxe digitala, non zure bidalketak dauden. Ez al zaizu gustatzen? Transferitu zerbitzariak edonoiz eta ekarri zure jarraitzaileak ere.", + "domain_pill.your_username": "Zerbitzarian duzun identifikatzaile bakarra. Baliteke erabiltzaile-izen bera duten erabiltzaileak zerbitzari desberdinetan aurkitzea.", "embed.instructions": "Txertatu bidalketa hau zure webgunean beheko kodea kopiatuz.", "embed.preview": "Hau da izango duen itxura:", "emoji_button.activity": "Jarduera", @@ -402,9 +427,15 @@ "loading_indicator.label": "Kargatzen…", "media_gallery.toggle_visible": "Txandakatu ikusgaitasuna", "moved_to_account_banner.text": "Zure {disabledAccount} kontua desgaituta dago une honetan, {movedToAccount} kontura aldatu zinelako.", - "mute_modal.duration": "Iraupena", - "mute_modal.hide_notifications": "Ezkutatu erabiltzaile honen jakinarazpenak?", - "mute_modal.indefinite": "Zehaztu gabe", + "mute_modal.hide_from_notifications": "Ezkutatu jakinarazpenetatik", + "mute_modal.hide_options": "Ezkutatu aukerak", + "mute_modal.indefinite": "Desmututua izan arte", + "mute_modal.show_options": "Erakutsi aukerak", + "mute_modal.they_can_mention_and_follow": "Aipa eta jarrai zaitzakete, baina ez dituzu ikusiko.", + "mute_modal.they_wont_know": "Ez dute jakingo mututuak izan direnik.", + "mute_modal.title": "Erabiltzailea mututu nahi duzu?", + "mute_modal.you_wont_see_mentions": "Ez duzu ikusiko bera aipatzen duen argitalpenik.", + "mute_modal.you_wont_see_posts": "Zure argitalpenak ikus ditzake, baina ez dituzu bereak ikusiko.", "navigation_bar.about": "Honi buruz", "navigation_bar.advanced_interface": "Ireki web interfaze aurreratuan", "navigation_bar.blocks": "Blokeatutako erabiltzaileak", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index aaa01a5dc7..b784a1d5c0 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "افزودن هشدار محتوا", "compose_form.spoiler_placeholder": "هشدار محتوا (اختیاری)", "confirmation_modal.cancel": "لغو", - "confirmations.block.block_and_report": "انسداد و گزارش", "confirmations.block.confirm": "انسداد", - "confirmations.block.message": "مطمئنید که می‌خواهید {name} را مسدود کنید؟", "confirmations.cancel_follow_request.confirm": "رد کردن درخواست", "confirmations.cancel_follow_request.message": "مطمئنید که می خواهید درخواست پی‌گیری {name} را لغو کنید؟", "confirmations.delete.confirm": "حذف", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "مطمئنید می‌خواهید این سیاهه را برای همیشه حذف کنید؟", "confirmations.discard_edit_media.confirm": "دور انداختن", "confirmations.discard_edit_media.message": "تغییرات ذخیره نشده‌ای در توضیحات یا پیش‌نمایش رسانه دارید. همگی نادیده گرفته شوند؟", - "confirmations.domain_block.confirm": "انسداد تمام دامنه", "confirmations.domain_block.message": "آیا جدی جدی می‌خواهید تمام دامنهٔ {domain} را مسدود کنید؟ در بیشتر موارد مسدود کردن یا خموشاندن چند حساب خاص کافی است و توصیه می‌شود. پس از این کار شما هیچ محتوایی را از این دامنه در خط زمانی عمومی یا آگاهی‌هایتان نخواهید دید. پی‌گیرانتان از این دامنه هم برداشته خواهند شد.", "confirmations.edit.confirm": "ویرایش", "confirmations.edit.message": "در صورت ویرایش، پیامی که در حال نوشتنش بودید از بین خواهد رفت. می‌خواهید ادامه دهید؟", "confirmations.logout.confirm": "خروج از حساب", "confirmations.logout.message": "مطمئنید می‌خواهید خارج شوید؟", "confirmations.mute.confirm": "خموش", - "confirmations.mute.explanation": "این کار فرسته‌های آن‌ها و فرسته‌هایی را که از آن‌ها نام برده پنهان می‌کند، ولی آن‌ها همچنان اجازه دارند فرسته‌های شما را ببینند و شما را پی‌گیری کنند.", - "confirmations.mute.message": "مطمئنید می‌خواهید {name} را بخموشانید؟", "confirmations.redraft.confirm": "حذف و بازنویسی", "confirmations.redraft.message": "مطمئنید که می‌خواهید این فرسته را حذف کنید و از نو بنویسید؟ با این کار تقویت‌ها و پسندهایش از دست رفته و پاسخ‌ها به آن بی‌مرجع می‌شود.", "confirmations.reply.confirm": "پاسخ", @@ -399,9 +394,6 @@ "loading_indicator.label": "در حال بارگذاری…", "media_gallery.toggle_visible": "{number, plural, one {نهفتن تصویر} other {نهفتن تصاویر}}", "moved_to_account_banner.text": "حسابتان {disabledAccount} اکنون از کار افتاده؛ چرا که به {movedToAccount} منتقل شدید.", - "mute_modal.duration": "مدت زمان", - "mute_modal.hide_notifications": "نهفتن آگاهی‌ها از این کاربر؟", - "mute_modal.indefinite": "نامعلوم", "navigation_bar.about": "درباره", "navigation_bar.advanced_interface": "بازکردن در رابط کاربری وب پیشرفته", "navigation_bar.blocks": "کاربران مسدود شده", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 703992a0e7..bb5370b6d7 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -89,6 +89,14 @@ "announcement.announcement": "Tiedote", "attachments_list.unprocessed": "(käsittelemätön)", "audio.hide": "Piilota ääni", + "block_modal.remote_users_caveat": "Pyydämme palvelinta {domain} kunnioittamaan päätöstäsi. Myötämielisyyttä ei kuitenkaan taata, koska jotkin palvelimet voivat käsitellä estoja eri tavalla. Julkiset julkaisut voivat silti näkyä kirjautumattomille käyttäjille.", + "block_modal.show_less": "Näytä vähemmän", + "block_modal.show_more": "Näytä enemmän", + "block_modal.they_cant_mention": "Hän ei voi enää mainita eikä seurata sinua.", + "block_modal.they_cant_see_posts": "Hän ei voi enää nähdä julkaisujasi, etkä sinä voi nähdä hänen.", + "block_modal.they_will_know": "Hän voi nähdä, että hänet on estetty.", + "block_modal.title": "Estetäänkö käyttäjä?", + "block_modal.you_wont_see_mentions": "Et enää näe hänen julkaisujaan etkä voi seurata häntä.", "boost_modal.combo": "Ensi kerralla voit ohittaa tämän painamalla {combo}", "bundle_column_error.copy_stacktrace": "Kopioi virheraportti", "bundle_column_error.error.body": "Pyydettyä sivua ei voitu hahmontaa. Se voi johtua virheestä koodissamme tai selaimen yhteensopivuudessa.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Lisää sisältövaroitus", "compose_form.spoiler_placeholder": "Sisältövaroitus (valinnainen)", "confirmation_modal.cancel": "Peruuta", - "confirmations.block.block_and_report": "Estä ja raportoi", "confirmations.block.confirm": "Estä", - "confirmations.block.message": "Haluatko varmasti estää käyttäjän {name}?", "confirmations.cancel_follow_request.confirm": "Peruuta pyyntö", "confirmations.cancel_follow_request.message": "Haluatko varmasti perua pyyntösi seurata käyttäjätiliä {name}?", "confirmations.delete.confirm": "Poista", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Haluatko varmasti poistaa tämän listan pysyvästi?", "confirmations.discard_edit_media.confirm": "Hylkää", "confirmations.discard_edit_media.message": "Sinulla on tallentamattomia muutoksia median kuvaukseen tai esikatseluun. Hylätäänkö ne silti?", - "confirmations.domain_block.confirm": "Estä koko verkkotunnus", + "confirmations.domain_block.confirm": "Estä palvelin", "confirmations.domain_block.message": "Haluatko aivan varmasti estää koko verkkotunnuksen {domain}? Useimmiten muutama kohdistettu esto tai mykistys on riittävä ja suositeltava toimi. Et näe sisältöä tästä verkkotunnuksesta millään julkisilla aikajanoilla tai ilmoituksissa. Tähän verkkotunnukseen kuuluvat seuraajasi poistetaan.", "confirmations.edit.confirm": "Muokkaa", "confirmations.edit.message": "Jos muokkaat viestiä nyt, se korvaa parhaillaan työstämäsi viestin. Haluatko varmasti jatkaa?", "confirmations.logout.confirm": "Kirjaudu ulos", "confirmations.logout.message": "Haluatko varmasti kirjautua ulos?", "confirmations.mute.confirm": "Mykistä", - "confirmations.mute.explanation": "Tämä toiminto piilottaa heidän julkaisunsa sinulta – mukaan lukien ne, joissa heidät mainitaan – sallien heidän yhä nähdä julkaisusi ja seurata sinua.", - "confirmations.mute.message": "Haluatko varmasti mykistää käyttäjän {name}?", "confirmations.redraft.confirm": "Poista ja palauta muokattavaksi", "confirmations.redraft.message": "Haluatko varmasti poistaa julkaisun ja tehdä siitä luonnoksen? Suosikit ja tehostukset menetetään, ja alkuperäisen julkaisun vastaukset jäävät orvoiksi.", "confirmations.reply.confirm": "Vastaa", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Nämä sosiaalisen verkon julkaisut keräävät tänään eniten huomiota. Uusimmat, tehostetuimmat ja suosikeiksi lisätyimmät julkaisut nousevat listauksessa korkeammalle.", "dismissable_banner.explore_tags": "Nämä sosiaalisen verkon aihetunnisteet keräävät tänään eniten huomiota. Useimman käyttäjän käyttämät aihetunnisteet nousevat listauksessa korkeammalle.", "dismissable_banner.public_timeline": "Nämä ovat viimeisimpiä julkaisuja sosiaalisen verkon käyttäjiltä, joita seurataan palvelimella {domain}.", + "domain_block_modal.block": "Estä palvelin", + "domain_block_modal.block_account_instead": "Estä sen sijaan @{name}", + "domain_block_modal.they_can_interact_with_old_posts": "Ihmiset tältä palvelimelta eivät voi olla vuorovaikutuksessa vanhojen julkaisujesi kanssa.", + "domain_block_modal.they_cant_follow": "Kukaan tältä palvelimelta ei voi seurata sinua.", + "domain_block_modal.they_wont_know": "Hän ei saa tietää, että hänet on estetty.", + "domain_block_modal.title": "Estetäänkö verkkotunnus?", + "domain_block_modal.you_will_lose_followers": "Kaikki seuraajasi tältä palvelimelta poistetaan.", + "domain_block_modal.you_wont_see_posts": "Et enää näe julkaisuja etkä ilmoituksia tämän palvelimen käyttäjiltä.", + "domain_pill.activitypub_lets_connect": "Sen avulla voit muodostaa yhteyden ja olla vuorovaikutuksessa ihmisten kanssa, ei vain Mastodonissa vaan myös muissa sosiaalisissa sovelluksissa.", + "domain_pill.activitypub_like_language": "ActivityPub on kuin kieli, jota Mastodon puhuu muiden sosiaalisten verkostojen kanssa.", + "domain_pill.server": "Palvelin", + "domain_pill.their_handle": "Hänen käyttäjänimensä:", + "domain_pill.their_server": "Hänen digitaalinen kotinsa, jossa kaikki hänen julkaisunsa sijaitsevat.", + "domain_pill.their_username": "Hänen yksilöllinen tunnisteensa omalla palvelimellaan. Eri palvelimilta on mahdollista löytää käyttäjiä, joilla on sama käyttäjänimi.", + "domain_pill.username": "Käyttäjänimi", + "domain_pill.whats_in_a_handle": "Mitä käyttäjänimessä on?", + "domain_pill.who_they_are": "Koska käyttäjätunnukset kertovat, kuka ja missä joku on, voit olla vuorovaikutuksessa ihmisten kanssa läpi sosiaalisen verkon, joka koostuu .", + "domain_pill.who_you_are": "Koska käyttäjätunnuksesi kertoo, kuka ja missä olet, ihmiset voivat olla vaikutuksessa kanssasi läpi sosiaalisen verkon, joka koostuu .", + "domain_pill.your_handle": "Käyttäjänimesi:", + "domain_pill.your_server": "Digitaalinen kotisi, jossa kaikki julkaisusi sijaitsevat. Etkö pidä tästä? Siirry palvelimelta toiselle milloin tahansa ja tuo myös seuraajasi mukanasi.", + "domain_pill.your_username": "Yksilöllinen tunnisteesi tällä palvelimella. Eri palvelimilta on mahdollista löytää käyttäjiä, joilla on sama käyttäjänimi.", "embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.", "embed.preview": "Tältä se näyttää:", "emoji_button.activity": "Aktiviteetit", @@ -272,7 +297,7 @@ "filter_modal.select_filter.subtitle": "Käytä olemassa olevaa luokkaa tai luo uusi", "filter_modal.select_filter.title": "Suodata tämä julkaisu", "filter_modal.title.status": "Suodata julkaisu", - "filtered_notifications_banner.pending_requests": "Ilmoitukset, {count, plural, =0 {ei tänään} one {1 henkilö} other {# henkilöä}}", + "filtered_notifications_banner.pending_requests": "Ilmoitukset {count, plural, =0 {ei keltään} one {yhdeltä henkilöltä} other {# henkilöltä}}, jonka saatat tuntea", "filtered_notifications_banner.title": "Suodatetut ilmoitukset", "firehose.all": "Kaikki", "firehose.local": "Tämä palvelin", @@ -402,9 +427,15 @@ "loading_indicator.label": "Ladataan…", "media_gallery.toggle_visible": "{number, plural, one {Piilota kuva} other {Piilota kuvat}}", "moved_to_account_banner.text": "Tilisi {disabledAccount} on tällä hetkellä poissa käytöstä, koska teit siirron tiliin {movedToAccount}.", - "mute_modal.duration": "Kesto", - "mute_modal.hide_notifications": "Piilotetaanko tältä käyttäjältä tulevat ilmoitukset?", - "mute_modal.indefinite": "Ikuisesti", + "mute_modal.hide_from_notifications": "Piilota ilmoituksista", + "mute_modal.hide_options": "Piilota valinnat", + "mute_modal.indefinite": "Kunnes poistan mykistyksen häneltä", + "mute_modal.show_options": "Näytä valinnat", + "mute_modal.they_can_mention_and_follow": "Hän voi mainita sinut ja seurata sinua, mutta sinä et näe häntä.", + "mute_modal.they_wont_know": "Hän ei saa tietää, että hänet on mykistetty.", + "mute_modal.title": "Mykistetäänkö käyttäjä?", + "mute_modal.you_wont_see_mentions": "Et enää näe julkaisuja, joissa hänet mainitaan.", + "mute_modal.you_wont_see_posts": "Hän voi yhä nähdä julkaisusi, mutta sinä et näe hänen.", "navigation_bar.about": "Tietoja", "navigation_bar.advanced_interface": "Avaa edistyneessä selainkäyttöliittymässä", "navigation_bar.blocks": "Estetyt käyttäjät", diff --git a/app/javascript/mastodon/locales/fil.json b/app/javascript/mastodon/locales/fil.json index 387a65c785..afa0e5fbc2 100644 --- a/app/javascript/mastodon/locales/fil.json +++ b/app/javascript/mastodon/locales/fil.json @@ -106,16 +106,13 @@ "compose_form.reply": "Tumugon", "compose_form.spoiler.unmarked": "Idagdag ang babala sa nilalaman", "confirmation_modal.cancel": "Pagpaliban", - "confirmations.block.block_and_report": "Harangan at i-ulat", "confirmations.block.confirm": "Harangan", - "confirmations.block.message": "Sigurado ka bang gusto mong harangan si {name}?", "confirmations.cancel_follow_request.confirm": "Bawiin ang kahilingan", "confirmations.cancel_follow_request.message": "Sigurdo ka bang gusto mong bawiin ang kahilingang sundan si/ang {name}?", "confirmations.delete.message": "Sigurado ka bang gusto mong burahin ang post na ito?", "confirmations.delete_list.confirm": "Tanggalin", "confirmations.delete_list.message": "Sigurado ka bang gusto mong burahin ang listahang ito?", "confirmations.discard_edit_media.confirm": "Ipagpaliban", - "confirmations.domain_block.confirm": "Harangan ang buong domain", "confirmations.edit.confirm": "Baguhin", "confirmations.reply.confirm": "Tumugon", "copy_icon_button.copied": "Sinipi sa clipboard", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 53677e2383..c3e3f8cc1a 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -89,6 +89,14 @@ "announcement.announcement": "Kunngerð", "attachments_list.unprocessed": "(óviðgjørt)", "audio.hide": "Fjal ljóð", + "block_modal.remote_users_caveat": "Vit biðja ambætaran {domain} virða tína avgerð. Kortini er eingin vissa um samsvar, av tí at fleiri ambætarar handfara blokkar ymiskt. Almennir postar kunnu framvegis vera sjónligir fyri brúkarar, sum ikki eru innritaðir.", + "block_modal.show_less": "Vís minni", + "block_modal.show_more": "Vís meiri", + "block_modal.they_cant_mention": "Tey kunnu hvørki nevna teg ella fylgja tær.", + "block_modal.they_cant_see_posts": "Tey síggja ikki tínar postar og tú sært ikki teirra.", + "block_modal.they_will_know": "Tey síggja, at tey eru bannað.", + "block_modal.title": "Banna brúkara?", + "block_modal.you_wont_see_mentions": "Tú sært ikki postar, sum nevna tey.", "boost_modal.combo": "Tú kanst trýsta á {combo} fyri at loypa uppum hetta næstu ferð", "bundle_column_error.copy_stacktrace": "Avrita feilfráboðan", "bundle_column_error.error.body": "Umbidna síðan kann ikki vísast. Tað kann vera orsakað av einum feili í koduni hjá okkum ella tað kann vera orsakað av kaganum, sum tú brúkar.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Skriva ávaring um innihald", "compose_form.spoiler_placeholder": "Innihaldsávaring (valfrí)", "confirmation_modal.cancel": "Strika", - "confirmations.block.block_and_report": "Banna og melda", "confirmations.block.confirm": "Banna", - "confirmations.block.message": "Ert tú vís/ur í, at tú vilt banna {name}?", "confirmations.cancel_follow_request.confirm": "Tak umbønina aftur", "confirmations.cancel_follow_request.message": "Er tað tilætlað, at tú tekur umbønina at fylgja {name} aftur?", "confirmations.delete.confirm": "Strika", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Ert tú vís/ur í, at tú vilt strika hetta uppslagið?", "confirmations.discard_edit_media.confirm": "Vraka", "confirmations.discard_edit_media.message": "Tú hevur broytingar í miðlalýsingini ella undansýningini, sum ikki eru goymdar. Vilt tú kortini vraka?", - "confirmations.domain_block.confirm": "Banna heilum økisnavni", + "confirmations.domain_block.confirm": "Banna ambætara", "confirmations.domain_block.message": "Ert tú púra, púra vís/ur í, at tú vilt banna øllum {domain}? Í flestu førum er nóg mikið og betri, bert at banna ella doyva onkrum ávísum. Tú fert eingi evni at síggja frá økisnavninum á nakrari almennari tíðarrás ella í tínum fráboðanum. Tínir fylgjarar undir økisnavninum verða eisini strikaðir.", "confirmations.edit.confirm": "Rætta", "confirmations.edit.message": "Rættingar, sum verða gjørdar nú, skriva yvir boðini, sum tú ert í holt við. Ert tú vís/ur í, at tú vilt halda fram?", "confirmations.logout.confirm": "Rita út", "confirmations.logout.message": "Ert tú vís/ur í, at tú vilt útrita teg?", "confirmations.mute.confirm": "Doyv", - "confirmations.mute.explanation": "Henda atgerð fjalir teirra postar og postar, ið nevna tey; men tey kunnu framvegis síggja tínar postar og fylgja tær.", - "confirmations.mute.message": "Ert tú vís/ur í, at tú vilt doyva {name}?", "confirmations.redraft.confirm": "Sletta og skriva umaftur", "confirmations.redraft.message": "Vilt tú veruliga strika hendan postin og í staðin gera hann til eina nýggja kladdu? Yndisfrámerki og framhevjanir blíva burtur, og svar til upprunapostin missa tilknýtið.", "confirmations.reply.confirm": "Svara", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Hesi uppsløg, frá hesum og øðrum ambætarum á miðspjadda netverkinum, hava framgongd á hesum ambætara júst nú. Nýggjari postar, sum fleiri hava framhevja og dáma, verða raðfestir hægri.", "dismissable_banner.explore_tags": "Hesi frámerki vinna í løtuni fótafesti millum fólk á hesum og øðrum ambætarum í desentrala netverkinum beint nú.", "dismissable_banner.public_timeline": "Hetta eru teir nýggjast postarnir frá fólki á sosialu vevinum, sum fólk á {domain} fylgja.", + "domain_block_modal.block": "Banna ambætara", + "domain_block_modal.block_account_instead": "Banna @{name} ístaðin", + "domain_block_modal.they_can_interact_with_old_posts": "Fólk frá hesum ambætara kunnu svara tínum gomlu postum.", + "domain_block_modal.they_cant_follow": "Eingin frá hesum ambætara kann fylgja tær.", + "domain_block_modal.they_wont_know": "Tey vita ikki, at tey eru bannað.", + "domain_block_modal.title": "Banna økisnavni?", + "domain_block_modal.you_will_lose_followers": "Allir tínir fylgjarar á hesum ambætara hvørva.", + "domain_block_modal.you_wont_see_posts": "Tú sært ongar postar ella boð frá brúkarum á hesum ambætara.", + "domain_pill.activitypub_lets_connect": "Tað letur teg fáa samband og samvirka við fólki ikki bara á Mastodon, men á øðrum sosialum appum eisini.", + "domain_pill.activitypub_like_language": "ActivityPub er málið, sum Mastodon tosar við onnur sosial netverk.", + "domain_pill.server": "Ambætari", + "domain_pill.their_handle": "Teirra hald:", + "domain_pill.their_server": "Teirra talgilda heim, har allir teirra postar liva.", + "domain_pill.their_username": "Teirra eyðmerki á teirra ambætara. Tað er møguligt at finna brúkarar við tí sama brúkaranavninum á ymiskum ambætarum.", + "domain_pill.username": "Brúkaranavn", + "domain_pill.whats_in_a_handle": "Hvat er í einum haldi?", + "domain_pill.who_they_are": "Eftirsum at hald siga, hvør onkur er og hvar tey eru, so kanst tú samvirka við fólk á øllum .", + "domain_pill.who_you_are": "Av tí at tíni hald siga, hvør tú er og hvar tú eru, so kunnu onnur samvirka við teg á øllum .", + "domain_pill.your_handle": "Títt hald:", + "domain_pill.your_server": "Títt talgilda heim, har allir tínir postar liva. Dámar tað ikki hendan? Flyt til ein annan ambætara tá tú hevur hug til tess og tak fylgjarar tínar við eisini.", + "domain_pill.your_username": "Títt eyðmerki á hesum ambætaranum. Tað er møguligt at finna brúkarar við tí sama brúkaranavninum á ymiskum ambætarum.", "embed.instructions": "Fell hendan postin inní á tínum vevstaði við at taka avrit av koduni niðanfyri.", "embed.preview": "Soleiðis fer tað at síggja út:", "emoji_button.activity": "Virksemi", @@ -402,9 +427,15 @@ "loading_indicator.label": "Innlesur…", "media_gallery.toggle_visible": "{number, plural, one {Fjal mynd} other {Fjal myndir}}", "moved_to_account_banner.text": "Konta tín {disabledAccount} er í løtuni óvirkin, tí tú flutti til {movedToAccount}.", - "mute_modal.duration": "Tíðarbil", - "mute_modal.hide_notifications": "Fjal fráboðanir frá hesum brúkaranum?", - "mute_modal.indefinite": "Óásett tíðarskeið", + "mute_modal.hide_from_notifications": "Fjal boð", + "mute_modal.hide_options": "Fjal valmøguleikar", + "mute_modal.indefinite": "Inntil eg tendri tey aftur", + "mute_modal.show_options": "Vís valmøguleikar", + "mute_modal.they_can_mention_and_follow": "Tey kunnu bæði nevna og fylgja tær, men tú sært ikki tey.", + "mute_modal.they_wont_know": "Tey vita ikki, at tey eru sløkt.", + "mute_modal.title": "Sløkk brúkara?", + "mute_modal.you_wont_see_mentions": "Tú sært ikki postar, sum nevna tey.", + "mute_modal.you_wont_see_posts": "Tey síggja framvegis tínar postar, men tú sært ikki teirra.", "navigation_bar.about": "Um", "navigation_bar.advanced_interface": "Lat upp í framkomnum vevmarkamóti", "navigation_bar.blocks": "Bannaðir brúkarar", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 6f517fb34e..9549686d7c 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Ajouter un avertissement de contenu", "compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)", "confirmation_modal.cancel": "Annuler", - "confirmations.block.block_and_report": "Bloquer et signaler", "confirmations.block.confirm": "Bloquer", - "confirmations.block.message": "Voulez-vous vraiment bloquer {name}?", "confirmations.cancel_follow_request.confirm": "Retirer cette demande", "confirmations.cancel_follow_request.message": "Êtes-vous sûr de vouloir retirer votre demande pour suivre {name}?", "confirmations.delete.confirm": "Supprimer", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste?", "confirmations.discard_edit_media.confirm": "Rejeter", "confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, voulez-vous quand même les supprimer?", - "confirmations.domain_block.confirm": "Bloquer ce domaine entier", "confirmations.domain_block.message": "Voulez-vous vraiment, vraiment bloquer {domain} en entier? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans vos fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.", "confirmations.edit.confirm": "Éditer", "confirmations.edit.message": "Modifier maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?", "confirmations.logout.confirm": "Se déconnecter", "confirmations.logout.message": "Voulez-vous vraiment vous déconnecter?", "confirmations.mute.confirm": "Masquer", - "confirmations.mute.explanation": "Cela masquera ses publications et celle le/la mentionnant, mais cela lui permettra toujours de voir vos messages et de vous suivre.", - "confirmations.mute.message": "Voulez-vous vraiment masquer {name}?", "confirmations.redraft.confirm": "Supprimer et réécrire", "confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer cette publication pour la réécrire? Ses ses mises en favori et boosts seront perdus et ses réponses seront orphelines.", "confirmations.reply.confirm": "Répondre", @@ -271,6 +266,8 @@ "filter_modal.select_filter.subtitle": "Utilisez une catégorie existante ou en créer une nouvelle", "filter_modal.select_filter.title": "Filtrer cette publication", "filter_modal.title.status": "Filtrer une publication", + "filtered_notifications_banner.pending_requests": "Notifications {count, plural, =0 {de personne} one {d’une personne} other {de # personnes}} que vous pouvez connaitre", + "filtered_notifications_banner.title": "Notifications filtrées", "firehose.all": "Tout", "firehose.local": "Ce serveur", "firehose.remote": "Autres serveurs", @@ -399,9 +396,6 @@ "loading_indicator.label": "Chargement…", "media_gallery.toggle_visible": "{number, plural, one {Cacher l’image} other {Cacher les images}}", "moved_to_account_banner.text": "Votre compte {disabledAccount} est actuellement désactivé parce que vous avez déménagé sur {movedToAccount}.", - "mute_modal.duration": "Durée", - "mute_modal.hide_notifications": "Masquer les notifications de ce compte?", - "mute_modal.indefinite": "Indéfinie", "navigation_bar.about": "À propos", "navigation_bar.advanced_interface": "Ouvrir dans l’interface avancée", "navigation_bar.blocks": "Comptes bloqués", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 81c6719ea5..29b4d56a4f 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Ajouter un avertissement de contenu", "compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)", "confirmation_modal.cancel": "Annuler", - "confirmations.block.block_and_report": "Bloquer et signaler", "confirmations.block.confirm": "Bloquer", - "confirmations.block.message": "Voulez-vous vraiment bloquer {name} ?", "confirmations.cancel_follow_request.confirm": "Retirer la demande", "confirmations.cancel_follow_request.message": "Êtes-vous sûr de vouloir retirer votre demande pour suivre {name} ?", "confirmations.delete.confirm": "Supprimer", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste ?", "confirmations.discard_edit_media.confirm": "Rejeter", "confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, les supprimer quand même ?", - "confirmations.domain_block.confirm": "Bloquer tout le domaine", "confirmations.domain_block.message": "Voulez-vous vraiment, vraiment bloquer {domain} en entier ? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans vos fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.", "confirmations.edit.confirm": "Modifier", "confirmations.edit.message": "Modifier maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?", "confirmations.logout.confirm": "Se déconnecter", "confirmations.logout.message": "Voulez-vous vraiment vous déconnecter ?", "confirmations.mute.confirm": "Masquer", - "confirmations.mute.explanation": "Cela masquera ses messages et les messages le ou la mentionnant, mais cela lui permettra quand même de voir vos messages et de vous suivre.", - "confirmations.mute.message": "Voulez-vous vraiment masquer {name} ?", "confirmations.redraft.confirm": "Supprimer et ré-écrire", "confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer cette publication pour la réécrire ? Ses partages ainsi que ses mises en favori seront perdus et ses réponses seront orphelines.", "confirmations.reply.confirm": "Répondre", @@ -271,6 +266,8 @@ "filter_modal.select_filter.subtitle": "Utilisez une catégorie existante ou en créer une nouvelle", "filter_modal.select_filter.title": "Filtrer ce message", "filter_modal.title.status": "Filtrer un message", + "filtered_notifications_banner.pending_requests": "Notifications {count, plural, =0 {de personne} one {d’une personne} other {de # personnes}} que vous pouvez connaitre", + "filtered_notifications_banner.title": "Notifications filtrées", "firehose.all": "Tout", "firehose.local": "Ce serveur", "firehose.remote": "Autres serveurs", @@ -399,9 +396,6 @@ "loading_indicator.label": "Chargement…", "media_gallery.toggle_visible": "{number, plural, one {Cacher l’image} other {Cacher les images}}", "moved_to_account_banner.text": "Votre compte {disabledAccount} est actuellement désactivé parce que vous l'avez déplacé à {movedToAccount}.", - "mute_modal.duration": "Durée", - "mute_modal.hide_notifications": "Masquer les notifications de cette personne ?", - "mute_modal.indefinite": "Indéfinie", "navigation_bar.about": "À propos", "navigation_bar.advanced_interface": "Ouvrir dans l’interface avancée", "navigation_bar.blocks": "Comptes bloqués", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index 02b3833701..97119e30c0 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Ynhâldswarskôging tafoegje", "compose_form.spoiler_placeholder": "Ynhâldswarskôging (opsjoneel)", "confirmation_modal.cancel": "Annulearje", - "confirmations.block.block_and_report": "Blokkearje en rapportearje", "confirmations.block.confirm": "Blokkearje", - "confirmations.block.message": "Binne jo wis dat jo {name} blokkearje wolle?", "confirmations.cancel_follow_request.confirm": "Fersyk annulearje", "confirmations.cancel_follow_request.message": "Binne jo wis dat jo jo fersyk om {name} te folgjen annulearje wolle?", "confirmations.delete.confirm": "Fuortsmite", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Binne jo wis dat jo dizze list foar permanint fuortsmite wolle?", "confirmations.discard_edit_media.confirm": "Fuortsmite", "confirmations.discard_edit_media.message": "Jo hawwe net-bewarre wizigingen yn de mediabeskriuwing of foarfertoaning, wolle jo dizze dochs fuortsmite?", - "confirmations.domain_block.confirm": "Alles fan dit domein blokkearje", "confirmations.domain_block.message": "Binne jo echt wis dat jo alles fan {domain} negearje wolle? Yn de measte gefallen is it blokkearjen of negearjen fan in pear spesifike persoanen genôch en better. Jo sille gjin berjochten fan dizze server op iepenbiere tiidlinen sjen of yn jo meldingen. Jo folgers fan dizze server wurde fuortsmiten.", "confirmations.edit.confirm": "Bewurkje", "confirmations.edit.message": "Troch no te bewurkjen sil it berjocht dat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo trochgean?", "confirmations.logout.confirm": "Ofmelde", "confirmations.logout.message": "Binne jo wis dat jo ôfmelde wolle?", "confirmations.mute.confirm": "Negearje", - "confirmations.mute.explanation": "Dit sil berjochten fan harren en berjochten dêr’t se yn fermeld wurde ûnsichtber meitsje, mar se sille jo berjochten noch hieltyd sjen kinne en jo folgje kinne.", - "confirmations.mute.message": "Binne jo wis dat jo {name} negearje wolle?", "confirmations.redraft.confirm": "Fuortsmite en opnij opstelle", "confirmations.redraft.message": "Binne jo wis dat jo dit berjocht fuortsmite en opnij opstelle wolle? Favoriten en boosts geane dan ferlern en reaksjes op it oarspronklike berjocht reitsje jo kwyt.", "confirmations.reply.confirm": "Reagearje", @@ -399,9 +394,6 @@ "loading_indicator.label": "Lade…", "media_gallery.toggle_visible": "{number, plural, one {ôfbylding ferstopje} other {ôfbyldingen ferstopje}}", "moved_to_account_banner.text": "Omdat jo nei {movedToAccount} ferhuze binne is jo account {disabledAccount} op dit stuit útskeakele.", - "mute_modal.duration": "Doer", - "mute_modal.hide_notifications": "Meldingen fan dizze brûker ferstopje?", - "mute_modal.indefinite": "Foar ûnbepaalde tiid", "navigation_bar.about": "Oer", "navigation_bar.advanced_interface": "Yn avansearre webomjouwing iepenje", "navigation_bar.blocks": "Blokkearre brûkers", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 50ea6bbf6c..c71effe06d 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -133,9 +133,7 @@ "compose_form.spoiler.marked": "Bain rabhadh ábhair", "compose_form.spoiler.unmarked": "Cuir rabhadh ábhair", "confirmation_modal.cancel": "Cealaigh", - "confirmations.block.block_and_report": "Bac ⁊ Tuairiscigh", "confirmations.block.confirm": "Bac", - "confirmations.block.message": "An bhfuil tú cinnte gur mhaith leat {name} a bhac?", "confirmations.cancel_follow_request.confirm": "Éirigh as iarratas", "confirmations.cancel_follow_request.message": "An bhfuil tú cinnte gur mhaith leat éirigh as an iarratas leanta {name}?", "confirmations.delete.confirm": "Scrios", @@ -144,13 +142,10 @@ "confirmations.delete_list.message": "An bhfuil tú cinnte gur mhaith leat an liosta seo a scriosadh go buan?", "confirmations.discard_edit_media.confirm": "Faigh réidh de", "confirmations.discard_edit_media.message": "Tá athruithe neamhshlánaithe don tuarascáil gné nó réamhamharc agat, faigh réidh dóibh ar aon nós?", - "confirmations.domain_block.confirm": "Bac fearann go hiomlán", "confirmations.domain_block.message": "An bhfuil tú iontach cinnte gur mhaith leat bac an t-ainm fearainn {domain} in iomlán? I bhformhór na gcásanna, is leor agus is fearr cúpla baic a cur i bhfeidhm nó cúpla úsáideoirí a balbhú. Ní fheicfidh tú ábhair ón t-ainm fearainn sin in amlíne ar bith, nó i d'fhógraí. Scaoilfear do leantóirí ón ainm fearainn sin.", "confirmations.logout.confirm": "Logáil amach", "confirmations.logout.message": "An bhfuil tú cinnte gur mhaith leat logáil amach?", "confirmations.mute.confirm": "Balbhaigh", - "confirmations.mute.explanation": "Cuiridh seo teachtaireachtaí uathu agus fúthu i bhfolach, ach beidh siad in ann fós do theachtaireachtaí a fheiceáil agus tú a leanúint.", - "confirmations.mute.message": "An bhfuil tú cinnte gur mhaith leat {name} a bhalbhú?", "confirmations.redraft.confirm": "Scrios ⁊ athdhréachtaigh", "confirmations.reply.confirm": "Freagair", "confirmations.reply.message": "Scriosfaidh freagra láithreach an teachtaireacht atá a chumadh anois agat. An bhfuil tú cinnte gur mhaith leat leanúint leat?", @@ -311,9 +306,6 @@ "lists.replies_policy.title": "Taispeáin freagraí:", "lists.search": "Cuardaigh i measc daoine atá á leanúint agat", "lists.subheading": "Do liostaí", - "mute_modal.duration": "Tréimhse", - "mute_modal.hide_notifications": "Cuir póstalacha ón t-úsáideoir seo i bhfolach?", - "mute_modal.indefinite": "Gan téarma", "navigation_bar.about": "Maidir le", "navigation_bar.blocks": "Cuntais bhactha", "navigation_bar.bookmarks": "Leabharmharcanna", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 5d263c0fe6..ad9a58d83d 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -89,6 +89,14 @@ "announcement.announcement": "Brath-fios", "attachments_list.unprocessed": "(gun phròiseasadh)", "audio.hide": "Falaich an fhuaim", + "block_modal.remote_users_caveat": "Iarraidh sinn air an fhrithealaiche {domain} gun gèill iad ri do cho-dhùnadh. Gidheadh, chan eil barantas gun gèill iad on a làimhsicheas cuid a fhrithealaichean bacaidhean air dòigh eadar-dhealaichte. Dh’fhaoidte gum faic daoine gun chlàradh a-steach na postaichean poblach agad fhathast.", + "block_modal.show_less": "Seall nas lugha dheth", + "block_modal.show_more": "Seall barrachd dheth", + "block_modal.they_cant_mention": "Chan urrainn dhaibh iomradh a thoirt ort no do leantainn.", + "block_modal.they_cant_see_posts": "Chan fhaic iad na postaichean agad ’s chan fhaic thu na postaichean aca-san.", + "block_modal.they_will_know": "Chì iad gun deach am bacadh.", + "block_modal.title": "A bheil thu airson an cleachdaiche a bhacadh?", + "block_modal.you_wont_see_mentions": "Chan fhaic thu na postaichean a bheir iomradh orra.", "boost_modal.combo": "Brùth air {combo} nam b’ fheàrr leat leum a ghearradh thar seo an ath-thuras", "bundle_column_error.copy_stacktrace": "Dèan lethbhreac de aithris na mearachd", "bundle_column_error.error.body": "Cha b’ urrainn dhuinn an duilleag a dh’iarr thu a reandaradh. Dh’fhaoidte gu bheil buga sa chòd againn no duilgheadas co-chòrdalachd leis a’ bhrabhsair.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Cuir rabhadh susbainte ris", "compose_form.spoiler_placeholder": "Rabhadh susbainte (roghainneil)", "confirmation_modal.cancel": "Sguir dheth", - "confirmations.block.block_and_report": "Bac ⁊ dèan gearan", "confirmations.block.confirm": "Bac", - "confirmations.block.message": "A bheil thu cinnteach gu bheil thu airson {name} a bhacadh?", "confirmations.cancel_follow_request.confirm": "Cuir d’ iarrtas dhan dàrna taobh", "confirmations.cancel_follow_request.message": "A bheil thu cinnteach gu bheil thu airson d’ iarrtas airson {name} a leantainn a chur dhan dàrna taobh?", "confirmations.delete.confirm": "Sguab às", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "A bheil thu cinnteach gu bheil thu airson an liosta seo a sguabadh às gu buan?", "confirmations.discard_edit_media.confirm": "Tilg air falbh", "confirmations.discard_edit_media.message": "Tha atharraichean gun sàbhaladh agad ann an tuairisgeul no ro-shealladh a’ mheadhain, a bheil thu airson an tilgeil air falbh co-dhiù?", - "confirmations.domain_block.confirm": "Bac an àrainn uile gu lèir", + "confirmations.domain_block.confirm": "Bac am frithealaiche", "confirmations.domain_block.message": "A bheil thu cinnteach dha-rìribh gu bheil thu airson an àrainn {domain} a bhacadh uile gu lèir? Mar as trice, foghnaidh gun dèan thu bacadh no mùchadh no dhà gu sònraichte agus bhiodh sin na b’ fheàrr. Chan fhaic thu susbaint on àrainn ud air loidhne-ama phoblach sam bith no am measg nam brathan agad. Thèid an luchd-leantainn agad on àrainn ud a thoirt air falbh.", "confirmations.edit.confirm": "Deasaich", "confirmations.edit.message": "Ma nì thu deasachadh an-dràsta, thèid seo a sgrìobhadh thairis air an teachdaireachd a tha thu a’ sgrìobhadh an-dràsta. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?", "confirmations.logout.confirm": "Clàraich a-mach", "confirmations.logout.message": "A bheil thu cinnteach gu bheil thu airson clàradh a-mach?", "confirmations.mute.confirm": "Mùch", - "confirmations.mute.explanation": "Cuiridh seo na postaichean uapa ’s na postaichean a bheir iomradh orra am falach ach chì iad-san na postaichean agad fhathast is faodaidh iad ’gad leantainn.", - "confirmations.mute.message": "A bheil thu cinnteach gu bheil thu airson {name} a mhùchadh?", "confirmations.redraft.confirm": "Sguab às ⁊ dèan dreachd ùr", "confirmations.redraft.message": "A bheil thu cinnteach gu bheil thu airson am post seo a sguabadh às agus dreachd ùr a thòiseachadh? Caillidh tu gach annsachd is brosnachadh air agus thèid freagairtean dhan phost thùsail ’nan dìlleachdanan.", "confirmations.reply.confirm": "Freagair", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Tha fèill air na postaichean seo a’ fàs thar an lìona shòisealta an-diugh. Gheibh postaichean nas ùire le barrachd brosnaichean is annsachdan rangachadh nas àirde.", "dismissable_banner.explore_tags": "Tha fèill air na tagaichean hais seo a’ fàs air an fhrithealaiche seo is frithealaichean eile dhen lìonra sgaoilte an-diugh. Gheibh tagaichean hais a tha ’gan cleachdadh le daoine eadar-dhealaichte rangachadh nas àirde.", "dismissable_banner.public_timeline": "Seo na postaichean poblach as ùire o dhaoine air an lìonra sòisealta tha ’gan leantainn le daoine air {domain}.", + "domain_block_modal.block": "Bac am frithealaiche", + "domain_block_modal.block_account_instead": "Bac @{name} ’na àite", + "domain_block_modal.they_can_interact_with_old_posts": "’S urrainn do dhaoine a th’ air an fhrithealaiche seo eadar-ghabhail leis na seann-phostaichean agad.", + "domain_block_modal.they_cant_follow": "Chan urrainn do neach sam bith a th’ air an fhrithealaiche seo do leantainn.", + "domain_block_modal.they_wont_know": "Cha bhi fios aca gun deach am bacadh.", + "domain_block_modal.title": "A bheil thu airson an àrainn a bhacadh?", + "domain_block_modal.you_will_lose_followers": "Thèid a h-uile neach-leantainn agad a th’ air an fhrithealaiche seo a thoirt air falbh.", + "domain_block_modal.you_wont_see_posts": "Chan fhaic thu postaichean no brathan o chleachdaichean a th’ air an fhrithealaiche seo.", + "domain_pill.activitypub_lets_connect": "Leigidh e leat ceangal a dhèanamh ri daoine chan ann air Mastodon a-mhàin ach air feadh aplacaidean sòisealta eile cuideachd agus conaltradh leotha.", + "domain_pill.activitypub_like_language": "Tha ActivityPub coltach ri cànan a bhruidhneas Mastodon ri lìonraidhean sòisealta eile.", + "domain_pill.server": "Frithealaiche", + "domain_pill.their_handle": "An t-aithnichear aca:", + "domain_pill.their_server": "An dachaigh dhigiteach far a bheil na postaichean uile aca a’ fuireach.", + "domain_pill.their_username": "Seo an t-aithnichear àraidh aca air an fhrithealaiche aca. Dh’fhaoidte gu bheil luchd-cleachdaidh air a bheil an t-aon ainm air frithealaichean eile.", + "domain_pill.username": "Ainm-cleachdaiche", + "domain_pill.whats_in_a_handle": "Dè th’ ann an aithnichear?", + "domain_pill.who_they_are": "On a dh’innseas aithnichearan cò cuideigin agus càit a bheil iad, ’s urrainn dhut conaltradh le daoine thar an lìonraidh shòisealta de .", + "domain_pill.who_you_are": "On a dh’innseas d’ aithnichear cò thusa agus càit a bheil thu, ’s urrainn do dhaoine conaltradh leat thar an lìonraidh shòisealta de .", + "domain_pill.your_handle": "An t-aithnichear agad:", + "domain_pill.your_server": "Do dhachaigh dhigiteach far a bheil na postaichean uile agad a’ fuireach. Nach toigh leat an tè seo? Dèan imrich gu frithealaiche eile uair sam bith is thoir an luchd-leantainn agad leat cuideachd.", + "domain_pill.your_username": "Seo an t-aithnichear àraidh agad air an fhrithealaiche seo. Dh’fhaoidte gu bheil luchd-cleachdaidh air a bheil an t-aon ainm air frithealaichean eile.", "embed.instructions": "Leabaich am post seo san làrach-lìn agad is tu a’ dèanamh lethbhreac dhen chòd gu h-ìosal.", "embed.preview": "Seo an coltas a bhios air:", "emoji_button.activity": "Gnìomhachd", @@ -241,6 +266,7 @@ "empty_column.list": "Chan eil dad air an liosta seo fhathast. Nuair a phostaicheas buill a tha air an liosta seo postaichean ùra, nochdaidh iad an-seo.", "empty_column.lists": "Chan eil liosta agad fhathast. Nuair chruthaicheas tu tè, nochdaidh i an-seo.", "empty_column.mutes": "Cha do mhùch thu cleachdaiche sam bith fhathast.", + "empty_column.notification_requests": "Glan! Chan eil dad an-seo. Nuair a gheibh thu brathan ùra, nochdaidh iad an-seo a-rèir nan roghainnean agad.", "empty_column.notifications": "Cha d’ fhuair thu brath sam bith fhathast. Nuair a nì càch conaltradh leat, chì thu an-seo e.", "empty_column.public": "Chan eil dad an-seo! Sgrìobh rudeigin gu poblach no lean càch o fhrithealaichean eile a làimh airson seo a lìonadh", "error.unexpected_crash.explanation": "Air sàilleibh buga sa chòd againn no duilgheadas co-chòrdalachd leis a’ bhrabhsair, chan urrainn dhuinn an duilleag seo a shealltainn mar bu chòir.", @@ -271,6 +297,8 @@ "filter_modal.select_filter.subtitle": "Cleachd roinn-seòrsa a tha ann no cruthaich tè ùr", "filter_modal.select_filter.title": "Criathraich am post seo", "filter_modal.title.status": "Criathraich post", + "filtered_notifications_banner.pending_requests": "{count, plural, =0 {Chan eil brath ann o dhaoine} one {Tha brathan ann o # neach} two {Tha brathan ann o # neach} few {Tha brathan ann o # daoine} other {Tha brathan ann o # duine}} air a bheil thu eòlach ’s dòcha", + "filtered_notifications_banner.title": "Brathan criathraichte", "firehose.all": "Na h-uile", "firehose.local": "Am frithealaiche seo", "firehose.remote": "Frithealaichean eile", @@ -287,7 +315,7 @@ "follow_suggestions.personalized_suggestion": "Moladh pearsanaichte", "follow_suggestions.popular_suggestion": "Moladh air a bheil fèill mhòr", "follow_suggestions.view_all": "Seall na h-uile", - "follow_suggestions.who_to_follow": "Cò a leanas tu", + "follow_suggestions.who_to_follow": "Molaidhean leantainn", "followed_tags": "Tagaichean hais ’gan leantainn", "footer.about": "Mu dhèidhinn", "footer.directory": "Eòlaire nam pròifil", @@ -399,9 +427,15 @@ "loading_indicator.label": "’Ga luchdadh…", "media_gallery.toggle_visible": "{number, plural, 1 {Falaich an dealbh} one {Falaich na dealbhan} two {Falaich na dealbhan} few {Falaich na dealbhan} other {Falaich na dealbhan}}", "moved_to_account_banner.text": "Tha an cunntas {disabledAccount} agad à comas on a rinn thu imrich gu {movedToAccount}.", - "mute_modal.duration": "Faide", - "mute_modal.hide_notifications": "A bheil thu airson na brathan fhalach on chleachdaiche seo?", - "mute_modal.indefinite": "Gun chrìoch", + "mute_modal.hide_from_notifications": "Falaich o na brathan", + "mute_modal.hide_options": "Roghainnean falaich", + "mute_modal.indefinite": "Gus an dì-mhùch mi iad", + "mute_modal.show_options": "Seall na roghainnean", + "mute_modal.they_can_mention_and_follow": "’S urrainn dhaibh iomradh a thoirt ort agus do leantainn ach chan fhaic thu iad-san.", + "mute_modal.they_wont_know": "Cha bhi fios aca gun deach am mùchadh.", + "mute_modal.title": "A bheil thu airson an cleachdaiche a mhùchadh?", + "mute_modal.you_wont_see_mentions": "Chan fhaic thu na postaichean a bheir iomradh orra.", + "mute_modal.you_wont_see_posts": "Chì iad na postaichean agad fhathast ach chan fhaic thu na postaichean aca-san.", "navigation_bar.about": "Mu dhèidhinn", "navigation_bar.advanced_interface": "Fosgail san eadar-aghaidh-lìn adhartach", "navigation_bar.blocks": "Cleachdaichean bacte", @@ -439,6 +473,10 @@ "notification.reblog": "Bhrosnaich {name} am post agad", "notification.status": "Phostaich {name} rud", "notification.update": "Dheasaich {name} post", + "notification_requests.accept": "Gabh ris", + "notification_requests.dismiss": "Leig seachad", + "notification_requests.notifications_from": "Brathan o {name}", + "notification_requests.title": "Brathan criathraichte", "notifications.clear": "Falamhaich na brathan", "notifications.clear_confirmation": "A bheil thu cinnteach gu bheil thu airson na brathan uile agad fhalamhachadh gu buan?", "notifications.column_settings.admin.report": "Gearanan ùra:", @@ -470,6 +508,15 @@ "notifications.permission_denied": "Chan eil brathan deasga ri fhaighinn on a chaidh iarrtas ceadan a’ bhrabhsair a dhiùltadh cheana", "notifications.permission_denied_alert": "Cha ghabh brathan deasga a chur an comas on a chaidh iarrtas ceadan a’ bhrabhsair a dhiùltadh cheana", "notifications.permission_required": "Chan eil brathan deasga ri fhaighinn on nach deach an cead riatanach a thoirt seachad.", + "notifications.policy.filter_new_accounts.hint": "Chaidh a chruthachadh o chionn {count, plural, one {# latha} two {# latha} few {# làithean} other {# latha}}", + "notifications.policy.filter_new_accounts_title": "Cunntasan ùra", + "notifications.policy.filter_not_followers_hint": "A’ gabhail a-staigh an fheadhainn a lean ort nas lugha na {count, plural, one {# latha} two {# latha} few {# làithean} other {# latha}} seo chaidh", + "notifications.policy.filter_not_followers_title": "Daoine nach eil gad leantainn", + "notifications.policy.filter_not_following_hint": "Gus an aontaich thu riutha a làimh", + "notifications.policy.filter_not_following_title": "Daoine nach eil thu a’ leantainn", + "notifications.policy.filter_private_mentions_hint": "Criathraichte ach ma tha e a’ freagairt do dh’iomradh agad fhèin no ma tha thu a’ leantainn an seòladair", + "notifications.policy.filter_private_mentions_title": "Iomraidhean prìobhaideach o choigrich", + "notifications.policy.title": "Falamhaich na brathan o…", "notifications_permission_banner.enable": "Cuir brathan deasga an comas", "notifications_permission_banner.how_to_control": "Airson brathan fhaighinn nuair nach eil Mastodon fosgailte, cuir na brathan deasga an comas. Tha an smachd agad fhèin air dè na seòrsaichean de chonaltradh a ghineas brathan deasga leis a’ phutan {icon} gu h-àrd nuair a bhios iad air an cur an comas.", "notifications_permission_banner.title": "Na caill dad gu bràth tuilleadh", @@ -646,9 +693,11 @@ "status.direct": "Thoir iomradh air @{name} gu prìobhaideach", "status.direct_indicator": "Iomradh prìobhaideach", "status.edit": "Deasaich", + "status.edited": "An deasachadh mu dheireadh {date}", "status.edited_x_times": "Chaidh a dheasachadh {count, plural, one {{counter} turas} two {{counter} thuras} few {{counter} tursan} other {{counter} turas}}", "status.embed": "Leabaich", "status.favourite": "Cuir ris na h-annsachdan", + "status.favourites": "{count, plural, one {annsachd} two {annsachd} few {annsachdan} other {annsachd}", "status.filter": "Criathraich am post seo", "status.filtered": "Criathraichte", "status.hide": "Falaich am post", @@ -669,6 +718,7 @@ "status.reblog": "Brosnaich", "status.reblog_private": "Brosnaich leis an t-so-fhaicsinneachd tùsail", "status.reblogged_by": "’Ga bhrosnachadh le {name}", + "status.reblogs": "{count, plural, one {bhrosnachadh} two {bhrosnachadh} few {brosnachaidhean} other {brosnachadh}", "status.reblogs.empty": "Chan deach am post seo a bhrosnachadh le duine sam bith fhathast. Nuair a bhrosnaicheas cuideigin e, nochdaidh iad an-seo.", "status.redraft": "Sguab às ⁊ dèan dreachd ùr", "status.remove_bookmark": "Thoir an comharra-lìn air falbh", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 02f57570a5..d5726062a3 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Engadir aviso sobre o contido", "compose_form.spoiler_placeholder": "Aviso sobre o contido (optativo)", "confirmation_modal.cancel": "Cancelar", - "confirmations.block.block_and_report": "Bloquear e denunciar", "confirmations.block.confirm": "Bloquear", - "confirmations.block.message": "Tes a certeza de querer bloquear a {name}?", "confirmations.cancel_follow_request.confirm": "Retirar solicitude", "confirmations.cancel_follow_request.message": "Tes a certeza de querer retirar a solicitude para seguir a {name}?", "confirmations.delete.confirm": "Eliminar", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Tes a certeza de querer eliminar de xeito permanente esta listaxe?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tes cambios sen gardar para a vista previa ou descrición do multimedia, descartamos os cambios?", - "confirmations.domain_block.confirm": "Agochar dominio enteiro", "confirmations.domain_block.message": "Tes a certeza de querer bloquear todo de {domain}? Na meirande parte dos casos uns bloqueos ou silenciados específicos son suficientes. Non verás máis o contido deste dominio en ningunha cronoloxía pública ou nas túas notificacións. As túas seguidoras deste dominio serán eliminadas.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Ao editar sobrescribirás a mensaxe que estás a compor. Tes a certeza de que queres continuar?", "confirmations.logout.confirm": "Pechar sesión", "confirmations.logout.message": "Desexas pechar a sesión?", "confirmations.mute.confirm": "Acalar", - "confirmations.mute.explanation": "Isto agochará as súas publicacións ou as que a mencionen, mais poderá ler as túas publicacións e ser seguidora túa.", - "confirmations.mute.message": "Tes a certeza de querer acalar a {name}?", "confirmations.redraft.confirm": "Eliminar e reescribir", "confirmations.redraft.message": "Tes a certeza de querer eliminar esta publicación e reescribila? Perderás as promocións e favorecementos, e as respostas á publicación orixinal ficarán orfas.", "confirmations.reply.confirm": "Responder", @@ -402,9 +397,6 @@ "loading_indicator.label": "Estase a cargar…", "media_gallery.toggle_visible": "Agochar {number, plural, one {imaxe} other {imaxes}}", "moved_to_account_banner.text": "A túa conta {disabledAccount} está actualmente desactivada porque movéchela a {movedToAccount}.", - "mute_modal.duration": "Duración", - "mute_modal.hide_notifications": "Agochar notificacións desta persoa?", - "mute_modal.indefinite": "Indefinida", "navigation_bar.about": "Acerca de", "navigation_bar.advanced_interface": "Abrir coa interface web avanzada", "navigation_bar.blocks": "Usuarias bloqueadas", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 6cf7fc9283..48f028f3b5 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -89,6 +89,14 @@ "announcement.announcement": "הכרזה", "attachments_list.unprocessed": "(לא מעובד)", "audio.hide": "השתק", + "block_modal.remote_users_caveat": "אנו נבקש מהשרת {domain} לכבד את החלטתך. עם זאת, ציות למוסכמות איננו מובטח כיוון ששרתים מסויימים עשויים לטפל בחסימות בצורה אחרת. הודעות פומביות עדיין יהיו גלויות לעיני משתמשים שאינם מחוברים.", + "block_modal.show_less": "הצג פחות", + "block_modal.show_more": "הצג עוד", + "block_modal.they_cant_mention": "הם אינם יכולים לאזכר אותך או לעקוב אחריך.", + "block_modal.they_cant_see_posts": "הם לא יכולים לראות את הודעותיך ואתם לא תוכלו לראות את שלהם.", + "block_modal.they_will_know": "הם יכולים לראות שהם חסומים.", + "block_modal.title": "לחסום משתמש?", + "block_modal.you_wont_see_mentions": "לא תראה הודעות שמאזכרות אותם.", "boost_modal.combo": "ניתן להקיש {combo} כדי לדלג בפעם הבאה", "bundle_column_error.copy_stacktrace": "העתקת הודעת שגיאה", "bundle_column_error.error.body": "הדף המבוקש אינו זמין. זה עשוי להיות באג בקוד או בעייה בתאימות הדפדפן.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "הוסף אזהרת תוכן", "compose_form.spoiler_placeholder": "אזהרת תוכן (לא חובה)", "confirmation_modal.cancel": "ביטול", - "confirmations.block.block_and_report": "לחסום ולדווח", "confirmations.block.confirm": "לחסום", - "confirmations.block.message": "האם את/ה בטוח/ה שברצונך למחוק את \"{name}\"?", "confirmations.cancel_follow_request.confirm": "ויתור על בקשה", "confirmations.cancel_follow_request.message": "לבטל את בקשת המעקב אחרי {name}?", "confirmations.delete.confirm": "למחוק", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "האם אתם בטוחים שאתם רוצים למחוק את הרשימה לצמיתות?", "confirmations.discard_edit_media.confirm": "השלך", "confirmations.discard_edit_media.message": "יש לך שינויים לא שמורים לתיאור המדיה. להשליך אותם בכל זאת?", - "confirmations.domain_block.confirm": "חסמו לגמרי את שם המתחם (דומיין)", + "confirmations.domain_block.confirm": "חסימת שרת", "confirmations.domain_block.message": "בטוחה שברצונך באמת לחסום את קהילת {domain}? ברב המקרים השתקה וחסימה של מספר משתמשים עשוייה להספיק. לא תראי תוכל מכלל שם המתחם בפידים הציבוריים או בהתראות שלך. העוקבים שלך מהקהילה הזאת יוסרו", "confirmations.edit.confirm": "עריכה", "confirmations.edit.message": "עריכה תדרוס את ההודעה שכבר התחלת לכתוב. האם להמשיך?", "confirmations.logout.confirm": "התנתקות", "confirmations.logout.message": "האם אתם בטוחים שאתם רוצים להתנתק?", "confirmations.mute.confirm": "להשתיק", - "confirmations.mute.explanation": "זה יסתיר הודעות שלהם והודעות שמאזכרות אותם, אבל עדיין יתיר להם לראות הודעות שלך ולעקוב אחריך.", - "confirmations.mute.message": "בטוח/ה שברצונך להשתיק את {name}?", "confirmations.redraft.confirm": "מחיקה ועריכה מחדש", "confirmations.redraft.message": "למחוק ולהתחיל טיוטה חדשה? חיבובים והדהודים יאבדו, ותגובות להודעה המקורית ישארו יתומות.", "confirmations.reply.confirm": "תגובה", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "אלו הודעות משרת זה ואחרים ברשת המבוזרת שצוברות חשיפה היום. הודעות חדשות יותר עם יותר הדהודים וחיבובים מדורגות גבוה יותר.", "dismissable_banner.explore_tags": "התגיות האלו, משרת זה ואחרים ברשת המבוזרת, צוברות חשיפה כעת.", "dismissable_banner.public_timeline": "אלו ההודעות האחרונות שהתקבלו מהמשתמשים שנעקבים על ידי משתמשים מ־{domain}.", + "domain_block_modal.block": "חסימת שרת", + "domain_block_modal.block_account_instead": "לחסום את @{name} במקום שרת שלם", + "domain_block_modal.they_can_interact_with_old_posts": "משתמשים משרת זה יכולים להתייחס להודעותיך הישנות.", + "domain_block_modal.they_cant_follow": "משתמש משרת זה לא יכול לעקוב אחריך.", + "domain_block_modal.they_wont_know": "הם לא ידעו כי נחסמו.", + "domain_block_modal.title": "לחסום שרת?", + "domain_block_modal.you_will_lose_followers": "כל עוקביך משרת זה יוסרו.", + "domain_block_modal.you_wont_see_posts": "לא תוכלו לראות הודעות ממשתמשים על שרת זה.", + "domain_pill.activitypub_lets_connect": "מאפשר לך להתחבר ולהתרועע עם אחרים לא רק במסטודון, אלא גם ביישומים חברתיים שונים אחרים.", + "domain_pill.activitypub_like_language": "אקטיביטיפאב היא למעשה השפה בה מסטודון מדבר עם רשתות חברתיות אחרות.", + "domain_pill.server": "שרת", + "domain_pill.their_handle": "הכינוי שלהם:", + "domain_pill.their_server": "הבית המקוון שלהם, היכן שהודעותיהם שוכנות.", + "domain_pill.their_username": "המזהה הייחודי של השרת שלהם. ניתן למצוא משתמשים עם שם משתמש זהה על שרתים שונים.", + "domain_pill.username": "שם משתמש/ת", + "domain_pill.whats_in_a_handle": "מה כולל כינוי?", + "domain_pill.who_they_are": "מאחר וכינויים מספרים על מישהו ומה מיקומו, ניתן להיות בקשר עם אנשים לרוחבה של הרשת החברתית של .", + "domain_pill.who_you_are": "מאחר והכינוי שלך מספר על מי את.ה ומה מקומך בעולם, משתמשים מכל העולם יוכלו להיות בקשר עמך לרוחבה של הרשת החברתית של .", + "domain_pill.your_handle": "הכינוי שלך:", + "domain_pill.your_server": "הבית המקוון שלך, היכן ששוכנות כל הודעותיך. לא מוצא חן בעיניך? ניתן לעבור שרתים בכל עת וגם לשמור על העוקבים.", + "domain_pill.your_username": "המזהה הייחודי שלך על שרת זה. ניתן למצוא משתמשים עם שם משתמש זהה על שרתים שונים.", "embed.instructions": "ניתן להטמיע את ההודעה הזו באתרך ע\"י העתקת הקוד שלהלן.", "embed.preview": "דוגמא כיצד זה יראה:", "emoji_button.activity": "פעילות", @@ -402,9 +427,15 @@ "loading_indicator.label": "בטעינה…", "media_gallery.toggle_visible": "{number, plural, one {להסתיר תמונה} two {להסתיר תמונותיים} many {להסתיר תמונות} other {להסתיר תמונות}}", "moved_to_account_banner.text": "חשבונך {disabledAccount} אינו פעיל כרגע עקב מעבר ל{movedToAccount}.", - "mute_modal.duration": "משך הזמן", - "mute_modal.hide_notifications": "להסתיר התראות מחשבון זה?", - "mute_modal.indefinite": "ללא תאריך סיום", + "mute_modal.hide_from_notifications": "להסתיר מהתראות", + "mute_modal.hide_options": "הסתרת אפשרויות", + "mute_modal.indefinite": "עד שאסיר השתקה", + "mute_modal.show_options": "הצגת אפשרויות", + "mute_modal.they_can_mention_and_follow": "הם יכולם לאזכר אתכם ולעקוב אחריכם, אבל לא תראו אותם.", + "mute_modal.they_wont_know": "הם לא ידעו כי הושתקו.", + "mute_modal.title": "להשתיק משתמש?", + "mute_modal.you_wont_see_mentions": "לא תראה הודעות שמאזכרות אותם.", + "mute_modal.you_wont_see_posts": "הם יכולים לראות את הודעותכם, אבל אתם לא תוכלו לראות את שלהם.", "navigation_bar.about": "אודות", "navigation_bar.advanced_interface": "פתח במנשק ווב מתקדם", "navigation_bar.blocks": "משתמשים חסומים", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index edab89a84a..372eb09fa7 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -21,6 +21,7 @@ "account.blocked": "ब्लॉक", "account.browse_more_on_origin_server": "मूल प्रोफ़ाइल पर अधिक ब्राउज़ करें", "account.cancel_follow_request": "फॉलो रिक्वेस्ट वापस लें", + "account.copy": "प्रोफाइल पर लिंक कॉपी करें", "account.direct": "निजि तरीके से उल्लेख करे @{name}", "account.disable_notifications": "@{name} पोस्ट के लिए मुझे सूचित मत करो", "account.domain_blocked": "छिपा हुआ डोमेन", @@ -31,6 +32,7 @@ "account.featured_tags.last_status_never": "कोई पोस्ट नहीं है", "account.featured_tags.title": "{name} के चुनिंदा हैशटैग", "account.follow": "फॉलो करें", + "account.follow_back": "फॉलो करें", "account.followers": "फॉलोवर", "account.followers.empty": "कोई भी इस यूज़र् को फ़ॉलो नहीं करता है", "account.followers_counter": "{count, plural, one {{counter} अनुगामी} other {{counter} समर्थक}}", @@ -51,6 +53,7 @@ "account.mute_notifications_short": "सूचनाओ को शांत करे", "account.mute_short": "शांत करे", "account.muted": "म्यूट है", + "account.mutual": "आपसी", "account.no_bio": "कोई विवरण नहि दिया गया हे", "account.open_original_page": "ओरिजिनल पोस्ट खोलें", "account.posts": "टूट्स", @@ -75,6 +78,8 @@ "admin.dashboard.retention.average": "औसत", "admin.dashboard.retention.cohort": "साईन-अप महिना", "admin.dashboard.retention.cohort_size": "नये उपयोगकर्ता", + "admin.impact_report.instance_accounts": "ये अकाउंट प्रोफाइल मिटा देगा", + "admin.impact_report.instance_followers": "हमारे यूजर्स इन फॉलोअर्स को खो देंगे", "admin.impact_report.title": "प्रभावकां सारांश", "alert.rate_limited.message": "कृप्या {retry_time, time, medium} के बाद दुबारा कोशिश करें", "alert.rate_limited.title": "सीमित दर", @@ -83,6 +88,13 @@ "announcement.announcement": "घोषणा", "attachments_list.unprocessed": "(असंसाधित)", "audio.hide": "हाईड ऑडियो", + "block_modal.show_less": "कम दिखाएं", + "block_modal.show_more": "और दिखाएँ", + "block_modal.they_cant_mention": "वे आपको मेंशन या फॉलो नहीं कर सकते", + "block_modal.they_cant_see_posts": "वो आपके पोस्ट नहीं देख सकते और न आप उनके", + "block_modal.they_will_know": "वे नहीं देख सकते कि उन्हें ब्लॉक किया गया है", + "block_modal.title": "यूजर को ब्लॉक करें?", + "block_modal.you_wont_see_mentions": "वो पोस्ट आप नहीं देख सकते जिनमें उन्हें मेंशन किया गया है", "boost_modal.combo": "अगली बार स्किप करने के लिए आप {combo} दबा सकते है", "bundle_column_error.copy_stacktrace": "कॉपी एरर रिपोर्ट", "bundle_column_error.error.body": "अनुरोधित पेज प्रस्तुत नहीं किया जा सका। यह हमारे कोड में बग या ब्राउज़र संगतता समस्या के कारण हो सकता है।", @@ -130,7 +142,9 @@ "community.column_settings.remote_only": "केवल सुदूर", "compose.language.change": "भाषा बदलें", "compose.language.search": "भाषाएँ खोजें...", + "compose.published.body": "पोस्ट प्रकाशित हुआ।", "compose.published.open": "खोलें", + "compose.saved.body": "पोस्ट सुरक्षित किया गया।", "compose_form.direct_message_warning_learn_more": "और जानें", "compose_form.encryption_warning": "मास्टोडॉन पर पोस्ट एन्ड-टू-एन्ड एन्क्रिप्टेड नहीं है। कोई भी व्यक्तिगत जानकारी मास्टोडॉन पर मत भेजें।", "compose_form.hashtag_warning": "ये पोस्ट किसी भी हैशटैग में लिस्ट नहीं किया जाएगा क्योंकि ये पब्लिक नहीं है। सिर्फ पब्लिक पोस्ट ही हैशटैग से खोजे जा सकते हैं।", @@ -138,15 +152,21 @@ "compose_form.lock_disclaimer.lock": "लॉक्ड", "compose_form.placeholder": "What is on your mind?", "compose_form.poll.duration": "चुनाव की अवधि", + "compose_form.poll.multiple": "बहुविकल्पी", + "compose_form.poll.option_placeholder": "विकल्प {number}", + "compose_form.poll.single": "कोई एक चुनें", "compose_form.poll.switch_to_multiple": "कई विकल्पों की अनुमति देने के लिए पोल बदलें", "compose_form.poll.switch_to_single": "एक ही विकल्प के लिए अनुमति देने के लिए पोल बदलें", + "compose_form.poll.type": "स्टाइल", + "compose_form.publish": "पोस्ट करें", "compose_form.publish_form": "पब्लिश", + "compose_form.reply": "जवाब दें", + "compose_form.save_changes": "अपडेट करें", "compose_form.spoiler.marked": "चेतावनी के पीछे टेक्स्ट छिपा है", "compose_form.spoiler.unmarked": "टेक्स्ट छिपा नहीं है", + "compose_form.spoiler_placeholder": "सामग्री चेतावनी (वैकल्पिक)", "confirmation_modal.cancel": "रद्द करें", - "confirmations.block.block_and_report": "ब्लॉक एवं रिपोर्ट", "confirmations.block.confirm": "ब्लॉक", - "confirmations.block.message": "क्या आप वाकई {name} को ब्लॉक करना चाहते हैं?", "confirmations.cancel_follow_request.confirm": "रिक्वेस्ट वापस लें", "confirmations.cancel_follow_request.message": "क्या आप सुनिश्चित है की आप {name} का फॉलो रिक्वेस्ट वापिस लेना चाहते हैं?", "confirmations.delete.confirm": "मिटाए", @@ -155,15 +175,13 @@ "confirmations.delete_list.message": "क्या आप वाकई इस लिस्ट को हमेशा के लिये मिटाना चाहते हैं?", "confirmations.discard_edit_media.confirm": "डिस्कार्ड", "confirmations.discard_edit_media.message": "लिस्ट में जोड़ें", - "confirmations.domain_block.confirm": "संपूर्ण डोमेन छिपाएं", + "confirmations.domain_block.confirm": "सर्वर ब्लॉक करें", "confirmations.domain_block.message": "क्या आप वास्तव में, वास्तव में आप पूरे {domain} को ब्लॉक करना चाहते हैं? ज्यादातर मामलों में कुछ लक्षित ब्लॉक या म्यूट पर्याप्त और बेहतर हैं। आप किसी भी सार्वजनिक समय-सीमा या अपनी सूचनाओं में उस डोमेन की सामग्री नहीं देखेंगे। उस डोमेन से आपके फॉलोवर्स को हटा दिया जाएगा।", "confirmations.edit.confirm": "संशोधित करें", "confirmations.edit.message": "अभी संपादन किया तो वो संदेश मिट जायेगा जिसे आप लिख रहे थे। क्या आप जारी रखना चाहते हैं?", "confirmations.logout.confirm": "लॉग आउट करें", "confirmations.logout.message": "आप सुनिश्चित हैं कि लॉगआउट करना चाहते हैं?", "confirmations.mute.confirm": "शांत", - "confirmations.mute.explanation": "यह उनसे और पोस्टों का उल्लेख करते हुए उनसे छिपाएगा, लेकिन यह अभी भी उन्हें आपकी पोस्ट देखने और आपको फॉलो करने की अनुमति देगा।", - "confirmations.mute.message": "क्या आप वाकई {name} को शांत करना चाहते हैं?", "confirmations.redraft.confirm": "मिटायें और पुनःप्रारूपण करें", "confirmations.redraft.message": "क्या आप वाकई इस स्टेटस को हटाना चाहते हैं और इसे फिर से ड्राफ्ट करना चाहते हैं? पसंदीदा और बूस्ट खो जाएंगे, और मूल पोस्ट के उत्तर अनाथ हो जाएंगे।", "confirmations.reply.confirm": "उत्तर दें", @@ -174,6 +192,7 @@ "conversation.mark_as_read": "पढ़ा गया के रूप में चिह्नित करें", "conversation.open": "वार्तालाप देखें", "conversation.with": "{names} के साथ", + "copy_icon_button.copied": "क्लिपबोर्ड पर कॉपी किया गया", "copypaste.copied": "कॉपी किआ जा चूका है", "copypaste.copy_to_clipboard": "क्लिपबोर्ड पर कॉपी करें", "directory.federated": "ज्ञात फेडीवर्स से", @@ -345,9 +364,6 @@ "lists.replies_policy.none": "कोई नहीं", "lists.replies_policy.title": "इसके जवाब दिखाएं:", "lists.subheading": "आपकी सूचियाँ", - "mute_modal.duration": "अवधि", - "mute_modal.hide_notifications": "इस सभ्य की ओरसे आनेवाली सूचनाए शांत करे", - "mute_modal.indefinite": "अनिश्चितकालीन", "navigation_bar.about": "विवरण", "navigation_bar.blocks": "ब्लॉक्ड यूज़र्स", "navigation_bar.bookmarks": "पुस्तकचिह्न:", @@ -480,6 +496,7 @@ "status.delete": "हटाएं", "status.detailed_status": "विस्तृत वार्ता दृश्य", "status.direct": "निजी संदेश @{name} से", + "status.edited": "पिछला संशोधन {date}", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", "status.media.open": "खोलने के लिए क्लिक करें", "status.media.show": "दिखाने के लिए क्लिक करें", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 1e68854c12..ec8d62dbba 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -146,9 +146,7 @@ "compose_form.spoiler.marked": "Tekst je skriven iza upozorenja", "compose_form.spoiler.unmarked": "Tekst nije skriven", "confirmation_modal.cancel": "Otkaži", - "confirmations.block.block_and_report": "Blokiraj i prijavi", "confirmations.block.confirm": "Blokiraj", - "confirmations.block.message": "Sigurno želite blokirati {name}?", "confirmations.cancel_follow_request.confirm": "Povuci zahtjev", "confirmations.delete.confirm": "Obriši", "confirmations.delete.message": "Stvarno želite obrisati ovaj toot?", @@ -156,14 +154,11 @@ "confirmations.delete_list.message": "Jeste li sigurni da želite trajno obrisati ovu listu?", "confirmations.discard_edit_media.confirm": "Odbaciti", "confirmations.discard_edit_media.message": "Postoje nespremljene promjene u opisu medija ili u pretpregledu, svejedno ih odbaciti?", - "confirmations.domain_block.confirm": "Blokiraj cijelu domenu", "confirmations.domain_block.message": "Jeste li zaista, zaista sigurni da želite blokirati cijelu domenu {domain}? U većini slučajeva dovoljno je i preferirano nekoliko ciljanih blokiranja ili utišavanja. Nećete vidjeti sadržaj s te domene ni u kojim javnim vremenskim crtama ili Vašim obavijestima. Vaši pratitelji s te domene bit će uklonjeni.", "confirmations.edit.confirm": "Uredi", "confirmations.logout.confirm": "Odjavi se", "confirmations.logout.message": "Jeste li sigurni da se želite odjaviti?", "confirmations.mute.confirm": "Utišaj", - "confirmations.mute.explanation": "Ovo će sakriti njihove objave i objave koje ih spominju, ali i dalje će im dopuštati da vide Vaše objave i da Vas prate.", - "confirmations.mute.message": "Jeste li sigurni da želite utišati {name}?", "confirmations.redraft.confirm": "Izbriši i ponovno uredi", "confirmations.reply.confirm": "Odgovori", "confirmations.reply.message": "Odgovaranje sada će prepisati poruku koju upravo pišete. Jeste li sigurni da želite nastaviti?", @@ -323,8 +318,6 @@ "lists.search": "Traži među praćenim ljudima", "lists.subheading": "Vaše liste", "media_gallery.toggle_visible": "Sakrij {number, plural, one {sliku} other {slike}}", - "mute_modal.duration": "Trajanje", - "mute_modal.hide_notifications": "Sakrij obavijesti ovog korisnika?", "navigation_bar.about": "O aplikaciji", "navigation_bar.advanced_interface": "Otvori u naprednom web sučelju", "navigation_bar.blocks": "Blokirani korisnici", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index f658fe4656..c13c8dc220 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -16,7 +16,7 @@ "account.badges.bot": "Automatizált", "account.badges.group": "Csoport", "account.block": "@{name} letiltása", - "account.block_domain": "Domain blokkolása: {domain}", + "account.block_domain": "Domain letiltása: {domain}", "account.block_short": "Letiltás", "account.blocked": "Letiltva", "account.browse_more_on_origin_server": "További böngészés az eredeti profilon", @@ -89,6 +89,14 @@ "announcement.announcement": "Közlemény", "attachments_list.unprocessed": "(feldolgozatlan)", "audio.hide": "Hang elrejtése", + "block_modal.remote_users_caveat": "Arra kérjük a {domain} kiszolgálót, hogy tartsa tiszteletben a döntésedet. Ugyanakkor az együttműködés nem garantált, mivel néhány kiszolgáló másképp kezelheti a letiltásokat. A nyilvános bejegyzések a be nem jelentkezett felhasználók számára továbbra is látszódhatnak.", + "block_modal.show_less": "Kevesebb mutatása", + "block_modal.show_more": "Több mutatása", + "block_modal.they_cant_mention": "Nem említhetnek meg vagy követhetnek téged.", + "block_modal.they_cant_see_posts": "Nem láthatják a bejegyzéseidet, és te sem fogod látni az övékét.", + "block_modal.they_will_know": "Láthatják, hogy le vannak tiltva.", + "block_modal.title": "Letiltsuk a felhasználót?", + "block_modal.you_wont_see_mentions": "Nem látsz majd őket említő bejegyzéseket.", "boost_modal.combo": "Hogy átugord ezt következő alkalommal, használd {combo}", "bundle_column_error.copy_stacktrace": "Hibajelentés másolása", "bundle_column_error.error.body": "A kért lap nem jeleníthető meg. Ez lehet, hogy kódhiba, vagy böngészőkompatibitási hiba.", @@ -113,7 +121,7 @@ "column.community": "Helyi idővonal", "column.direct": "Személyes említések", "column.directory": "Profilok böngészése", - "column.domain_blocks": "Letiltott tartománynevek", + "column.domain_blocks": "Letiltott domainek", "column.favourites": "Kedvencek", "column.firehose": "Hírfolyamok", "column.follow_requests": "Követési kérelmek", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Tartalmi figyelmeztetés hozzáadása", "compose_form.spoiler_placeholder": "Tartalmi figyelmeztetés (opcionális)", "confirmation_modal.cancel": "Mégsem", - "confirmations.block.block_and_report": "Letiltás és jelentés", "confirmations.block.confirm": "Letiltás", - "confirmations.block.message": "Biztos, hogy letiltod: {name}?", "confirmations.cancel_follow_request.confirm": "Kérés visszavonása", "confirmations.cancel_follow_request.message": "Biztos, hogy visszavonod a(z) {name} felhasználóra vonatkozó követési kérésedet?", "confirmations.delete.confirm": "Törlés", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Biztos, hogy véglegesen törölni szeretnéd ezt a listát?", "confirmations.discard_edit_media.confirm": "Elvetés", "confirmations.discard_edit_media.message": "Elmentetlen változtatásaid vannak a média leírásában vagy előnézetében. Eldobjuk őket?", - "confirmations.domain_block.confirm": "Teljes tartomány tiltása", + "confirmations.domain_block.confirm": "Kiszolgáló letiltása", "confirmations.domain_block.message": "Biztos, hogy le szeretnéd tiltani a teljes {domain} domaint? A legtöbb esetben néhány célzott tiltás vagy némítás elegendő, és kívánatosabb megoldás. Semmilyen tartalmat nem fogsz látni ebből a domainből se az idővonalakon, se az értesítésekben. Az ebben a domainben lévő követőidet is eltávolítjuk.", "confirmations.edit.confirm": "Szerkesztés", "confirmations.edit.message": "Ha most szerkeszted, ez felülírja a most szerkesztés alatt álló üzenetet. Mégis ezt szeretnéd?", "confirmations.logout.confirm": "Kijelentkezés", "confirmations.logout.message": "Biztos, hogy kijelentkezel?", "confirmations.mute.confirm": "Némítás", - "confirmations.mute.explanation": "Ez elrejti a tőlük érkező bejegyzéseket, valamint az őket megemlítőket, de ők továbbra is láthatják a te bejegyzéseid, és követhetnek is téged.", - "confirmations.mute.message": "Biztos, hogy némítod: {name}?", "confirmations.redraft.confirm": "Törlés és újraírás", "confirmations.redraft.message": "Biztos, hogy ezt a bejegyzést szeretnéd törölni és újraírni? Minden megtolást és kedvencnek jelölést elvesztesz, az eredetire adott válaszok pedig elárvulnak.", "confirmations.reply.confirm": "Válasz", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Ezek jelenleg népszerűvé váló bejegyzések a háló különböző szegleteiből. Az újabb vagy több megtolással rendelkező bejegyzéseket, illetve a kedvencnek jelöléssel rendelkezőeket rangsoroljuk előrébb.", "dismissable_banner.explore_tags": "Jelenleg ezek a hashtagek hódítanak teret a közösségi weben. Azokat a hashtageket, amelyeket több különböző ember használ, magasabbra rangsorolják.", "dismissable_banner.public_timeline": "Ezek a legfrissebb nyilvános bejegyzések a közösségi weben, amelyeket {domain} domain felhasználói követnek.", + "domain_block_modal.block": "Kiszolgáló letiltása", + "domain_block_modal.block_account_instead": "Helyette @{name} letiltása", + "domain_block_modal.they_can_interact_with_old_posts": "Az ezen a kiszolgálón lévő emberek interaktálhatnak a régi bejegyzéseiddel.", + "domain_block_modal.they_cant_follow": "Erről a kiszolgálóról senki sem követhet.", + "domain_block_modal.they_wont_know": "Nem fogják tudni, hogy letiltották őket.", + "domain_block_modal.title": "Letiltsuk a domaint?", + "domain_block_modal.you_will_lose_followers": "Az ezen a kiszolgálón lévő összes követődet törölni fogjuk.", + "domain_block_modal.you_wont_see_posts": "Nem látsz majd bejegyzéseket vagy értesítéseket ennek a kiszolgálónak a felhasználóitól.", + "domain_pill.activitypub_lets_connect": "Lehetővé teszi, hogy kapcsolatba lépj nem csak a Mastodonon, hanem a más közösségi alkalmazásokon lévő emberekkel is.", + "domain_pill.activitypub_like_language": "Az ActivityPub olyan mint egy nyelv, amelyet a Mastodon a más közösségi hálózatokkal való kommunikációra használ.", + "domain_pill.server": "Kiszolgáló", + "domain_pill.their_handle": "A fiókneve:", + "domain_pill.their_server": "A digitális otthona, ahol a bejegyzései találhatók.", + "domain_pill.their_username": "Az egyedi azonosítója a kiszolgálóján. Lehet, hogy ugyanazon felhasználónév különböző kiszolgálókon is megtalálható.", + "domain_pill.username": "Felhasználónév", + "domain_pill.whats_in_a_handle": "Mi is egy fióknév?", + "domain_pill.who_they_are": "Mivel a fióknevek mondják meg, hogy valaki kicsoda és hol található, így ezek használatával léphetsz kapcsolatba az közösségi hálózatán lévő emberekkel.", + "domain_pill.who_you_are": "Mivel a fiókneved mondja meg, hogy ki vagy és hol, így ezek használatával léphetnek kapcsolatba veled az közösségi hálózatán lévő emberek.", + "domain_pill.your_handle": "Saját fióknév:", + "domain_pill.your_server": "A digitális otthonod, ahol a bejegyzéseid találhatók. Nem tetszik a mostani? Válts kiszolgálót bármikor, és vidd magaddal a követőidet is.", + "domain_pill.your_username": "Az egyedi azonosítód ezen a kiszolgálón. Lehet, hogy ugyanazon felhasználónév különböző kiszolgálókon is megtalálható.", "embed.instructions": "Ágyazd be ezt a bejegyzést a weboldaladba az alábbi kód kimásolásával.", "embed.preview": "Így fog kinézni:", "emoji_button.activity": "Tevékenység", @@ -230,7 +255,7 @@ "empty_column.bookmarked_statuses": "Még nincs egyetlen könyvjelzőzött bejegyzésed sem. Ha könyvjelzőzöl egyet, itt fog megjelenni.", "empty_column.community": "A helyi idővonal üres. Tégy közzé valamit nyilvánosan, hogy elindítsd az eseményeket!", "empty_column.direct": "Még nincs egy személyes említésed sem. Küldéskor vagy fogadáskor itt fognak megjelenni.", - "empty_column.domain_blocks": "Még nem lett letiltva egyetlen tartomány sem.", + "empty_column.domain_blocks": "Még nem lett letiltva egyetlen domain sem.", "empty_column.explore_statuses": "Jelenleg semmi sem felkapott. Nézz vissza később!", "empty_column.favourited_statuses": "Még nincs egyetlen kedvenc bejegyzésed sem. Ha kedvencnek jelölsz egyet, itt fog megjelenni.", "empty_column.favourites": "Még senki sem jelölte ezt a bejegyzést kedvencnek. Ha valaki mégis megteszi, itt fogjuk mutatni.", @@ -402,9 +427,15 @@ "loading_indicator.label": "Betöltés…", "media_gallery.toggle_visible": "{number, plural, one {Kép elrejtése} other {Képek elrejtése}}", "moved_to_account_banner.text": "A(z) {disabledAccount} fiókod jelenleg le van tiltva, mert átköltöztél ide: {movedToAccount}.", - "mute_modal.duration": "Időtartam", - "mute_modal.hide_notifications": "Rejtsük el a felhasználótól származó értesítéseket?", - "mute_modal.indefinite": "Határozatlan", + "mute_modal.hide_from_notifications": "Elrejtés az értesítések közül", + "mute_modal.hide_options": "Beállítások elrejtése", + "mute_modal.indefinite": "Amíg nem oldom fel a némítást", + "mute_modal.show_options": "Beállítások megjelenítése", + "mute_modal.they_can_mention_and_follow": "Megemlíthetnek vagy követhetnek téged, de nem fogod őket látni.", + "mute_modal.they_wont_know": "Nem fogják tudni, hogy lenémították őket.", + "mute_modal.title": "Elnémítsuk a felhasználót?", + "mute_modal.you_wont_see_mentions": "Nem látsz majd őket említő bejegyzéseket.", + "mute_modal.you_wont_see_posts": "Továbbra is látni fogják a bejegyzéseidet, de te nem fogod látni az övékét.", "navigation_bar.about": "Névjegy", "navigation_bar.advanced_interface": "Megnyitás a speciális webes felületben", "navigation_bar.blocks": "Letiltott felhasználók", @@ -413,7 +444,7 @@ "navigation_bar.compose": "Új bejegyzés írása", "navigation_bar.direct": "Személyes említések", "navigation_bar.discover": "Felfedezés", - "navigation_bar.domain_blocks": "Letiltott tartományok", + "navigation_bar.domain_blocks": "Letiltott domainek", "navigation_bar.explore": "Felfedezés", "navigation_bar.favourites": "Kedvencek", "navigation_bar.filters": "Némított szavak", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 2ef6d4c777..7310104bf9 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -123,23 +123,18 @@ "compose_form.spoiler.marked": "Տեքստը թաքցուած է զգուշացման ետեւում", "compose_form.spoiler.unmarked": "Տեքստը թաքցուած չէ", "confirmation_modal.cancel": "Չեղարկել", - "confirmations.block.block_and_report": "Արգելափակել եւ բողոքել", "confirmations.block.confirm": "Արգելափակել", - "confirmations.block.message": "Վստա՞հ ես, որ ուզում ես արգելափակել {name}֊ին։", "confirmations.cancel_follow_request.confirm": "Կասեցնել հայցը", "confirmations.delete.confirm": "Ջնջել", "confirmations.delete.message": "Վստա՞հ ես, որ ուզում ես ջնջել այս գրառումը։", "confirmations.delete_list.confirm": "Ջնջել", "confirmations.delete_list.message": "Վստա՞հ ես, որ ուզում ես մշտապէս ջնջել այս ցանկը։", "confirmations.discard_edit_media.confirm": "Չեղարկել", - "confirmations.domain_block.confirm": "Թաքցնել ամբողջ տիրույթը", "confirmations.domain_block.message": "Հաստատ֊հաստա՞տ վստահ ես, որ ուզում ես արգելափակել ամբողջ {domain} տիրոյթը։ Սովորաբար մի երկու թիրախաւորուած արգելափակում կամ լռեցում բաւական է ու նախընտրելի։", "confirmations.edit.confirm": "Խմբագրել", "confirmations.logout.confirm": "Ելք", "confirmations.logout.message": "Համոզո՞ւած ես, որ ուզում ես դուրս գալ", "confirmations.mute.confirm": "Լռեցնել", - "confirmations.mute.explanation": "Սա թաքցնելու ա իրենց գրառումներն, ինչպէս նաեւ իրենց նշող գրառումներն, բայց իրենք միեւնոյն է կը կարողանան հետեւել ձեզ եւ տեսնել ձեր գրառումները։", - "confirmations.mute.message": "Վստա՞հ ես, որ ուզում ես {name}֊ին լռեցնել։", "confirmations.redraft.confirm": "Ջնջել եւ խմբագրել նորից", "confirmations.reply.confirm": "Պատասխանել", "confirmations.reply.message": "Այս պահին պատասխանելը կը չեղարկի ձեր՝ այս պահին անաւարտ հաղորդագրութիւնը։ Համոզուա՞ծ էք։", @@ -302,9 +297,6 @@ "lists.subheading": "Քո ցանկերը", "load_pending": "{count, plural, one {# նոր նիւթ} other {# նոր նիւթ}}", "media_gallery.toggle_visible": "Ցուցադրել/թաքցնել", - "mute_modal.duration": "Տեւողութիւն", - "mute_modal.hide_notifications": "Թաքցնե՞լ ծանուցումներն այս օգտատիրոջից։", - "mute_modal.indefinite": "Անժամկէտ", "navigation_bar.about": "Մասին", "navigation_bar.blocks": "Արգելափակուած օգտատէրեր", "navigation_bar.bookmarks": "Էջանիշեր", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 89285271ff..7418b213e7 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -123,21 +123,17 @@ "compose_form.spoiler.unmarked": "Adder advertimento de contento", "compose_form.spoiler_placeholder": "Advertimento de contento (optional)", "confirmation_modal.cancel": "Cancellar", - "confirmations.block.block_and_report": "Blocar e signalar", "confirmations.block.confirm": "Blocar", - "confirmations.block.message": "Es tu secur que tu vole blocar {name}?", "confirmations.cancel_follow_request.confirm": "Retirar requesta", "confirmations.cancel_follow_request.message": "Es tu secur que tu vole retirar tu requesta a sequer a {name}?", "confirmations.delete.confirm": "Deler", "confirmations.delete.message": "Es tu secur que tu vole deler iste message?", "confirmations.delete_list.confirm": "Deler", "confirmations.delete_list.message": "Es tu secur que tu vole deler permanentemente iste lista?", - "confirmations.domain_block.confirm": "Blocar le dominio complete", "confirmations.edit.confirm": "Modificar", "confirmations.logout.confirm": "Clauder le session", "confirmations.logout.message": "Es tu secur que tu vole clauder le session?", "confirmations.mute.confirm": "Silentiar", - "confirmations.mute.message": "Es tu secur que tu vole silentiar {name}?", "confirmations.reply.confirm": "Responder", "confirmations.unfollow.confirm": "Non plus sequer", "confirmations.unfollow.message": "Es tu secur que tu vole non plus sequer {name}?", @@ -155,6 +151,7 @@ "disabled_account_banner.account_settings": "Parametros de conto", "disabled_account_banner.text": "Tu conto {disabledAccount} es actualmente disactivate.", "dismissable_banner.dismiss": "Dimitter", + "domain_pill.username": "Nomine de usator", "embed.preview": "Hic es como il parera:", "emoji_button.activity": "Activitate", "emoji_button.clear": "Rader", @@ -269,8 +266,6 @@ "lists.subheading": "Tu listas", "loading_indicator.label": "Cargante…", "media_gallery.toggle_visible": "{number, plural, one {Celar imagine} other {Celar imagines}}", - "mute_modal.duration": "Duration", - "mute_modal.hide_notifications": "Celar notificationes de iste usator?", "navigation_bar.about": "A proposito de", "navigation_bar.advanced_interface": "Aperir in un interfacie web avantiate", "navigation_bar.blocks": "Usatores blocate", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index ae2051a376..764c081119 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -140,9 +140,7 @@ "compose_form.spoiler.marked": "Hapus peringatan tentang isi konten", "compose_form.spoiler.unmarked": "Tambahkan peringatan tentang isi konten", "confirmation_modal.cancel": "Batal", - "confirmations.block.block_and_report": "Blokir & Laporkan", "confirmations.block.confirm": "Blokir", - "confirmations.block.message": "Apa Anda yakin ingin memblokir {name}?", "confirmations.cancel_follow_request.confirm": "Batalkan permintaan", "confirmations.cancel_follow_request.message": "Apakah Anda yakin ingin membatalkan permintaan Anda untuk mengikuti {name}?", "confirmations.delete.confirm": "Hapus", @@ -151,14 +149,11 @@ "confirmations.delete_list.message": "Apakah Anda yakin untuk menghapus daftar ini secara permanen?", "confirmations.discard_edit_media.confirm": "Buang", "confirmations.discard_edit_media.message": "Anda belum menyimpan perubahan deskripsi atau pratinjau media, buang saja?", - "confirmations.domain_block.confirm": "Sembunyikan keseluruhan domain", "confirmations.domain_block.message": "Apakah Anda benar-benar yakin untuk memblokir keseluruhan {domain}? Dalam kasus tertentu beberapa pemblokiran atau penyembunyian lebih baik.", "confirmations.edit.confirm": "Ubah", "confirmations.logout.confirm": "Keluar", "confirmations.logout.message": "Apakah Anda yakin ingin keluar?", "confirmations.mute.confirm": "Bisukan", - "confirmations.mute.explanation": "Ini akan menyembunyikan pos dari mereka dan pos yang menyebut mereka, tapi ini tetap mengizinkan mereka melihat posmu dan mengikutimu.", - "confirmations.mute.message": "Apa Anda yakin ingin membisukan {name}?", "confirmations.redraft.confirm": "Hapus dan susun ulang", "confirmations.reply.confirm": "Balas", "confirmations.reply.message": "Membalas sekarang akan menimpa pesan yang sedang Anda buat. Anda yakin ingin melanjutkan?", @@ -340,9 +335,6 @@ "load_pending": "{count, plural, other {# item baru}}", "media_gallery.toggle_visible": "Tampil/Sembunyikan", "moved_to_account_banner.text": "Akun {disabledAccount} Anda kini dinonaktifkan karena Anda pindah ke {movedToAccount}.", - "mute_modal.duration": "Durasi", - "mute_modal.hide_notifications": "Sembunyikan notifikasi dari pengguna ini?", - "mute_modal.indefinite": "Tak terbatas", "navigation_bar.about": "Tentang", "navigation_bar.blocks": "Pengguna diblokir", "navigation_bar.bookmarks": "Markah", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index d0a42b0b35..17f312418d 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -89,6 +89,10 @@ "announcement.announcement": "Proclamation", "attachments_list.unprocessed": "(íntractat)", "audio.hide": "Celar audio", + "block_modal.show_less": "Monstrar minu", + "block_modal.show_more": "Monstrar plu", + "block_modal.title": "Bloccar usator?", + "block_modal.you_wont_see_mentions": "Tu ne va vider postas mentionant li usator.", "boost_modal.combo": "Li proxim vez tu posse pressar {combo} por passar to-ci", "bundle_column_error.copy_stacktrace": "Copiar erra-raporte", "bundle_column_error.error.body": "Li demandat págine ne posset esser rendit. Fórsan it es un problema in nor code, o un problema de compatibilitá con li navigator.", @@ -160,9 +164,7 @@ "compose_form.spoiler.unmarked": "Adjunter avise pri li contenete", "compose_form.spoiler_placeholder": "Advertiment de contenete (optional)", "confirmation_modal.cancel": "Anullar", - "confirmations.block.block_and_report": "Bloccar & Raportar", "confirmations.block.confirm": "Bloccar", - "confirmations.block.message": "Esque tu vermen vole bloccar {name}?", "confirmations.cancel_follow_request.confirm": "Retraer petition", "confirmations.cancel_follow_request.message": "Esque tu vermen vole retraer tui petition sequer {name}?", "confirmations.delete.confirm": "Deleter", @@ -171,15 +173,13 @@ "confirmations.delete_list.message": "Esque tu vermen vole permanentmen deleter ti-ci liste?", "confirmations.discard_edit_media.confirm": "Forjettar", "confirmations.discard_edit_media.message": "Tu have ínconservat changes al descrition de medie o al previse, forjettar les sin egarda?", - "confirmations.domain_block.confirm": "Bloccar li tot dominia", + "confirmations.domain_block.confirm": "Bloccar servitor", "confirmations.domain_block.message": "Esque tu es certissim que tu vole bloccar li tot {domain}? In mult casus, bloccar o silentiar quelc specific contos es suficent e preferibil. Tu ne va vider contenete de ti dominia in quelcunc public témpor-linea o in tui notificationes. Tui sequitores de ti dominia va esser removet.", "confirmations.edit.confirm": "Redacter", "confirmations.edit.message": "Redacter nu va remplazzar li missage quel tu actualmen composi. Esque tu vermen vole proceder?", "confirmations.logout.confirm": "Exear", "confirmations.logout.message": "Esque tu vermen vole exear?", "confirmations.mute.confirm": "Silentiar", - "confirmations.mute.explanation": "To-ci va celar postas de ilu e postas mentionant ilu, ma it ancor va permisser ilu vider tui postas e sequer te.", - "confirmations.mute.message": "Esque tu vermen vole silentiar {name}?", "confirmations.redraft.confirm": "Deleter & redacter", "confirmations.redraft.message": "Esque tu vermen vole deleter ti-ci posta e redacter it? Favorites e boosts va esser perdit, e responses al posta original va esser orfanat.", "confirmations.reply.confirm": "Responder", @@ -205,6 +205,7 @@ "dismissable_banner.explore_statuses": "Tis-ci es postas del social retage queles es popular hodie. Nov postas con plu mult boosts e favorites es monstrat plu alt.", "dismissable_banner.explore_tags": "Tis-ci es hashtags queles es popular che li social retage hodie. Hashtags usat de plu mult persones diferent es monstrat plu alt.", "dismissable_banner.public_timeline": "Tis-ci es li max recent public postas de persones che li social retage quem gente che {domain} seque.", + "domain_block_modal.block": "Bloccar servitor", "embed.instructions": "Inbedar ti-ci posta per copiar li code in infra.", "embed.preview": "Vi qualmen it va aspecter:", "emoji_button.activity": "Activitá", @@ -399,9 +400,6 @@ "loading_indicator.label": "Cargant…", "media_gallery.toggle_visible": "{number, plural, one {Celar image} other {Celar images}}", "moved_to_account_banner.text": "Tui conto {disabledAccount} es actualmen desactivisat pro que tu movet te a {movedToAccount}.", - "mute_modal.duration": "Duration", - "mute_modal.hide_notifications": "Celar notificationes de ti-ci usator?", - "mute_modal.indefinite": "Índefinit", "navigation_bar.about": "Information", "navigation_bar.advanced_interface": "Aperter in li web-interfacie avansat", "navigation_bar.blocks": "Bloccat usatores", diff --git a/app/javascript/mastodon/locales/ig.json b/app/javascript/mastodon/locales/ig.json index a4f7268422..a9b300fa4f 100644 --- a/app/javascript/mastodon/locales/ig.json +++ b/app/javascript/mastodon/locales/ig.json @@ -37,7 +37,6 @@ "confirmations.delete.confirm": "Hichapụ", "confirmations.delete.message": "Are you sure you want to delete this status?", "confirmations.delete_list.confirm": "Hichapụ", - "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.edit.confirm": "Dezie", "confirmations.mute.confirm": "Mee ogbi", "confirmations.reply.confirm": "Zaa", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 5d0b231ed1..3382fa1aec 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -149,9 +149,7 @@ "compose_form.spoiler.marked": "Text is hidden behind warning", "compose_form.spoiler.unmarked": "Text is not hidden", "confirmation_modal.cancel": "Anulez", - "confirmations.block.block_and_report": "Restriktez e Raportizez", "confirmations.block.confirm": "Restriktez", - "confirmations.block.message": "Ka vu certe volas restrikar {name}?", "confirmations.cancel_follow_request.confirm": "Desendez demando", "confirmations.cancel_follow_request.message": "Ka vu certe volas desendar vua demando di sequar {name}?", "confirmations.delete.confirm": "Efacez", @@ -160,15 +158,12 @@ "confirmations.delete_list.message": "Ka vu certe volas netempale efacar ca listo?", "confirmations.discard_edit_media.confirm": "Efacez", "confirmations.discard_edit_media.message": "Vu havas nesparita chanji di mediodeskript o prevido, vu volas jus efacar?", - "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", "confirmations.edit.confirm": "Modifikez", "confirmations.edit.message": "Modifikar nun remplasos la mesajo quon vu nune skribas. Ka vu certe volas procedar?", "confirmations.logout.confirm": "Ekirez", "confirmations.logout.message": "Ka tu certe volas ekirar?", "confirmations.mute.confirm": "Silencigez", - "confirmations.mute.explanation": "Co celigos posti de oli e posti quo mencionas oli, ma ol ankore permisas oli vidar vua posti e sequar vu.", - "confirmations.mute.message": "Ka vu certe volas silencigar {name}?", "confirmations.redraft.confirm": "Efacez e riskisez", "confirmations.redraft.message": "Ka vu certe volas efacar ca posto e riskisigar ol? Favoriziti e repeti esos perdita, e respondi al posto originala esos orfanigita.", "confirmations.reply.confirm": "Respondez", @@ -377,9 +372,6 @@ "loading_indicator.label": "Kargante…", "media_gallery.toggle_visible": "Chanjar videbleso", "moved_to_account_banner.text": "Vua konto {disabledAccount} es nune desaktiva pro ke vu movis a {movedToAccount}.", - "mute_modal.duration": "Durado", - "mute_modal.hide_notifications": "Celez avizi de ca uzanto?", - "mute_modal.indefinite": "Nedefinitiva", "navigation_bar.about": "Pri co", "navigation_bar.advanced_interface": "Apertez per retintervizajo", "navigation_bar.blocks": "Blokusita uzeri", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index cf2d0281f8..d050aa0311 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -89,6 +89,14 @@ "announcement.announcement": "Auglýsing", "attachments_list.unprocessed": "(óunnið)", "audio.hide": "Fela hljóð", + "block_modal.remote_users_caveat": "Við munum biðja {domain} netþjóninn um að virða ákvörðun þína. Hitt er svo annað mál hvort hann fari eftir þessu, ekki er hægt að tryggja eftirfylgni því sumir netþjónar meðhöndla útilokanir á sinn hátt. Opinberar færslur gætu verið sýnilegar notendum sem ekki eru skráðir inn.", + "block_modal.show_less": "Sýna minna", + "block_modal.show_more": "Sýna meira", + "block_modal.they_cant_mention": "Viðkomandi geta ekki minnst á þig eða fylgst með þér.", + "block_modal.they_cant_see_posts": "Viðkomandi geta ekki séð færslurnar þínar og þú ekki þeirra.", + "block_modal.they_will_know": "Viðkomandi geta séð að þeir eru útilokaðir.", + "block_modal.title": "Útiloka notanda?", + "block_modal.you_wont_see_mentions": "Þú munt ekki sjá færslur sem minnast á viðkomandi aðila.", "boost_modal.combo": "Þú getur ýtt á {combo} til að sleppa þessu næst", "bundle_column_error.copy_stacktrace": "Afrita villuskýrslu", "bundle_column_error.error.body": "Umbeðna síðau var ekki hægt að myndgera. Það gæti verið vegna villu í kóðanum okkar eða vandamáls með samhæfni vafra.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Bæta við aðvörun vegna efnis", "compose_form.spoiler_placeholder": "Aðvörun vegna efnis (valkvætt)", "confirmation_modal.cancel": "Hætta við", - "confirmations.block.block_and_report": "Útiloka og kæra", "confirmations.block.confirm": "Útiloka", - "confirmations.block.message": "Ertu viss um að þú viljir loka á {name}?", "confirmations.cancel_follow_request.confirm": "Taka beiðni til baka", "confirmations.cancel_follow_request.message": "Ertu viss um að þú viljir taka til baka beiðnina um að fylgjast með {name}?", "confirmations.delete.confirm": "Eyða", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Ertu viss um að þú viljir eyða þessum lista endanlega?", "confirmations.discard_edit_media.confirm": "Henda", "confirmations.discard_edit_media.message": "Þú ert með óvistaðar breytingar á lýsingu myndefnis eða forskoðunar, henda þeim samt?", - "confirmations.domain_block.confirm": "Útiloka allt lénið", + "confirmations.domain_block.confirm": "Útiloka netþjón", "confirmations.domain_block.message": "Ertu alveg algjörlega viss um að þú viljir loka á allt {domain}? Í flestum tilfellum er vænlegra að nota færri en markvissari útilokanir eða að þagga niður tiltekna aðila. Þú munt ekki sjá efni frá þessu léni í neinum opinberum tímalínum eða í tilkynningunum þínum. Fylgjendur þínir frá þessu léni verða fjarlægðir.", "confirmations.edit.confirm": "Breyta", "confirmations.edit.message": "Ef þú breytir núna verður skrifað yfir skilaboðin sem þú ert að semja núna. Ertu viss um að þú viljir halda áfram?", "confirmations.logout.confirm": "Skrá út", "confirmations.logout.message": "Ertu viss um að þú viljir skrá þig út?", "confirmations.mute.confirm": "Þagga", - "confirmations.mute.explanation": "Þetta mun fela færslur frá þeim og þær færslur þar sem minnst er á þau, en það mun samt sem áður gera þeim kleift að sjá færslurnar þínar og að fylgjast með þér.", - "confirmations.mute.message": "Ertu viss um að þú viljir þagga niður í {name}?", "confirmations.redraft.confirm": "Eyða og endurvinna drög", "confirmations.redraft.message": "Ertu viss um að þú viljir eyða þessari færslu og enduvinna drögin? Eftirlæti og endurbirtingar munu glatast og svör við upprunalegu færslunni munu verða munaðarlaus.", "confirmations.reply.confirm": "Svara", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Þessar færslur frá þessum og öðrum netþjónum á dreifhýsta netkerfinu eru að fá aukna athygli í þessu töluðum orðum.", "dismissable_banner.explore_tags": "Þetta eru myllumerki sem í augnablikinu eru að fá aukna athygli hjá fólki á þessum og öðrum netþjónum á dreifhýsta netkerfinu.", "dismissable_banner.public_timeline": "Þetta eru nýjustu opinberu færslurnar frá fólki á samfélagsnetinu sem fólk á {domain} fylgjast með.", + "domain_block_modal.block": "Útiloka netþjón", + "domain_block_modal.block_account_instead": "Útiloka {name} í staðinn", + "domain_block_modal.they_can_interact_with_old_posts": "Fólk frá þessum netþjóni getur sýslað með eldri færslur þínar.", + "domain_block_modal.they_cant_follow": "Enginn frá þessum netþjóni getur fylgst með þér.", + "domain_block_modal.they_wont_know": "Viðkomandi mun ekki vita að hann hafi verið útilokaður.", + "domain_block_modal.title": "Útiloka lén?", + "domain_block_modal.you_will_lose_followers": "Allir fylgjendur þínir af þessum netþjóni verða fjarlægðir.", + "domain_block_modal.you_wont_see_posts": "Þú munt ekki sjá neinar færslur eða tilkynningar frá notendum á þessum netþjóni.", + "domain_pill.activitypub_lets_connect": "Það gerir þér kleift að tengjast og eiga í samskiptum við fólk, ekki bara á Mastodon, heldur einnig á mörgum öðrum mismunandi samfélagsmiðlum.", + "domain_pill.activitypub_like_language": "ActivityPub er eins og tungumál sem Mastodon notar til að tala við önnur samfélagsnet.", + "domain_pill.server": "Netþjónn", + "domain_pill.their_handle": "Kennislóðin þeirra:", + "domain_pill.their_server": "Stafrænt heimili viðkomandi, þar sem allar færslur hans eru hýstar.", + "domain_pill.their_username": "Sértækt auðkenni viðkomandi á netþjóni hans. Það er mögulegt að finna notendur með sama notandanafn á mismunandi netþjónum.", + "domain_pill.username": "Notandanafn", + "domain_pill.whats_in_a_handle": "Hvað er í kennislóð (handle)?", + "domain_pill.who_they_are": "Vegna þess að kennislóðir segja hver einhver sé og hvar hann sé að finna, getur þú átt í samskiptum við fólk í gegnum samfélagsvef sem knúinn er af .", + "domain_pill.who_you_are": "Vegna þess að kennislóðin þín segir hver þú sért og hvar þig sé að finna, getur fólk átt í samskiptum við þig í gegnum samfélagsvef sem knúinn er af .", + "domain_pill.your_handle": "Kennislóðin þín:", + "domain_pill.your_server": "Stafrænt heimili þitt, þar sem allar færslur þínar eru hýstar. Kanntu ekki við þennan netþjón? Þú getur flutt þig á milli netþjóna hvenær sem er og tekið með þér alla fylgjendurna þína.", + "domain_pill.your_username": "Sértækt auðkenni þitt á þessum netþjóni. Það er mögulegt að finna notendur með sama notandanafn á mismunandi netþjónum.", "embed.instructions": "Felldu þessa færslu inn í vefsvæðið þitt með því að afrita kóðann hér fyrir neðan.", "embed.preview": "Svona mun þetta líta út:", "emoji_button.activity": "Virkni", @@ -402,9 +427,15 @@ "loading_indicator.label": "Hleð inn…", "media_gallery.toggle_visible": "Víxla sýnileika", "moved_to_account_banner.text": "Aðgangurinn þinn {disabledAccount} er óvirkur í augnablikinu vegna þess að þú fluttir þig yfir á {movedToAccount}.", - "mute_modal.duration": "Lengd", - "mute_modal.hide_notifications": "Fela tilkynningar frá þessum notanda?", - "mute_modal.indefinite": "Óendanlegt", + "mute_modal.hide_from_notifications": "Fela úr tilkynningum", + "mute_modal.hide_options": "Fela valkosti", + "mute_modal.indefinite": "Þar til ég hætti að þagga niður í viðkomandi", + "mute_modal.show_options": "Birta valkosti", + "mute_modal.they_can_mention_and_follow": "Viðkomandi geta minnst á þig og fylgst með þér, en þú munt ekki sjá þá.", + "mute_modal.they_wont_know": "Viðkomandi aðilar munu ekki vita að þaggað hefur verið niður í þeim.", + "mute_modal.title": "Þagga niður í notanda?", + "mute_modal.you_wont_see_mentions": "Þú munt ekki sjá færslur sem minnast á viðkomandi aðila.", + "mute_modal.you_wont_see_posts": "Viðkomandi geta áfram séð færslurnar þínar en þú munt ekki sjá færslurnar þeirra.", "navigation_bar.about": "Um hugbúnaðinn", "navigation_bar.advanced_interface": "Opna í ítarlegu vefviðmóti", "navigation_bar.blocks": "Útilokaðir notendur", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 06825f40dd..3b4ea15f9e 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Aggiungi l'avviso del contenuto", "compose_form.spoiler_placeholder": "Contenuto sensibile (facoltativo)", "confirmation_modal.cancel": "Annulla", - "confirmations.block.block_and_report": "Blocca & Segnala", "confirmations.block.confirm": "Blocca", - "confirmations.block.message": "Sei sicuro di voler bloccare {name}?", "confirmations.cancel_follow_request.confirm": "Annulla la richiesta", "confirmations.cancel_follow_request.message": "Sei sicuro di voler annullare la tua richiesta per seguire {name}?", "confirmations.delete.confirm": "Elimina", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Sei sicuro di voler eliminare permanentemente questa lista?", "confirmations.discard_edit_media.confirm": "Scarta", "confirmations.discard_edit_media.message": "Hai delle modifiche non salvate alla descrizione o anteprima del media, scartarle comunque?", - "confirmations.domain_block.confirm": "Blocca l'intero dominio", "confirmations.domain_block.message": "Sei davvero sicuro di voler bloccare l'intero {domain}? In gran parte dei casi, è sufficiente e preferibile bloccare o silenziare alcuni profili. Non visualizzerai i contenuti da quel dominio in alcuna cronologia pubblica o tra le tue notifiche. I tuoi seguaci da quel dominio saranno rimossi.", "confirmations.edit.confirm": "Modifica", "confirmations.edit.message": "Modificare ora sovrascriverà il messaggio che stai correntemente componendo. Sei sicuro di voler procedere?", "confirmations.logout.confirm": "Disconnettiti", "confirmations.logout.message": "Sei sicuro di volerti disconnettere?", "confirmations.mute.confirm": "Silenzia", - "confirmations.mute.explanation": "Questo nasconderà i post da loro e i post che li menzionano, ma consentirà comunque loro di visualizzare i tuoi post e di seguirti.", - "confirmations.mute.message": "Sei sicuro di voler silenziare {name}?", "confirmations.redraft.confirm": "Elimina e riscrivi", "confirmations.redraft.message": "Sei sicuro di voler eliminare questo post e riscriverlo? I preferiti e i boost andranno persi e le risposte al post originale non saranno più collegate.", "confirmations.reply.confirm": "Rispondi", @@ -402,9 +397,6 @@ "loading_indicator.label": "Caricamento…", "media_gallery.toggle_visible": "{number, plural, one {Nascondi immagine} other {Nascondi immagini}}", "moved_to_account_banner.text": "Il tuo profilo {disabledAccount} è correntemente disabilitato perché ti sei spostato a {movedToAccount}.", - "mute_modal.duration": "Durata", - "mute_modal.hide_notifications": "Nascondere le notifiche da questo utente?", - "mute_modal.indefinite": "Per sempre", "navigation_bar.about": "Info", "navigation_bar.advanced_interface": "Apri nell'interfaccia web avanzata", "navigation_bar.blocks": "Utenti bloccati", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index ba32c7c492..66811eafd6 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "本文は隠されていません", "compose_form.spoiler_placeholder": "閲覧注意 (オプション)", "confirmation_modal.cancel": "キャンセル", - "confirmations.block.block_and_report": "ブロックし通報", "confirmations.block.confirm": "ブロック", - "confirmations.block.message": "本当に{name}さんをブロックしますか?", "confirmations.cancel_follow_request.confirm": "フォローリクエストを取り消す", "confirmations.cancel_follow_request.message": "{name}に対するフォローリクエストを取り消しますか?", "confirmations.delete.confirm": "削除", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "本当にこのリストを完全に削除しますか?", "confirmations.discard_edit_media.confirm": "破棄", "confirmations.discard_edit_media.message": "メディアの説明またはプレビューに保存されていない変更があります。それでも破棄しますか?", - "confirmations.domain_block.confirm": "ドメイン全体をブロック", "confirmations.domain_block.message": "本当に{domain}全体を非表示にしますか? 多くの場合は個別にブロックやミュートするだけで充分であり、また好ましいです。公開タイムラインにそのドメインのコンテンツが表示されなくなり、通知も届かなくなります。そのドメインのフォロワーはアンフォローされます。", "confirmations.edit.confirm": "編集", "confirmations.edit.message": "今編集すると現在作成中のメッセージが上書きされます。本当に実行しますか?", "confirmations.logout.confirm": "ログアウト", "confirmations.logout.message": "本当にログアウトしますか?", "confirmations.mute.confirm": "ミュート", - "confirmations.mute.explanation": "これにより相手の投稿と返信は見えなくなりますが、相手はあなたをフォローし続け投稿を見ることができます。", - "confirmations.mute.message": "本当に{name}さんをミュートしますか?", "confirmations.redraft.confirm": "削除して下書きに戻す", "confirmations.redraft.message": "投稿を削除して下書きに戻します。この投稿へのお気に入り登録やブーストは失われ、返信は孤立することになります。よろしいですか?", "confirmations.reply.confirm": "返信", @@ -402,9 +397,6 @@ "loading_indicator.label": "読み込み中…", "media_gallery.toggle_visible": "{number, plural, one {画像を閉じる} other {画像を閉じる}}", "moved_to_account_banner.text": "あなたのアカウント『{disabledAccount}』は『{movedToAccount}』に移動したため現在無効になっています。", - "mute_modal.duration": "ミュートする期間", - "mute_modal.hide_notifications": "このユーザーからの通知を隠しますか?", - "mute_modal.indefinite": "無期限", "navigation_bar.about": "概要", "navigation_bar.advanced_interface": "上級者向けUIに戻る", "navigation_bar.blocks": "ブロックしたユーザー", @@ -481,7 +473,7 @@ "notifications.policy.filter_new_accounts_title": "新しいアカウントからの通知をブロックする", "notifications.policy.filter_not_followers_hint": "フォローされていても、フォローから{days, plural, other {#日}}経っていない場合はブロックされます", "notifications.policy.filter_not_followers_title": "フォローされていないアカウントからの通知をブロックする", - "notifications.policy.filter_not_following_hint": "手動で受け入れたアカウントはブロックされません", + "notifications.policy.filter_not_following_hint": "手動で通知を受け入れたアカウントはブロックされません", "notifications.policy.filter_not_following_title": "フォローしていないアカウントからの通知をブロックする", "notifications.policy.filter_private_mentions_hint": "あなたがメンションした相手からの返信、およびフォローしているアカウントからの返信以外がブロックされます", "notifications.policy.filter_private_mentions_title": "外部からの非公開の返信をブロックする", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index 964a764a93..7af4dccd86 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -71,15 +71,12 @@ "compose_form.spoiler.unmarked": "ტექსტი არაა დამალული", "confirmation_modal.cancel": "უარყოფა", "confirmations.block.confirm": "ბლოკი", - "confirmations.block.message": "დარწმუნებული ხართ, გსურთ დაბლოკოთ {name}?", "confirmations.delete.confirm": "გაუქმება", "confirmations.delete.message": "დარწმუნებული ხართ, გსურთ გააუქმოთ ეს სტატუსი?", "confirmations.delete_list.confirm": "გაუქმება", "confirmations.delete_list.message": "დარწმუნებული ხართ, გსურთ სამუდამოდ გააუქმოთ ეს სია?", - "confirmations.domain_block.confirm": "მთელი დომენის დამალვა", "confirmations.domain_block.message": "ნაღდად, ნაღდად, დარწმუნებული ხართ, გსურთ დაბლოკოთ მთელი {domain}? უმეტეს შემთხვევაში რამდენიმე გამიზნული ბლოკი ან გაჩუმება საკმარისი და უკეთესია. კონტენტს ამ დომენიდან ვერ იხილავთ ვერც ერთ ღია თაიმლაინზე ან თქვენს შეტყობინებებში. ამ დომენიდან არსებული მიმდევრები ამოიშლება.", "confirmations.mute.confirm": "გაჩუმება", - "confirmations.mute.message": "დარწმუნებული ხართ, გსურთ გააჩუმოთ {name}?", "confirmations.redraft.confirm": "გაუქმება და გადანაწილება", "confirmations.unfollow.confirm": "ნუღარ მიჰყვები", "confirmations.unfollow.message": "დარწმუნებული ხართ, აღარ გსურთ მიჰყვებოდეთ {name}-ს?", @@ -160,7 +157,6 @@ "lists.search": "ძებნა ადამიანებს შორის რომელთაც მიჰყვებით", "lists.subheading": "თქვენი სიები", "media_gallery.toggle_visible": "ხილვადობის ჩართვა", - "mute_modal.hide_notifications": "დავმალოთ შეტყობინებები ამ მომხმარებლისგან?", "navigation_bar.blocks": "დაბლოკილი მომხმარებლები", "navigation_bar.community_timeline": "ლოკალური თაიმლაინი", "navigation_bar.compose": "Compose new toot", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 0d719b71b1..fbe60c3bdd 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -67,6 +67,11 @@ "alert.unexpected.title": "Ayhuh!", "announcement.announcement": "Ulɣu", "audio.hide": "Ffer amesli", + "block_modal.show_less": "Ssken-d drus", + "block_modal.show_more": "Ssken-d ugar", + "block_modal.they_cant_mention": "Ur zmiren ad k·m-id-bedren, ur zmiren ad k·m-ḍefren.", + "block_modal.they_cant_see_posts": "Ur zmiren ad walin tisufaɣ-nwen, ur tettwalim tid-nsen.", + "block_modal.title": "Sewḥel aseqdac ?", "boost_modal.combo": "Tzemreḍ ad tsiteḍ ɣef {combo} akken ad tzegleḍ aya tikelt i d-iteddun", "bundle_column_error.copy_stacktrace": "Nɣel tuccḍa n uneqqis", "bundle_column_error.error.title": "Uh, ala !", @@ -129,22 +134,18 @@ "compose_form.spoiler.marked": "Kkes aḍris yettwaffren deffir n walɣu", "compose_form.spoiler.unmarked": "Rnu aḍris yettwaffren deffir n walɣu", "confirmation_modal.cancel": "Sefsex", - "confirmations.block.block_and_report": "Sewḥel & sewɛed", "confirmations.block.confirm": "Sewḥel", - "confirmations.block.message": "Tebɣiḍ s tidet ad tesḥebseḍ {name}?", "confirmations.delete.confirm": "Kkes", "confirmations.delete.message": "Tebɣiḍ s tidet ad tekkseḍ tasuffeɣt-agi?", "confirmations.delete_list.confirm": "Kkes", "confirmations.delete_list.message": "Tebɣiḍ s tidet ad tekkseḍ umuɣ-agi i lebda?", "confirmations.discard_edit_media.confirm": "Sefsex", - "confirmations.domain_block.confirm": "Ffer taɣult meṛṛa", + "confirmations.domain_block.confirm": "Sewḥel aqeddac", "confirmations.edit.confirm": "Ẓreg", "confirmations.edit.message": "Abeddel tura ad d-yaru izen-nni i d-tegreḍ akka tura. Tetḥeqqeḍ tebɣiḍ ad tkemmleḍ?", "confirmations.logout.confirm": "Ffeɣ", "confirmations.logout.message": "D tidet tebɣiḍ ad teffɣeḍ?", "confirmations.mute.confirm": "Sgugem", - "confirmations.mute.explanation": "Aya ad yeffer iznan-is d wid i deg d-yettwabder neɣ d-tettwabder, maca xas akka yezmer neɣ tezmer awali n yiznan-inek d uḍfaṛ-ik.", - "confirmations.mute.message": "Tetḥeqqeḍ belli tebɣiḍ ad ttegugmeḍ {name}?", "confirmations.redraft.confirm": "Sfeḍ & Ɛiwed tira", "confirmations.reply.confirm": "Err", "confirmations.reply.message": "Tiririt akka tura ad k-degger izen-agi i tettaruḍ. Tebɣiḍ ad tkemmleḍ?", @@ -166,6 +167,12 @@ "dismissable_banner.explore_links": "D tiqsiḍin n yisallen i yettwabḍan ass-a deg web inmetti. Tiqsiḍin n yisallen timaynutin i d-yettwassufɣen s wugar n medden yemgaraden, d tid i d-yufraren ugar.", "dismissable_banner.explore_statuses": "Ti d tisufaɣ seg uzeṭṭa anmetti i d-yettawin tamyigawt ass-a. Tisufaɣ timaynutin yesεan aṭas n lǧehd d tid iḥemmlen s waṭas, ttwaεlayit d timezwura.", "dismissable_banner.explore_tags": "D wiyi i d ihacṭagen i d-yettawin tamyigawt deg web anmetti ass-a. Ihacṭagen i sseqdacen ugar n medden, εlayit d imezwura.", + "domain_block_modal.block": "Sewḥel aqeddac", + "domain_block_modal.they_cant_follow": "Yiwen ur yezmir ad k·m-id-yeḍfer seg uqeddac-a.", + "domain_pill.activitypub_like_language": "ActivityPub am tutlayt yettmeslay Mastodon d izeḍwan inmettiyen nniḍen.", + "domain_pill.server": "Aqeddac", + "domain_pill.username": "Isem n useqdac", + "domain_pill.your_server": "D axxam-inek·inem umḍin, anda i zedɣent akk tsuffaɣ-ik·im. Ur k·m-yeεǧib ara wa? Ssenfel-d iqeddacen melmi i ak·m-yehwa, awi-d daɣen ineḍfaren-ik·im yid-k·m.", "embed.instructions": "Ẓẓu addad-agi deg usmel-inek s wenγal n tangalt yellan sdaw-agi.", "embed.preview": "Akka ara d-iban:", "emoji_button.activity": "Aqeddic", @@ -209,9 +216,11 @@ "explore.trending_tags": "Ihacṭagen", "filter_modal.added.review_and_configure_title": "Iɣewwaṛen n imzizdig", "filter_modal.added.settings_link": "asebter n yiɣewwaṛen", + "filter_modal.added.short_explanation": "Tasuffeɣt-a tettwarna ɣer taggayt-a n yimsizdegen: {title}.", "filter_modal.select_filter.expired": "yemmut", "filter_modal.select_filter.prompt_new": "Taggayt tamaynutt : {name}", "filter_modal.select_filter.search": "Nadi neɣ snulfu-d", + "filter_modal.select_filter.title": "Sizdeg tassufeɣt-a", "firehose.all": "Akk", "firehose.local": "Deg uqeddac-ayi", "firehose.remote": "Iqeddacen nniḍen", @@ -248,6 +257,7 @@ "home.column_settings.show_replies": "Ssken-d tiririyin", "home.hide_announcements": "Ffer ulɣuyen", "home.pending_critical_update.body": "Ma ulac aɣilif, leqqem aqeddac-ik Mastodon akken kan tzemreḍ !", + "home.pending_critical_update.link": "Wali ileqman", "home.show_announcements": "Ssken-d ulɣuyen", "interaction_modal.description.favourite": "S umiḍan ɣef Mastodon, tzemreḍ ad tesmenyifeḍ tasuffeɣt-a akken ad teǧǧeḍ amaru ad iẓer belli tḥemmleḍ-tt u ad tt-id-tsellkeḍ i ticki.", "interaction_modal.description.follow": "S umiḍan deg Mastodon, tzemreḍ ad tḍefreḍ {name} akken ad d-teṭṭfeḍ iznan-is deg lxiḍ-ik·im agejdan.", @@ -321,9 +331,9 @@ "load_pending": "{count, plural, one {# n uferdis amaynut} other {# n yiferdisen imaynuten}}", "loading_indicator.label": "Yessalay-d …", "media_gallery.toggle_visible": "{number, plural, one {Ffer tugna} other {Ffer tugniwin}}", - "mute_modal.duration": "Tanzagt", - "mute_modal.hide_notifications": "Tebɣiḍ ad teffreḍ talɣutin n umseqdac-a?", - "mute_modal.indefinite": "Ur yettwasbadu ara", + "mute_modal.hide_options": "Ffer tinefrunin", + "mute_modal.show_options": "Sken-d tinefrunin", + "mute_modal.title": "Sgugem aseqdac?", "navigation_bar.about": "Ɣef", "navigation_bar.blocks": "Iseqdacen yettusḥebsen", "navigation_bar.bookmarks": "Ticraḍ", @@ -371,6 +381,7 @@ "notifications.column_settings.show": "Ssken-d tilɣa deg ujgu", "notifications.column_settings.sound": "Rmed imesli", "notifications.column_settings.status": "Tisuffaɣ timaynutin :", + "notifications.column_settings.unread_notifications.category": "Ilɣa ur nettwaɣra", "notifications.filter.all": "Akk", "notifications.filter.boosts": "Seǧhed", "notifications.filter.favourites": "Imenyafen", @@ -389,7 +400,7 @@ "notifications.policy.filter_not_following_hint": "Alamma tqebleḍ-ten s ufus", "notifications.policy.filter_not_following_title": "Wid akked tid ur tettḍafareḍ ara", "notifications.policy.filter_private_mentions_title": "Abdar uslig ur yettwasferken ara", - "notifications.policy.title": "Sizdeg ilɣa seg …", + "notifications.policy.title": "Sizdeg ilɣa sɣur …", "notifications_permission_banner.enable": "Rmed talɣutin n tnarit", "notifications_permission_banner.title": "Ur zeggel acemma", "onboarding.action.back": "Tuɣalin ɣer deffir", @@ -398,7 +409,7 @@ "onboarding.actions.go_to_home": "Go to your home feed", "onboarding.compose.template": "Azul a #Mastodon!", "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", - "onboarding.follows.title": "Popular on Mastodon", + "onboarding.follows.title": "Ttwassnen deg Mastodon", "onboarding.profile.display_name": "Isem ara d-yettwaskanen", "onboarding.profile.note": "Tameddurt", "onboarding.profile.note_hint": "Tzemreḍ ad d-@tbedreḍ imdanen niḍen neɣ #ihacṭagen …", @@ -414,7 +425,7 @@ "onboarding.start.title": "Tseggmeḍ-tt !", "onboarding.steps.follow_people.body": "Aḍfer n medden yelhan, d tikti n Mastodon.", "onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}", - "onboarding.steps.publish_status.body": "Say hello to the world.", + "onboarding.steps.publish_status.body": "Ini-as azul i umaḍal s uḍris, s tiwlafin, s tividyutin neɣ s tefranin {emoji}", "onboarding.steps.publish_status.title": "Aru tasuffeɣt-inek·inem tamezwarutt", "onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.", "onboarding.steps.setup_profile.title": "Customize your profile", @@ -507,6 +518,7 @@ "status.edit": "Ẓreg", "status.edited_x_times": "Tettwaẓreg {count, plural, one {{count} n tikkelt} other {{count} n tikkal}}", "status.embed": "Seddu", + "status.filter": "Sizdeg tassufeɣt-a", "status.filtered": "Yettwasizdeg", "status.hide": "Ffer tasuffeɣt", "status.load_more": "Sali ugar", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index f71c10f916..bd0a806cdb 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -105,20 +105,15 @@ "compose_form.spoiler.marked": "Мәтін ескертумен жасырылған", "compose_form.spoiler.unmarked": "Мәтін жасырылмаған", "confirmation_modal.cancel": "Қайтып алу", - "confirmations.block.block_and_report": "Блок және Шағым", "confirmations.block.confirm": "Бұғаттау", - "confirmations.block.message": "{name} атты қолданушыны бұғаттайтыныңызға сенімдісіз бе?", "confirmations.delete.confirm": "Өшіру", "confirmations.delete.message": "Бұл жазбаны өшіресіз бе?", "confirmations.delete_list.confirm": "Өшіру", "confirmations.delete_list.message": "Бұл тізімді жоясыз ба шынымен?", - "confirmations.domain_block.confirm": "Бұл доменді бұғатта", "confirmations.domain_block.message": "Бұл домендегі {domain} жазбаларды шынымен бұғаттайсыз ба? Кейде үнсіз қылып тастау да жеткілікті.", "confirmations.logout.confirm": "Шығу", "confirmations.logout.message": "Шығатыныңызға сенімдісіз бе?", "confirmations.mute.confirm": "Үнсіз қылу", - "confirmations.mute.explanation": "Олардың посттары же олар туралы меншндар сізге көрінбейді, бірақ олар сіздің посттарды көре алады және жазыла алады.", - "confirmations.mute.message": "{name} атты қолданушы үнсіз болсын ба?", "confirmations.redraft.confirm": "Өшіруді құптау", "confirmations.reply.confirm": "Жауап", "confirmations.reply.message": "Жауабыңыз жазып жатқан жазбаңыздың үстіне кетеді. Жалғастырамыз ба?", @@ -234,7 +229,6 @@ "lists.subheading": "Тізімдеріңіз", "load_pending": "{count, plural, one {# жаңа нәрсе} other {# жаңа нәрсе}}", "media_gallery.toggle_visible": "Көрінуді қосу", - "mute_modal.hide_notifications": "Бұл қолданушы ескертпелерін жасырамыз ба?", "navigation_bar.blocks": "Бұғатталғандар", "navigation_bar.bookmarks": "Бетбелгілер", "navigation_bar.community_timeline": "Жергілікті желі", diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json index 396aebbdf2..ceb0f8b9b6 100644 --- a/app/javascript/mastodon/locales/kn.json +++ b/app/javascript/mastodon/locales/kn.json @@ -31,7 +31,6 @@ "compose_form.spoiler.marked": "Text is hidden behind warning", "compose_form.spoiler.unmarked": "Text is not hidden", "confirmations.delete.message": "Are you sure you want to delete this status?", - "confirmations.domain_block.confirm": "Hide entire domain", "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", "embed.instructions": "Embed this status on your website by copying the code below.", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index a96b146ac2..5fd28cfd81 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -89,6 +89,14 @@ "announcement.announcement": "공지사항", "attachments_list.unprocessed": "(처리 안 됨)", "audio.hide": "소리 숨기기", + "block_modal.remote_users_caveat": "우리는 {domain} 서버가 당신의 결정을 존중해 주길 부탁할 것입니다. 하지만 몇몇 서버는 차단을 다르게 취급할 수 있기 때문에 규정이 준수되는 것을 보장할 수는 없습니다. 공개 게시물은 로그인 하지 않은 사용자들에게 여전히 보여질 수 있습니다.", + "block_modal.show_less": "간략히 보기", + "block_modal.show_more": "더 보기", + "block_modal.they_cant_mention": "나를 멘션하거나 팔로우 할 수 없습니다.", + "block_modal.they_cant_see_posts": "내가 작성한 게시물을 볼 수 없고 나도 그가 작성한 게시물을 보지 않게 됩니다.", + "block_modal.they_will_know": "자신이 차단 당했다는 사실을 확인할 수 있습니다.", + "block_modal.title": "사용자를 차단할까요?", + "block_modal.you_wont_see_mentions": "그를 멘션하는 게시물을 더는 보지 않습니다.", "boost_modal.combo": "다음엔 {combo}를 눌러서 이 과정을 건너뛸 수 있습니다", "bundle_column_error.copy_stacktrace": "에러 리포트 복사하기", "bundle_column_error.error.body": "요청한 페이지를 렌더링 할 수 없습니다. 저희의 코드에 버그가 있거나, 브라우저 호환성 문제일 수 있습니다.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "열람 주의 문구 추가", "compose_form.spoiler_placeholder": "내용 경고 (선택사항)", "confirmation_modal.cancel": "취소", - "confirmations.block.block_and_report": "차단하고 신고하기", "confirmations.block.confirm": "차단", - "confirmations.block.message": "정말로 {name}를 차단하시겠습니까?", "confirmations.cancel_follow_request.confirm": "요청 삭제", "confirmations.cancel_follow_request.message": "정말 {name}님에 대한 팔로우 요청을 취소하시겠습니까?", "confirmations.delete.confirm": "삭제", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "정말로 이 리스트를 영구적으로 삭제하시겠습니까?", "confirmations.discard_edit_media.confirm": "저장 안함", "confirmations.discard_edit_media.message": "미디어 설명이나 미리보기에 대한 저장하지 않은 변경사항이 있습니다. 버리시겠습니까?", - "confirmations.domain_block.confirm": "도메인 전체를 차단", + "confirmations.domain_block.confirm": "서버 차단", "confirmations.domain_block.message": "정말로 {domain} 전체를 차단하시겠습니까? 대부분의 경우 개별 차단이나 뮤트로 충분합니다. 모든 공개 타임라인과 알림에서 해당 도메인에서 작성된 콘텐츠를 보지 못합니다. 해당 도메인에 속한 팔로워와의 관계가 사라집니다.", "confirmations.edit.confirm": "수정", "confirmations.edit.message": "지금 편집하면 작성 중인 메시지를 덮어씁니다. 진행이 확실한가요?", "confirmations.logout.confirm": "로그아웃", "confirmations.logout.message": "정말로 로그아웃 하시겠습니까?", "confirmations.mute.confirm": "뮤트", - "confirmations.mute.explanation": "이 동작은 해당 계정의 게시물과 해당 계정을 멘션하는 게시물을 숨깁니다, 하지만 여전히 해당 계정이 당신의 게시물을 보고 팔로우 할 수 있습니다.", - "confirmations.mute.message": "정말로 {name} 님을 뮤트하시겠습니까?", "confirmations.redraft.confirm": "삭제하고 다시 쓰기", "confirmations.redraft.message": "정말로 이 게시물을 삭제하고 다시 쓰시겠습니까? 해당 게시물에 대한 부스트와 좋아요를 잃게 되고 원본에 대한 답장은 연결 되지 않습니다.", "confirmations.reply.confirm": "답글", @@ -205,6 +209,22 @@ "dismissable_banner.explore_statuses": "이 게시물들은 오늘 소셜 웹에서 호응을 얻고 있는 게시물들입니다. 부스트와 관심을 받는 새로운 글들이 높은 순위가 됩니다.", "dismissable_banner.explore_tags": "이 해시태그들은 이 서버와 분산화된 네트워크의 다른 서버에서 사람들의 인기를 끌고 있는 것들입니다.", "dismissable_banner.public_timeline": "이것들은 {domain}에 있는 사람들이 팔로우한 사람들의 최신 공개 게시물들입니다.", + "domain_block_modal.block": "서버 차단", + "domain_block_modal.block_account_instead": "대신 @{name}를 차단", + "domain_block_modal.they_can_interact_with_old_posts": "이 서버에 있는 사람들이 내 예전 게시물에 상호작용할 수는 있습니다.", + "domain_block_modal.they_cant_follow": "이 서버의 누구도 나를 팔로우 할 수 없습니다.", + "domain_block_modal.they_wont_know": "내가 차단했다는 사실을 모를 것입니다.", + "domain_block_modal.title": "도메인을 차단할까요?", + "domain_block_modal.you_will_lose_followers": "이 서버에 있는 팔로워들이 모두 제거될 것입니다.", + "domain_block_modal.you_wont_see_posts": "이 서버 사용자의 게시물이나 알림을 보지 않게 됩니다.", + "domain_pill.activitypub_lets_connect": "이것은 마스토돈 뿐만이 아니라 다른 소셜 앱들을 넘나들며 사람들을 연결하고 상호작용 할 수 있게 합니다.", + "domain_pill.activitypub_like_language": "액티비티펍은 마스토돈이 다른 소셜 네트워크와 대화할 때 쓰는 언어 같은 것입니다.", + "domain_pill.server": "서버", + "domain_pill.their_handle": "그의 핸들:", + "domain_pill.username": "사용자명", + "domain_pill.whats_in_a_handle": "핸들엔 무엇이 담겨 있나요?", + "domain_pill.who_you_are": "내 핸들은 내가 어디에 있는 누군지 나타내기 때문에 사람들은 을 통해 소셜 웹을 넘나들며 나와 상호작용 할 수 있습니다.", + "domain_pill.your_handle": "내 핸들:", "embed.instructions": "아래의 코드를 복사하여 대화를 원하는 곳으로 공유하세요.", "embed.preview": "이렇게 표시됩니다:", "emoji_button.activity": "활동", @@ -241,6 +261,7 @@ "empty_column.list": "리스트에 아직 아무것도 없습니다. 리스트의 누군가가 게시물을 올리면 여기에 나타납니다.", "empty_column.lists": "아직 리스트가 없습니다. 리스트를 만들면 여기에 나타납니다.", "empty_column.mutes": "아직 아무도 뮤트하지 않았습니다.", + "empty_column.notification_requests": "깔끔합니다! 여기엔 아무 것도 없습니다. 알림을 받게 되면 설정에 따라 여기에 나타나게 됩니다.", "empty_column.notifications": "아직 알림이 없습니다. 다른 사람들이 당신에게 반응했을 때, 여기에서 볼 수 있습니다.", "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 서버의 사용자를 팔로우 해서 채워보세요", "error.unexpected_crash.explanation": "버그 혹은 브라우저 호환성 문제로 이 페이지를 올바르게 표시할 수 없습니다.", @@ -401,9 +422,15 @@ "loading_indicator.label": "불러오는 중...", "media_gallery.toggle_visible": "이미지 숨기기", "moved_to_account_banner.text": "당신의 계정 {disabledAccount}는 {movedToAccount}로 이동하였기 때문에 현재 비활성화 상태입니다.", - "mute_modal.duration": "기간", - "mute_modal.hide_notifications": "이 사용자로부터의 알림을 숨기시겠습니까?", - "mute_modal.indefinite": "무기한", + "mute_modal.hide_from_notifications": "알림에서 숨기기", + "mute_modal.hide_options": "옵션 숨기기", + "mute_modal.indefinite": "내가 뮤트를 해제하기 전까지", + "mute_modal.show_options": "옵션 표시", + "mute_modal.they_can_mention_and_follow": "나를 멘션하거나 팔로우 할 수 있습니다, 다만 나에게 안 보일 것입니다.", + "mute_modal.they_wont_know": "내가 차단했다는 사실을 모를 것입니다.", + "mute_modal.title": "사용자를 뮤트할까요?", + "mute_modal.you_wont_see_mentions": "그를 멘션하는 게시물을 더는 보지 않게 됩니다.", + "mute_modal.you_wont_see_posts": "내가 작성한 게시물을 볼 수는 있지만, 나는 그가 작성한 것을 보지 않게 됩니다.", "navigation_bar.about": "정보", "navigation_bar.advanced_interface": "고급 웹 인터페이스에서 열기", "navigation_bar.blocks": "차단한 사용자", @@ -482,6 +509,7 @@ "notifications.policy.filter_not_followers_title": "나를 팔로우하지 않는 사람들", "notifications.policy.filter_not_following_hint": "내가 수동으로 승인하기 전까지", "notifications.policy.filter_not_following_title": "내가 팔로우하지 않는 사람들", + "notifications.policy.filter_private_mentions_hint": "내가 한 멘션에 단 답글이거나 내가 발신자를 팔로우 한 것이 아닌 이상 걸러집니다", "notifications.policy.filter_private_mentions_title": "청하지 않은 개인적인 멘션", "notifications.policy.title": "알림을 거를 사람들…", "notifications_permission_banner.enable": "데스크탑 알림 활성화", @@ -660,9 +688,11 @@ "status.direct": "@{name} 님에게 개인적으로 멘션", "status.direct_indicator": "개인적인 멘션", "status.edit": "수정", + "status.edited": "%{date}에 마지막으로 편집됨", "status.edited_x_times": "{count}번 수정됨", "status.embed": "임베드", "status.favourite": "좋아요", + "status.favourites": "{count, plural, other {좋아요}}", "status.filter": "이 게시물을 필터", "status.filtered": "필터로 걸러짐", "status.hide": "게시물 숨기기", @@ -683,6 +713,7 @@ "status.reblog": "부스트", "status.reblog_private": "원래의 수신자들에게 부스트", "status.reblogged_by": "{name} 님이 부스트했습니다", + "status.reblogs": "{count, plural, other {부스트}}", "status.reblogs.empty": "아직 아무도 이 게시물을 부스트하지 않았습니다. 부스트 한 사람들이 여기에 표시 됩니다.", "status.redraft": "지우고 다시 쓰기", "status.remove_bookmark": "북마크 삭제", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index 0702fa0003..c78861b60c 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -135,9 +135,7 @@ "compose_form.spoiler.marked": "Hişyariya naverokê rake", "compose_form.spoiler.unmarked": "Hişyariya naverokê tevlî bike", "confirmation_modal.cancel": "Dev jê berde", - "confirmations.block.block_and_report": "Asteng bike & ragihîne", "confirmations.block.confirm": "Asteng bike", - "confirmations.block.message": "Ma tu dixwazî ku {name} asteng bikî?", "confirmations.cancel_follow_request.confirm": "Daxwazê vekişîne", "confirmations.cancel_follow_request.message": "Tu dixwazî ​​daxwaza xwe ya şopandina {name} vekşînî?", "confirmations.delete.confirm": "Jê bibe", @@ -146,14 +144,11 @@ "confirmations.delete_list.message": "Tu ji dil dixwazî vê lîsteyê bi awayekî mayînde jê bibî?", "confirmations.discard_edit_media.confirm": "Biavêje", "confirmations.discard_edit_media.message": "Guhertinên neqedandî di danasîna an pêşdîtina medyayê de hene, wan bi her awayî bavêje?", - "confirmations.domain_block.confirm": "Tevahiya navperê asteng bike", "confirmations.domain_block.message": "Tu pê bawerî ku tu dixwazî tevahiya {domain} asteng bikî? Di gelek rewşan de astengkirin an jî bêdengkirin têrê dike û tê hilbijartin. Tu nikarî naveroka vê navperê di demnameyê an jî agahdariyên xwe de bibînî. Şopînerên te yê di vê navperê wê werin jêbirin.", "confirmations.edit.confirm": "Serrast bike", "confirmations.logout.confirm": "Derkeve", "confirmations.logout.message": "Ma tu dixwazî ku derkevî?", "confirmations.mute.confirm": "Bêdeng bike", - "confirmations.mute.explanation": "Ev ê şandinên ji wan tê û şandinên ku behsa wan dike veşêre, lê hê jî maf dide ku ew şandinên te bibînin û te bişopînin.", - "confirmations.mute.message": "Bi rastî tu dixwazî {name} bêdeng bikî?", "confirmations.redraft.confirm": "Jê bibe & ji nû ve serrast bike", "confirmations.reply.confirm": "Bersivê bide", "confirmations.reply.message": "Bersiva niha li ser peyama ku tu niha berhev dikî dê binivsîne. Ma pê bawer î ku tu dixwazî bidomînî?", @@ -328,9 +323,6 @@ "load_pending": "{count, plural, one {# hêmaneke nû} other {#hêmaneke nû}}", "media_gallery.toggle_visible": "{number, plural, one {Wêneyê veşêre} other {Wêneyan veşêre}}", "moved_to_account_banner.text": "Ajimêrê te {disabledAccount} niha neçalak e ji ber ku te bar kir bo {movedToAccount}.", - "mute_modal.duration": "Dem", - "mute_modal.hide_notifications": "Agahdariyan ji ev bikarhêner veşêre?", - "mute_modal.indefinite": "Nediyar", "navigation_bar.about": "Derbar", "navigation_bar.blocks": "Bikarhênerên astengkirî", "navigation_bar.bookmarks": "Şûnpel", diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json index f9c70db53e..794cbd9ede 100644 --- a/app/javascript/mastodon/locales/kw.json +++ b/app/javascript/mastodon/locales/kw.json @@ -86,20 +86,15 @@ "compose_form.spoiler.marked": "Dilea gwarnyans dalgh", "compose_form.spoiler.unmarked": "Keworra gwarnyans dalgh", "confirmation_modal.cancel": "Hedhi", - "confirmations.block.block_and_report": "Lettya & Reportya", "confirmations.block.confirm": "Lettya", - "confirmations.block.message": "Owgh hwi sur a vynnes lettya {name}?", "confirmations.delete.confirm": "Dilea", "confirmations.delete.message": "Owgh hwi sur a vynnes dilea'n post ma?", "confirmations.delete_list.confirm": "Dilea", "confirmations.delete_list.message": "Owgh hwi sur a vynnes dilea'n rol ma yn fast?", - "confirmations.domain_block.confirm": "Lettya gorfarth dhien", "confirmations.domain_block.message": "Owgh hwi wir, wir sur a vynnes lettya'n {domain} dhien? Y'n brassa rann a gasow, boghes lettyansow medrys po tawheansow yw lowr ha gwell. Ny wrewgh hwi gweles dalgh a'n worfarth na yn py amserlin boblek pynag po yn agas gwarnyansow. Agas holyoryon an worfarth na a vydh diles.", "confirmations.logout.confirm": "Digelmi", "confirmations.logout.message": "Owgh hwi sur a vynnes digelmi?", "confirmations.mute.confirm": "Tawhe", - "confirmations.mute.explanation": "Hemm a wra kudha postow anedha ha postow orth aga meneges, mes hwath aga gasa dhe weles agas postow ha'gas holya.", - "confirmations.mute.message": "Owgh hwi sur a vynnes tawhe {name}?", "confirmations.redraft.confirm": "Dilea & daskynskrifa", "confirmations.reply.confirm": "Gorthebi", "confirmations.reply.message": "Gorthebi lemmyn a wra ughskrifa'n messach esowgh hwi orth y skrifa lemmyn. Owgh hwi sur a vynnes pesya?", @@ -225,9 +220,6 @@ "lists.subheading": "Agas rolyow", "load_pending": "{count, plural, one {# daklennowydh} other {# a daklennow nowydh}}", "media_gallery.toggle_visible": "Hide {number, plural, one {aven} other {aven}}", - "mute_modal.duration": "Duryans", - "mute_modal.hide_notifications": "Kudha gwarnyansow a'n devnydhyer ma?", - "mute_modal.indefinite": "Andhevri", "navigation_bar.blocks": "Devnydhyoryon lettys", "navigation_bar.bookmarks": "Folennosow", "navigation_bar.community_timeline": "Amserlin leel", diff --git a/app/javascript/mastodon/locales/la.json b/app/javascript/mastodon/locales/la.json index 99aac2ef13..48b2334008 100644 --- a/app/javascript/mastodon/locales/la.json +++ b/app/javascript/mastodon/locales/la.json @@ -41,7 +41,6 @@ "confirmations.delete.confirm": "Oblitterare", "confirmations.delete.message": "Are you sure you want to delete this status?", "confirmations.delete_list.confirm": "Oblitterare", - "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.mute.confirm": "Confutare", "confirmations.reply.confirm": "Respondere", "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index 9a85344923..2f4185f69e 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -89,6 +89,9 @@ "announcement.announcement": "Pregon", "attachments_list.unprocessed": "(no prosesado)", "audio.hide": "Eskonde audio", + "block_modal.show_less": "Amostra manko", + "block_modal.show_more": "Amostra mas", + "block_modal.title": "Bloka utilizador?", "boost_modal.combo": "Puedes klikar {combo} para ometer esto la proksima vez", "bundle_column_error.copy_stacktrace": "Kopia el raporto de yerro", "bundle_column_error.error.body": "La pajina solisitada no pudo ser renderada. Podria ser por un yerro en muestro kodiche o un problem de kompatibilita kon el navigador.", @@ -160,9 +163,7 @@ "compose_form.spoiler.unmarked": "Adjusta avertensya de kontenido", "compose_form.spoiler_placeholder": "Avertensya de kontenido (opsyonal)", "confirmation_modal.cancel": "Anula", - "confirmations.block.block_and_report": "Bloka i raporta", "confirmations.block.confirm": "Bloka", - "confirmations.block.message": "Estas siguro ke keres blokar a {name}?", "confirmations.cancel_follow_request.confirm": "Anula solisitud", "confirmations.cancel_follow_request.message": "Estas siguro ke keres anular tu solisitud de segir a {name}?", "confirmations.delete.confirm": "Efasa", @@ -171,15 +172,13 @@ "confirmations.delete_list.message": "Estas siguro ke keres permanentemente efasar esta lista?", "confirmations.discard_edit_media.confirm": "Anula", "confirmations.discard_edit_media.message": "Tienes trokamientos no guadrados en la deskripsion o vista previa. Keres efasarlos entanto?", - "confirmations.domain_block.confirm": "Bloka domeno entero", + "confirmations.domain_block.confirm": "Bloka sirvidor", "confirmations.domain_block.message": "Estas totalmente siguro ke keres blokar todo el domeno {domain}? En djeneral unos kuantos blokos o silensiamientos son sufisientes i preferavles. No veras kontenido de akel domeno en dinguna linya de tiempo publika ni ent tus avizos. Tus suivantes de akel domeno seran kitados.", "confirmations.edit.confirm": "Edita", "confirmations.edit.message": "Si edites agora, kitaras el mesaj kualo estas eskriviendo aktualmente. Estas siguro ke keres fazerlo?", "confirmations.logout.confirm": "Sal", "confirmations.logout.message": "Estas siguro ke keres salir de tu kuento?", "confirmations.mute.confirm": "Silensia", - "confirmations.mute.explanation": "Esto eskondera las publikasyones de este kuento i publikasyones ke lo enmentan, pero ainda les permetera segirte.", - "confirmations.mute.message": "Estas siguro ke keres silensiar a {name}?", "confirmations.redraft.confirm": "Efasa i reeskrive", "confirmations.redraft.message": "Estas siguro ke keres efasar esta publikasyon i reeskrivirla? Pedreras todos los favoritos i repartajasyones asosiados kon esta publikasyon i repuestas a eya seran guerfanadas.", "confirmations.reply.confirm": "Arisponde", @@ -205,6 +204,10 @@ "dismissable_banner.explore_statuses": "Estas publikasyones de este sirvidor i otros de la red desentralizada estan agora popularas. Publikasyones mas muevas, kon mas repartajasiones i favoritadas por mas djente aparesen primero.", "dismissable_banner.explore_tags": "Estas etiketas estan agora popularas en la red sosyala. Etiketas uzadas por mas djente aparesen primero.", "dismissable_banner.public_timeline": "Estas son las publikasyones publikas mas resientes de personas en la red sosyala a las kualas la djente de {domain} sige.", + "domain_block_modal.block": "Bloka sirvidor", + "domain_block_modal.title": "Bloka el domeno?", + "domain_pill.server": "Sirvidor", + "domain_pill.username": "Nombre de utilizador", "embed.instructions": "Enkrusta esta publikasyon en tu sitio internetiko kopiando este kodiche.", "embed.preview": "Paresera ansina:", "emoji_button.activity": "Aktivita", @@ -401,9 +404,6 @@ "loading_indicator.label": "Eskargando…", "media_gallery.toggle_visible": "{number, plural, one {Eskonde imaje} other {Eskonde imajes}}", "moved_to_account_banner.text": "Tu kuento {disabledAccount} esta aktualmente inkapasitado porke transferates a {movedToAccount}.", - "mute_modal.duration": "Durasyon", - "mute_modal.hide_notifications": "Eskonder avizos de este utilizador?", - "mute_modal.indefinite": "Indefinida", "navigation_bar.about": "Sovre mozotros", "navigation_bar.advanced_interface": "Avre en la enterfaz avanzada", "navigation_bar.blocks": "Utilizadores blokados", @@ -659,6 +659,7 @@ "status.direct": "Enmenta a @{name} en privado", "status.direct_indicator": "Enmentadura privada", "status.edit": "Edita", + "status.edited": "Ultima edisyon: {date}", "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} vezes}}", "status.embed": "Inkrusta", "status.favourite": "Te plaze", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 1503460978..f9ef7e242c 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Pridėti turinio įspėjimą", "compose_form.spoiler_placeholder": "Turinio įspėjimas (pasirinktinis)", "confirmation_modal.cancel": "Atšaukti", - "confirmations.block.block_and_report": "Blokuoti ir pranešti", "confirmations.block.confirm": "Blokuoti", - "confirmations.block.message": "Ar tikrai nori užblokuoti {name}?", "confirmations.cancel_follow_request.confirm": "Atšaukti prašymą", "confirmations.cancel_follow_request.message": "Ar tikrai nori atšaukti savo prašymą sekti {name}?", "confirmations.delete.confirm": "Ištrinti", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Ar tikrai nori visam laikui ištrinti šį sąrašą?", "confirmations.discard_edit_media.confirm": "Atmesti", "confirmations.discard_edit_media.message": "Turi neišsaugotų medijos aprašymo ar peržiūros pakeitimų, vis tiek juos atmesti?", - "confirmations.domain_block.confirm": "Blokuoti visą domeną", "confirmations.domain_block.message": "Ar tikrai, tikrai nori užblokuoti visą {domain}? Daugeliu atvejų užtenka kelių tikslinių blokavimų arba nutildymų. Šio domeno turinio nematysi jokiose viešose laiko skalėse ar pranešimuose. Tavo sekėjai iš to domeno bus pašalinti.", "confirmations.edit.confirm": "Redaguoti", "confirmations.edit.message": "Redaguojant dabar, bus perrašyta šiuo metu kuriama žinutė. Ar tikrai nori tęsti?", "confirmations.logout.confirm": "Atsijungti", "confirmations.logout.message": "Ar tikrai nori atsijungti?", "confirmations.mute.confirm": "Nutildyti", - "confirmations.mute.explanation": "Tai paslėps jų įrašus ir įrašus, kuriuose jie menėmi, bet jie vis tiek galės matyti tavo įrašus ir sekti.", - "confirmations.mute.message": "Ar tikrai nori nutildyti {name}?", "confirmations.redraft.confirm": "Ištrinti ir parengti iš naujo", "confirmations.redraft.message": "Ar tikrai nori ištrinti šį įrašą ir parengti jį iš naujo kaip juodraštį? Bus prarastos mėgstamiausios ir pakėlimai, o atsakymai į originalinį įrašą taps liekamojais.", "confirmations.reply.confirm": "Atsakyti", @@ -205,6 +200,19 @@ "dismissable_banner.explore_statuses": "Tai – įrašai iš viso socialinio žiniatinklio, kurie šiandien sulaukia daug dėmesio. Naujesni įrašai, turintys daugiau pakėlimų ir mėgstamų, vertinami aukščiau.", "dismissable_banner.explore_tags": "Tai – saitažodžiai, kurie šiandien sulaukia daug dėmesio socialiniame žiniatinklyje. Saitažodžiai, kuriuos naudoja daugiau skirtingų žmonių, vertinami aukščiau.", "dismissable_banner.public_timeline": "Tai – naujausi vieši įrašai, kuriuos socialiniame žiniatinklyje paskelbė žmonės, sekantys {domain}.", + "domain_pill.activitypub_lets_connect": "Tai leidžia tau bendrauti su žmonėmis ne tik Mastodon, bet ir įvairiose socialinėse programėlėse.", + "domain_pill.activitypub_like_language": "ActivityPub – tarsi kalba, kuria Mastodon kalba su kitais socialiniais tinklais.", + "domain_pill.server": "Serveris", + "domain_pill.their_handle": "Jų socialinis medijos vardas:", + "domain_pill.their_server": "Jų skaitmeniniai namai, kuriuose saugomi visi jų įrašai.", + "domain_pill.their_username": "Jų unikalus identifikatorius jų serveryje. Skirtinguose serveriuose galima rasti naudotojų, turinčių tą patį naudotojo vardą.", + "domain_pill.username": "Naudotojo vardas", + "domain_pill.whats_in_a_handle": "Kas yra socialiniame medijos varde?", + "domain_pill.who_they_are": "Kadangi socialines medijos vardai nurodo, kas ir kur jie yra, galima bendrauti su žmonėmis visame socialiniame tinkle, kuriame yra .", + "domain_pill.who_you_are": "Kadangi tavo socialinis medijos vardas nurodo, kas esi ir kur esi, žmonės gali bendrauti su tavimi visame socialiniame tinkle, kurį sudaro .", + "domain_pill.your_handle": "Tavo socialinis medijos vardas:", + "domain_pill.your_server": "Tavo skaitmeniniai namai, kuriuose saugomi visi tavo įrašai. Nepatinka šis? Bet kada perkelk serverius ir atsivesk ir savo sekėjus.", + "domain_pill.your_username": "Tavo unikalus identifikatorius šiame serveryje. Skirtinguose serveriuose galima rasti naudotojų, turinčių tą patį naudotojo vardą.", "embed.instructions": "Įterpk šį įrašą į savo svetainę nukopijavus (-usi) toliau pateiktą kodą.", "embed.preview": "Štai, kaip tai atrodys:", "emoji_button.activity": "Veikla", @@ -399,9 +407,6 @@ "loading_indicator.label": "Kraunama…", "media_gallery.toggle_visible": "{number, plural, one {Slėpti vaizdą} few {Slėpti vaizdus} many {Slėpti vaizdo} other {Slėpti vaizdų}}", "moved_to_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu išjungta, nes persikėlei į {movedToAccount}.", - "mute_modal.duration": "Trukmė", - "mute_modal.hide_notifications": "Slėpti šio naudotojo pranešimus?", - "mute_modal.indefinite": "Neribota", "navigation_bar.about": "Apie", "navigation_bar.advanced_interface": "Atidaryti išplėstinę žiniatinklio sąsają", "navigation_bar.blocks": "Užblokuoti naudotojai", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 726ae655c2..51d06c8233 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -159,9 +159,7 @@ "compose_form.spoiler.unmarked": "Pievienot satura brīdinājumu", "compose_form.spoiler_placeholder": "Satura brīdinājums (pēc izvēles)", "confirmation_modal.cancel": "Atcelt", - "confirmations.block.block_and_report": "Bloķēt un ziņot", "confirmations.block.confirm": "Bloķēt", - "confirmations.block.message": "Vai tiešām vēlies bloķēt {name}?", "confirmations.cancel_follow_request.confirm": "Atsaukt pieprasījumu", "confirmations.cancel_follow_request.message": "Vai tiešām vēlies atsaukt pieprasījumu sekot {name}?", "confirmations.delete.confirm": "Dzēst", @@ -170,15 +168,12 @@ "confirmations.delete_list.message": "Vai tiešām neatgriezeniski izdzēst šo sarakstu?", "confirmations.discard_edit_media.confirm": "Atmest", "confirmations.discard_edit_media.message": "Ir nesaglabātas izmaiņas informācijas nesēja aprakstā vai priekšskatījumā. Vēlies tās atmest tik un tā?", - "confirmations.domain_block.confirm": "Bloķēt visu domēnu", "confirmations.domain_block.message": "Vai tu tiešām vēlies bloķēt visu domēnu {domain}? Parasti pietiek, ja nobloķē vai apklusini kādu. Tu neredzēsi saturu vai paziņojumus no šī domēna nevienā laika līnijā. Tavi sekotāji no šī domēna tiks noņemti.", "confirmations.edit.confirm": "Labot", "confirmations.edit.message": "Rediģējot, tiks pārrakstīts ziņojums, kuru tu šobrīd raksti. Vai tiešām vēlies turpināt?", "confirmations.logout.confirm": "Iziet", "confirmations.logout.message": "Vai tiešām vēlies izrakstīties?", "confirmations.mute.confirm": "Apklusināt", - "confirmations.mute.explanation": "Šādi tiks slēpti ieraksti no viņiem un ieraksti, kuros viņi tiek pieminēti, taču viņi joprojām varēs redzēt Tavus ierakstus un sekot Tev.", - "confirmations.mute.message": "Vai tiešām vēlies apklusināt {name}?", "confirmations.redraft.confirm": "Dzēst un pārrakstīt", "confirmations.redraft.message": "Vai tiešām vēlies dzēst šo ziņu un no jauna noformēt to? Izlase un pastiprinājumi tiks zaudēti, un atbildes uz sākotnējo ziņu tiks atstātas bez autoratlīdzības.", "confirmations.reply.confirm": "Atbildēt", @@ -391,9 +386,6 @@ "loading_indicator.label": "Ielādē…", "media_gallery.toggle_visible": "{number, plural, one {Slēpt attēlu} other {Slēpt attēlus}}", "moved_to_account_banner.text": "Tavs konts {disabledAccount} pašlaik ir atspējots, jo Tu pārcēlies uz kontu {movedToAccount}.", - "mute_modal.duration": "Ilgums", - "mute_modal.hide_notifications": "Slēpt paziņojumus no šī lietotāja?", - "mute_modal.indefinite": "Beztermiņa", "navigation_bar.about": "Par", "navigation_bar.advanced_interface": "Atvērt paplašinātā tīmekļa saskarnē", "navigation_bar.blocks": "Bloķētie lietotāji", @@ -633,7 +625,7 @@ "status.edit": "Labot", "status.edited_x_times": "Labots {count, plural, one {{count} reizi} other {{count} reizes}}", "status.embed": "Iestrādāt", - "status.favourite": "Iecienīts", + "status.favourite": "Izlasē", "status.filter": "Filtrē šo ziņu", "status.filtered": "Filtrēts", "status.hide": "Slēpt ierakstu", diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json index cd30e29493..d8a470ed47 100644 --- a/app/javascript/mastodon/locales/mk.json +++ b/app/javascript/mastodon/locales/mk.json @@ -80,20 +80,15 @@ "compose_form.spoiler.marked": "Текстот е сокриен зад предупредување", "compose_form.spoiler.unmarked": "Текстот не е сокриен", "confirmation_modal.cancel": "Откажи", - "confirmations.block.block_and_report": "Блокирај и Пријави", "confirmations.block.confirm": "Блокирај", - "confirmations.block.message": "Сигурни сте дека дека го блокирате {name}?", "confirmations.delete.confirm": "Избриши", "confirmations.delete.message": "Сигурни сте дека го бришите статусот?", "confirmations.delete_list.confirm": "Избриши", "confirmations.delete_list.message": "Дали сте сигурни дека сакате да го избришете списоков?", - "confirmations.domain_block.confirm": "Сокриј цел домеин", "confirmations.domain_block.message": "Дали скроз сте сигурни дека ќе блокирате сѐ од {domain}? Во повеќето случаеви неколку таргетирани блокирања или заќутувања се доволни и предложени. Нема да ја видите содржината од тој домеин во никој јавен времеплов или вашите нотификации. Вашите следбеници од тој домеин ќе бидат остранети.", "confirmations.logout.confirm": "Одјави се", "confirmations.logout.message": "Дали сте сигурни дека сакате да се одјавите?", "confirmations.mute.confirm": "Заќути", - "confirmations.mute.explanation": "Ќе сокрие објави од нив и објави кои ги спомнуваат нив, но сеуште ќе им дозволи да ги видат вашите постови и ве следат.", - "confirmations.mute.message": "Дали ќе го заќутите {name}?", "confirmations.reply.confirm": "Одговори", "confirmations.unfollow.confirm": "Одследи", "confirmations.unfollow.message": "Сигурни сте дека ќе го отследите {name}?", diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json index 6f1ec3c117..8fb4e818db 100644 --- a/app/javascript/mastodon/locales/ml.json +++ b/app/javascript/mastodon/locales/ml.json @@ -108,14 +108,11 @@ "compose_form.spoiler.marked": "എഴുത്ത് മുന്നറിയിപ്പിനാൽ മറച്ചിരിക്കുന്നു", "compose_form.spoiler.unmarked": "എഴുത്ത് മറയ്ക്കപ്പെട്ടിട്ടില്ല", "confirmation_modal.cancel": "റദ്ദാക്കുക", - "confirmations.block.block_and_report": "തടയുകയും റിപ്പോർട്ടും ചെയ്യുക", "confirmations.block.confirm": "തടയുക", - "confirmations.block.message": "{name} തടയാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?", "confirmations.delete.confirm": "മായ്ക്കുക", "confirmations.delete.message": "ഈ ടൂട്ട് ഇല്ലാതാക്കണം എന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", "confirmations.delete_list.confirm": "മായ്ക്കുക", "confirmations.delete_list.message": "ഈ പട്ടിക എന്നെന്നേക്കുമായി നീക്കം ചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?", - "confirmations.domain_block.confirm": "മുഴുവൻ ഡൊമെയ്‌നും തടയുക", "confirmations.logout.confirm": "പുറത്തുകടക്കുക", "confirmations.logout.message": "നിങ്ങൾക്ക് ലോഗ് ഔട്ട് ചെയ്യണമെന്ന് ഉറപ്പാണോ?", "confirmations.mute.confirm": "നിശ്ശബ്ദമാക്കുക", @@ -229,8 +226,6 @@ "lists.replies_policy.none": "ആരുമില്ല", "lists.replies_policy.title": "ഇതിനുള്ള മറുപടികൾ കാണിക്കുക:", "lists.subheading": "എന്റെ പട്ടികകൾ", - "mute_modal.duration": "കാലാവധി", - "mute_modal.indefinite": "അനിശ്ചിതകാല", "navigation_bar.blocks": "തടയപ്പെട്ട ഉപയോക്താക്കൾ", "navigation_bar.bookmarks": "ബുക്ക്മാർക്കുകൾ", "navigation_bar.community_timeline": "പ്രാദേശിക സമയരേഖ", diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json index 0cd5e7ef78..a00b39e838 100644 --- a/app/javascript/mastodon/locales/mr.json +++ b/app/javascript/mastodon/locales/mr.json @@ -105,7 +105,6 @@ "confirmations.delete.message": "हे स्टेटस तुम्हाला नक्की हटवायचंय?", "confirmations.delete_list.confirm": "हटवा", "confirmations.delete_list.message": "ही यादी तुम्हाला नक्की कायमची हटवायचीय?", - "confirmations.domain_block.confirm": "संपूर्ण डोमेन लपवा", "confirmations.logout.message": "तुमची खात्री आहे की तुम्ही लॉग आउट करू इच्छिता?", "confirmations.mute.confirm": "आवाज बंद करा", "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 155eeccee6..8fe043c5dc 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Tambah amaran kandungan", "compose_form.spoiler_placeholder": "Amaran kandungan (pilihan)", "confirmation_modal.cancel": "Batal", - "confirmations.block.block_and_report": "Sekat & Lapor", "confirmations.block.confirm": "Sekat", - "confirmations.block.message": "Adakah anda pasti anda ingin menyekat {name}?", "confirmations.cancel_follow_request.confirm": "Tarik balik permintaan", "confirmations.cancel_follow_request.message": "Adakah anda pasti ingin menarik balik permintaan anda untuk mengikut {name}?", "confirmations.delete.confirm": "Padam", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Adakah anda pasti anda ingin memadam senarai ini secara kekal?", "confirmations.discard_edit_media.confirm": "Singkir", "confirmations.discard_edit_media.message": "Anda belum menyimpan perubahan pada penerangan atau pratonton media. Anda ingin membuangnya?", - "confirmations.domain_block.confirm": "Sekat keseluruhan domain", "confirmations.domain_block.message": "Adakah anda betul-betul, sungguh-sungguh pasti anda ingin menyekat keseluruhan {domain}? Selalunya, beberapa sekatan atau pembisuan tersasar sudah memadai dan lebih diutamakan. Anda tidak akan nampak kandungan daripada domain tersebut di mana-mana garis masa awam mahupun pemberitahuan anda. Pengikut anda daripada domain tersebut juga akan dibuang.", "confirmations.edit.confirm": "Sunting", "confirmations.edit.message": "Mengedit sekarang akan menimpa mesej yang sedang anda karang. Adakah anda pasti mahu meneruskan?", "confirmations.logout.confirm": "Log keluar", "confirmations.logout.message": "Adakah anda pasti anda ingin log keluar?", "confirmations.mute.confirm": "Bisukan", - "confirmations.mute.explanation": "Ini akan menyembunyikan hantaran daripada mereka dan juga hantaran yang menyebut mereka, tetapi ia masih membenarkan mereka melihat hantaran anda dan mengikuti anda.", - "confirmations.mute.message": "Adakah anda pasti anda ingin membisukan {name}?", "confirmations.redraft.confirm": "Padam & rangka semula", "confirmations.redraft.message": "Adakah anda pasti anda ingin memadam pos ini dan merangkanya semula? Kegemaran dan galakan akan hilang, dan balasan ke pos asal akan menjadi yatim.", "confirmations.reply.confirm": "Balas", @@ -396,9 +391,6 @@ "loading_indicator.label": "Memuatkan…", "media_gallery.toggle_visible": "{number, plural, other {Sembunyikan imej}}", "moved_to_account_banner.text": "Akaun anda {disabledAccount} kini dinyahdayakan kerana anda berpindah ke {movedToAccount}.", - "mute_modal.duration": "Tempoh", - "mute_modal.hide_notifications": "Sembunyikan pemberitahuan daripada pengguna ini?", - "mute_modal.indefinite": "Tidak tentu", "navigation_bar.about": "Perihal", "navigation_bar.advanced_interface": "Buka dalam antara muka web lanjutan", "navigation_bar.blocks": "Pengguna yang disekat", diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json index 001e15e0d1..23eaa8564b 100644 --- a/app/javascript/mastodon/locales/my.json +++ b/app/javascript/mastodon/locales/my.json @@ -150,9 +150,7 @@ "compose_form.spoiler.marked": "Text is hidden behind warning", "compose_form.spoiler.unmarked": "Text is not hidden", "confirmation_modal.cancel": "ပယ်ဖျက်မည်", - "confirmations.block.block_and_report": "ဘလော့ပြီး တိုင်ကြားမည်", "confirmations.block.confirm": "ဘလော့မည်", - "confirmations.block.message": "အကောင့်မှ ထွက်ရန် သေချာပါသလား?", "confirmations.cancel_follow_request.confirm": "ပန်ကြားချက်ကို ပယ်ဖျက်မည်", "confirmations.cancel_follow_request.message": "{name} ကို စောင့်ကြည့်ခြင်းအားပယ်ဖျက်ရန် သေချာပါသလား။", "confirmations.delete.confirm": "ဖျက်မည်", @@ -161,15 +159,12 @@ "confirmations.delete_list.message": "ဖျက်ရန် သေချာပါသလား?", "confirmations.discard_edit_media.confirm": "ဖယ်ထုတ်ပါ", "confirmations.discard_edit_media.message": "သင်သည် မီဒီယာဖော်ပြချက် သို့မဟုတ် အစမ်းကြည့်ရှုခြင်းတွင် မသိမ်းဆည်းရသေးသော အပြောင်းအလဲများရှိသည်။ မည်သို့ပင်ဖြစ်စေ ဖျက်ပစ်မည်လား။", - "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.message": "{domain} တစ်ခုလုံးကို ဘလော့လုပ်ရန် တကယ် သေချာပါသလား? များသောအားဖြင့် အနည်းစုကို ပစ်မှတ်ထား ဘလော့လုပ်ခြင်းသည် လုံလောက်ပါသည်။ ထို ဒိုမိန်းမှ အကြောင်းအရာ တစ်ခုမှ မြင်ရမည်မဟုတ်သည့်အပြင် ထို ဒိုမိန်းတွင်ရှိသော သင်၏ စောင့်ကြည့်သူများပါ ဖယ်ရှားပစ်မည်ဖြစ်သည်။", "confirmations.edit.confirm": "ပြင်ရန်", "confirmations.edit.message": "ယခုပြင်ဆင်ခြင်းတွင် သင်လက်ရှိမက်ဆေ့ချ်ကို ဖျက်ပစ်ပြီး အသစ်ရေးပါမည်။ ရှေ့ဆက်လိုသည်မှာ သေချာပါသလား။", "confirmations.logout.confirm": "အကောင့်မှထွက်မည်", "confirmations.logout.message": "အကောင့်မှ ထွက်ရန် သေချာပါသလား?", "confirmations.mute.confirm": "ပိတ်ထားရန်", - "confirmations.mute.explanation": "၎င်းသည် ၎င်းတို့ထံမှ ပို့စ်များနှင့် ၎င်းတို့ကို ဖော်ပြထားသော ပို့စ်များကို ဖျောက်ထားမည်ဖြစ်ပြီး၊ သို့သော် ၎င်းတို့သည် သင့်ပို့စ်များကို မြင်နိုင်ပြီး သင့်အား လိုက်ကြည့်နိုင်စေမည်ဖြစ်သည်။", - "confirmations.mute.message": "{name} ကို မမြင်လိုသည်မှာ သေချာပါသလား။ ", "confirmations.redraft.confirm": "ဖျက်ပြီး ပြန်လည်ရေးမည်။", "confirmations.redraft.message": "သင် ဒီပိုစ့်ကိုဖျက်ပြီး ပြန်တည်းဖြတ်မှာ သေချာပြီလား။ ကြယ်ပွင့်​တွေ နဲ့ ပြန်မျှ​ဝေမှု​တွေကိုဆုံးရှုံးမည်။မူရင်းပို့စ်ဆီကို ပြန်စာ​တွေမှာလည်း​ \nပိုစ့်ကို​တွေ့ရမည်မဟုတ်​တော့ပါ။.", "confirmations.reply.confirm": "စာပြန်မည်", @@ -377,9 +372,6 @@ "loading_indicator.label": "လုပ်ဆောင်နေသည်…", "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}", "moved_to_account_banner.text": "{movedToAccount} အကောင့်သို့ပြောင်းလဲထားသဖြင့် {disabledAccount} အကောင့်မှာပိတ်ထားသည်", - "mute_modal.duration": "ကြာချိန်", - "mute_modal.hide_notifications": "ဤအကောင့်မှသတိပေးချက်များကိုပိတ်မလား?", - "mute_modal.indefinite": "ရေတွက်လို့မရပါ", "navigation_bar.about": "အကြောင်း", "navigation_bar.advanced_interface": "အဆင့်မြင့်ဝဘ်ပုံစံ ဖွင့်ပါ", "navigation_bar.blocks": "ဘလော့ထားသောအကောင့်များ", diff --git a/app/javascript/mastodon/locales/ne.json b/app/javascript/mastodon/locales/ne.json index 86e24a15fb..aef23c8566 100644 --- a/app/javascript/mastodon/locales/ne.json +++ b/app/javascript/mastodon/locales/ne.json @@ -50,6 +50,10 @@ "admin.dashboard.retention.cohort_size": "नयाँ प्रयोगकर्ताहरू", "alert.rate_limited.message": "कृपया {retry_time, time, medium} पछि पुन: प्रयास गर्नुहोस्।", "alert.unexpected.message": "एउटा अनपेक्षित त्रुटि भयो।", + "announcement.announcement": "घोषणा", + "block_modal.remote_users_caveat": "हामी सर्भर {domain} लाई तपाईंको निर्णयको सम्मान गर्न सोध्नेछौं। तर, हामी अनुपालनको ग्यारेन्टी दिन सक्दैनौं किनभने केही सर्भरहरूले ब्लकहरू फरक रूपमा ह्यान्डल गर्न सक्छन्। सार्वजनिक पोस्टहरू लग इन नभएका प्रयोगकर्ताहरूले देख्न सक्छन्।", + "block_modal.show_less": "कम देखाउनुहोस्", + "block_modal.show_more": "थप देखाउनुहोस्", "bundle_column_error.retry": "पुन: प्रयास गर्नुहोस्", "bundle_modal_error.close": "बन्द गर्नुहोस्", "bundle_modal_error.message": "यो कम्पोनेन्ट लोड गर्दा केही गडबड भयो।", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index cdb5562e90..9bf40a7148 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -89,6 +89,14 @@ "announcement.announcement": "Mededeling", "attachments_list.unprocessed": "(niet verwerkt)", "audio.hide": "Audio verbergen", + "block_modal.remote_users_caveat": "We vragen de server {domain} om je besluit te respecteren. Het naleven hiervan is echter niet gegarandeerd, omdat sommige servers blokkades anders kunnen interpreteren. Openbare berichten zijn mogelijk nog steeds zichtbaar voor niet-ingelogde gebruikers.", + "block_modal.show_less": "Minder tonen", + "block_modal.show_more": "Meer tonen", + "block_modal.they_cant_mention": "De persoon kan jou niet vermelden of volgen.", + "block_modal.they_cant_see_posts": "De persoon kan jouw berichten niet zien en jij ook niet diens berichten.", + "block_modal.they_will_know": "De persoon kan zien dat die wordt geblokkeerd.", + "block_modal.title": "Gebruiker blokkeren?", + "block_modal.you_wont_see_mentions": "Je ziet geen berichten meer die dit account vermelden.", "boost_modal.combo": "Je kunt {combo} klikken om dit de volgende keer over te slaan", "bundle_column_error.copy_stacktrace": "Foutrapportage kopiëren", "bundle_column_error.error.body": "De opgevraagde pagina kon niet worden weergegeven. Dit kan het gevolg zijn van een fout in onze broncode, of van een compatibiliteitsprobleem met je webbrowser.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Inhoudswaarschuwing toevoegen", "compose_form.spoiler_placeholder": "Inhoudswaarschuwing (optioneel)", "confirmation_modal.cancel": "Annuleren", - "confirmations.block.block_and_report": "Blokkeren en rapporteren", "confirmations.block.confirm": "Blokkeren", - "confirmations.block.message": "Weet je het zeker dat je {name} wilt blokkeren?", "confirmations.cancel_follow_request.confirm": "Verzoek annuleren", "confirmations.cancel_follow_request.message": "Weet je zeker dat je jouw verzoek om {name} te volgen wilt annuleren?", "confirmations.delete.confirm": "Verwijderen", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Weet je zeker dat je deze lijst definitief wilt verwijderen?", "confirmations.discard_edit_media.confirm": "Weggooien", "confirmations.discard_edit_media.message": "Je hebt niet-opgeslagen wijzigingen in de mediabeschrijving of voorvertonning, wil je deze toch weggooien?", - "confirmations.domain_block.confirm": "Blokkeer alles van deze server", - "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wilt blokkeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en beter. Je zult geen berichten van deze server op openbare tijdlijnen zien of in jouw meldingen. Jouw volgers van deze server worden verwijderd.", + "confirmations.domain_block.confirm": "Server blokkeren", + "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wilt blokkeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en beter. Je ziet geen berichten van deze server meer op openbare tijdlijnen of in jouw meldingen. Jouw volgers van deze server worden verwijderd.", "confirmations.edit.confirm": "Bewerken", "confirmations.edit.message": "Door nu te reageren overschrijf je het bericht dat je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?", "confirmations.logout.confirm": "Uitloggen", "confirmations.logout.message": "Weet je zeker dat je wilt uitloggen?", "confirmations.mute.confirm": "Negeren", - "confirmations.mute.explanation": "Dit verbergt diens berichten en berichten waar diegene in wordt vermeld, maar diegene kan nog steeds jouw berichten bekijken en jou volgen.", - "confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?", "confirmations.redraft.confirm": "Verwijderen en herschrijven", "confirmations.redraft.message": "Weet je zeker dat je dit bericht wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en de reacties op het originele bericht raak je kwijt.", "confirmations.reply.confirm": "Reageren", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Dit zijn berichten op het sociale web die vandaag aan populariteit winnen. Nieuwere berichten met meer boosts en favorieten staan hoger.", "dismissable_banner.explore_tags": "Deze hashtags winnen aan populariteit op het sociale web. Hashtags die door meer verschillende mensen worden gebruikt staan hoger.", "dismissable_banner.public_timeline": "Dit zijn de meest recente openbare berichten van accounts op het sociale web die door mensen op {domain} worden gevolgd.", + "domain_block_modal.block": "Server blokkeren", + "domain_block_modal.block_account_instead": "In plaats hiervan {name} blokkeren", + "domain_block_modal.they_can_interact_with_old_posts": "Mensen op deze server kunnen interactie hebben met jouw oude berichten.", + "domain_block_modal.they_cant_follow": "Niemand op deze server kan jou volgen.", + "domain_block_modal.they_wont_know": "Ze krijgen niet te weten dat ze worden geblokkeerd.", + "domain_block_modal.title": "Server blokkeren?", + "domain_block_modal.you_will_lose_followers": "Al jouw volgers van deze server worden ontvolgd.", + "domain_block_modal.you_wont_see_posts": "Je ziet geen berichten of meldingen meer van gebruikers op deze server.", + "domain_pill.activitypub_lets_connect": "Het zorgt ervoor dat je niet alleen maar kunt verbinden en communiceren met mensen op Mastodon, maar ook met andere sociale apps.", + "domain_pill.activitypub_like_language": "ActivityPub is de taal die Mastodon met andere sociale netwerken spreekt.", + "domain_pill.server": "Server", + "domain_pill.their_handle": "Hun Mastodon-adres:", + "domain_pill.their_server": "Hun digitale thuis, waar al hun berichten zich bevinden.", + "domain_pill.their_username": "Hun unieke identificatie-adres op hun server. Het is mogelijk dat er gebruikers met dezelfde gebruikersnaam op verschillende servers te vinden zijn.", + "domain_pill.username": "Gebruikersnaam", + "domain_pill.whats_in_a_handle": "Wat is een Mastodon-adres?", + "domain_pill.who_they_are": "Omdat je aan een Mastodon-adres kunt zien wie iemand is en waar die zich bevindt, kun je met mensen op het door sociale web communiceren.", + "domain_pill.who_you_are": "Omdat je aan jouw Mastodon-adres kunt zien wie jij bent is en waar je je bevindt, kunnen mensen op het door sociale web met jou communiceren.", + "domain_pill.your_handle": "Jouw Mastodon-adres:", + "domain_pill.your_server": "Jouw digitale thuis, waar al jouw berichten zich bevinden. Is deze server toch niet naar jouw wens? Dan kun je op elk moment naar een andere server verhuizen en ook jouw volgers overbrengen.", + "domain_pill.your_username": "Jouw unieke identificatie-adres op deze server. Het is mogelijk dat er gebruikers met dezelfde gebruikersnaam op verschillende servers te vinden zijn.", "embed.instructions": "Embed dit bericht op jouw website door de onderstaande code te kopiëren.", "embed.preview": "Zo komt het eruit te zien:", "emoji_button.activity": "Activiteiten", @@ -229,17 +254,17 @@ "empty_column.blocks": "Je hebt nog geen gebruikers geblokkeerd.", "empty_column.bookmarked_statuses": "Jij hebt nog geen berichten aan je bladwijzers toegevoegd. Wanneer je er een aan jouw bladwijzers toevoegt, valt deze hier te zien.", "empty_column.community": "De lokale tijdlijn is nog leeg. Plaats een openbaar bericht om de spits af te bijten!", - "empty_column.direct": "Je hebt nog geen privéberichten. Wanneer je er een verstuurt of ontvangt, zullen deze hier verschijnen.", + "empty_column.direct": "Je hebt nog geen privéberichten. Wanneer je er een verstuurt of ontvangt, komen deze hier te staan.", "empty_column.domain_blocks": "Er zijn nog geen geblokkeerde servers.", "empty_column.explore_statuses": "Momenteel zijn er geen trends. Kom later terug!", "empty_column.favourited_statuses": "Jij hebt nog geen favoriete berichten. Wanneer je een bericht als favoriet markeert, valt deze hier te zien.", "empty_column.favourites": "Niemand heeft dit bericht nog als favoriet gemarkeerd. Wanneer iemand dit doet, valt dat hier te zien.", - "empty_column.follow_requests": "Je hebt nog geen volgverzoeken. Wanneer je er een ontvangt, zal dat hier te zien zijn.", - "empty_column.followed_tags": "Je hebt nog geen hashtags gevolgd. Wanneer je dit doet, zullen ze hier verschijnen.", + "empty_column.follow_requests": "Jij hebt nog enkel volgverzoek ontvangen. Wanneer je er eentje ontvangt, valt dat hier te zien.", + "empty_column.followed_tags": "Je hebt nog geen hashtags gevolgd. Nadat je dit doet, komen deze hier te staan.", "empty_column.hashtag": "Er is nog niks te vinden onder deze hashtag.", "empty_column.home": "Deze tijdlijn is leeg! Volg meer mensen om het te vullen.", "empty_column.list": "Er is nog niks te zien in deze lijst. Wanneer lijstleden nieuwe berichten plaatsen, zijn deze hier te zien.", - "empty_column.lists": "Je hebt nog geen lijsten. Wanneer je er een aanmaakt, zal dat hier verschijnen.", + "empty_column.lists": "Je hebt nog geen lijsten. Wanneer je er een aanmaakt, valt dat hier te zien.", "empty_column.mutes": "Jij hebt nog geen gebruikers genegeerd.", "empty_column.notification_requests": "Helemaal leeg! Er is hier niets. Wanneer je nieuwe meldingen ontvangt, verschijnen deze hier volgens jouw instellingen.", "empty_column.notifications": "Je hebt nog geen meldingen. Begin met iemand een gesprek.", @@ -402,9 +427,15 @@ "loading_indicator.label": "Laden…", "media_gallery.toggle_visible": "{number, plural, one {afbeelding verbergen} other {afbeeldingen verbergen}}", "moved_to_account_banner.text": "Omdat je naar {movedToAccount} bent verhuisd is jouw account {disabledAccount} momenteel uitgeschakeld.", - "mute_modal.duration": "Tijdsduur", - "mute_modal.hide_notifications": "Verberg meldingen van deze persoon?", - "mute_modal.indefinite": "Voor onbepaalde tijd", + "mute_modal.hide_from_notifications": "Onder meldingen verbergen", + "mute_modal.hide_options": "Opties verbergen", + "mute_modal.indefinite": "Totdat ik ze niet meer negeer", + "mute_modal.show_options": "Opties tonen", + "mute_modal.they_can_mention_and_follow": "De persoon kan jou vermelden en volgen, maar jij ziet niks meer van deze persoon.", + "mute_modal.they_wont_know": "De persoon krijgt niet te weten dat die wordt genegeerd.", + "mute_modal.title": "Gebruiker negeren?", + "mute_modal.you_wont_see_mentions": "Je ziet geen berichten meer die dit account vermelden.", + "mute_modal.you_wont_see_posts": "De persoon kan nog steeds jouw berichten zien, maar diens berichten zie je niet meer.", "navigation_bar.about": "Over", "navigation_bar.advanced_interface": "In geavanceerde webinterface openen", "navigation_bar.blocks": "Geblokkeerde gebruikers", @@ -495,7 +526,7 @@ "onboarding.actions.go_to_home": "Ga naar je starttijdlijn", "onboarding.compose.template": "Hallo #Mastodon!", "onboarding.follows.empty": "Helaas kunnen op dit moment geen resultaten worden getoond. Je kunt proberen te zoeken of op de verkenningspagina te bladeren om mensen te vinden die je kunt volgen, of probeer het later opnieuw.", - "onboarding.follows.lead": "Jouw starttijdlijn is de belangrijkste manier om Mastodon te ervaren. Hoe meer mensen je volgt, hoe actiever en interessanter het zal zijn. Om te beginnen, zijn hier enkele suggesties:", + "onboarding.follows.lead": "Jouw starttijdlijn is de belangrijkste manier om Mastodon te ervaren. Hoe meer mensen je volgt, hoe actiever en interessanter het wordt. Om te beginnen zijn hier enkele suggesties:", "onboarding.follows.title": "Je starttijdlijn aan jouw wensen aanpassen", "onboarding.profile.discoverable": "Maak mijn profiel vindbaar", "onboarding.profile.discoverable_hint": "Wanneer je akkoord gaat met het vindbaar zijn op Mastodon, verschijnen je berichten in zoekresultaten en kunnen ze trending worden, en je profiel kan aan andere mensen worden aanbevolen wanneer ze vergelijkbare interesses hebben.", @@ -519,7 +550,7 @@ "onboarding.steps.follow_people.title": "Je starttijdlijn aan jouw wensen aanpassen", "onboarding.steps.publish_status.body": "Zeg hallo tegen de wereld met tekst, foto's, video's of peilingen {emoji}", "onboarding.steps.publish_status.title": "Maak je eerste bericht", - "onboarding.steps.setup_profile.body": "Anderen zullen eerder met je in contact treden als je wat over jezelf vertelt.", + "onboarding.steps.setup_profile.body": "Wanneer je meer over jezelf vertelt, krijg je meer interactie met andere mensen.", "onboarding.steps.setup_profile.title": "Je profiel aanpassen", "onboarding.steps.share_profile.body": "Laat je vrienden weten waar je te vinden bent op Mastodon", "onboarding.steps.share_profile.title": "Deel je Mastodonprofiel", @@ -547,7 +578,7 @@ "privacy.private.short": "Volgers", "privacy.public.long": "Iedereen op Mastodon en daarbuiten", "privacy.public.short": "Openbaar", - "privacy.unlisted.additional": "Dit is vergelijkbaar met openbaar, behalve dat het beticht niet verschijnt op openbare tijdlijnen of hashtags, onder verkennen of Mastodon zoeken, zelfs als je je account daarvoor hebt ingesteld.", + "privacy.unlisted.additional": "Dit is vergelijkbaar met openbaar, behalve dat het bericht niet op openbare tijdlijnen, onder hashtags, verkennen of zoeken verschijnt, zelfs als je je account daarvoor hebt ingesteld.", "privacy.unlisted.long": "Voor iedereen zichtbaar, maar niet onder trends, hashtags en op openbare tijdlijnen", "privacy.unlisted.short": "Minder openbaar", "privacy_policy.last_updated": "Laatst bijgewerkt op {date}", @@ -693,7 +724,7 @@ "status.remove_bookmark": "Bladwijzer verwijderen", "status.replied_to": "Reageerde op {name}", "status.reply": "Reageren", - "status.replyAll": "Reageer op iedereen", + "status.replyAll": "Op iedereen reageren", "status.report": "@{name} rapporteren", "status.sensitive_warning": "Gevoelige inhoud", "status.share": "Delen", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 4235f57916..a218cadf8d 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -89,6 +89,9 @@ "announcement.announcement": "Kunngjering", "attachments_list.unprocessed": "(ubehandla)", "audio.hide": "Gøym lyd", + "block_modal.remote_users_caveat": "Vi vil be tenaren {domain} om å respektere di avgjerd. Det kan ikkje garanterast at det vert etterfølgd, sidan nokre tenarar kan handtere blokkering ulikt. Offentlege innlegg kan framleis vere synlege for ikkje-innlogga brukarar.", + "block_modal.show_less": "Vis mindre", + "block_modal.show_more": "Vis meir", "boost_modal.combo": "Du kan trykkja {combo} for å hoppa over dette neste gong", "bundle_column_error.copy_stacktrace": "Kopier feilrapport", "bundle_column_error.error.body": "Den etterspurde sida kan ikke hentast fram. Det kan skuldast ein feil i koden vår eller eit kompatibilitetsproblem.", @@ -160,9 +163,7 @@ "compose_form.spoiler.unmarked": "Legg til innhaldsåtvaring", "compose_form.spoiler_placeholder": "Innhaldsåtvaring (valfritt)", "confirmation_modal.cancel": "Avbryt", - "confirmations.block.block_and_report": "Blokker & rapporter", "confirmations.block.confirm": "Blokker", - "confirmations.block.message": "Er du sikker på at du vil blokkera {name}?", "confirmations.cancel_follow_request.confirm": "Trekk attende førespurnad", "confirmations.cancel_follow_request.message": "Er du sikker på at du vil trekkje attende førespurnaden din om å fylgje {name}?", "confirmations.delete.confirm": "Slett", @@ -171,15 +172,12 @@ "confirmations.delete_list.message": "Er du sikker på at du vil sletta denne lista for alltid?", "confirmations.discard_edit_media.confirm": "Forkast", "confirmations.discard_edit_media.message": "Du har ulagra endringar i mediaskildringa eller førehandsvisinga. Vil du forkasta dei likevel?", - "confirmations.domain_block.confirm": "Blokker heile domenet", "confirmations.domain_block.message": "Er du heilt, heilt sikker på at du vil skjula heile {domain}? I dei fleste tilfelle er det godt nok og føretrekt med nokre få målretta blokkeringar eller målbindingar. Du kjem ikkje til å sjå innhald frå domenet i fødererte tidsliner eller i varsla dine. Fylgjarane dine frå domenet vert fjerna.", "confirmations.edit.confirm": "Rediger", "confirmations.edit.message": "Å redigera no vil overskriva den meldinga du er i ferd med å skriva. Er du sikker på at du vil halda fram?", "confirmations.logout.confirm": "Logg ut", "confirmations.logout.message": "Er du sikker på at du vil logga ut?", "confirmations.mute.confirm": "Målbind", - "confirmations.mute.explanation": "Dette vil gøyma innlegga deira og innlegg som nemner dei, men dei vil framleis kunna sjå innlegga dine og fylgja deg.", - "confirmations.mute.message": "Er du sikker på at du vil målbinda {name}?", "confirmations.redraft.confirm": "Slett & skriv på nytt", "confirmations.redraft.message": "Er du sikker på at du vil sletta denne statusen og skriva han på nytt? Då misser du favorittar og framhevingar, og svar til det opprinnelege innlegget vert foreldrelause.", "confirmations.reply.confirm": "Svar", @@ -205,6 +203,19 @@ "dismissable_banner.explore_statuses": "Dette er innlegg frå det desentraliserte nettverket som er i støytet i dag. Nye statusar som er mykje framheva og merkte som favorittar er rangert høgare.", "dismissable_banner.explore_tags": "Desse emneknaggane er populære blant folk på denne tenaren og andre tenarar i det desentraliserte nettverket nett no.", "dismissable_banner.public_timeline": "Dette er dei nyaste offentlege innlegga frå menneske på det sosiale nettet som folk på {domain} følgjer.", + "domain_pill.activitypub_lets_connect": "Den lar deg kople til og samhandle med folk ikkje berre på Mastodon, men òg på tvers av forskjellige sosiale appar.", + "domain_pill.activitypub_like_language": "ActivityPub er som språket Mastodon snakkar med andre sosiale nettverk.", + "domain_pill.server": "Tenar", + "domain_pill.their_handle": "Deira handtak:", + "domain_pill.their_server": "Deira digitale heim, som alle innlegga deira bur.", + "domain_pill.their_username": "Deira unike identifikator på serveren deira. Det er mogleg å finne brukarar med same brukarnamn på forskjellige tenarar.", + "domain_pill.username": "Brukarnamn", + "domain_pill.whats_in_a_handle": "Kva er i eit handtak?", + "domain_pill.who_they_are": "Sidan handtak seier kven nokon er og kvar dei er, kan du interagere med folk på tvers av det sosiale nettverket av .", + "domain_pill.who_you_are": "Sidan handtaket ditt seier kven du er og kvar du er, kan folk interagere med deg på tvers av det sosiale nettverket av .", + "domain_pill.your_handle": "Handtaket ditt:", + "domain_pill.your_server": "Din digitale heim, som alle postane dine bur i. Liker du ikkje dette? Overfør tenarar når som helst og ta med følgjarane dine òg.", + "domain_pill.your_username": "Din unike identifikator på denne tenaren. Det er mogleg å finne brukarar med same brukarnamn på forskjellige tenarar.", "embed.instructions": "Bygg inn denne statusen på nettsida di ved å kopiera koden nedanfor.", "embed.preview": "Slik kjem det til å sjå ut:", "emoji_button.activity": "Aktivitet", @@ -402,9 +413,6 @@ "loading_indicator.label": "Lastar…", "media_gallery.toggle_visible": "{number, plural, one {Skjul bilete} other {Skjul bilete}}", "moved_to_account_banner.text": "Kontoen din, {disabledAccount} er for tida deaktivert fordi du har flytta til {movedToAccount}.", - "mute_modal.duration": "Varigheit", - "mute_modal.hide_notifications": "Gøym varsel frå denne brukaren?", - "mute_modal.indefinite": "På ubestemt tid", "navigation_bar.about": "Om", "navigation_bar.advanced_interface": "Opne i avansert nettgrensesnitt", "navigation_bar.blocks": "Blokkerte brukarar", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 4834100a91..7f93ff0465 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Legg til innholdsvarsel", "compose_form.spoiler_placeholder": "Innholdsadvarsel (valgfritt)", "confirmation_modal.cancel": "Avbryt", - "confirmations.block.block_and_report": "Blokker og rapporter", "confirmations.block.confirm": "Blokkèr", - "confirmations.block.message": "Er du sikker på at du vil blokkere {name}?", "confirmations.cancel_follow_request.confirm": "Trekk tilbake forespørsel", "confirmations.cancel_follow_request.message": "Er du sikker på at du vil trekke tilbake forespørselen din for å følge {name}?", "confirmations.delete.confirm": "Slett", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Er du sikker på at du vil slette denne listen permanent?", "confirmations.discard_edit_media.confirm": "Forkast", "confirmations.discard_edit_media.message": "Du har ulagrede endringer i mediebeskrivelsen eller i forhåndsvisning, forkast dem likevel?", - "confirmations.domain_block.confirm": "Skjul alt fra domenet", "confirmations.domain_block.message": "Er du sikker på at du vil skjule hele domenet {domain}? I de fleste tilfeller er det bedre med målrettet blokkering eller demping.", "confirmations.edit.confirm": "Redigér", "confirmations.edit.message": "Å redigere nå vil overskrive meldingen du skriver for øyeblikket. Er du sikker på at du vil fortsette?", "confirmations.logout.confirm": "Logg ut", "confirmations.logout.message": "Er du sikker på at du vil logge ut?", "confirmations.mute.confirm": "Demp", - "confirmations.mute.explanation": "Dette vil skjule innlegg fra dem og innlegg som nevner dem, men det vil fortsatt la dem se dine innlegg og å følge deg.", - "confirmations.mute.message": "Er du sikker på at du vil dempe {name}?", "confirmations.redraft.confirm": "Slett og skriv på nytt", "confirmations.redraft.message": "Er du sikker på at du vil slette dette innlegget og lagre det på nytt? Favoritter og fremhevinger vil gå tapt, og svar til det originale innlegget vil bli foreldreløse.", "confirmations.reply.confirm": "Svar", @@ -389,9 +384,6 @@ "loading_indicator.label": "Laster…", "media_gallery.toggle_visible": "Veksle synlighet", "moved_to_account_banner.text": "Din konto {disabledAccount} er for øyeblikket deaktivert fordi du flyttet til {movedToAccount}.", - "mute_modal.duration": "Varighet", - "mute_modal.hide_notifications": "Skjul varslinger fra denne brukeren?", - "mute_modal.indefinite": "På ubestemt tid", "navigation_bar.about": "Om", "navigation_bar.advanced_interface": "Åpne i det avanserte nettgrensesnittet", "navigation_bar.blocks": "Blokkerte brukere", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 2a5d05aac7..3c32fed0ef 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -137,9 +137,7 @@ "compose_form.spoiler.marked": "Lo tèxte es rescondut jos l’avertiment", "compose_form.spoiler.unmarked": "Lo tèxte es pas rescondut", "confirmation_modal.cancel": "Anullar", - "confirmations.block.block_and_report": "Blocar e senhalar", "confirmations.block.confirm": "Blocar", - "confirmations.block.message": "Volètz vertadièrament blocar {name} ?", "confirmations.cancel_follow_request.confirm": "Retirar la demandar", "confirmations.cancel_follow_request.message": "Volètz vertadièrament retirar la demanda de seguiment de {name} ?", "confirmations.delete.confirm": "Escafar", @@ -147,14 +145,11 @@ "confirmations.delete_list.confirm": "Suprimir", "confirmations.delete_list.message": "Volètz vertadièrament suprimir aquesta lista per totjorn ?", "confirmations.discard_edit_media.confirm": "Ignorar", - "confirmations.domain_block.confirm": "Amagar tot lo domeni", "confirmations.domain_block.message": "Volètz vertadièrament blocar complètament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.\nVeiretz pas cap de contengut d’aquel domeni dins cap de flux public o dins vòstras notificacions. Vòstres seguidors d’aquel domeni seràn levats.", "confirmations.edit.confirm": "Modificar", "confirmations.logout.confirm": "Desconnexion", "confirmations.logout.message": "Volètz vertadièrament vos desconnectar ?", "confirmations.mute.confirm": "Rescondre", - "confirmations.mute.explanation": "Aquò lor escondrà las publicacions e mencions, mas aquò lor permetrà encara de veire vòstra publicacions e de vos sègre.", - "confirmations.mute.message": "Volètz vertadièrament rescondre {name} ?", "confirmations.redraft.confirm": "Escafar & tornar formular", "confirmations.reply.confirm": "Respondre", "confirmations.reply.message": "Respondre remplaçarà lo messatge que sètz a escriure. Volètz vertadièrament contunhar ?", @@ -333,9 +328,6 @@ "load_pending": "{count, plural, one {# nòu element} other {# nòu elements}}", "loading_indicator.label": "Cargament…", "media_gallery.toggle_visible": "Modificar la visibilitat", - "mute_modal.duration": "Durada", - "mute_modal.hide_notifications": "Rescondre las notificacions d’aquesta persona ?", - "mute_modal.indefinite": "Cap de data de fin", "navigation_bar.about": "A prepaus", "navigation_bar.advanced_interface": "Dobrir l’interfàcia web avançada", "navigation_bar.blocks": "Personas blocadas", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index f86a6933fc..e09dd9067a 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -86,13 +86,11 @@ "compose_form.spoiler.unmarked": "ਸਮੱਗਰੀ ਬਾਰੇ ਚੇਤਾਵਨੀ ਜੋੜੋ", "compose_form.spoiler_placeholder": "ਸਮੱਗਰੀ ਬਾਰੇ ਚੇਤਾਵਨੀ (ਚੋਣਵਾਂ)", "confirmation_modal.cancel": "ਰੱਦ ਕਰੋ", - "confirmations.block.block_and_report": "ਰੋਕ ਲਾਓ ਤੇ ਰਿਪੋਰਟ ਕਰੋ", "confirmations.block.confirm": "ਪਾਬੰਦੀ", "confirmations.delete.confirm": "ਹਟਾਓ", "confirmations.delete.message": "ਕੀ ਤੁਸੀਂ ਇਹ ਪੋਸਟ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?", "confirmations.delete_list.confirm": "ਹਟਾਓ", "confirmations.discard_edit_media.confirm": "ਰੱਦ ਕਰੋ", - "confirmations.domain_block.confirm": "ਪੂਰੀ ਡੋਮੇਨ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ", "confirmations.edit.confirm": "ਸੋਧ", "confirmations.logout.confirm": "ਬਾਹਰ ਹੋਵੋ", "confirmations.mute.confirm": "ਮੌਨ ਕਰੋ", @@ -196,7 +194,6 @@ "lists.replies_policy.followed": "ਕੋਈ ਵੀ ਫ਼ਾਲੋ ਕੀਤਾ ਵਰਤੋਂਕਾਰ", "lists.replies_policy.none": "ਕੋਈ ਨਹੀਂ", "loading_indicator.label": "ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ…", - "mute_modal.duration": "ਮਿਆਦ", "navigation_bar.about": "ਇਸ ਬਾਰੇ", "navigation_bar.advanced_interface": "ਤਕਨੀਕੀ ਵੈੱਬ ਇੰਟਰਫੇਸ ਵਿੱਚ ਖੋਲ੍ਹੋ", "navigation_bar.blocks": "ਪਾਬੰਦੀ ਲਾਏ ਵਰਤੋਂਕਾਰ", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index acd389da1c..782ea9d762 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -89,6 +89,14 @@ "announcement.announcement": "Ogłoszenie", "attachments_list.unprocessed": "(nieprzetworzone)", "audio.hide": "Ukryj dźwięk", + "block_modal.remote_users_caveat": "Poprosimy serwer {domain} o uszanowanie twojej decyzji. Zgodność nie jest jednak gwarantowana, bo niektóre serwery mogą inaczej obsługiwać blokowanie. Wpisy publiczne mogą być widoczne dla niezalogowanych użytkowników.", + "block_modal.show_less": "Pokaż mniej", + "block_modal.show_more": "Pokaż więcej", + "block_modal.they_cant_mention": "Użytkownik nie może Cię obserwować ani dodawać wzmianek o Tobie.", + "block_modal.they_cant_see_posts": "Użytkownik nie będzie widzieć Twoich wpisów, a Ty jego.", + "block_modal.they_will_know": "Użytkownik będzie wiedział, że jest zablokowany.", + "block_modal.title": "Zablokować użytkownika?", + "block_modal.you_wont_see_mentions": "Nie zobaczysz wpisów, które wspominają tego użytkownika.", "boost_modal.combo": "Naciśnij {combo}, aby pominąć to następnym razem", "bundle_column_error.copy_stacktrace": "Skopiuj raport o błędzie", "bundle_column_error.error.body": "Nie można zrenderować żądanej strony. Może to być spowodowane błędem w naszym kodzie lub problemami z kompatybilnością przeglądarki.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Dodaj ostrzeżenie o treści", "compose_form.spoiler_placeholder": "Ostrzeżenie o treści (opcjonalne)", "confirmation_modal.cancel": "Anuluj", - "confirmations.block.block_and_report": "Zablokuj i zgłoś", "confirmations.block.confirm": "Zablokuj", - "confirmations.block.message": "Czy na pewno chcesz zablokować {name}?", "confirmations.cancel_follow_request.confirm": "Wycofaj prośbę", "confirmations.cancel_follow_request.message": "Czy na pewno chcesz wycofać prośbę o możliwość obserwowania {name}?", "confirmations.delete.confirm": "Usuń", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Czy na pewno chcesz bezpowrotnie usunąć tą listę?", "confirmations.discard_edit_media.confirm": "Odrzuć", "confirmations.discard_edit_media.message": "Masz niezapisane zmiany w opisie lub podglądzie, odrzucić je mimo to?", - "confirmations.domain_block.confirm": "Ukryj wszystko z domeny", + "confirmations.domain_block.confirm": "Blokuj serwer", "confirmations.domain_block.message": "Czy na pewno chcesz zablokować całą domenę {domain}? Zwykle lepszym rozwiązaniem jest blokada lub wyciszenie kilku użytkowników.", "confirmations.edit.confirm": "Edytuj", "confirmations.edit.message": "Edytowanie wpisu nadpisze wiadomość, którą obecnie piszesz. Czy na pewno chcesz to zrobić?", "confirmations.logout.confirm": "Wyloguj", "confirmations.logout.message": "Czy na pewno chcesz się wylogować?", "confirmations.mute.confirm": "Wycisz", - "confirmations.mute.explanation": "To schowa ich i wspominające ich posty, ale wciąż pozwoli im widzieć twoje posty i obserwować cię.", - "confirmations.mute.message": "Czy na pewno chcesz wyciszyć {name}?", "confirmations.redraft.confirm": "Usuń i przeredaguj", "confirmations.redraft.message": "Czy na pewno chcesz usunąć i przeredagować ten wpis? Polubienia i podbicia zostaną utracone, a odpowiedzi do oryginalnego wpisu zostaną osierocone.", "confirmations.reply.confirm": "Odpowiedz", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Obecnie te wpisy z tego serwera i pozostałych serwerów w zdecentralizowanej sieci zyskują popularność na tym serwerze.", "dismissable_banner.explore_tags": "Te hasztagi obecnie zyskują popularność wśród osób z tego serwera i pozostałych w zdecentralizowanej sieci.", "dismissable_banner.public_timeline": "Są to najnowsze publiczne wpisy osób w serwisie społecznościowym, które obserwują ludzie w serwisie {domain}.", + "domain_block_modal.block": "Blokuj serwer", + "domain_block_modal.block_account_instead": "Zamiast tego zablokuj @{name}", + "domain_block_modal.they_can_interact_with_old_posts": "Ludzie z tego serwera mogą wchodzić w interakcje z Twoimi starymi wpisami.", + "domain_block_modal.they_cant_follow": "Nikt z tego serwera nie może Cię obserwować.", + "domain_block_modal.they_wont_know": "Użytkownik nie dowie się, że został zablokowany.", + "domain_block_modal.title": "Zablokować domenę?", + "domain_block_modal.you_will_lose_followers": "Wszyscy twoi obserwujący z tego serwera zostaną usunięci.", + "domain_block_modal.you_wont_see_posts": "Nie zobaczysz postów ani powiadomień od użytkowników na tym serwerze.", + "domain_pill.activitypub_lets_connect": "Pozwala połączyć się z ludźmi na Mastodonie, jak i na innych serwisach społecznościowych.", + "domain_pill.activitypub_like_language": "ActivityPub jest językiem używanym przez Mastodon do wymiany danych z innymi serwisami społecznościowymi.", + "domain_pill.server": "Serwer", + "domain_pill.their_handle": "Uchwyt:", + "domain_pill.their_server": "Cyfrowy dom, w którym znajdują się wszystkie wpisy.", + "domain_pill.their_username": "Unikalny identyfikator na serwerze. Możliwe jest znalezienie użytkowników o tej samej nazwie użytkownika na różnych serwerach.", + "domain_pill.username": "Nazwa użytkownika", + "domain_pill.whats_in_a_handle": "Co zawiera uchwyt użytkownika?", + "domain_pill.who_they_are": "Ponieważ uchwyty mówią kto jest kim i gdzie się znajduje, możesz wchodzić w interakcje z ludźmi korzystającymi z .", + "domain_pill.who_you_are": "Ponieważ Twój uchwyt mówi kim jesteś i gdzie się znajdujesz, inni mogą wchodzić z Tobą w interakcje korzystając z .", + "domain_pill.your_handle": "Twój uchwyt:", + "domain_pill.your_server": "Twój cyfrowy dom, w którym żyją wszystkie Twoje wpisy. Nie lubisz tego? Zmień serwer w dowolnym momencie i przenieś swoich obserwujących.", + "domain_pill.your_username": "Twój unikalny identyfikator na tym serwerze. Użytkownicy o tej samej nazwie mogą współistnieć na różnych serwerach.", "embed.instructions": "Osadź ten wpis na swojej stronie wklejając poniższy kod.", "embed.preview": "Będzie to wyglądać tak:", "emoji_button.activity": "Aktywność", @@ -402,9 +427,15 @@ "loading_indicator.label": "Ładowanie…", "media_gallery.toggle_visible": "Przełącz widoczność", "moved_to_account_banner.text": "Twoje konto {disabledAccount} jest obecnie wyłączone, ponieważ zostało przeniesione na {movedToAccount}.", - "mute_modal.duration": "Czas", - "mute_modal.hide_notifications": "Chcesz ukryć powiadomienia od tego użytkownika?", - "mute_modal.indefinite": "Nieokreślony", + "mute_modal.hide_from_notifications": "Ukryj z powiadomień", + "mute_modal.hide_options": "Ukryj opcje", + "mute_modal.indefinite": "Do ręcznego usunięcia wyciszenia", + "mute_modal.show_options": "Pokaż opcje", + "mute_modal.they_can_mention_and_follow": "Użytkownik może Cię obserwować oraz dodawać wzmianki, ale Ty ich nie zobaczysz.", + "mute_modal.they_wont_know": "Użytkownik nie dowie się, że został wyciszony.", + "mute_modal.title": "Wyciszyć użytkownika?", + "mute_modal.you_wont_see_mentions": "Nie zobaczysz wpisów, które wspominają tego użytkownika.", + "mute_modal.you_wont_see_posts": "Użytkownik dalej będzie widzieć Twoje posty, ale Ty nie będziesz widzieć jego.", "navigation_bar.about": "O serwerze", "navigation_bar.advanced_interface": "Otwórz w zaawansowanym interfejsie użytkownika", "navigation_bar.blocks": "Zablokowani użytkownicy", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 585052de91..28a18667ae 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -89,6 +89,10 @@ "announcement.announcement": "Comunicados", "attachments_list.unprocessed": "(não processado)", "audio.hide": "Ocultar áudio", + "block_modal.show_less": "Mostrar menos", + "block_modal.show_more": "Mostrar mais", + "block_modal.title": "Bloquear usuário?", + "block_modal.you_wont_see_mentions": "Você não verá publicações que os mencionem.", "boost_modal.combo": "Pressione {combo} para pular isso na próxima vez", "bundle_column_error.copy_stacktrace": "Copiar relatório do erro", "bundle_column_error.error.body": "A página solicitada não pôde ser renderizada. Pode ser devido a um erro no nosso código, ou um problema de compatibilidade do seu navegador.", @@ -160,9 +164,7 @@ "compose_form.spoiler.unmarked": "Sem Aviso de Conteúdo", "compose_form.spoiler_placeholder": "Aviso de conteúdo (opcional)", "confirmation_modal.cancel": "Cancelar", - "confirmations.block.block_and_report": "Bloquear e denunciar", "confirmations.block.confirm": "Bloquear", - "confirmations.block.message": "Você tem certeza de que deseja bloquear {name}?", "confirmations.cancel_follow_request.confirm": "Cancelar a solicitação", "confirmations.cancel_follow_request.message": "Tem certeza de que deseja cancelar seu pedido para seguir {name}?", "confirmations.delete.confirm": "Excluir", @@ -171,15 +173,12 @@ "confirmations.delete_list.message": "Você tem certeza de que deseja excluir esta lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Há mudanças não salvas na descrição ou pré-visualização da mídia. Descartar assim mesmo?", - "confirmations.domain_block.confirm": "Bloquear instância", "confirmations.domain_block.message": "Você tem certeza de que deseja bloquear tudo de {domain}? Você não verá mais o conteúdo desta instância em nenhuma linha do tempo pública ou nas suas notificações. Seus seguidores desta instância serão removidos.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar agora irá substituir a mensagem que está sendo criando. Tem certeza de que deseja continuar?", "confirmations.logout.confirm": "Sair", "confirmations.logout.message": "Você tem certeza de que deseja sair?", "confirmations.mute.confirm": "Silenciar", - "confirmations.mute.explanation": "Isso ocultará toots do usuário e toots que o mencionam, mas ainda permitirá que ele veja teus toots e te siga.", - "confirmations.mute.message": "Você tem certeza de que deseja silenciar {name}?", "confirmations.redraft.confirm": "Excluir e rascunhar", "confirmations.redraft.message": "Você tem certeza de que quer apagar essa postagem e rascunhá-la? Favoritos e impulsos serão perdidos, e respostas à postagem original ficarão órfãs.", "confirmations.reply.confirm": "Responder", @@ -205,6 +204,8 @@ "dismissable_banner.explore_statuses": "Estas são postagens de toda a rede social que estão ganhando tração hoje. Postagens mais recentes com mais impulsos e favoritos têm classificações mais altas.", "dismissable_banner.explore_tags": "Estas hashtags estão ganhando popularidade no momento entre as pessoas deste e de outros servidores da rede descentralizada.", "dismissable_banner.public_timeline": "Estas são as publicações públicas mais recentes de pessoas na rede social que pessoas em {domain} seguem.", + "domain_block_modal.they_can_interact_with_old_posts": "Pessoas deste servidor podem interagir com suas publicações antigas.", + "domain_block_modal.they_cant_follow": "Ninguém deste servidor pode lhe seguir.", "embed.instructions": "Incorpore este toot no seu site ao copiar o código abaixo.", "embed.preview": "Aqui está como vai ficar:", "emoji_button.activity": "Atividade", @@ -401,9 +402,13 @@ "loading_indicator.label": "Carregando…", "media_gallery.toggle_visible": "{number, plural, one {Ocultar mídia} other {Ocultar mídias}}", "moved_to_account_banner.text": "Sua conta {disabledAccount} está desativada porque você a moveu para {movedToAccount}.", - "mute_modal.duration": "Duração", - "mute_modal.hide_notifications": "Ocultar notificações deste usuário?", - "mute_modal.indefinite": "Indefinido", + "mute_modal.hide_options": "Ocultar opções", + "mute_modal.show_options": "Mostrar opções", + "mute_modal.they_can_mention_and_follow": "Eles podem mencionar e seguir você, mas você não os verá.", + "mute_modal.they_wont_know": "Eles não saberão que foram silenciados.", + "mute_modal.title": "Silenciar usuário?", + "mute_modal.you_wont_see_mentions": "Você não verá publicações que os mencionem.", + "mute_modal.you_wont_see_posts": "Eles ainda poderão ver suas publicações, mas você não verá as deles.", "navigation_bar.about": "Sobre", "navigation_bar.advanced_interface": "Ativar na interface web avançada", "navigation_bar.blocks": "Usuários bloqueados", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index c5a837a34c..b1145f64d5 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Juntar um aviso de conteúdo", "compose_form.spoiler_placeholder": "Aviso de conteúdo (opcional)", "confirmation_modal.cancel": "Cancelar", - "confirmations.block.block_and_report": "Bloquear e Denunciar", "confirmations.block.confirm": "Bloquear", - "confirmations.block.message": "De certeza que queres bloquear {name}?", "confirmations.cancel_follow_request.confirm": "Retirar pedido", "confirmations.cancel_follow_request.message": "Tem a certeza que pretende retirar o pedido para seguir {name}?", "confirmations.delete.confirm": "Eliminar", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Tens a certeza de que deseja eliminar permanentemente esta lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tem alterações por guardar na descrição ou pré-visualização do conteúdo. Descartar mesmo assim?", - "confirmations.domain_block.confirm": "Esconder tudo deste domínio", "confirmations.domain_block.message": "De certeza que queres bloquear completamente o domínio {domain}? Na maioria dos casos, silenciar ou bloquear alguns utilizadores é suficiente e é o recomendado. Não irás ver conteúdo daquele domínio em cronologia alguma nem nas tuas notificações. Os teus seguidores daquele domínio serão removidos.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar agora irá sobrescrever a mensagem que está a compor. Tem a certeza de que deseja continuar?", "confirmations.logout.confirm": "Terminar sessão", "confirmations.logout.message": "Tem a certeza de que quer terminar a sessão?", "confirmations.mute.confirm": "Silenciar", - "confirmations.mute.explanation": "Isto irá esconder publicações deles ou publicações que os mencionem, mas irá permitir que vejam as suas publicações e sejam seus seguidores.", - "confirmations.mute.message": "De certeza que queres silenciar {name}?", "confirmations.redraft.confirm": "Eliminar & reescrever", "confirmations.redraft.message": "Tem a certeza de que quer eliminar e reescrever esta publicação? Os favoritos e partilhas perder-se-ão e as respostas à publicação original ficarão órfãs.", "confirmations.reply.confirm": "Responder", @@ -402,9 +397,6 @@ "loading_indicator.label": "A carregar…", "media_gallery.toggle_visible": "Alternar visibilidade", "moved_to_account_banner.text": "A sua conta {disabledAccount} está, no momento, desativada, porque você migrou para {movedToAccount}.", - "mute_modal.duration": "Duração", - "mute_modal.hide_notifications": "Esconder notificações deste utilizador?", - "mute_modal.indefinite": "Indefinidamente", "navigation_bar.about": "Sobre", "navigation_bar.advanced_interface": "Abrir na interface web avançada", "navigation_bar.blocks": "Utilizadores bloqueados", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 37e999053c..0aef0ebd96 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -155,9 +155,7 @@ "compose_form.spoiler.unmarked": "Adaugă un avertisment privind conținutul", "compose_form.spoiler_placeholder": "Atenționare de conținut (opțional)", "confirmation_modal.cancel": "Anulează", - "confirmations.block.block_and_report": "Blochează și raportează", "confirmations.block.confirm": "Blochează", - "confirmations.block.message": "Ești sigur că vrei să blochezi pe {name}?", "confirmations.cancel_follow_request.confirm": "Retrage cererea", "confirmations.cancel_follow_request.message": "Sunteți sigur că doriți să retrageți cererea dvs. de urmărire pentru {name}?", "confirmations.delete.confirm": "Elimină", @@ -166,15 +164,12 @@ "confirmations.delete_list.message": "Ești sigur că vrei să elimini definitiv această listă?", "confirmations.discard_edit_media.confirm": "Renunță", "confirmations.discard_edit_media.message": "Ai modificări nesalvate în descrierea sau previzualizarea media, renunți oricum?", - "confirmations.domain_block.confirm": "Blochează întregul domeniu", "confirmations.domain_block.message": "Ești absolut sigur că vrei să blochezi tot domeniul {domain}? În cele mai multe cazuri, raportarea sau blocarea anumitor lucruri este suficientă și de preferat. Nu vei mai vedea niciun conținut din acest domeniu în vreun flux public sau în vreo notificare. Abonații tăi din acest domeniu vor fi eliminați.", "confirmations.edit.confirm": "Modifică", "confirmations.edit.message": "Editarea acum va suprascrie mesajul pe care îl compuneți în prezent. Sunteți sigur că vreți să continuați?", "confirmations.logout.confirm": "Deconectare", "confirmations.logout.message": "Ești sigur că vrei să te deconectezi?", "confirmations.mute.confirm": "Ignoră", - "confirmations.mute.explanation": "Postările acestei persoane și postările în care este menționată vor fi ascunse, însă tot va putea să îți vadă postările și să se aboneze la tine.", - "confirmations.mute.message": "Ești sigur că vrei să ignori pe {name}?", "confirmations.redraft.confirm": "Șterge și scrie din nou", "confirmations.reply.confirm": "Răspunde", "confirmations.reply.message": "Dacă răspunzi acum, mesajul pe care îl scrii în acest moment va fi șters. Ești sigur că vrei să continui?", @@ -370,9 +365,6 @@ "load_pending": "{count, plural, one {# element nou} other {# elemente noi}}", "media_gallery.toggle_visible": "{number, plural, one {Ascunde imaginea} other {Ascunde imaginile}}", "moved_to_account_banner.text": "Contul tău {disabledAccount} este în acest moment dezactivat deoarece te-ai mutat la {movedToAccount}.", - "mute_modal.duration": "Durata", - "mute_modal.hide_notifications": "Ascunde notificările de la acest utilizator?", - "mute_modal.indefinite": "Nedeterminat", "navigation_bar.about": "Despre", "navigation_bar.advanced_interface": "Deschide în interfața web avansată", "navigation_bar.blocks": "Utilizatori blocați", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 917b8f4965..7a60f3bb7c 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Текст не скрыт", "compose_form.spoiler_placeholder": "Предупреждение о контенте (опционально)", "confirmation_modal.cancel": "Отмена", - "confirmations.block.block_and_report": "Заблокировать и пожаловаться", "confirmations.block.confirm": "Заблокировать", - "confirmations.block.message": "Вы уверены, что хотите заблокировать {name}?", "confirmations.cancel_follow_request.confirm": "Отменить запрос", "confirmations.cancel_follow_request.message": "Вы уверены, что хотите отозвать свой запрос на подписку {name}?", "confirmations.delete.confirm": "Удалить", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Вы действительно хотите навсегда удалить этот список?", "confirmations.discard_edit_media.confirm": "Отменить", "confirmations.discard_edit_media.message": "У вас есть несохранённые изменения описания мультимедиа или предпросмотра, отменить их?", - "confirmations.domain_block.confirm": "Да, заблокировать узел", "confirmations.domain_block.message": "Вы точно уверены, что хотите заблокировать {domain} полностью? В большинстве случаев нескольких блокировок и игнорирований вполне достаточно. Вы перестанете видеть публичную ленту и уведомления оттуда. Ваши подписчики из этого домена будут удалены.", "confirmations.edit.confirm": "Редактировать", "confirmations.edit.message": "В данный момент, редактирование перезапишет составляемое вами сообщение. Вы уверены, что хотите продолжить?", "confirmations.logout.confirm": "Выйти", "confirmations.logout.message": "Вы уверены, что хотите выйти?", "confirmations.mute.confirm": "Игнорировать", - "confirmations.mute.explanation": "Это действие скроет посты данного пользователя и те, в которых он упоминается, но при этом он по-прежнему сможет подписаться и смотреть ваши посты.", - "confirmations.mute.message": "Вы уверены, что хотите добавить {name} в список игнорируемых?", "confirmations.redraft.confirm": "Удалить и исправить", "confirmations.redraft.message": "Вы уверены, что хотите удалить и переписать этот пост? Отметки «избранного», продвижения и ответы к оригинальному посту будут удалены.", "confirmations.reply.confirm": "Ответить", @@ -393,9 +388,6 @@ "loading_indicator.label": "Загрузка…", "media_gallery.toggle_visible": "Показать/скрыть {number, plural, =1 {изображение} other {изображения}}", "moved_to_account_banner.text": "Ваша учетная запись {disabledAccount} в настоящее время заморожена, потому что вы переехали на {movedToAccount}.", - "mute_modal.duration": "Продолжительность", - "mute_modal.hide_notifications": "Скрыть уведомления от этого пользователя?", - "mute_modal.indefinite": "Не определена", "navigation_bar.about": "О проекте", "navigation_bar.advanced_interface": "Включить многоколоночный интерфейс", "navigation_bar.blocks": "Заблокированные пользователи", diff --git a/app/javascript/mastodon/locales/ry.json b/app/javascript/mastodon/locales/ry.json index 59de039777..de3d619171 100644 --- a/app/javascript/mastodon/locales/ry.json +++ b/app/javascript/mastodon/locales/ry.json @@ -15,5 +15,42 @@ "account.block_domain": "Заблоковати домен {domain}", "account.block_short": "Заблоковати", "account.blocked": "Заблоковано", - "account.browse_more_on_origin_server": "Позирайте бульше на ориґіналнум профілю" + "account.browse_more_on_origin_server": "Позирайте бульше на ориґіналнум профілю", + "account.copy": "Зкопіровати удкликованя на профіл", + "account.domain_blocked": "Домен заблокованый", + "account.edit_profile": "Управити профіл", + "account.endorse": "Указовати на профілови", + "account.featured_tags.last_status_at": "Датум послідньої публикації {date}", + "account.featured_tags.last_status_never": "Ниє публикацій", + "account.follow": "Пудписати ся", + "account.followers": "Пудписникы", + "account.followers.empty": "У сього хосновача раз ниє пудписникув.", + "account.following": "Слідуєте", + "account.follows.empty": "Сись хосновач щи никого не слідує.", + "account.go_to_profile": "Перейти на профіл", + "account.languages": "Поміняти убрані языкы", + "account.link_verified_on": "Властность сього удкликованя было звірено {date}", + "account.media": "Медіа", + "account.moved_to": "Хосновач {name} указав, ож новый профіл йим є:", + "account.mute_notifications_short": "Стишити голошіня", + "account.mute_short": "Стишити", + "account.muted": "Стишено", + "account.mutual": "Взайомно", + "account.no_bio": "Описа ниє.", + "account.open_original_page": "Удоперти ориґіналну сторунку", + "account.posts": "Публикації", + "account.posts_with_replies": "Публикації тай удповіді", + "account.report": "Скарговати ся на {name}", + "account.requested": "Чекат ся на пудтвердженя. Нажміт убы удмінити запрос на слідованя", + "account.requested_follow": "Хосновач {name} просит ся пудписати ся на вас", + "account.share": "Пошырити профіл хосновача {name}", + "account.unblock": "Розблоковати {name}", + "account.unblock_domain": "Розблоковати домен {domain}", + "bundle_column_error.return": "Вернути ся на головну", + "bundle_column_error.routing.body": "Не можеме найти сяку сторунку. Бизувні сьте, ож URL у адресному шорикови є добрый?", + "bundle_column_error.routing.title": "404", + "bundle_modal_error.close": "Заперти", + "bundle_modal_error.message": "Штось ся показило, закидь сьме ладовали сись компонент.", + "bundle_modal_error.retry": "Попробовати зась", + "closed_registrations.other_server_instructions": "Mastodon є децентралізованов платформов, можете си учинити профіл и на другому серверови тай комуніковати из сим." } diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json index 8620b348e3..99aa46bc89 100644 --- a/app/javascript/mastodon/locales/sa.json +++ b/app/javascript/mastodon/locales/sa.json @@ -135,9 +135,7 @@ "compose_form.spoiler.marked": "प्रच्छान्नाक्षरं विद्यते", "compose_form.spoiler.unmarked": "अप्रच्छन्नाक्षरं विद्यते", "confirmation_modal.cancel": "नश्यताम्", - "confirmations.block.block_and_report": "अवरुध्य आविद्यताम्", "confirmations.block.confirm": "निषेधः", - "confirmations.block.message": "निश्चयेनाऽवरोधो विधेयः {name}?", "confirmations.cancel_follow_request.confirm": "अनुरोधनमपनय", "confirmations.cancel_follow_request.message": "{name} अनुसरणस्यानुरोधमपनेतुं दृढीकृतं वा?", "confirmations.delete.confirm": "मार्जय", @@ -146,15 +144,12 @@ "confirmations.delete_list.message": "सूचिरियं निश्चयेन स्थायित्वेन च मार्जितुमिच्छसि वा?", "confirmations.discard_edit_media.confirm": "अपास्य", "confirmations.discard_edit_media.message": "माध्यमवर्णनां प्रदर्शनञ्च अरक्षितानि परिवर्तनानि सन्ति, तानि अपासितुमिच्छसि वा?", - "confirmations.domain_block.confirm": "निषिद्धः प्रदेशः क्रियताम्", "confirmations.domain_block.message": "नूनं निश्चयेनैव विनष्टुमिच्छति पूर्णप्रदेशमेव {domain} ? अधिकांशसन्दर्भेऽस्थायित्वेन निषेधता निःशब्दत्वञ्च पर्याप्तं चयनीयञ्च । न तस्मात् प्रदेशात्सर्वे विषया द्रष्टुमशक्याः किस्यांश्चिदपि सर्वजनिकसमयतालिकायां वा स्वीयसूचनापटले । सर्वेऽनुसर्तारस्ते प्रदेशात् ये सन्ति ते नश्यन्ते ।", "confirmations.edit.confirm": "सम्पादय", "confirmations.edit.message": "सम्पादनमिदानीं लिख्यते तर्हि पूर्वलिखितसन्देशं विनश्य पुनः लिख्यते। निश्चयेनैवं कर्तव्यम्?", "confirmations.logout.confirm": "बहिर्गम्यताम्", "confirmations.logout.message": "निश्चयेनैव बहिर्गमनं वाञ्छितम्?", "confirmations.mute.confirm": "निःशब्दम्", - "confirmations.mute.explanation": "एतेन तेषां पत्राणि तथा च यत्र ते उल्लिखिताः तानि छाद्यन्ते, किन्त्वेवं सत्यपि ते त्वामनुसर्तुं ततश्च पत्राणि द्रष्टुं शक्नुवन्ति ।", - "confirmations.mute.message": "किं निश्चयेन निःशब्दं भवेत् {name} मित्रमेतत् ?", "confirmations.redraft.confirm": "मार्जय पुनश्च लिख्यताम्", "confirmations.reply.confirm": "उत्तरम्", "confirmations.reply.message": "प्रत्युत्तरमिदानीं लिख्यते तर्हि पूर्वलिखितसन्देशं विनश्य पुनः लिख्यते । निश्चयेनैवं कर्तव्यम् ?", @@ -334,9 +329,6 @@ "load_pending": "{count, plural, one {# नूतनवस्तु} other {# नूतनवस्तूनि}}", "media_gallery.toggle_visible": "{number, plural, one {चित्रं प्रच्छादय} other {चित्राणि प्रच्छादय}}", "moved_to_account_banner.text": "तव एकौण्ट् {disabledAccount} अधुना निष्कृतो यतोहि {movedToAccount} अस्मिन्त्वमसार्षीः।", - "mute_modal.duration": "परिमाणम्", - "mute_modal.hide_notifications": "अस्मादुपभोक्तुर्विज्ञापनानि प्रच्छादयितुमिच्छसि वा?", - "mute_modal.indefinite": "अ॑परिमितम्", "navigation_bar.about": "विषये", "navigation_bar.blocks": "निषिद्धभोक्तारः", "navigation_bar.bookmarks": "पुटचिह्नानि", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index a3d11d7dbd..1a5f2ef0f3 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -106,21 +106,16 @@ "compose_form.spoiler.marked": "Boga avisu de cuntenutu", "compose_form.spoiler.unmarked": "Agiunghe avisu de cuntenutu", "confirmation_modal.cancel": "Annulla", - "confirmations.block.block_and_report": "Bloca e signala", "confirmations.block.confirm": "Bloca", - "confirmations.block.message": "Seguru chi boles blocare {name}?", "confirmations.delete.confirm": "Cantzella", "confirmations.delete.message": "Seguru chi boles cantzellare custa publicatzione?", "confirmations.delete_list.confirm": "Cantzella", "confirmations.delete_list.message": "Seguru chi boles cantzellare custa lista in manera permanente?", - "confirmations.domain_block.confirm": "Bloca totu su domìniu", "confirmations.domain_block.message": "Boles de seguru, ma a beru a beru, blocare {domain}? In sa parte manna de is casos, pagos blocos o silentziamentos de persones sunt sufitzientes e preferìbiles. No as a bìdere cuntenutos dae custu domìniu in peruna lìnia de tempus pùblica o in is notìficas tuas. Sa gente chi ti sighit dae cussu domìniu at a èssere bogada.", "confirmations.edit.confirm": "Modìfica", "confirmations.logout.confirm": "Essi·nche", "confirmations.logout.message": "Seguru chi boles essire?", "confirmations.mute.confirm": "A sa muda", - "confirmations.mute.explanation": "Custu at a cuare is publicatziones issoro e is messàgios chi ddos mèntovant, ma ant a pòdere bìdere is messàgios tuos e t'ant a pòdere sighire.", - "confirmations.mute.message": "Seguru chi boles pònnere a {name} a sa muda?", "confirmations.redraft.confirm": "Cantzella e torra a fàghere", "confirmations.reply.confirm": "Risponde", "confirmations.reply.message": "Rispondende immoe as a subrascrìere su messàgiu chi ses iscriende. Seguru chi boles sighire?", @@ -265,9 +260,6 @@ "load_pending": "{count, plural, one {# elementu nou} other {# elementos noos}}", "loading_indicator.label": "Carrighende…", "media_gallery.toggle_visible": "Cua {number, plural, one {immàgine} other {immàgines}}", - "mute_modal.duration": "Durada", - "mute_modal.hide_notifications": "Boles cuare is notìficas de custa persone?", - "mute_modal.indefinite": "Indefinida", "navigation_bar.about": "Informatziones", "navigation_bar.blocks": "Persones blocadas", "navigation_bar.bookmarks": "Sinnalibros", diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json index 7d6997131e..ba62c11f71 100644 --- a/app/javascript/mastodon/locales/sco.json +++ b/app/javascript/mastodon/locales/sco.json @@ -131,9 +131,7 @@ "compose_form.spoiler.marked": "Tak aff the content warnin", "compose_form.spoiler.unmarked": "Pit on a content warnin", "confirmation_modal.cancel": "Stap", - "confirmations.block.block_and_report": "Dingie & Clype", "confirmations.block.confirm": "Dingie", - "confirmations.block.message": "Ye shair thit ye'r wantin tae dingie {name}?", "confirmations.cancel_follow_request.confirm": "Tak back yer request", "confirmations.cancel_follow_request.message": "Ye shair thit ye'r wantin tae tak back yer request fir tae follae {name}?", "confirmations.delete.confirm": "Delete", @@ -142,13 +140,10 @@ "confirmations.delete_list.message": "Ye shair thit ye'r wantin fir tae delete this post fir ever?", "confirmations.discard_edit_media.confirm": "Fling awa", "confirmations.discard_edit_media.message": "Ye'v chynges tae the media description or preview thit ye'v no saved, fling them awa onie weys?", - "confirmations.domain_block.confirm": "Dingie the hail domain", "confirmations.domain_block.message": "Ye a hunner percent shair thit ye'r wantin tae dingie the hail {domain}? In maist cases a haunfae tairgtit dingies an wheeshts are eneuch an preferit. Ye wullnae see content fae that domain in onie public timelines or in yer notes. Yer follaers fae that domain wull be taen awa.", "confirmations.logout.confirm": "Log oot", "confirmations.logout.message": "Ye shair thit ye'r wantin tae log oot?", "confirmations.mute.confirm": "Wheesht", - "confirmations.mute.explanation": "This'll hide posts fae them an posts mentionin them, but it'll stull alloo them tae see yer posts an follae ye.", - "confirmations.mute.message": "Ye sure thit ye'r wantin tae wheesht {name}?", "confirmations.redraft.confirm": "Delete an stert anew", "confirmations.reply.confirm": "Reply", "confirmations.reply.message": "Replyin noo'll owerwrite the message ye'r screivin the noo. Ur ye sure thit ye'r wantin tae dae that?", @@ -319,9 +314,6 @@ "load_pending": "{count, plural, one {# new item} other {# new items}}", "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}", "moved_to_account_banner.text": "Yer accoont {disabledAccount} is disabilt the noo acause ye flittit tae {movedToAccount}.", - "mute_modal.duration": "Lenth", - "mute_modal.hide_notifications": "Hide notifications fae this uiser?", - "mute_modal.indefinite": "Indefinite", "navigation_bar.about": "Aboot", "navigation_bar.blocks": "Dingied uisers", "navigation_bar.bookmarks": "Buikmairks", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index e310a63edc..4cb81a760c 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -108,21 +108,17 @@ "compose_form.spoiler.marked": "අන්තර්ගත අවවාදය ඉවත් කරන්න", "compose_form.spoiler.unmarked": "අන්තර්ගත අවවාදයක් එක් කරන්න", "confirmation_modal.cancel": "අවලංගු", - "confirmations.block.block_and_report": "අවහිර කර වාර්තා කරන්න", "confirmations.block.confirm": "අවහිර", - "confirmations.block.message": "ඔබට {name} අවහිර කිරීමට වුවමනා ද?", "confirmations.delete.confirm": "මකන්න", "confirmations.delete.message": "ඔබට මෙම ලිපිය මැකීමට වුවමනා ද?", "confirmations.delete_list.confirm": "මකන්න", "confirmations.delete_list.message": "ඔබට මෙම ලැයිස්තුව සදහටම මැකීමට වුවමනා ද?", "confirmations.discard_edit_media.confirm": "ඉවත ලන්න", "confirmations.discard_edit_media.message": "ඔබට මාධ්‍ය විස්තරයට හෝ පෙරදසුනට නොසුරකින ලද වෙනස්කම් තිබේ, කෙසේ වෙතත් ඒවා ඉවත දමන්නද?", - "confirmations.domain_block.confirm": "සම්පූර්ණ වසම අවහිර කරන්න", "confirmations.edit.confirm": "සංස්කරණය", "confirmations.logout.confirm": "නික්මෙන්න", "confirmations.logout.message": "ඔබට නික්මෙන්න අවශ්‍ය බව විශ්වාසද?", "confirmations.mute.confirm": "නිශ්ශබ්ද", - "confirmations.mute.message": "{name} නිහඬ කිරීමට වුවමනා ද?", "confirmations.reply.confirm": "පිළිතුර", "conversation.delete": "සංවාදය මකන්න", "conversation.mark_as_read": "කියවූ බව යොදන්න", @@ -248,8 +244,6 @@ "lists.replies_policy.none": "කිසිවෙක් නැත", "lists.replies_policy.title": "පිළිතුරු පෙන්වන්න:", "lists.subheading": "ඔබගේ ලැයිස්තු", - "mute_modal.duration": "පරාසය", - "mute_modal.hide_notifications": "මෙම පුද්ගලයාගේ දැනුම්දීම් සඟවන්නද?", "navigation_bar.about": "පිළිබඳව", "navigation_bar.blocks": "අවහිර කළ අය", "navigation_bar.bookmarks": "පොත්යොමු", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 499ce9794c..8c9238bb9e 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Pridať varovanie o obsahu", "compose_form.spoiler_placeholder": "Varovanie o obsahu (voliteľné)", "confirmation_modal.cancel": "Zruš", - "confirmations.block.block_and_report": "Zablokovať a nahlásiť", "confirmations.block.confirm": "Zablokovať", - "confirmations.block.message": "Určite chcete zablokovať {name}?", "confirmations.cancel_follow_request.confirm": "Stiahnuť žiadosť", "confirmations.cancel_follow_request.message": "Určite chcete stiahnuť svoju žiadosť o sledovanie {name}?", "confirmations.delete.confirm": "Vymazať", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Určite chcete tento zoznam trvalo vymazať?", "confirmations.discard_edit_media.confirm": "Zahodiť", "confirmations.discard_edit_media.message": "Máte neuložené zmeny v popise alebo náhľade média, zahodiť ich aj tak?", - "confirmations.domain_block.confirm": "Blokovať celú doménu", "confirmations.domain_block.message": "Určite chcete blokovať celú doménu {domain}? Vo väčšine prípadov stačí blokovať alebo ignorovať pár konkrétnych účtov, čo aj odporúčame. Obsah z tejto domény neuvidíte v žiadnej verejnej časovej osi ani v upozorneniach. Vaši sledujúci pochádzajúci z tejto domény budú odstránení.", "confirmations.edit.confirm": "Upraviť", "confirmations.edit.message": "Úpravou prepíšete príspevok, ktorý máte rozpísaný. Určite chcete pokračovať?", "confirmations.logout.confirm": "Odhlásiť sa", "confirmations.logout.message": "Určite sa chcete odhlásiť?", "confirmations.mute.confirm": "Stíšiť", - "confirmations.mute.explanation": "Toto nastavenie skryje príspevky od daného účtu alebo príspevky od iných, v ktorých je tento účet spomenutý. Účet bude stále vidieť vaše príspevky a môcť vás sledovať.", - "confirmations.mute.message": "Určite chcete stíšiť {name}?", "confirmations.redraft.confirm": "Vymazať a prepísať", "confirmations.redraft.message": "Určite chcete tento príspevok vymazať a prepísať? Prídete o jeho zdieľania a ohviezdičkovania a odpovede na pôvodný príspevok budú odlúčené.", "confirmations.reply.confirm": "Odpovedať", @@ -400,9 +395,6 @@ "loading_indicator.label": "Načítavanie…", "media_gallery.toggle_visible": "{number, plural, one {Skryť obrázok} other {Skryť obrázky}}", "moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálne deaktivovaný, pretože ste sa presunuli na {movedToAccount}.", - "mute_modal.duration": "Trvanie", - "mute_modal.hide_notifications": "Skryť upozornenia od tohto účtu?", - "mute_modal.indefinite": "Bez obmedzenia", "navigation_bar.about": "O tomto serveri", "navigation_bar.advanced_interface": "Otvoriť v pokročilom webovom rozhraní", "navigation_bar.blocks": "Blokované účty", @@ -653,6 +645,7 @@ "status.direct": "Súkromne označiť @{name}", "status.direct_indicator": "Súkromné označenie", "status.edit": "Upraviť", + "status.edited": "Naposledy upravený {date}", "status.edited_x_times": "Upravený {count, plural, other {{count}×}}", "status.embed": "Vložiť", "status.favourite": "Ohviezdičkované", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index c96e929163..de22e98f07 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -89,6 +89,14 @@ "announcement.announcement": "Obvestilo", "attachments_list.unprocessed": "(neobdelano)", "audio.hide": "Skrij zvok", + "block_modal.remote_users_caveat": "Od strežnika {domain} bomo zahtevali, da spoštuje vašo odločitev. Izpolnjevanje zahteve ni zagotovljeno, ker nekateri strežniki blokiranja obravnavajo drugače. Javne objave bodo morda še vedno vidne neprijavljenim uporabnikom.", + "block_modal.show_less": "Pokaži manj", + "block_modal.show_more": "Pokaži več", + "block_modal.they_cant_mention": "Ne morejo vas omenjati ali vam slediti.", + "block_modal.they_cant_see_posts": "Ne vidijo vaših objav, vi pa ne njihovih.", + "block_modal.they_will_know": "Ne morejo videti, da so blokirani.", + "block_modal.title": "Blokiraj uporabnika?", + "block_modal.you_wont_see_mentions": "Objav, ki jih omenjajo, ne boste videli.", "boost_modal.combo": "Če želite preskočiti to, lahko pritisnete {combo}", "bundle_column_error.copy_stacktrace": "Kopiraj poročilo o napaki", "bundle_column_error.error.body": "Zahtevane strani ni mogoče upodobiti. Vzrok težave je morda hrošč v naši kodi ali pa nezdružljivost z brskalnikom.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Dodaj opozorilo o vsebini", "compose_form.spoiler_placeholder": "Opozorilo o vsebini (ni obvezno)", "confirmation_modal.cancel": "Prekliči", - "confirmations.block.block_and_report": "Blokiraj in prijavi", "confirmations.block.confirm": "Blokiraj", - "confirmations.block.message": "Ali ste prepričani, da želite blokirati {name}?", "confirmations.cancel_follow_request.confirm": "Umakni zahtevo", "confirmations.cancel_follow_request.message": "Ali ste prepričani, da želite umakniti svojo zahtevo, da bi sledili {name}?", "confirmations.delete.confirm": "Izbriši", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Ali ste prepričani, da želite trajno izbrisati ta seznam?", "confirmations.discard_edit_media.confirm": "Opusti", "confirmations.discard_edit_media.message": "Imate ne shranjene spremembe za medijski opis ali predogled; jih želite kljub temu opustiti?", - "confirmations.domain_block.confirm": "Blokiraj celotno domeno", + "confirmations.domain_block.confirm": "Blokiraj strežnik", "confirmations.domain_block.message": "Ali ste res, res prepričani, da želite blokirati celotno {domain}? V večini primerov je nekaj ciljnih blokiranj ali utišanj dovolj in boljše. Vsebino iz te domene ne boste videli v javnih časovnicah ali obvestilih. Vaši sledilci iz te domene bodo odstranjeni.", "confirmations.edit.confirm": "Uredi", "confirmations.edit.message": "Urejanje bo prepisalo sporočilo, ki ga trenutno sestavljate. Ali ste prepričani, da želite nadaljevati?", "confirmations.logout.confirm": "Odjava", "confirmations.logout.message": "Ali ste prepričani, da se želite odjaviti?", "confirmations.mute.confirm": "Utišanje", - "confirmations.mute.explanation": "S tem boste skrili objave pred njimi in objave, ki jih omenjajo, še vedno pa bodo lahko videli vaše objave in vam sledili.", - "confirmations.mute.message": "Ali ste prepričani, da želite utišati {name}?", "confirmations.redraft.confirm": "Izbriši in preoblikuj", "confirmations.redraft.message": "Ali ste prepričani, da želite izbrisati ta status in ga preoblikovati? Vzljubi in izpostavitve bodo izgubljeni, odgovori na izvirno objavo pa bodo osiroteli.", "confirmations.reply.confirm": "Odgovori", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Te objave s tega in drugih strežnikov v decentraliziranem omrežju pridobivajo ravno zdaj veliko pozornosti na tem strežniku.", "dismissable_banner.explore_tags": "Ravno zdaj dobivajo ti ključniki veliko pozoronosti med osebami na tem in drugih strežnikih decentraliziranega omrežja.", "dismissable_banner.public_timeline": "To so najnovejše javne objave oseb z družabnega omrežja, ki jim sledijo osebe na {domain}.", + "domain_block_modal.block": "Blokiraj strežnik", + "domain_block_modal.block_account_instead": "Namesto tega blokiraj @{name}", + "domain_block_modal.they_can_interact_with_old_posts": "Osebe s tega strežnika se lahko odzivajo na vaše stare objave.", + "domain_block_modal.they_cant_follow": "Nihče s tega strežnika vam ne more slediti.", + "domain_block_modal.they_wont_know": "Ne bodo vedeli, da so blokirani.", + "domain_block_modal.title": "Blokiraj domeno?", + "domain_block_modal.you_will_lose_followers": "Vsi vaši sledilci s tega strežnika bodo odstranjeni.", + "domain_block_modal.you_wont_see_posts": "Objav ali obvestil uporabnikov s tega strežnika ne boste videli.", + "domain_pill.activitypub_lets_connect": "Omogoča vam povezovanje in interakcijo z ljudmi, ki niso samo na Mastodonu, ampak tudi na drugih družabnih platformah.", + "domain_pill.activitypub_like_language": "Protokol ActivityPub je kot jezik, s katerim se Mastodon pogovarja z drugimi družabnimi omrežji.", + "domain_pill.server": "Strežnik", + "domain_pill.their_handle": "Njihova ročica:", + "domain_pill.their_server": "Njihovo digitalno domovanje, kjer bivajo vse njihove objave.", + "domain_pill.their_username": "Njihov edinstveni identifikator na njihovem strežniku. Uporabnike z istim uporabniškim imenom lahko najdete na različnih strežnikih.", + "domain_pill.username": "Uporabniško ime", + "domain_pill.whats_in_a_handle": "Kaj je v ročici?", + "domain_pill.who_they_are": "Ker ročice povedo, kdo je kdo in kje so, ste lahko z osebami v interakciji prek družabnega spleta .", + "domain_pill.who_you_are": "Ker ročice povedo, kdo ste in kje ste, ste lahko z osebami v interakciji prek družabnega spleta .", + "domain_pill.your_handle": "Vaša ročica:", + "domain_pill.your_server": "Vaše digitalno domovanje, kjer bivajo vse vaše objave. Vam ta ni všeč? Prenesite ga med strežniki kadar koli in z njim tudi svoje sledilce.", + "domain_pill.your_username": "Vaš edinstveni identifikator na tem strežniku. Uporabnike z istim uporabniškim imenom je možno najti na različnih strežnikih.", "embed.instructions": "Vstavite to objavo na svojo spletno stran tako, da kopirate spodnjo kodo.", "embed.preview": "Tako bo izgledalo:", "emoji_button.activity": "Dejavnost", @@ -402,9 +427,15 @@ "loading_indicator.label": "Nalaganje …", "media_gallery.toggle_visible": "{number, plural,one {Skrij sliko} two {Skrij sliki} other {Skrij slike}}", "moved_to_account_banner.text": "Vaš račun {disabledAccount} je trenutno onemogočen, ker ste se prestavili na {movedToAccount}.", - "mute_modal.duration": "Trajanje", - "mute_modal.hide_notifications": "Ali želite skriti obvestila tega uporabnika?", - "mute_modal.indefinite": "Nedoločeno", + "mute_modal.hide_from_notifications": "Skrijte se pred obvestili", + "mute_modal.hide_options": "Skrij možnosti", + "mute_modal.indefinite": "Dokler jim ne povrnem glasu", + "mute_modal.show_options": "Pokaži možnosti", + "mute_modal.they_can_mention_and_follow": "Lahko vas omenijo ali vam sledijo, vi pa jih ne morete videti.", + "mute_modal.they_wont_know": "Ne bodo vedeli, da so utišani.", + "mute_modal.title": "Utišaj uporabnika?", + "mute_modal.you_wont_see_mentions": "Objav, ki jih omenjajo, ne boste videli.", + "mute_modal.you_wont_see_posts": "Še vedno vidijo vaše objave, vi pa ne njihovih.", "navigation_bar.about": "O Mastodonu", "navigation_bar.advanced_interface": "Odpri v naprednem spletnem vmesniku", "navigation_bar.blocks": "Blokirani uporabniki", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 8c71055594..dd8f4ad980 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -89,6 +89,14 @@ "announcement.announcement": "Lajmërim", "attachments_list.unprocessed": "(e papërpunuar)", "audio.hide": "Fshihe audion", + "block_modal.remote_users_caveat": "Do t’i kërkojmë shërbyesit {domain} të respektojë vendimin tuaj. Por, pajtimi s’është i garantuar, ngaqë disa shërbyes mund t’i trajtojnë ndryshe bllokimet. Psotimet publike mundet të jenë ende të dukshme për përdorues pa bërë hyrje në llogari.", + "block_modal.show_less": "Shfaq më pak", + "block_modal.show_more": "Shfaq më tepër", + "block_modal.they_cant_mention": "S’mund t’u përmendin, ose t’ju ndjekin.", + "block_modal.they_cant_see_posts": "S’mund të shohin postimet tuaja dhe as ju të tyret.", + "block_modal.they_will_know": "Mund të shohin se janë bllokuar.", + "block_modal.title": "Të bllokohet përdoruesi?", + "block_modal.you_wont_see_mentions": "S’do të shihni postimet ku përmenden.", "boost_modal.combo": "Që kjo të anashkalohet herës tjetër, mund të shtypni {combo}", "bundle_column_error.copy_stacktrace": "Kopjo raportim gabimi", "bundle_column_error.error.body": "Faqja e kërkuar s’u vizatua dot. Kjo mund të vijë nga një e metë në kodin tonë, ose nga një problem përputhshmërie i shfletuesit.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Shtoni sinjalizim lënde", "compose_form.spoiler_placeholder": "Sinjalizim lënde (opsional)", "confirmation_modal.cancel": "Anuloje", - "confirmations.block.block_and_report": "Bllokojeni & Raportojeni", "confirmations.block.confirm": "Bllokoje", - "confirmations.block.message": "Jeni i sigurt se doni të bllokohet {name}?", "confirmations.cancel_follow_request.confirm": "Tërhiqeni mbrapsht kërkesën", "confirmations.cancel_follow_request.message": "Jeni i sigurt se doni të tërhiqni mbrapsht kërkesën tuaj për ndjekje të {name}?", "confirmations.delete.confirm": "Fshije", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Jeni i sigurt se doni të fshihet përgjithmonë kjo listë?", "confirmations.discard_edit_media.confirm": "Hidhe tej", "confirmations.discard_edit_media.message": "Keni ndryshime të paruajtura te përshkrimi ose paraparja e medias, të hidhen tej, sido qoftë?", - "confirmations.domain_block.confirm": "Bllokoje krejt përkatësinë", + "confirmations.domain_block.confirm": "Bllokoje shërbyesin", "confirmations.domain_block.message": "Jeni i sigurt, shumë i sigurt se doni të bllokohet krejt {domain}? Në shumicën e rasteve, ndoca bllokime ose heshtime me synim të caktuar janë të mjaftueshme dhe të parapëlqyera. S’keni për të parë lëndë nga kjo përkatësi në ndonjë rrjedhë kohore publike, apo te njoftimet tuaja. Ndjekësit tuaj prej asaj përkatësie do të hiqen.", "confirmations.edit.confirm": "Përpunojeni", "confirmations.edit.message": "Përpunimi tani do të sjellë mbishkrim të mesazhit që po hartoni aktualisht. Jeni i sigurt se doni të vazhdohet?", "confirmations.logout.confirm": "Dilni", "confirmations.logout.message": "Jeni i sigurt se doni të dilet?", "confirmations.mute.confirm": "Heshtoje", - "confirmations.mute.explanation": "Kjo do t’u fshehë postimet dhe përmendje postimesh, por ende do t’u lejojë të shohin postimet tuaja dhe t’ju ndjekin.", - "confirmations.mute.message": "Jeni i sigurt se doni të heshtohet {name}?", "confirmations.redraft.confirm": "Fshijeni & rihartojeni", "confirmations.redraft.message": "Jeni i sigurt se doni të fshihet kjo gjendje dhe të rihartohet? Të parapëlqyerit dhe përforcimet do të humbin, ndërsa përgjigjet te postimi origjinal do të bëhen jetime.", "confirmations.reply.confirm": "Përgjigjuni", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Këto janë postime nga rrjeti shoqëror që po tërheqin vëmendjen tani. Postimet më të reja me më përforcime dhe më të parapëlqyera nga njerëzit renditen më sipër.", "dismissable_banner.explore_tags": "Këta hashtag-ë po tërheqin vëmendjen mes personave në këtë shërbyes dhe të tjerë të tillë të rrjetit të decentralizuar mu tani.", "dismissable_banner.public_timeline": "Këto janë postimet më të reja publike prej personash në rrjetin shoqëror që ndjekin njerëzit në {domain}.", + "domain_block_modal.block": "Bllokoje shërbyesin", + "domain_block_modal.block_account_instead": "Blloko @{name} në vend të kësaj", + "domain_block_modal.they_can_interact_with_old_posts": "Persona nga ky shërbyes mund të ndërveprojnë me postimet tuaja të vjetra.", + "domain_block_modal.they_cant_follow": "S’mund t’ju ndjekë askush nga ky shërbyes.", + "domain_block_modal.they_wont_know": "S’do ta dinë se janë bllokuar.", + "domain_block_modal.title": "Të bllokohet përkatësia?", + "domain_block_modal.you_will_lose_followers": "Krejt ndjekësit tuaj nga ky shërbyes do të hiqen.", + "domain_block_modal.you_wont_see_posts": "S’do të shihni postime, apo njoftime nga përdorues në këtë shërbyes.", + "domain_pill.activitypub_lets_connect": "Ju lejon të lidheni dhe ndërveproni me persona jo thjesht në Mastodon, por edhe nëpër aplikacione të ndryshme shoqërore.", + "domain_pill.activitypub_like_language": "ActivityPub është si gjuha me të cilën Mastodon-i komunikon me rrjete të tjerë shoqërorë.", + "domain_pill.server": "Shërbyes", + "domain_pill.their_handle": "Targa e tij:", + "domain_pill.their_server": "Shtëpia e tij dixhitale, ku rrinë krejt postimet prej tij.", + "domain_pill.their_username": "Identifikuesi i tij unik në shërbyesin e vet. Është e mundur të gjenden përdorues me të njëjtin emër përdoruesi në shërbyes të ndryshëm.", + "domain_pill.username": "Emër përdoruesi", + "domain_pill.whats_in_a_handle": "Ç’është një targë?", + "domain_pill.who_they_are": "Nga targat thonë se cili është dikush dhe se ku gjendet, ju mund të ndërveproni me persona nëpër web-in shoqëror të .", + "domain_pill.who_you_are": "Ngaqë targa juaj thotë se cili jeni dhe se ku gjendeni, njerëzit mund të ndërveprojnë me ju nëpër web-in shoqëror të .", + "domain_pill.your_handle": "Targa juaj:", + "domain_pill.your_server": "Shtëpia juaj dixhitale, kur gjenden krejt postimet tuaja. S’ju pëlqen kjo këtu? Shpërngulni shërbyes kur të doni dhe sillni edhe ndjekësit tuaj.", + "domain_pill.your_username": "Identifikuesi juja unik në këtë shërbyes. Është e mundur të gjenden përdorues me të njëjtin emër përdoruesi në shërbyes të ndryshëm.", "embed.instructions": "Trupëzojeni këtë gjendje në sajtin tuaj duke kopjuar kodin më poshtë.", "embed.preview": "Ja si do të duket:", "emoji_button.activity": "Veprimtari", @@ -401,9 +426,15 @@ "loading_indicator.label": "Po ngarkohet…", "media_gallery.toggle_visible": "Fshihni {number, plural, one {figurë} other {figura}}", "moved_to_account_banner.text": "Llogaria juaj {disabledAccount} aktualisht është e çaktivizuar, ngaqë kaluat te {movedToAccount}.", - "mute_modal.duration": "Kohëzgjatje", - "mute_modal.hide_notifications": "Të kalohen të fshehura njoftimet prej këtij përdoruesi?", - "mute_modal.indefinite": "E pacaktuar", + "mute_modal.hide_from_notifications": "Fshihe prej njoftimeve", + "mute_modal.hide_options": "Fshihi mundësitë", + "mute_modal.indefinite": "Deri sa t’u heq heshtimin", + "mute_modal.show_options": "Shfaq mundësi", + "mute_modal.they_can_mention_and_follow": "Mund t’ju përmendin dhe ndjekin, por s’do t’i shihni.", + "mute_modal.they_wont_know": "S’do ta dinë se janë heshtuar.", + "mute_modal.title": "Të heshtohet përdoruesi?", + "mute_modal.you_wont_see_mentions": "S’do të shihni postime ku përmenden.", + "mute_modal.you_wont_see_posts": "Ata munden ende të shohin postimet tuaja, por ju s’do të shihni të tyret.", "navigation_bar.about": "Mbi", "navigation_bar.advanced_interface": "Hape në ndërfaqe web të thelluar", "navigation_bar.blocks": "Përdorues të bllokuar", @@ -659,9 +690,11 @@ "status.direct": "Përmendje private për @{name}", "status.direct_indicator": "Përmendje private", "status.edit": "Përpunojeni", + "status.edited": "Përpunuar së fundi më {date}", "status.edited_x_times": "Përpunuar {count, plural, one {{count} herë} other {{count} herë}}", "status.embed": "Trupëzim", "status.favourite": "I vini shenjë si të parapëlqyer", + "status.favourites": "{count, plural, one {i parapëlqyer} other {të parapëlqyer}}", "status.filter": "Filtroje këtë postim", "status.filtered": "I filtruar", "status.hide": "Fshihe postimin", @@ -682,6 +715,7 @@ "status.reblog": "Përforcojeni", "status.reblog_private": "Përforcim për publikun origjinal", "status.reblogged_by": "{name} përforcoi", + "status.reblogs": "{count, plural, one {përforcim} other {përforcime}}", "status.reblogs.empty": "Këtë mesazh s’e ka përforcuar njeri deri tani. Kur ta bëjë dikush, kjo do të duket këtu.", "status.redraft": "Fshijeni & rihartojeni", "status.remove_bookmark": "Hiqe faqerojtësin", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 6281f729f7..2d795c76cc 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Dodaj upozorenje o sadržaju", "compose_form.spoiler_placeholder": "Upozorenje o sadržaju (opciono)", "confirmation_modal.cancel": "Otkaži", - "confirmations.block.block_and_report": "Blokiraj i prijavi", "confirmations.block.confirm": "Blokiraj", - "confirmations.block.message": "Da li ste sigurni da želite da blokirate korisnika {name}?", "confirmations.cancel_follow_request.confirm": "Povuci zahtev", "confirmations.cancel_follow_request.message": "Da li ste sigurni da želite da povučete zahtev da pratite {name}?", "confirmations.delete.confirm": "Izbriši", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Da li ste sigurni da želite da trajno izbrišete ovu listu?", "confirmations.discard_edit_media.confirm": "Odbaci", "confirmations.discard_edit_media.message": "Imate nesačuvane promene u opisu ili pregledu medija, da li ipak hoćete da ih odbacite?", - "confirmations.domain_block.confirm": "Blokiraj ceo domen", "confirmations.domain_block.message": "Da li ste zaista sigurni da želite da blokirate ceo domen {domain}? U većini slučajeva, dovoljno je i poželjno nekoliko ciljanih blokiranja ili ignorisanja. Nećete videti sadržaj sa tog domena ni u jednoj javnoj vremenskoj liniji ili u vašim obaveštenjima. Vaši pratioci sa tog domena će biti uklonjeni.", "confirmations.edit.confirm": "Uredi", "confirmations.edit.message": "Uređivanjem će se obrisati poruka koju trenutno sastavljate. Da li ste sigurni da želite da nastavite?", "confirmations.logout.confirm": "Odjava", "confirmations.logout.message": "Da li ste sigurni da želite da se odjavite?", "confirmations.mute.confirm": "Ignoriši", - "confirmations.mute.explanation": "Ovo će sakriti objave korisnika i objave koje ga pominju, ali će mu i dalje biti dozvoljeno da vidi Vaše objave i da Vas prati.", - "confirmations.mute.message": "Da li stvarno želite da ignorišete korisnika {name}?", "confirmations.redraft.confirm": "Izbriši i prepravi", "confirmations.redraft.message": "Da li ste sigurni da želite da izbrišete ovu objavu i da je prepravite? Podržavanja i oznake kao omiljenih će biti izgubljeni, a odgovori će ostati bez originalne objave.", "confirmations.reply.confirm": "Odgovori", @@ -402,9 +397,6 @@ "loading_indicator.label": "Učitavanje…", "media_gallery.toggle_visible": "{number, plural, one {Sakrij sliku} few {Sakrij slike} other {Sakrij slike}}", "moved_to_account_banner.text": "Vaš nalog {disabledAccount} je trenutno onemogućen jer ste prešli na {movedToAccount}.", - "mute_modal.duration": "Trajanje", - "mute_modal.hide_notifications": "Sakriti obaveštenja od ovog korisnika?", - "mute_modal.indefinite": "Neodređeno", "navigation_bar.about": "Osnovni podaci", "navigation_bar.advanced_interface": "Otvori u naprednom veb okruženju", "navigation_bar.blocks": "Blokirani korisnici", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index ae550315e4..347a3f65a3 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -89,6 +89,14 @@ "announcement.announcement": "Најава", "attachments_list.unprocessed": "(необрађено)", "audio.hide": "Сакриј аудио", + "block_modal.remote_users_caveat": "Замолићемо сервер {domain} да поштује вашу одлуку. Међутим, усклађеност није загарантована јер неки сервери могу другачије да обрађују блокове. Јавне објаве могу и даље бити видљиве корисницима који нису пријављени.", + "block_modal.show_less": "Прикажи мање", + "block_modal.show_more": "Прикажи више", + "block_modal.they_cant_mention": "Не могу да вас помињу или прате.", + "block_modal.they_cant_see_posts": "Не могу да виде ваше објаве, а ви нећете видети њихове.", + "block_modal.they_will_know": "Могу да виде да су блокирани.", + "block_modal.title": "Блокирати корисника?", + "block_modal.you_wont_see_mentions": "Нећете видети објаве које их помињу.", "boost_modal.combo": "Можете притиснути {combo} да прескочите ово следећи пут", "bundle_column_error.copy_stacktrace": "Копирај извештај о грешци", "bundle_column_error.error.body": "Није могуће приказати тражену страницу. Разлог може бити грешка у нашем коду или проблем са компатибилношћу претраживача.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Додај упозорење о садржају", "compose_form.spoiler_placeholder": "Упозорење о садржају (опционо)", "confirmation_modal.cancel": "Откажи", - "confirmations.block.block_and_report": "Блокирај и пријави", "confirmations.block.confirm": "Блокирај", - "confirmations.block.message": "Да ли сте сигурни да желите да блокирате корисника {name}?", "confirmations.cancel_follow_request.confirm": "Повуци захтев", "confirmations.cancel_follow_request.message": "Да ли сте сигурни да желите да повучете захтев да пратите {name}?", "confirmations.delete.confirm": "Избриши", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Да ли сте сигурни да желите да трајно избришете ову листу?", "confirmations.discard_edit_media.confirm": "Одбаци", "confirmations.discard_edit_media.message": "Имате несачуване промене у опису или прегледу медија, да ли ипак хоћете да их одбаците?", - "confirmations.domain_block.confirm": "Блокирај цео домен", + "confirmations.domain_block.confirm": "Блокирај сервер", "confirmations.domain_block.message": "Да ли сте заиста сигурни да желите да блокирате цео домен {domain}? У већини случајева, довољно је и пожељно неколико циљаних блокирања или игнорисања. Нећете видети садржај са тог домена ни у једној јавној временској линији или у вашим обавештењима. Ваши пратиоци са тог домена ће бити уклоњени.", "confirmations.edit.confirm": "Уреди", "confirmations.edit.message": "Уређивањем ће се обрисати порука коју тренутно састављате. Да ли сте сигурни да желите да наставите?", "confirmations.logout.confirm": "Одјава", "confirmations.logout.message": "Да ли сте сигурни да желите да се одјавите?", "confirmations.mute.confirm": "Игнориши", - "confirmations.mute.explanation": "Ово ће сакрити објаве корисника и објаве које га помињу, али ће му и даље бити дозвољено да види Ваше објаве и да Вас прати.", - "confirmations.mute.message": "Да ли стварно желите да игноришете корисника {name}?", "confirmations.redraft.confirm": "Избриши и преправи", "confirmations.redraft.message": "Да ли сте сигурни да желите да избришете ову објаву и да је преправите? Подржавања и ознаке као омиљених ће бити изгубљени, а одговори ће остати без оригиналне објаве.", "confirmations.reply.confirm": "Одговори", @@ -205,6 +209,18 @@ "dismissable_banner.explore_statuses": "Ово су објаве широм друштвеног веба које данас постају све популарније. Новије објаве са више подржавања и омиљене су рангиране више.", "dismissable_banner.explore_tags": "Ово су хеш ознаке које данас постају све популарније на друштвеној мрежи. Хеш ознаке које користи више различитих људи су рангиране више.", "dismissable_banner.public_timeline": "Ово су најновије јавне објаве људи са друштвеног веба које људи на {domain}-у прате.", + "domain_block_modal.block": "Блокирај сервер", + "domain_block_modal.block_account_instead": "Уместо тога, блокирај @{name}", + "domain_block_modal.they_can_interact_with_old_posts": "Људи са овог сервера могу да имају интеракцију са вашим старим објавама.", + "domain_block_modal.they_cant_follow": "Нико са овог сервера не може да вас прати.", + "domain_block_modal.they_wont_know": "Неће знати да су блокирани.", + "domain_block_modal.title": "Блокирати домен?", + "domain_block_modal.you_will_lose_followers": "Сви ваши пратиоци са овог сервера ће бити уклоњени.", + "domain_block_modal.you_wont_see_posts": "Нећете видети објаве или обавештења корисника на овом серверу.", + "domain_pill.activitypub_lets_connect": "Омогућује вам да се повежете и комуницирате са људима не само на Mastodon-у, већ и у различитим друштвеним апликацијама.", + "domain_pill.activitypub_like_language": "ActivityPub је као језик којим Mastodon говори са другим друштвеним мрежама.", + "domain_pill.server": "Сервер", + "domain_pill.username": "Корисничко име", "embed.instructions": "Уградите ову објаву на свој веб сајт копирањем кода испод.", "embed.preview": "Ево како ће то изгледати:", "emoji_button.activity": "Активности", @@ -402,9 +418,15 @@ "loading_indicator.label": "Учитавање…", "media_gallery.toggle_visible": "{number, plural, one {Сакриј слику} few {Сакриј слике} other {Сакриј слике}}", "moved_to_account_banner.text": "Ваш налог {disabledAccount} је тренутно онемогућен јер сте прешли на {movedToAccount}.", - "mute_modal.duration": "Трајање", - "mute_modal.hide_notifications": "Сакрити обавештења од овог корисника?", - "mute_modal.indefinite": "Неодређено", + "mute_modal.hide_from_notifications": "Сакриј из обавештења", + "mute_modal.hide_options": "Сакриј опције", + "mute_modal.indefinite": "Док их не уклоним из игнорисаних", + "mute_modal.show_options": "Прикажи опције", + "mute_modal.they_can_mention_and_follow": "Могу да вас помињу и прате, али их нећете видети.", + "mute_modal.they_wont_know": "Неће знати да су игнорисани.", + "mute_modal.title": "Игнорисати корисника?", + "mute_modal.you_wont_see_mentions": "Нећете видети објаве које га помињу.", + "mute_modal.you_wont_see_posts": "И даље може да види ваше објаве, али ви нећете видети његове.", "navigation_bar.about": "Основни подаци", "navigation_bar.advanced_interface": "Отвори у напредном веб окружењу", "navigation_bar.blocks": "Блокирани корисници", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 6bf7471359..1bfd3e480f 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -89,6 +89,13 @@ "announcement.announcement": "Meddelande", "attachments_list.unprocessed": "(obehandlad)", "audio.hide": "Dölj audio", + "block_modal.show_less": "Visa mindre", + "block_modal.show_more": "Visa mer", + "block_modal.they_cant_mention": "De kan inte nämna eller följa dig.", + "block_modal.they_cant_see_posts": "De kan inte se dina inlägg och du kan inte se deras.", + "block_modal.they_will_know": "De kan se att de är blockerade.", + "block_modal.title": "Blockera användare?", + "block_modal.you_wont_see_mentions": "Du kommer inte att se inlägg som nämner dem.", "boost_modal.combo": "Du kan trycka på {combo} för att hoppa över detta nästa gång", "bundle_column_error.copy_stacktrace": "Kopiera felrapport", "bundle_column_error.error.body": "Den begärda sidan kunde inte visas. Det kan bero på ett fel i vår kod eller ett problem med webbläsarens kompatibilitet.", @@ -160,9 +167,7 @@ "compose_form.spoiler.unmarked": "Texten är inte dold", "compose_form.spoiler_placeholder": "Innehållsvarning (valfritt)", "confirmation_modal.cancel": "Avbryt", - "confirmations.block.block_and_report": "Blockera & rapportera", "confirmations.block.confirm": "Blockera", - "confirmations.block.message": "Är du säker på att du vill blockera {name}?", "confirmations.cancel_follow_request.confirm": "Återkalla förfrågan", "confirmations.cancel_follow_request.message": "Är du säker på att du vill återkalla din begäran om att följa {name}?", "confirmations.delete.confirm": "Radera", @@ -171,15 +176,13 @@ "confirmations.delete_list.message": "Är du säker på att du vill radera denna lista permanent?", "confirmations.discard_edit_media.confirm": "Kasta", "confirmations.discard_edit_media.message": "Du har osparade ändringar till mediabeskrivningen eller förhandsgranskningen, kasta bort dem ändå?", - "confirmations.domain_block.confirm": "Dölj hela domänen", + "confirmations.domain_block.confirm": "Blockera server", "confirmations.domain_block.message": "Är du verkligen, verkligen säker på att du vill blockera hela {domain}? I de flesta fall är några riktade blockeringar eller nedtystade konton tillräckligt och att föredra. Du kommer inte se innehåll från den domänen i den allmänna tidslinjen eller i dina aviseringar. Dina följare från den domänen komer att tas bort.", "confirmations.edit.confirm": "Redigera", "confirmations.edit.message": "Om du svarar nu kommer det att ersätta meddelandet du håller på att skapa. Är du säker på att du vill fortsätta?", "confirmations.logout.confirm": "Logga ut", "confirmations.logout.message": "Är du säker på att du vill logga ut?", "confirmations.mute.confirm": "Tysta", - "confirmations.mute.explanation": "Detta kommer dölja inlägg från hen och inlägg som nämner hen, men hen tillåts fortfarande se dina inlägg och följa dig.", - "confirmations.mute.message": "Är du säker på att du vill tysta {name}?", "confirmations.redraft.confirm": "Radera & gör om", "confirmations.redraft.message": "Är du säker på att du vill radera detta inlägg och göra om det? Favoritmarkeringar, boostar och svar till det ursprungliga inlägget kommer förlora sitt sammanhang.", "confirmations.reply.confirm": "Svara", @@ -205,6 +208,16 @@ "dismissable_banner.explore_statuses": "Dessa inlägg, från denna och andra servrar i det decentraliserade nätverket, pratas det om just nu på denna server.", "dismissable_banner.explore_tags": "Dessa hashtaggar pratas det om just nu bland folk på denna och andra servrar i det decentraliserade nätverket.", "dismissable_banner.public_timeline": "De här är de aktuella publika inlägg från personer på det sociala nätet som personer i {domain} följer.", + "domain_block_modal.block": "Blockera server", + "domain_block_modal.block_account_instead": "Blockera @{name} istället", + "domain_block_modal.they_can_interact_with_old_posts": "Personer från denna server kan interagera med dina gamla inlägg.", + "domain_block_modal.they_cant_follow": "Ingen från denna server kan följa dig.", + "domain_block_modal.title": "Blockera domän?", + "domain_block_modal.you_will_lose_followers": "Alla dina följare från denna server kommer att tas bort.", + "domain_pill.server": "Server", + "domain_pill.their_username": "Deras unika identifierare på deras server. Det är möjligt att hitta användare med samma användarnamn på olika servrar.", + "domain_pill.username": "Användarnamn", + "domain_pill.your_username": "Din unika identifierare på denna server. Det är möjligt att hitta användare med samma användarnamn på olika servrar.", "embed.instructions": "Bädda in detta inlägg på din webbplats genom att kopiera koden nedan.", "embed.preview": "Så här kommer det att se ut:", "emoji_button.activity": "Aktivitet", @@ -399,9 +412,11 @@ "loading_indicator.label": "Laddar…", "media_gallery.toggle_visible": "Växla synlighet", "moved_to_account_banner.text": "Ditt konto {disabledAccount} är för närvarande inaktiverat eftersom du flyttat till {movedToAccount}.", - "mute_modal.duration": "Varaktighet", - "mute_modal.hide_notifications": "Dölj aviseringar från denna användare?", - "mute_modal.indefinite": "Obestämt", + "mute_modal.hide_options": "Dölj alternativ", + "mute_modal.show_options": "Visa alternativ", + "mute_modal.they_can_mention_and_follow": "De kan nämna och följa dig, men du ser dem inte.", + "mute_modal.you_wont_see_mentions": "Du kommer inte att se inlägg som nämner dem.", + "mute_modal.you_wont_see_posts": "De kan fortfarande se dina inlägg, men du kan inte se deras.", "navigation_bar.about": "Om", "navigation_bar.advanced_interface": "Öppna i avancerat webbgränssnitt", "navigation_bar.blocks": "Blockerade användare", diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json index 42164f656b..43cfc78d5b 100644 --- a/app/javascript/mastodon/locales/szl.json +++ b/app/javascript/mastodon/locales/szl.json @@ -34,7 +34,6 @@ "compose_form.spoiler.marked": "Text is hidden behind warning", "compose_form.spoiler.unmarked": "Text is not hidden", "confirmations.delete.message": "Are you sure you want to delete this status?", - "confirmations.domain_block.confirm": "Hide entire domain", "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", "embed.instructions": "Embed this status on your website by copying the code below.", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 7de7146bf6..ac0984293a 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -126,22 +126,17 @@ "compose_form.spoiler.marked": "எச்சரிக்கையின் பின்னால் பதிவு மறைக்கப்பட்டுள்ளது", "compose_form.spoiler.unmarked": "பதிவு மறைக்கப்படவில்லை", "confirmation_modal.cancel": "ரத்து", - "confirmations.block.block_and_report": "தடுத்துப் புகாரளி", "confirmations.block.confirm": "தடு", - "confirmations.block.message": "{name}-ஐ நிச்சயமாகத் தடுக்க விரும்புகிறீர்களா?", "confirmations.delete.confirm": "நீக்கு", "confirmations.delete.message": "இப்பதிவை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", "confirmations.delete_list.confirm": "நீக்கு", "confirmations.delete_list.message": "இப்பட்டியலை நிரந்தரமாக நீக்க நிச்சயம் விரும்புகிறீர்களா?", "confirmations.discard_edit_media.confirm": "நிராகரி", "confirmations.discard_edit_media.message": "சேமிக்கப்படாத மாற்றங்கள் ஊடக விளக்கம் அல்லது முன்னோட்டத்தில் உள்ளது. அவற்றை நிராகரிக்கவா?", - "confirmations.domain_block.confirm": "முழு களத்தையும் மறை", "confirmations.domain_block.message": "நீங்கள் முழு {domain} களத்தையும் நிச்சயமாக, நிச்சயமாகத் தடுக்க விரும்புகிறீர்களா? பெரும்பாலும் சில குறிப்பிட்ட பயனர்களைத் தடுப்பதே போதுமானது. முழு களத்தையும் தடுத்தால், அதிலிருந்து வரும் எந்தப் பதிவையும் உங்களால் காண முடியாது, மேலும் அப்பதிவுகள் குறித்த அறிவிப்புகளும் உங்களுக்கு வராது. அந்தக் களத்தில் இருக்கும் பின்தொடர்பவர்கள் உங்கள் பக்கத்திலிருந்து நீக்கப்படுவார்கள்.", "confirmations.logout.confirm": "வெளியேறு", "confirmations.logout.message": "நிச்சயமாக நீங்கள் வெளியேற விரும்புகிறீர்களா?", "confirmations.mute.confirm": "அமைதியாக்கு", - "confirmations.mute.explanation": "இந்தத் தேர்வு அவர்களின் பதிவுகளையும், அவர்களைக் குறிப்பிடும் பதிவுகளையும் மறைத்துவிடும். ஆனால், அவர்களால் உங்களைப் பின்தொடர்ந்து உங்கள் பதிவுகளைக் காண முடியும்.", - "confirmations.mute.message": "{name}-ஐ நிச்சயமாக நீங்கள் அமைதியாக்க விரும்புகிறீர்களா?", "confirmations.redraft.confirm": "பதிவை நீக்கி மறுவரைவு செய்", "confirmations.reply.confirm": "மறுமொழி", "confirmations.reply.message": "ஏற்கனவே ஒரு பதிவு எழுதப்பட்டுக்கொண்டிருக்கிறது. இப்பொழுது பதில் எழுத முனைந்தால் அது அழிக்கப்படும். பரவாயில்லையா?", @@ -264,7 +259,6 @@ "lists.subheading": "உங்கள் பட்டியல்கள்", "load_pending": "{count, plural,one {# புதியது}other {# புதியவை}}", "media_gallery.toggle_visible": "நிலைமாற்று தெரியும்", - "mute_modal.hide_notifications": "இந்த பயனரின் அறிவிப்புகளை மறைக்கவா?", "navigation_bar.blocks": "தடுக்கப்பட்ட பயனர்கள்", "navigation_bar.bookmarks": "அடையாளக்குறிகள்", "navigation_bar.community_timeline": "உள்ளூர் காலக்கெடு", diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json index fe6b8fe650..825cfb93bd 100644 --- a/app/javascript/mastodon/locales/tai.json +++ b/app/javascript/mastodon/locales/tai.json @@ -20,7 +20,6 @@ "compose_form.spoiler.marked": "Î-tû luē-iông kíng-kò", "compose_form.spoiler.unmarked": "Tsing-ka luē-iông kíng-kò", "confirmations.delete.message": "Lí kám bueh thâi-tiāu tsi̍t-ē huah-siann?", - "confirmations.domain_block.confirm": "Hong-só tsíng-kò bāng-hi̍k", "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", "embed.instructions": "Embed this status on your website by copying the code below.", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 1202de1556..284102c381 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -70,15 +70,12 @@ "compose_form.spoiler.unmarked": "పాఠ్యం దాచబడలేదు", "confirmation_modal.cancel": "రద్దు చెయ్యి", "confirmations.block.confirm": "బ్లాక్ చేయి", - "confirmations.block.message": "మీరు ఖచ్చితంగా {name}ని బ్లాక్ చేయాలనుకుంటున్నారా?", "confirmations.delete.confirm": "తొలగించు", "confirmations.delete.message": "మీరు ఖచ్చితంగా ఈ స్టేటస్ ని తొలగించాలనుకుంటున్నారా?", "confirmations.delete_list.confirm": "తొలగించు", "confirmations.delete_list.message": "మీరు ఖచ్చితంగా ఈ జాబితాను శాశ్వతంగా తొలగించాలనుకుంటున్నారా?", - "confirmations.domain_block.confirm": "మొత్తం డొమైన్ను దాచు", "confirmations.domain_block.message": "మీరు నిజంగా నిజంగా మొత్తం {domain} ని బ్లాక్ చేయాలనుకుంటున్నారా? చాలా సందర్భాలలో కొన్ని లక్ష్యంగా ఉన్న బ్లాక్స్ లేదా మ్యూట్స్ సరిపోతాయి మరియు ఉత్తమమైనవి. మీరు ఆ డొమైన్ నుండి కంటెంట్ను ఏ ప్రజా కాలక్రమాలలో లేదా మీ నోటిఫికేషన్లలో చూడలేరు. ఆ డొమైన్ నుండి మీ అనుచరులు తీసివేయబడతారు.", "confirmations.mute.confirm": "మ్యూట్ చేయి", - "confirmations.mute.message": "{name}ను మీరు ఖచ్చితంగా మ్యూట్ చేయాలనుకుంటున్నారా?", "confirmations.redraft.confirm": "తొలగించు & తిరగరాయు", "confirmations.reply.confirm": "ప్రత్యుత్తరమివ్వు", "confirmations.reply.message": "ఇప్పుడే ప్రత్యుత్తరం ఇస్తే మీరు ప్రస్తుతం వ్రాస్తున్న సందేశం తిరగరాయబడుతుంది. మీరు ఖచ్చితంగా కొనసాగించాలనుకుంటున్నారా?", @@ -173,7 +170,6 @@ "lists.search": "మీరు అనుసరించే వ్యక్తులలో శోధించండి", "lists.subheading": "మీ జాబితాలు", "media_gallery.toggle_visible": "దృశ్యమానతను టోగుల్ చేయండి", - "mute_modal.hide_notifications": "ఈ వినియోగదారు నుండి నోటిఫికేషన్లను దాచాలా?", "navigation_bar.blocks": "బ్లాక్ చేయబడిన వినియోగదారులు", "navigation_bar.community_timeline": "స్థానిక కాలక్రమం", "navigation_bar.compose": "కొత్త టూట్ను రాయండి", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index d3a04209fd..ce3b4eaa25 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -89,6 +89,14 @@ "announcement.announcement": "ประกาศ", "attachments_list.unprocessed": "(ยังไม่ได้ประมวลผล)", "audio.hide": "ซ่อนเสียง", + "block_modal.remote_users_caveat": "เราจะขอให้เซิร์ฟเวอร์ {domain} เคารพการตัดสินใจของคุณ อย่างไรก็ตาม ไม่รับประกันการปฏิบัติตามข้อกำหนดเนื่องจากเซิร์ฟเวอร์บางแห่งอาจจัดการการปิดกั้นแตกต่างกัน โพสต์สาธารณะอาจยังคงปรากฏแก่ผู้ใช้ที่ไม่ได้เข้าสู่ระบบ", + "block_modal.show_less": "แสดงน้อยลง", + "block_modal.show_more": "แสดงเพิ่มเติม", + "block_modal.they_cant_mention": "เขาไม่สามารถกล่าวถึงหรือติดตามคุณ", + "block_modal.they_cant_see_posts": "เขาไม่สามารถเห็นโพสต์ของคุณและคุณจะไม่เห็นโพสต์ของเขา", + "block_modal.they_will_know": "เขาสามารถเห็นว่ามีการปิดกั้นเขา", + "block_modal.title": "ปิดกั้นผู้ใช้?", + "block_modal.you_wont_see_mentions": "คุณจะไม่เห็นโพสต์ที่กล่าวถึงเขา", "boost_modal.combo": "คุณสามารถกด {combo} เพื่อข้ามสิ่งนี้ในครั้งถัดไป", "bundle_column_error.copy_stacktrace": "คัดลอกรายงานข้อผิดพลาด", "bundle_column_error.error.body": "ไม่สามารถแสดงผลหน้าที่ขอ ข้อผิดพลาดอาจเป็นเพราะข้อบกพร่องในโค้ดของเรา หรือปัญหาความเข้ากันได้ของเบราว์เซอร์", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "เพิ่มคำเตือนเนื้อหา", "compose_form.spoiler_placeholder": "คำเตือนเนื้อหา (ไม่จำเป็น)", "confirmation_modal.cancel": "ยกเลิก", - "confirmations.block.block_and_report": "ปิดกั้นแล้วรายงาน", "confirmations.block.confirm": "ปิดกั้น", - "confirmations.block.message": "คุณแน่ใจหรือไม่ว่าต้องการปิดกั้น {name}?", "confirmations.cancel_follow_request.confirm": "ถอนคำขอ", "confirmations.cancel_follow_request.message": "คุณแน่ใจหรือไม่ว่าต้องการถอนคำขอเพื่อติดตาม {name} ของคุณ?", "confirmations.delete.confirm": "ลบ", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "คุณแน่ใจหรือไม่ว่าต้องการลบรายการนี้อย่างถาวร?", "confirmations.discard_edit_media.confirm": "ละทิ้ง", "confirmations.discard_edit_media.message": "คุณมีการเปลี่ยนแปลงคำอธิบายหรือตัวอย่างสื่อที่ยังไม่ได้บันทึก ละทิ้งการเปลี่ยนแปลงเหล่านั้นต่อไป?", - "confirmations.domain_block.confirm": "ปิดกั้นทั้งโดเมน", + "confirmations.domain_block.confirm": "ปิดกั้นเซิร์ฟเวอร์", "confirmations.domain_block.message": "คุณแน่ใจจริง ๆ หรือไม่ว่าต้องการปิดกั้นทั้ง {domain}? ในกรณีส่วนใหญ่ การปิดกั้นหรือการซ่อนแบบกำหนดเป้าหมายไม่กี่รายการนั้นเพียงพอและเป็นที่นิยม คุณจะไม่เห็นเนื้อหาจากโดเมนนั้นในเส้นเวลาสาธารณะใด ๆ หรือการแจ้งเตือนของคุณ จะเอาผู้ติดตามของคุณจากโดเมนนั้นออก", "confirmations.edit.confirm": "แก้ไข", "confirmations.edit.message": "การแก้ไขในตอนนี้จะเขียนทับข้อความที่คุณกำลังเขียนในปัจจุบัน คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", "confirmations.logout.confirm": "ออกจากระบบ", "confirmations.logout.message": "คุณแน่ใจหรือไม่ว่าต้องการออกจากระบบ?", "confirmations.mute.confirm": "ซ่อน", - "confirmations.mute.explanation": "นี่จะซ่อนโพสต์จากเขาและโพสต์ที่กล่าวถึงเขา แต่จะยังคงอนุญาตให้เขาเห็นโพสต์ของคุณและติดตามคุณ", - "confirmations.mute.message": "คุณแน่ใจหรือไม่ว่าต้องการซ่อน {name}?", "confirmations.redraft.confirm": "ลบแล้วร่างใหม่", "confirmations.redraft.message": "คุณแน่ใจหรือไม่ว่าต้องการลบโพสต์นี้แล้วร่างโพสต์ใหม่? รายการโปรดและการดันจะสูญหาย และการตอบกลับโพสต์ดั้งเดิมจะไม่มีความเกี่ยวพัน", "confirmations.reply.confirm": "ตอบกลับ", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "นี่คือโพสต์จากทั่วทั้งเว็บสังคมที่กำลังได้รับความสนใจวันนี้ โพสต์ที่ใหม่กว่าที่มีการดันและรายการโปรดมากกว่าจะได้รับการจัดอันดับที่สูงกว่า", "dismissable_banner.explore_tags": "นี่คือแฮชแท็กที่กำลังได้รับความสนใจในเว็บสังคมวันนี้ แฮชแท็กที่มีการใช้โดยผู้คนต่าง ๆ มากกว่าจะได้รับการจัดอันดับที่สูงกว่า", "dismissable_banner.public_timeline": "นี่คือโพสต์สาธารณะล่าสุดจากผู้คนในเว็บสังคมที่ผู้คนใน {domain} ติดตาม", + "domain_block_modal.block": "ปิดกั้นเซิร์ฟเวอร์", + "domain_block_modal.block_account_instead": "ปิดกั้น @{name} แทน", + "domain_block_modal.they_can_interact_with_old_posts": "ผู้คนจากเซิร์ฟเวอร์นี้สามารถโต้ตอบกับโพสต์เก่า ๆ ของคุณ", + "domain_block_modal.they_cant_follow": "ไม่มีใครจากเซิร์ฟเวอร์นี้สามารถติดตามคุณ", + "domain_block_modal.they_wont_know": "เขาจะไม่ทราบว่ามีการปิดกั้นเขา", + "domain_block_modal.title": "ปิดกั้นโดเมน?", + "domain_block_modal.you_will_lose_followers": "จะเอาผู้ติดตามทั้งหมดของคุณจากเซิร์ฟเวอร์นี้ออก", + "domain_block_modal.you_wont_see_posts": "คุณจะไม่เห็นโพสต์หรือการแจ้งเตือนจากผู้ใช้ในเซิร์ฟเวอร์นี้", + "domain_pill.activitypub_lets_connect": "โปรโตคอลช่วยให้คุณเชื่อมต่อและโต้ตอบกับผู้คนไม่ใช่แค่ใน Mastodon แต่ทั่วทั้งแอปสังคมต่าง ๆ เช่นกัน", + "domain_pill.activitypub_like_language": "ActivityPub เป็นเหมือนภาษาที่ Mastodon พูดกับเครือข่ายสังคมอื่น ๆ", + "domain_pill.server": "เซิร์ฟเวอร์", + "domain_pill.their_handle": "นามของเขา:", + "domain_pill.their_server": "บ้านดิจิทัลของเขา ที่ซึ่งโพสต์ทั้งหมดของเขาอาศัยอยู่", + "domain_pill.their_username": "ตัวระบุที่ไม่ซ้ำกันของเขาในเซิร์ฟเวอร์ของเขา เป็นไปได้ที่จะค้นหาผู้ใช้ที่มีชื่อผู้ใช้เดียวกันในเซิร์ฟเวอร์ที่แตกต่างกัน", + "domain_pill.username": "ชื่อผู้ใช้", + "domain_pill.whats_in_a_handle": "ในนามมีอะไรอยู่?", + "domain_pill.who_they_are": "เนื่องจากนามบอกว่าใครสักคนคือใครและเขาอยู่ที่ไหน คุณสามารถโต้ตอบกับผู้คนทั่วทั้งเว็บสังคมของ ", + "domain_pill.who_you_are": "เนื่องจากนามของคุณบอกว่าคุณคือใครและคุณอยู่ที่ไหน ผู้คนสามารถโต้ตอบกับคุณทั่วทั้งเว็บสังคมของ ", + "domain_pill.your_handle": "นามของคุณ:", + "domain_pill.your_server": "บ้านดิจิทัลของคุณ ที่ซึ่งโพสต์ทั้งหมดของคุณอาศัยอยู่ ไม่ชอบเซิร์ฟเวอร์นี้? ถ่ายโอนเซิร์ฟเวอร์เมื่อใดก็ได้และนำผู้ติดตามของคุณไปด้วยเช่นกัน", + "domain_pill.your_username": "ตัวระบุที่ไม่ซ้ำกันของคุณในเซิร์ฟเวอร์นี้ เป็นไปได้ที่จะค้นหาผู้ใช้ที่มีชื่อผู้ใช้เดียวกันในเซิร์ฟเวอร์ที่แตกต่างกัน", "embed.instructions": "ฝังโพสต์นี้ในเว็บไซต์ของคุณโดยคัดลอกโค้ดด้านล่าง", "embed.preview": "นี่คือลักษณะของการฝังที่จะปรากฏ:", "emoji_button.activity": "กิจกรรม", @@ -402,9 +427,15 @@ "loading_indicator.label": "กำลังโหลด…", "media_gallery.toggle_visible": "{number, plural, other {ซ่อนภาพ}}", "moved_to_account_banner.text": "มีการปิดใช้งานบัญชีของคุณ {disabledAccount} ในปัจจุบันเนื่องจากคุณได้ย้ายไปยัง {movedToAccount}", - "mute_modal.duration": "ระยะเวลา", - "mute_modal.hide_notifications": "ซ่อนการแจ้งเตือนจากผู้ใช้นี้?", - "mute_modal.indefinite": "ไม่มีกำหนด", + "mute_modal.hide_from_notifications": "ซ่อนจากการแจ้งเตือน", + "mute_modal.hide_options": "ซ่อนตัวเลือก", + "mute_modal.indefinite": "จนกว่าฉันจะเลิกซ่อนเขา", + "mute_modal.show_options": "แสดงตัวเลือก", + "mute_modal.they_can_mention_and_follow": "เขาสามารถกล่าวถึงและติดตามคุณ แต่คุณจะไม่เห็นเขา", + "mute_modal.they_wont_know": "เขาจะไม่ทราบว่ามีการซ่อนเขา", + "mute_modal.title": "ซ่อนผู้ใช้?", + "mute_modal.you_wont_see_mentions": "คุณจะไม่เห็นโพสต์ที่กล่าวถึงเขา", + "mute_modal.you_wont_see_posts": "เขายังคงสามารถเห็นโพสต์ของคุณ แต่คุณจะไม่เห็นโพสต์ของเขา", "navigation_bar.about": "เกี่ยวกับ", "navigation_bar.advanced_interface": "เปิดในส่วนติดต่อเว็บขั้นสูง", "navigation_bar.blocks": "ผู้ใช้ที่ปิดกั้นอยู่", @@ -662,9 +693,11 @@ "status.direct": "กล่าวถึง @{name} แบบส่วนตัว", "status.direct_indicator": "การกล่าวถึงแบบส่วนตัว", "status.edit": "แก้ไข", + "status.edited": "แก้ไขล่าสุดเมื่อ {date}", "status.edited_x_times": "แก้ไข {count, plural, other {{count} ครั้ง}}", "status.embed": "ฝัง", "status.favourite": "ชื่นชอบ", + "status.favourites": "{count, plural, other {รายการโปรด}}", "status.filter": "กรองโพสต์นี้", "status.filtered": "กรองอยู่", "status.hide": "ซ่อนโพสต์", @@ -685,6 +718,7 @@ "status.reblog": "ดัน", "status.reblog_private": "ดันด้วยการมองเห็นดั้งเดิม", "status.reblogged_by": "{name} ได้ดัน", + "status.reblogs": "{count, plural, other {การดัน}}", "status.reblogs.empty": "ยังไม่มีใครดันโพสต์นี้ เมื่อใครสักคนดัน เขาจะปรากฏที่นี่", "status.redraft": "ลบแล้วร่างใหม่", "status.remove_bookmark": "เอาที่คั่นหน้าออก", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index f6bf927b94..c3f184e15d 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -119,9 +119,7 @@ "compose_form.save_changes": "o sin e ni", "compose_form.spoiler.marked": "o weka e toki pi ijo ike ken", "confirmation_modal.cancel": "o pini", - "confirmations.block.block_and_report": "o weka e jan o toki e jan tawa lawa", "confirmations.block.confirm": "o weka", - "confirmations.block.message": "sina o wile ala wile weka e jan {name}?", "confirmations.cancel_follow_request.confirm": "o weka e wile sina", "confirmations.cancel_follow_request.message": "sina awen ala awen wile weka e wile kute sina lon {name}?", "confirmations.delete.confirm": "o weka", @@ -130,15 +128,12 @@ "confirmations.delete_list.message": "sina wile ala wile weka e lipu ni?", "confirmations.discard_edit_media.confirm": "o weka", "confirmations.discard_edit_media.message": "toki sitelen anu lukin lili sitelen la ante pi awen ala li lon. sina wile weka e ante ni?", - "confirmations.domain_block.confirm": "o weka.", "confirmations.domain_block.message": "sina wile ala a wile a len e ma {domain} ꞏ ken suli la len jan taso li pona ꞏ len pi ma ni la sina ken ala lukin e ijo pi ma ni lon lipu toki ale anu lukin toki ꞏ len ni la jan kute sina pi ma ni li weka", "confirmations.edit.confirm": "o ante", "confirmations.edit.message": "sina ante e toki sina la toki pali sina li weka. sina wile ala wile e ni?", "confirmations.logout.confirm": "o weka", "confirmations.logout.message": "sina wile ala wile weka", "confirmations.mute.confirm": "o len", - "confirmations.mute.explanation": "ni la sina lukin ala e toki ona e toki kepeken nimi ona. taso la ona li ken lukin e toki sina li ken kute e ona.", - "confirmations.mute.message": "sina awen ala awen wile kute ala e {name}?", "confirmations.redraft.confirm": "o weka o pali sin e toki", "confirmations.redraft.message": "pali sin e toki ni la sina wile ala wile weka e ona? sina ni la suli pi toki ni en wawa pi toki ni li weka. kin la toki lon toki ni li jo e mama ala.", "confirmations.reply.confirm": "toki lon toki ni", @@ -266,8 +261,6 @@ "load_pending": "{count, plural, other {ijo sin #}}", "loading_indicator.label": "ni li kama…", "media_gallery.toggle_visible": "{number, plural, other {o len e sitelen}}", - "mute_modal.duration": "tenpo", - "mute_modal.indefinite": "tenpo ale", "navigation_bar.about": "sona", "navigation_bar.blocks": "jan weka", "navigation_bar.compose": "o pali e toki sin", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index b5209c2dad..bf88e53c94 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -89,6 +89,14 @@ "announcement.announcement": "Duyuru", "attachments_list.unprocessed": "(işlenmemiş)", "audio.hide": "Sesi gizle", + "block_modal.remote_users_caveat": "{domain} sunucusundan kararınıza saygı duymasını isteyeceğiz. Ancak, Uymaları garanti değildir çünkü bazı sunucular engellemeyi farklı şekilde yapıyorlar. Herkese açık gönderiler giriş yapmamış kullanıcılara görüntülenmeye devam edebilir.", + "block_modal.show_less": "Daha az göster", + "block_modal.show_more": "Daha fazla göster", + "block_modal.they_cant_mention": "Sizden bahsedemez veya sizi takip edemezler.", + "block_modal.they_cant_see_posts": "Onlar sizin gönderilerinizi görmeye devam edebilir, ancak siz onlarınkini göremezsiniz.", + "block_modal.they_will_know": "Engellendiklerini görebiliyorlar.", + "block_modal.title": "Kullanıcıyı engelle?", + "block_modal.you_wont_see_mentions": "Onlardan bahseden gönderiler göremezsiniz.", "boost_modal.combo": "Bir daha ki sefere {combo} tuşuna basabilirsin", "bundle_column_error.copy_stacktrace": "Hata raporunu kopyala", "bundle_column_error.error.body": "İstenen sayfa gösterilemiyor. Bu durum kodumuzdaki bir hatadan veya tarayıcı uyum sorunundan kaynaklanıyor olabilir.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Metin gizli değil", "compose_form.spoiler_placeholder": "İçerik uyarısı (isteğe bağlı)", "confirmation_modal.cancel": "İptal", - "confirmations.block.block_and_report": "Engelle ve Bildir", "confirmations.block.confirm": "Engelle", - "confirmations.block.message": "{name} adlı kullanıcıyı engellemek istediğinden emin misin?", "confirmations.cancel_follow_request.confirm": "İsteği geri çek", "confirmations.cancel_follow_request.message": "{name} kişisini takip etme isteğini geri çekmek istediğinden emin misin?", "confirmations.delete.confirm": "Sil", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Bu listeyi kalıcı olarak silmek istediğinden emin misin?", "confirmations.discard_edit_media.confirm": "Vazgeç", "confirmations.discard_edit_media.message": "Medya açıklaması veya ön izlemede kaydedilmemiş değişiklikleriniz var, yine de vazgeçmek istiyor musunuz?", - "confirmations.domain_block.confirm": "Alanın tamamını engelle", + "confirmations.domain_block.confirm": "Sunucuyu engelle", "confirmations.domain_block.message": "{domain} alanının tamamını engellemek istediğinden gerçekten emin misin? Genellikle hedeflenen birkaç engelleme veya sessize alma yeterlidir ve tercih edilir. Bu alan adından gelen içeriği herhangi bir genel zaman çizelgesinde veya bildirimlerinde görmezsin. Bu alan adındaki takipçilerin kaldırılır.", "confirmations.edit.confirm": "Düzenle", "confirmations.edit.message": "Şimdi düzenlersen şu an oluşturduğun iletinin üzerine yazılır. Devam etmek istediğine emin misin?", "confirmations.logout.confirm": "Oturumu kapat", "confirmations.logout.message": "Oturumu kapatmak istediğinden emin misin?", "confirmations.mute.confirm": "Sessize al", - "confirmations.mute.explanation": "Bu, onlardan gelen ve bahseden gönderileri gizler. Ancak yine de gönderilerini görmelerine ve seni takip etmelerine izin verilir.", - "confirmations.mute.message": "{name} kullanıcısını sessize almak istediğinden emin misin?", "confirmations.redraft.confirm": "Sil Düzenle ve yeniden paylaş", "confirmations.redraft.message": "Bu gönderiyi silip taslak haline getirmek istediğinize emin misiniz? Mevcut favoriler ve boostlar silinecek ve gönderiye verilen yanıtlar başıboş kalacak.", "confirmations.reply.confirm": "Yanıtla", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Bunlar, sosyal ağ genelinde bugün ilgi gören gönderiler. Daha çok yinelenen ve favorilenen yeni gönderiler daha üst sıralarda yer alır.", "dismissable_banner.explore_tags": "Bu etiketler, merkeziyetsiz ağda bulunan bu ve diğer sunuculardaki insanların şimdilerde ilgisini çekiyor.", "dismissable_banner.public_timeline": "Bunlar, {domain} üzerindeki insanların, sosyal ağ da takip ettiği insanlarca gönderilen en son ve herkese açık gönderilerdir.", + "domain_block_modal.block": "Sunucuyu engelle", + "domain_block_modal.block_account_instead": "Bunun yerine {name} hesabını engelle", + "domain_block_modal.they_can_interact_with_old_posts": "Bu sunucudan kişiler eski gönderilerinizle etkileşebilirler.", + "domain_block_modal.they_cant_follow": "Bu sunucudan hiç kimse sizi takip edemez.", + "domain_block_modal.they_wont_know": "Engellendiklerini bilmeyecekler.", + "domain_block_modal.title": "Alan adını engelle?", + "domain_block_modal.you_will_lose_followers": "Bu sunucudaki tüm takipçileriniz kaldırılacaktır.", + "domain_block_modal.you_wont_see_posts": "Bu sunucudaki kullanıcılardan gelen gönderileri veya bildirimleri göremezsiniz.", + "domain_pill.activitypub_lets_connect": "Sadece Mastodon üzerindeki değil, diğer sosyal uygulamalardaki kişilerle de bağlantı kurmanıza ve etkileşmenize olanak sağlar.", + "domain_pill.activitypub_like_language": "ActivityPub, Mastodon'un diğer sosyal ağlarla konuşmak için kullandığı dil gibidir.", + "domain_pill.server": "Sunucu", + "domain_pill.their_handle": "Tanıtıcıları:", + "domain_pill.their_server": "Dijital evleri, tüm gönderilerinin yaşadığı yerdir.", + "domain_pill.their_username": "Sunucularındaki tekil tanımlayıcıları. Farklı sunucularda aynı kullanıcı adına sahip kullanıcıları bulmak mümkündür.", + "domain_pill.username": "Kullanıcı adı", + "domain_pill.whats_in_a_handle": "Tanıtıcı nedir?", + "domain_pill.who_they_are": "Tanıtıcılar bir kişinin kim olduğunu ve nerede olduğunu söylediği için, sosyal ağındaki insanlarla etkileşime geçebilirsiniz.", + "domain_pill.who_you_are": "Tanıtıcınız kim olduğunuzu ve nerede olduğunuzu söylediği için, sosyal ağındaki insanlar sizinle etkileşime geçebilir.", + "domain_pill.your_handle": "Tanıtıcınız:", + "domain_pill.your_server": "Dijital anasayfanız, tüm gönderilerinizin yaşadığı yerdir. Bunu beğenmediniz mi? İstediğiniz zaman sunucularınızı değiştirin ve takipçilerinizi de getirin.", + "domain_pill.your_username": "Bu sunucudaki tekil tanımlayıcınız. Farklı sunucularda aynı kullanıcı adına sahip kullanıcıları bulmak mümkündür.", "embed.instructions": "Aşağıdaki kodu kopyalayarak bu durumu sitenize gömün.", "embed.preview": "İşte nasıl görüneceği:", "emoji_button.activity": "Aktivite", @@ -402,9 +427,15 @@ "loading_indicator.label": "Yükleniyor…", "media_gallery.toggle_visible": "{number, plural, one {Resmi} other {Resimleri}} gizle", "moved_to_account_banner.text": "{disabledAccount} hesabınız, {movedToAccount} hesabına taşıdığınız için şu an devre dışı.", - "mute_modal.duration": "Süre", - "mute_modal.hide_notifications": "Bu kullanıcıdan bildirimler gizlensin mı?", - "mute_modal.indefinite": "Belirsiz", + "mute_modal.hide_from_notifications": "Bildirimlerde gizle", + "mute_modal.hide_options": "Seçenekleri gizle", + "mute_modal.indefinite": "Ben sessizliklerini kaldırana kadar", + "mute_modal.show_options": "Seçenekleri göster", + "mute_modal.they_can_mention_and_follow": "Sizden bahsedebilir ve sizi takip edebilirler, ancak siz onları göremezsiniz.", + "mute_modal.they_wont_know": "Susturulduklarını bilmeyecekler.", + "mute_modal.title": "Kullanıcıyı sustur?", + "mute_modal.you_wont_see_mentions": "Onlardan bahseden gönderiler göremezsiniz.", + "mute_modal.you_wont_see_posts": "Onlar sizin gönderilerinizi görmeye devam edebilir, ancak siz onlarınkini göremezsiniz.", "navigation_bar.about": "Hakkında", "navigation_bar.advanced_interface": "Gelişmiş web arayüzünde aç", "navigation_bar.blocks": "Engellenen kullanıcılar", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json index ccddd82490..82d45205c2 100644 --- a/app/javascript/mastodon/locales/tt.json +++ b/app/javascript/mastodon/locales/tt.json @@ -134,9 +134,7 @@ "compose_form.spoiler.marked": "Text is hidden behind warning", "compose_form.spoiler.unmarked": "Text is not hidden", "confirmation_modal.cancel": "Баш тарту", - "confirmations.block.block_and_report": "Блоклау һәм шикаять итү", "confirmations.block.confirm": "Блоклау", - "confirmations.block.message": "Сез {name} кулланучыны блокларга телисезме?", "confirmations.cancel_follow_request.confirm": "Сорауны баш тарту", "confirmations.cancel_follow_request.message": "Сез абонемент соравыгызны кире кайтарырга телисез {name}?", "confirmations.delete.confirm": "Бетерү", @@ -145,14 +143,11 @@ "confirmations.delete_list.message": "Сез бу исемлекне мәңгегә бетерергә телисезме?", "confirmations.discard_edit_media.confirm": "Баш тарту", "confirmations.discard_edit_media.message": "Сезнең медиа тасвирламасында яки алдан карау өчен сакланмаган үзгәрешләр бармы? ", - "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.message": "Сез чыннан да барысын да блокларга телисез {domain}? Күпчелек очракта берничә максатлы блоклар яки тавышсызлар җитәрлек һәм өстенлекле. Сез бу доменнан эчтәлекне җәмәгать срокларында яки хәбәрләрегездә күрмәячәксез. Бу доменнан сезнең шәкертләр бетереләчәк.", "confirmations.edit.confirm": "Үзгәртү", "confirmations.logout.confirm": "Чыгу", "confirmations.logout.message": "Сез чыгарга телисезме?", "confirmations.mute.confirm": "Тавышсыз", - "confirmations.mute.explanation": "Бу алардан ураза тотуны һәм алар турында искә алуны яшерәчәк, ләкин бу аларга уразаларыгызны күрергә һәм язылырга мөмкинлек бирәчәк.", - "confirmations.mute.message": "Сез тавышны сүндерергә телисез {name}?", "confirmations.redraft.confirm": "Бетерү & эшкәртү", "confirmations.reply.confirm": "Җавап бирү", "confirmations.reply.message": "Тһеавап хәзер сез ясаган хәбәрне яңадан язуга китерәчәк. Сез дәвам итәсегез киләме?", @@ -301,8 +296,6 @@ "lists.replies_policy.none": "Һичкем", "lists.subheading": "Исемлегегегезләр", "load_pending": "{count, plural, one {# яңа элемент} other {# яңа элемент}}", - "mute_modal.duration": "Дәвамлык", - "mute_modal.indefinite": "Билгесез", "navigation_bar.about": "Проект турында", "navigation_bar.blocks": "Блокланган кулланучылар", "navigation_bar.bookmarks": "Кыстыргычлар", diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json index 9dc3b5c1f9..4120d4483b 100644 --- a/app/javascript/mastodon/locales/ug.json +++ b/app/javascript/mastodon/locales/ug.json @@ -17,7 +17,6 @@ "compose_form.spoiler.marked": "Text is hidden behind warning", "compose_form.spoiler.unmarked": "Text is not hidden", "confirmations.delete.message": "Are you sure you want to delete this status?", - "confirmations.domain_block.confirm": "Hide entire domain", "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", "embed.instructions": "Embed this status on your website by copying the code below.", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 14cff9d82f..bb0d0b39e2 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -160,9 +160,7 @@ "compose_form.spoiler.unmarked": "Додати попередження про вміст", "compose_form.spoiler_placeholder": "Попередження про вміст (необов'язково)", "confirmation_modal.cancel": "Скасувати", - "confirmations.block.block_and_report": "Заблокувати та поскаржитися", "confirmations.block.confirm": "Заблокувати", - "confirmations.block.message": "Ви впевнені, що хочете заблокувати {name}?", "confirmations.cancel_follow_request.confirm": "Відкликати запит", "confirmations.cancel_follow_request.message": "Ви дійсно бажаєте відкликати запит на стеження за {name}?", "confirmations.delete.confirm": "Видалити", @@ -171,15 +169,12 @@ "confirmations.delete_list.message": "Ви впевнені, що хочете видалити цей список назавжди?", "confirmations.discard_edit_media.confirm": "Відкинути", "confirmations.discard_edit_media.message": "У вас є незбережені зміни в описі медіа або попереднього перегляду, все одно відкинути їх?", - "confirmations.domain_block.confirm": "Заблокувати весь домен", "confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати або приховати лише деяких користувачів. Ви не зможете бачити контент з цього домену у будь-яких стрічках або ваших сповіщеннях. Ваші підписники з цього домену будуть відписані від вас.", "confirmations.edit.confirm": "Змінити", "confirmations.edit.message": "Редагування перезапише повідомлення, яке ви зараз пишете. Ви впевнені, що хочете продовжити?", "confirmations.logout.confirm": "Вийти", "confirmations.logout.message": "Ви впевнені, що хочете вийти?", "confirmations.mute.confirm": "Приховати", - "confirmations.mute.explanation": "Це сховає дописи від них і дописи зі згадками про них, проте вони все одно матимуть змогу бачити ваші дописи й підписуватися на вас.", - "confirmations.mute.message": "Ви впевнені, що хочете приховати {name}?", "confirmations.redraft.confirm": "Видалити та виправити", "confirmations.redraft.message": "Ви впевнені, що хочете видалити цей допис та переписати його? Додавання у вибране та поширення буде втрачено, а відповіді на оригінальний допис залишаться без першоджерела.", "confirmations.reply.confirm": "Відповісти", @@ -402,9 +397,6 @@ "loading_indicator.label": "Завантаження…", "media_gallery.toggle_visible": "{number, plural, one {Приховати зображення} other {Приховати зображення}}", "moved_to_account_banner.text": "Ваш обліковий запис {disabledAccount} наразі вимкнений, оскільки вас перенесено до {movedToAccount}.", - "mute_modal.duration": "Тривалість", - "mute_modal.hide_notifications": "Сховати сповіщення цього користувача?", - "mute_modal.indefinite": "Невизначений строк", "navigation_bar.about": "Про застосунок", "navigation_bar.advanced_interface": "Відкрити в розширеному вебінтерфейсі", "navigation_bar.blocks": "Заблоковані користувачі", diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json index d344f00c87..37f156c28f 100644 --- a/app/javascript/mastodon/locales/ur.json +++ b/app/javascript/mastodon/locales/ur.json @@ -121,20 +121,15 @@ "compose_form.spoiler.marked": "Text is hidden behind warning", "compose_form.spoiler.unmarked": "Text is not hidden", "confirmation_modal.cancel": "منسوخ", - "confirmations.block.block_and_report": "شکایت کریں اور بلاک کریں", "confirmations.block.confirm": "بلاک", - "confirmations.block.message": "کیا واقعی آپ {name} کو بلاک کرنا چاہتے ہیں؟", "confirmations.delete.confirm": "ڈیلیٹ", "confirmations.delete.message": "Are you sure you want to delete this status?", "confirmations.delete_list.confirm": "ڈیلیٹ", "confirmations.delete_list.message": "کیا آپ واقعی اس فہرست کو مستقل طور پر ڈیلیٹ کرنا چاہتے ہیں؟", - "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.message": "کیا آپ واقعی، واقعی یقین رکھتے ہیں کہ آپ پورے {domain} کو بلاک کرنا چاہتے ہیں؟ زیادہ تر معاملات میں چند ٹارگٹیڈ بلاکس یا خاموش کرنا کافی اور افضل ہیں۔ آپ اس ڈومین کا مواد کسی بھی عوامی ٹائم لائنز یا اپنی اطلاعات میں نہیں دیکھیں گے۔ اس ڈومین سے آپ کے پیروکاروں کو ہٹا دیا جائے گا۔", "confirmations.logout.confirm": "لاگ آؤٹ", "confirmations.logout.message": "کیا واقعی آپ لاگ آؤٹ ہونا چاہتے ہیں؟", "confirmations.mute.confirm": "خاموش", - "confirmations.mute.explanation": "یہ ان سے پوسٹس اور ان کا تذکرہ کرنے والی پوسٹس کو چھپائے گا، لیکن یہ پھر بھی انہیں آپ کی پوسٹس دیکھنے اور آپ کی پیروی کرنے کی اجازت دے گا۔", - "confirmations.mute.message": "کیا واقعی آپ {name} کو خاموش کرنا چاہتے ہیں؟", "confirmations.redraft.confirm": "ڈیلیٹ کریں اور دوبارہ ڈرافٹ کریں", "confirmations.reply.confirm": "جواب دیں", "confirmations.reply.message": "ابھی جواب دینے سے وہ پیغام اوور رائٹ ہو جائے گا جو آپ فی الحال لکھ رہے ہیں۔ کیا آپ واقعی آگے بڑھنا چاہتے ہیں؟", @@ -223,7 +218,6 @@ "keyboard_shortcuts.toot": "to start a brand new toot", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "to move up in the list", - "mute_modal.indefinite": "غیر معینہ", "navigation_bar.blocks": "مسدود صارفین", "navigation_bar.bookmarks": "بُک مارکس", "navigation_bar.community_timeline": "مقامی ٹائم لائن", diff --git a/app/javascript/mastodon/locales/uz.json b/app/javascript/mastodon/locales/uz.json index b307d917fa..77892914a4 100644 --- a/app/javascript/mastodon/locales/uz.json +++ b/app/javascript/mastodon/locales/uz.json @@ -132,9 +132,7 @@ "compose_form.spoiler.marked": "Kontent ogohlantirishini olib tashlang", "compose_form.spoiler.unmarked": "Kontent haqida ogohlantirish qo'shing", "confirmation_modal.cancel": "Bekor qilish", - "confirmations.block.block_and_report": "Bloklash va hisobot berish", "confirmations.block.confirm": "Bloklash", - "confirmations.block.message": "Haqiqatan ham {name}ni bloklamoqchimisiz?", "confirmations.cancel_follow_request.confirm": "Bekor qilish", "confirmations.cancel_follow_request.message": "Haqiqatan ham {name}ga obuna boʻlish soʻrovingizni qaytarib olmoqchimisiz?", "confirmations.delete.confirm": "Oʻchirish", @@ -143,13 +141,10 @@ "confirmations.delete_list.message": "Haqiqatan ham bu roʻyxatni butunlay oʻchirib tashlamoqchimisiz?", "confirmations.discard_edit_media.confirm": "Bekor qilish", "confirmations.discard_edit_media.message": "Sizda media tavsifi yoki oldindan ko‘rishda saqlanmagan o‘zgarishlar bor, ular baribir bekor qilinsinmi?", - "confirmations.domain_block.confirm": "Butun domenni bloklash", "confirmations.domain_block.message": "Haqiqatan ham, {domain} ni butunlay bloklamoqchimisiz? Ko'pgina hollarda bir nechta maqsadli bloklar yoki ovozni o'chirish etarli va afzaldir. Siz oʻsha domendagi kontentni hech qanday umumiy vaqt jadvallarida yoki bildirishnomalaringizda koʻrmaysiz. Bu domendagi obunachilaringiz olib tashlanadi.", "confirmations.logout.confirm": "Chiqish", "confirmations.logout.message": "Chiqishingizga aminmisiz?", "confirmations.mute.confirm": "Ovozsiz", - "confirmations.mute.explanation": "Bu ulardagi postlar va ular haqida eslatib o'tilgan postlarni yashiradi, ammo bu ularga sizning postlaringizni ko'rish va sizni kuzatish imkonini beradi.", - "confirmations.mute.message": "Haqiqatan ham {name} ovozini o‘chirib qo‘ymoqchimisiz?", "confirmations.redraft.confirm": "O'chirish va qayta loyihalash", "confirmations.reply.confirm": "Javob berish", "confirmations.reply.message": "Hozir javob bersangiz, hozir yozayotgan xabaringiz ustidan yoziladi. Davom etishni xohlaysizmi?", @@ -314,9 +309,6 @@ "load_pending": "{count, plural, one {# yangi element} other {# yangi elementlar}}", "media_gallery.toggle_visible": "{number, plural, one {Rasmni yashirish} other {Rasmlarni yashirish}}", "moved_to_account_banner.text": "{movedToAccount} hisobiga koʻchganingiz uchun {disabledAccount} hisobingiz hozirda oʻchirib qoʻyilgan.", - "mute_modal.duration": "Davomiyligi", - "mute_modal.hide_notifications": "Bu foydalanuvchidan bildirishnomalar berkitilsinmi?", - "mute_modal.indefinite": "Cheksiz", "navigation_bar.about": "Haqida", "navigation_bar.blocks": "Bloklangan foydalanuvchilar", "navigation_bar.bookmarks": "Xatcho‘plar", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index afd912556e..b51b832b2b 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -89,6 +89,14 @@ "announcement.announcement": "Có gì mới?", "attachments_list.unprocessed": "(chưa xử lí)", "audio.hide": "Ẩn âm thanh", + "block_modal.remote_users_caveat": "Chúng tôi sẽ yêu cầu {domain} tôn trọng quyết định của bạn. Tuy nhiên, việc tuân thủ không được đảm bảo vì một số máy chủ có thể xử lý việc chặn theo cách khác nhau. Các tút công khai vẫn có thể hiển thị đối với người dùng chưa đăng nhập.", + "block_modal.show_less": "Thu gọn", + "block_modal.show_more": "Hiện thêm", + "block_modal.they_cant_mention": "Họ không thể nhắc đến hay theo dõi bạn.", + "block_modal.they_cant_see_posts": "Bạn và họ sẽ không nhìn thấy tút của nhau.", + "block_modal.they_will_know": "Họ sẽ biết đã bị bạn chặn.", + "block_modal.title": "Chặn người này?", + "block_modal.you_wont_see_mentions": "Bạn sẽ không nhìn thấy tút có nhắc đến họ.", "boost_modal.combo": "Nhấn {combo} để bỏ qua bước này", "bundle_column_error.copy_stacktrace": "Sao chép báo lỗi", "bundle_column_error.error.body": "Không thể hiện trang này. Đây có thể là một lỗi trong mã lập trình của chúng tôi, hoặc là vấn đề tương thích của trình duyệt.", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "Tạo nội dung ẩn", "compose_form.spoiler_placeholder": "Nội dung ẩn (tùy chọn)", "confirmation_modal.cancel": "Hủy bỏ", - "confirmations.block.block_and_report": "Chặn & Báo cáo", "confirmations.block.confirm": "Chặn", - "confirmations.block.message": "Bạn có thật sự muốn chặn {name}?", "confirmations.cancel_follow_request.confirm": "Thu hồi yêu cầu", "confirmations.cancel_follow_request.message": "Bạn có chắc muốn thu hồi yêu cầu theo dõi của bạn với {name}?", "confirmations.delete.confirm": "Xóa bỏ", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "Bạn thật sự muốn xóa vĩnh viễn danh sách này?", "confirmations.discard_edit_media.confirm": "Bỏ qua", "confirmations.discard_edit_media.message": "Bạn chưa lưu thay đổi đối với phần mô tả hoặc bản xem trước của media, vẫn bỏ luôn?", - "confirmations.domain_block.confirm": "Ẩn toàn bộ máy chủ", + "confirmations.domain_block.confirm": "Chặn máy chủ", "confirmations.domain_block.message": "Bạn thật sự muốn ẩn toàn bộ nội dung từ {domain}? Sẽ hợp lý hơn nếu bạn chỉ chặn hoặc ẩn một vài tài khoản cụ thể. Ẩn toàn bộ nội dung từ máy chủ sẽ khiến bạn không còn thấy nội dung từ máy chủ đó ở bất kỳ nơi nào, kể cả thông báo. Người quan tâm bạn từ máy chủ đó cũng sẽ bị xóa luôn.", "confirmations.edit.confirm": "Sửa", "confirmations.edit.message": "Nội dung tút cũ sẽ bị ghi đè, bạn có tiếp tục?", "confirmations.logout.confirm": "Đăng xuất", "confirmations.logout.message": "Bạn có thật sự muốn thoát?", "confirmations.mute.confirm": "Ẩn", - "confirmations.mute.explanation": "Điều này sẽ khiến tút của họ và những tút có nhắc đến họ bị ẩn, tuy nhiên họ vẫn có thể xem tút của bạn và theo dõi bạn.", - "confirmations.mute.message": "Bạn thật sự muốn ẩn {name}?", "confirmations.redraft.confirm": "Xóa & viết lại", "confirmations.redraft.message": "Bạn thật sự muốn xóa tút và viết lại? Điều này sẽ xóa mất những lượt thích và đăng lại của tút, cũng như những trả lời sẽ không còn nội dung gốc.", "confirmations.reply.confirm": "Trả lời", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "Đây là những tút đang phổ biến trong mạng liên hợp của máy chủ này.", "dismissable_banner.explore_tags": "Đây là những hashtag đang được sử dụng nhiều trong mạng liên hợp của máy chủ này.", "dismissable_banner.public_timeline": "Đây là những tút công khai gần đây trong mạng liên hợp của máy chủ {domain}.", + "domain_block_modal.block": "Chặn máy chủ", + "domain_block_modal.block_account_instead": "Chỉ chặn {name}", + "domain_block_modal.they_can_interact_with_old_posts": "Thành viên máy chủ này có thể tương tác với các tút cũ của bạn.", + "domain_block_modal.they_cant_follow": "Không ai trên máy chủ này có thể theo dõi bạn.", + "domain_block_modal.they_wont_know": "Họ sẽ không biết đã bị bạn chặn.", + "domain_block_modal.title": "Chặn máy chủ?", + "domain_block_modal.you_will_lose_followers": "Những người theo dõi bạn ở máy chủ này sẽ bị xóa.", + "domain_block_modal.you_wont_see_posts": "Bạn sẽ không thấy tút hoặc thông báo từ thành viên máy chủ này.", + "domain_pill.activitypub_lets_connect": "Nó cho phép bạn kết nối và tương tác với mọi người không chỉ trên Mastodon mà còn trên các ứng dụng xã hội khác.", + "domain_pill.activitypub_like_language": "ActivityPub giống như ngôn ngữ Mastodon giao tiếp với các mạng xã hội khác.", + "domain_pill.server": "Máy chủ", + "domain_pill.their_handle": "Địa chỉ Mastodon:", + "domain_pill.their_server": "Ngôi nhà kỹ thuật số, nơi lưu giữ tút của ai đó.", + "domain_pill.their_username": "Danh tính duy nhất của họ trên máy chủ này. Có thể có tên người dùng giống nhau trên các máy chủ khác.", + "domain_pill.username": "Tên người dùng", + "domain_pill.whats_in_a_handle": "Địa chỉ Mastodon là gì?", + "domain_pill.who_they_are": "Vì địa chỉ Mastodon cho biết một người là ai và họ ở đâu, nên bạn có thể tương tác với mọi người trên các nền tảng có .", + "domain_pill.who_you_are": "Vì địa chỉ Mastodon cho biết bạn là ai và bạn ở đâu, nên bạn có thể tương tác với mọi người trên các nền tảng có .", + "domain_pill.your_handle": "Địa chỉ Mastodon của bạn:", + "domain_pill.your_server": "Ngôi nhà kỹ thuật số, nơi lưu giữ tút của bạn. Không thích ở đây? Chuyển sang máy chủ khác và mang theo người theo dõi của bạn.", + "domain_pill.your_username": "Danh tính duy nhất của bạn trên máy chủ này. Có thể có tên người dùng giống bạn trên các máy chủ khác.", "embed.instructions": "Sao chép đoạn mã dưới đây và chèn vào trang web của bạn.", "embed.preview": "Nó sẽ hiển thị như vầy:", "emoji_button.activity": "Hoạt động", @@ -402,9 +427,15 @@ "loading_indicator.label": "Đang tải…", "media_gallery.toggle_visible": "{number, plural, other {Ẩn hình ảnh}}", "moved_to_account_banner.text": "Tài khoản {disabledAccount} của bạn hiện không khả dụng vì bạn đã chuyển sang {movedToAccount}.", - "mute_modal.duration": "Thời hạn", - "mute_modal.hide_notifications": "Ẩn thông báo từ người này?", - "mute_modal.indefinite": "Vĩnh viễn", + "mute_modal.hide_from_notifications": "Ẩn thông báo", + "mute_modal.hide_options": "Tùy chọn ẩn", + "mute_modal.indefinite": "Cho tới khi bỏ ẩn", + "mute_modal.show_options": "Hiển thị tùy chọn", + "mute_modal.they_can_mention_and_follow": "Họ có thể nhắc đến và theo dõi bạn, nhưng bạn không thấy họ.", + "mute_modal.they_wont_know": "Họ sẽ không biết đã bị bạn ẩn.", + "mute_modal.title": "Ẩn người này?", + "mute_modal.you_wont_see_mentions": "Bạn sẽ không nhìn thấy tút có nhắc đến họ.", + "mute_modal.you_wont_see_posts": "Bạn sẽ không nhìn thấy tút của họ.", "navigation_bar.about": "Giới thiệu", "navigation_bar.advanced_interface": "Dùng bố cục nhiều cột", "navigation_bar.blocks": "Người đã chặn", @@ -662,9 +693,11 @@ "status.direct": "Nhắn riêng @{name}", "status.direct_indicator": "Nhắn riêng", "status.edit": "Sửa", + "status.edited": "Sửa lần cuối {date}", "status.edited_x_times": "Đã sửa {count, plural, other {{count} lần}}", "status.embed": "Nhúng", "status.favourite": "Thích", + "status.favourites": "{count, plural, other {lượt thích}}", "status.filter": "Lọc tút này", "status.filtered": "Bộ lọc", "status.hide": "Ẩn tút", @@ -685,6 +718,7 @@ "status.reblog": "Đăng lại", "status.reblog_private": "Đăng lại (Riêng tư)", "status.reblogged_by": "{name} đăng lại", + "status.reblogs": "{count, plural, other {đăng lại}}", "status.reblogs.empty": "Tút này chưa có ai đăng lại. Nếu có, nó sẽ hiển thị ở đây.", "status.redraft": "Xóa và viết lại", "status.remove_bookmark": "Bỏ lưu", diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json index a585838cd2..1d3a22108c 100644 --- a/app/javascript/mastodon/locales/zgh.json +++ b/app/javascript/mastodon/locales/zgh.json @@ -48,11 +48,9 @@ "compose_form.spoiler.unmarked": "Text is not hidden", "confirmation_modal.cancel": "ⵙⵔ", "confirmations.block.confirm": "ⴳⴷⵍ", - "confirmations.block.message": "ⵉⵙ ⵏⵉⵜ ⵜⵅⵙⴷ ⴰⴷ ⵜⴳⴷⵍⴷ {name}?", "confirmations.delete.confirm": "ⴽⴽⵙ", "confirmations.delete.message": "ⵉⵙ ⵏⵉⵜ ⵜⵅⵙⴷ ⴰⴷ ⵜⴽⴽⵙⴷ ⵜⴰⵥⵕⵉⴳⵜ ⴰ?", "confirmations.delete_list.confirm": "ⴽⴽⵙ", - "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.logout.confirm": "ⴼⴼⵖ", "confirmations.logout.message": "ⵉⵙ ⵏⵉⵜ ⵜⵅⵙⴷ ⴰⴷ ⵜⴼⴼⵖⴷ?", "confirmations.mute.confirm": "ⵥⵥⵉⵥⵏ", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 7694270d10..1a39dc235c 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -89,6 +89,14 @@ "announcement.announcement": "公告", "attachments_list.unprocessed": "(未处理)", "audio.hide": "隐藏音频", + "block_modal.remote_users_caveat": "我们将要求服务器 {domain} 尊重您的决定。然而,无法保证对方一定遵从,因为某些服务器可能会以不同的方式处理屏蔽操作。公开嘟文仍然可能对未登录用户可见。", + "block_modal.show_less": "显示更少", + "block_modal.show_more": "显示更多", + "block_modal.they_cant_mention": "他们不能提及或关注你。", + "block_modal.they_cant_see_posts": "他们看不到你的嘟文,你也看不到他们的嘟文。", + "block_modal.they_will_know": "他们可以看到他们被屏蔽。", + "block_modal.title": "屏蔽用户?", + "block_modal.you_wont_see_mentions": "你不会看到提及他们的嘟文。", "boost_modal.combo": "下次按住 {combo} 即可跳过此提示", "bundle_column_error.copy_stacktrace": "复制错误报告", "bundle_column_error.error.body": "请求的页面无法渲染,可能是代码出现错误或浏览器存在兼容性问题。", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "添加内容警告", "compose_form.spoiler_placeholder": "内容警告 (可选)", "confirmation_modal.cancel": "取消", - "confirmations.block.block_and_report": "屏蔽与举报", "confirmations.block.confirm": "屏蔽", - "confirmations.block.message": "确定要屏蔽 {name} 吗?", "confirmations.cancel_follow_request.confirm": "撤回请求", "confirmations.cancel_follow_request.message": "确定撤回关注 {name} 的请求吗?", "confirmations.delete.confirm": "删除", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "确定永久删除这个列表吗?", "confirmations.discard_edit_media.confirm": "丢弃", "confirmations.discard_edit_media.message": "您还有未保存的媒体描述或预览修改,仍要丢弃吗?", - "confirmations.domain_block.confirm": "屏蔽整个域名", + "confirmations.domain_block.confirm": "屏蔽服务器", "confirmations.domain_block.message": "你真的确定要屏蔽所有来自 {domain} 的内容吗?多数情况下,对几个特定的用户进行屏蔽或禁用对他们的消息提醒就足够了。屏蔽后,来自该域名的内容将不再出现在你任何的公共时间轴或通知列表里,你来自该域名下的关注者也将被移除。", "confirmations.edit.confirm": "编辑", "confirmations.edit.message": "编辑此消息将会覆盖当前正在撰写的信息。仍要继续吗?", "confirmations.logout.confirm": "退出登录", "confirmations.logout.message": "确定要退出登录吗?", "confirmations.mute.confirm": "隐藏", - "confirmations.mute.explanation": "他们的嘟文以及提到他们的嘟文都会隐藏,但他们仍然可以看到你的嘟文,也可以关注你。", - "confirmations.mute.message": "你确定要隐藏 {name} 吗?", "confirmations.redraft.confirm": "删除并重新编辑", "confirmations.redraft.message": "确定删除这条嘟文并重写吗?所有相关的喜欢和转嘟都将丢失,嘟文的回复也会失去关联。", "confirmations.reply.confirm": "回复", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "这些是目前在社交网络上引起关注的嘟文。嘟文的喜欢和转嘟次数越多,排名越高。", "dismissable_banner.explore_tags": "这些标签正在本站和分布式网络上其他站点的用户中引起关注。", "dismissable_banner.public_timeline": "这些是在 {domain} 上关注的人们最新发布的公开嘟文。", + "domain_block_modal.block": "屏蔽服务器", + "domain_block_modal.block_account_instead": "改为屏蔽 @{name}", + "domain_block_modal.they_can_interact_with_old_posts": "来自该服务器的人可以与你之前的嘟文交互。", + "domain_block_modal.they_cant_follow": "此服务器上没有人可以关注你。", + "domain_block_modal.they_wont_know": "他们不会知道自己被屏蔽。", + "domain_block_modal.title": "屏蔽该域名?", + "domain_block_modal.you_will_lose_followers": "该服务器上你的所有关注者都会被删除。", + "domain_block_modal.you_wont_see_posts": "你将不会看到此服务器上用户的嘟文或通知。", + "domain_pill.activitypub_lets_connect": "它让你不仅能与Mastodon上的人交流互动,还能与其它不同社交应用上的人联系。", + "domain_pill.activitypub_like_language": "ActivityPub就像Mastodon与其它社交网络交流时使用的语言。", + "domain_pill.server": "服务器", + "domain_pill.their_handle": "它们的代号:", + "domain_pill.their_server": "它们的数字家园,它们的所有嘟文都存放在那里。", + "domain_pill.their_username": "它们在它们的服务器上的唯一标识符。在不同的服务器上可能会找到相同用户名的用户。", + "domain_pill.username": "用户名", + "domain_pill.whats_in_a_handle": "代号里都有什么?", + "domain_pill.who_they_are": "代号可以告诉你一个人是谁和在哪里,所以你可以在社交网络上与的人们互动。", + "domain_pill.who_you_are": "你的代号可以告诉别人你是谁和你在哪里,这样社交网络上来自的人们就可以与你互动。", + "domain_pill.your_handle": "你的代号:", + "domain_pill.your_server": "你的数字家园,你的所有嘟文都存放在这里。不喜欢这个服务器吗?随时带上你的关注者一起迁移到其它服务器。", + "domain_pill.your_username": "你在这个服务器上的唯一标识符。在不同的服务器上可能会找到相同用户名的用户。", "embed.instructions": "复制下列代码以在你的网站中嵌入此嘟文。", "embed.preview": "它会像这样显示出来:", "emoji_button.activity": "活动", @@ -402,9 +427,15 @@ "loading_indicator.label": "加载中…", "media_gallery.toggle_visible": "{number, plural, other {隐藏图像}}", "moved_to_account_banner.text": "您的账号 {disabledAccount} 已禁用,因为您已迁移到 {movedToAccount}。", - "mute_modal.duration": "持续时长", - "mute_modal.hide_notifications": "同时隐藏来自这个用户的通知?", - "mute_modal.indefinite": "无期限", + "mute_modal.hide_from_notifications": "从通知中隐藏", + "mute_modal.hide_options": "隐藏选项", + "mute_modal.indefinite": "直到我取消隐藏他们", + "mute_modal.show_options": "显示选项", + "mute_modal.they_can_mention_and_follow": "他们可以提及和关注你,但是你看不到他们。", + "mute_modal.they_wont_know": "它们不会知道自己已被隐藏。", + "mute_modal.title": "隐藏用户?", + "mute_modal.you_wont_see_mentions": "你看不到提及他们的嘟文。", + "mute_modal.you_wont_see_posts": "他们可以看到你的嘟文,但是你看不到他们的。", "navigation_bar.about": "关于", "navigation_bar.advanced_interface": "在高级网页界面中打开", "navigation_bar.blocks": "已屏蔽的用户", @@ -545,7 +576,7 @@ "privacy.direct.short": "具体的人", "privacy.private.long": "仅限您的关注者", "privacy.private.short": "关注者", - "privacy.public.long": "所有Mastodon内外的人", + "privacy.public.long": "所有 Mastodon 内外的人", "privacy.public.short": "公开", "privacy.unlisted.additional": "该模式的行为与“公开”完全相同,只是帖子不会出现在实时动态、话题标签、探索或 Mastodon 搜索中,即使你已在账户级设置中选择加入。", "privacy.unlisted.long": "减少算法影响", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 3ec1085ec2..44a1435b2f 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -89,6 +89,14 @@ "announcement.announcement": "公告", "attachments_list.unprocessed": "(未處理)", "audio.hide": "隱藏音訊", + "block_modal.remote_users_caveat": "我們會要求 {domain} 伺服器尊重你的決定。然而,由於部份伺服器可能以不同方式處理封鎖,因此無法保證一定會成功。公開帖文仍然有機會被未登入的使用者看見。", + "block_modal.show_less": "顯示更少", + "block_modal.show_more": "顯示更多", + "block_modal.they_cant_mention": "對方無法提及和追蹤你。", + "block_modal.they_cant_see_posts": "你們無法看到對方的帖文。", + "block_modal.they_will_know": "對方會看到自己被封鎖。", + "block_modal.title": "封鎖使用者?", + "block_modal.you_wont_see_mentions": "你將不會看到提及對方的帖文。", "boost_modal.combo": "你下次可以按 {combo} 來跳過", "bundle_column_error.copy_stacktrace": "複製錯誤報告", "bundle_column_error.error.body": "無法提供請求的頁面。這可能是因為代碼出現錯誤或瀏覽器出現兼容問題。", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "文字沒有被隱藏", "compose_form.spoiler_placeholder": "內容警告 (選用)", "confirmation_modal.cancel": "取消", - "confirmations.block.block_and_report": "封鎖並檢舉", "confirmations.block.confirm": "封鎖", - "confirmations.block.message": "你確定要封鎖{name}嗎?", "confirmations.cancel_follow_request.confirm": "撤回請求", "confirmations.cancel_follow_request.message": "您確定要撤回追蹤 {name} 的請求嗎?", "confirmations.delete.confirm": "刪除", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "你確定要永久刪除這列表嗎?", "confirmations.discard_edit_media.confirm": "捨棄", "confirmations.discard_edit_media.message": "您在媒體描述或預覽有尚未儲存的變更。確定要捨棄它們嗎?", - "confirmations.domain_block.confirm": "封鎖整個網站", + "confirmations.domain_block.confirm": "封鎖伺服器", "confirmations.domain_block.message": "你真的真的確定要封鎖整個 {domain} ?多數情況下,封鎖或靜音幾個特定目標就已經有效,也是比較建議的做法。若然封鎖全站,你將不會再在這裏看到該站的內容和通知。來自該站的關注者亦會被移除。", "confirmations.edit.confirm": "編輯", "confirmations.edit.message": "現在編輯將會覆蓋你目前正在撰寫的訊息。你確定要繼續嗎?", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "確定要登出嗎?", "confirmations.mute.confirm": "靜音", - "confirmations.mute.explanation": "這將會隱藏來自他們的貼文與通知,但是他們還是可以查閱你的貼文與關注你。", - "confirmations.mute.message": "你確定要將{name}靜音嗎?", "confirmations.redraft.confirm": "刪除並編輯", "confirmations.redraft.message": "你確定要移除並重新起草這篇帖文嗎?你將會失去最愛和轉推,而回覆也會與原始帖文斷開連接。", "confirmations.reply.confirm": "回覆", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "這些是今天在社交網絡上受到關注的帖文。新的帖文如果有較多轉推和最愛會排得更高。", "dismissable_banner.explore_tags": "這些主題標籤正在被本站以及去中心化網路上的人們熱烈討論。", "dismissable_banner.public_timeline": "這些是 {domain} 使用者追蹤的社交網絡上最新的公開帖文。", + "domain_block_modal.block": "封鎖伺服器", + "domain_block_modal.block_account_instead": "封鎖 @{name} 即可", + "domain_block_modal.they_can_interact_with_old_posts": "此伺服器的人們可與你的舊帖文互動。", + "domain_block_modal.they_cant_follow": "此伺服器的人無法追蹤你。", + "domain_block_modal.they_wont_know": "對方不會知道自己被封鎖。", + "domain_block_modal.title": "封鎖網域?", + "domain_block_modal.you_will_lose_followers": "你在此伺服器的所有追蹤者都將會被移除。", + "domain_block_modal.you_wont_see_posts": "你將看不到此伺服器使用者的帖文和通知。", + "domain_pill.activitypub_lets_connect": "這讓你不僅能在 Mastodon 上,也能在其他社交應用程式中與人交流互動。", + "domain_pill.activitypub_like_language": "ActivityPub 就像 Mastodon 與其他社交網絡溝通所用的語言。", + "domain_pill.server": "伺服器", + "domain_pill.their_handle": "他們的帳號:", + "domain_pill.their_server": "他們的數碼家園,所有帖文的棲息地。", + "domain_pill.their_username": "在他們的伺服器上的獨特識別碼。不同伺服器上的使用者有可能擁有相同的使用者名稱。", + "domain_pill.username": "使用者名稱", + "domain_pill.whats_in_a_handle": "帳號是甚麼?", + "domain_pill.who_they_are": "帳號代表了使用者的身份和所在之處,因此你能夠在以 構建的社交網絡中與他人互動交流。", + "domain_pill.who_you_are": "你的帳號代表了你的身份和所在之處,因此人們能夠在以 構建的社交網絡中與你互動交流。", + "domain_pill.your_handle": "你的帳號:", + "domain_pill.your_server": "你的數碼家園,你所有帖文的棲息地。不喜歡這裏嗎?隨時搬家到其他伺服器,把你的追蹤者也帶來。", + "domain_pill.your_username": "你在這台伺服器的獨特識別碼。可以在不同伺服器上找到相同使用者名稱的人。", "embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。", "embed.preview": "看上去會是這樣:", "emoji_button.activity": "活動", @@ -241,6 +266,7 @@ "empty_column.list": "這個列表暫時未有內容。", "empty_column.lists": "你還沒有建立任何名單。這裡將會顯示你所建立的名單。", "empty_column.mutes": "你尚未靜音任何使用者。", + "empty_column.notification_requests": "沒有新通知了!當有新通知時,會根據設定顯示在這裏。", "empty_column.notifications": "你沒有任何通知紀錄,快向其他用戶搭訕吧。", "empty_column.public": "跨站時間軸暫時沒有內容!快寫一些公共的文章,或者關注另一些服務站的用戶吧!你和本站、友站的交流,將決定這裏出現的內容。", "error.unexpected_crash.explanation": "由於發生系統故障或瀏覽器相容性問題,故無法正常顯示頁面。", @@ -271,13 +297,21 @@ "filter_modal.select_filter.subtitle": "使用既有類別,或創建一個新類別", "filter_modal.select_filter.title": "過濾此帖文", "filter_modal.title.status": "過濾一則帖文", + "filtered_notifications_banner.pending_requests": "來自 {count, plural, =0 {0 位} other {# 位}}你可能認識的人的通知", + "filtered_notifications_banner.title": "已過濾之通知", "firehose.all": "全部", "firehose.local": "本伺服器", "firehose.remote": "其他伺服器", "follow_request.authorize": "批准", "follow_request.reject": "拒絕", "follow_requests.unlocked_explanation": "即使您的帳號未上鎖,{domain} 的工作人員認為您可能會想手動審核來自這些帳號的追蹤請求。", + "follow_suggestions.curated_suggestion": "編輯精選", "follow_suggestions.dismiss": "不再顯示", + "follow_suggestions.hints.featured": "這個人檔案是由 {domain} 團隊精挑細選。", + "follow_suggestions.hints.friends_of_friends": "這個人檔案在你追蹤的人當中很受歡迎。", + "follow_suggestions.hints.most_followed": "這個人檔案是在 {domain} 上最多追蹤之一。", + "follow_suggestions.hints.most_interactions": "這個人檔案最近在 {domain} 上備受關注。", + "follow_suggestions.hints.similar_to_recently_followed": "這個人檔案與你最近追蹤的類似。", "follow_suggestions.personalized_suggestion": "個人化推薦", "follow_suggestions.popular_suggestion": "熱門推薦", "follow_suggestions.view_all": "查看所有", @@ -393,9 +427,15 @@ "loading_indicator.label": "載入中…", "media_gallery.toggle_visible": "隱藏圖片", "moved_to_account_banner.text": "您的帳號 {disabledAccount} 目前已停用,因為您已搬家至 {movedToAccount}。", - "mute_modal.duration": "時間", - "mute_modal.hide_notifications": "需要隱藏這使用者的通知嗎?", - "mute_modal.indefinite": "沒期限", + "mute_modal.hide_from_notifications": "隱藏通知", + "mute_modal.hide_options": "隱藏選項", + "mute_modal.indefinite": "直至我將對方解除靜音", + "mute_modal.show_options": "顯示選項", + "mute_modal.they_can_mention_and_follow": "對方能提及和追蹤你,但你將看不到對方。", + "mute_modal.they_wont_know": "對方不會知道自己被靜音。", + "mute_modal.title": "將使用者靜音?", + "mute_modal.you_wont_see_mentions": "你將看不到提及他們的帖文。", + "mute_modal.you_wont_see_posts": "他們仍能看到你的帖文,但你將看不到他們的。", "navigation_bar.about": "關於", "navigation_bar.advanced_interface": "在進階網頁介面打開", "navigation_bar.blocks": "封鎖名單", @@ -433,6 +473,10 @@ "notification.reblog": "{name} 轉推你的文章", "notification.status": "{name} 剛發表了文章", "notification.update": "{name} 編輯了帖文", + "notification_requests.accept": "接受", + "notification_requests.dismiss": "忽略", + "notification_requests.notifications_from": "來自 {name} 的通知", + "notification_requests.title": "已過濾之通知", "notifications.clear": "清空通知紀錄", "notifications.clear_confirmation": "你確定要清空通知紀錄嗎?", "notifications.column_settings.admin.report": "新舉報:", @@ -464,6 +508,15 @@ "notifications.permission_denied": "本站不能發送桌面通知,因為瀏覽器先前拒絕了本站的桌面通知權限請求", "notifications.permission_denied_alert": "無法啟用桌面通知,因為瀏覽器先前拒絕了本站的桌面通知權限請求", "notifications.permission_required": "由於瀏覽器未有授予桌面通知權限,本站暫未能發送桌面通知。", + "notifications.policy.filter_new_accounts.hint": "在過去 {days, plural, other {# 天}}內建立", + "notifications.policy.filter_new_accounts_title": "新帳號", + "notifications.policy.filter_not_followers_hint": "包括追蹤你不到 {days, plural, other {# 天}}的人", + "notifications.policy.filter_not_followers_title": "未追蹤你的人", + "notifications.policy.filter_not_following_hint": "直至你手動核准他們", + "notifications.policy.filter_not_following_title": "你未追蹤的人", + "notifications.policy.filter_private_mentions_hint": "除非回覆你的提及或來自你追蹤的人,否則將被過濾", + "notifications.policy.filter_private_mentions_title": "未經請求的私人提及", + "notifications.policy.title": "過濾來自以下的通知…", "notifications_permission_banner.enable": "啟用桌面通知", "notifications_permission_banner.how_to_control": "只要啟用桌面通知,便可在 Mastodon 網站沒有打開時收到通知。在已經啟用桌面通知的時候,你可以透過上面的 {icon} 按鈕準確控制哪些類型的互動會產生桌面通知。", "notifications_permission_banner.title": "不放過任何事情", @@ -640,6 +693,7 @@ "status.direct": "私下提及 @{name}", "status.direct_indicator": "私人提及", "status.edit": "編輯", + "status.edited": "最後編輯於 {date}", "status.edited_x_times": "Edited {count, plural, one {{count} 次} other {{count} 次}}", "status.embed": "嵌入", "status.favourite": "最愛", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index c2450ac015..71272213a8 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -70,7 +70,7 @@ "account.unendorse": "取消於個人檔案推薦對方", "account.unfollow": "取消跟隨", "account.unmute": "解除靜音 @{name}", - "account.unmute_notifications_short": "取消靜音推播通知", + "account.unmute_notifications_short": "解除靜音推播通知", "account.unmute_short": "解除靜音", "account_note.placeholder": "按此新增備註", "admin.dashboard.daily_retention": "註冊後使用者存留率(日)", @@ -89,6 +89,14 @@ "announcement.announcement": "公告", "attachments_list.unprocessed": "(未經處理)", "audio.hide": "隱藏音訊", + "block_modal.remote_users_caveat": "我們會要求 {domain} 伺服器尊重您的決定。然而,我們無法保證所有伺服器都會遵守,某些伺服器可能以不同方式處理封鎖。未登入之使用者仍可能看到您的公開嘟文。", + "block_modal.show_less": "減少顯示", + "block_modal.show_more": "顯示更多", + "block_modal.they_cant_mention": "他們無法提及或跟隨您。", + "block_modal.they_cant_see_posts": "他們無法讀取您的嘟文,且您不會見到他們的。", + "block_modal.they_will_know": "他們能見到他們已被封鎖。", + "block_modal.title": "是否封鎖該使用者?", + "block_modal.you_wont_see_mentions": "您不會見到提及他們的嘟文。", "boost_modal.combo": "下次您可以按 {combo} 跳過", "bundle_column_error.copy_stacktrace": "複製錯誤報告", "bundle_column_error.error.body": "無法繪製請求的頁面。這可能是因為我們程式碼中的臭蟲或是瀏覽器的相容問題。", @@ -160,9 +168,7 @@ "compose_form.spoiler.unmarked": "新增內容警告", "compose_form.spoiler_placeholder": "內容警告 (可選的)", "confirmation_modal.cancel": "取消", - "confirmations.block.block_and_report": "封鎖並檢舉", "confirmations.block.confirm": "封鎖", - "confirmations.block.message": "您確定要封鎖 {name} 嗎?", "confirmations.cancel_follow_request.confirm": "收回跟隨請求", "confirmations.cancel_follow_request.message": "您確定要收回跟隨 {name} 的請求嗎?", "confirmations.delete.confirm": "刪除", @@ -171,15 +177,13 @@ "confirmations.delete_list.message": "您確定要永久刪除此列表嗎?", "confirmations.discard_edit_media.confirm": "捨棄", "confirmations.discard_edit_media.message": "您於媒體描述或預覽區塊有未儲存的變更。是否要捨棄這些變更?", - "confirmations.domain_block.confirm": "封鎖整個網域", + "confirmations.domain_block.confirm": "封鎖伺服器", "confirmations.domain_block.message": "您真的非常確定要封鎖整個 {domain} 網域嗎?大部分情況下,封鎖或靜音少數特定的帳號就能滿足需求了。您將不能在任何公開的時間軸及通知中看到來自此網域的內容。您來自該網域的跟隨者也將被移除。", "confirmations.edit.confirm": "編輯", "confirmations.edit.message": "編輯嘟文將覆蓋掉您目前正在撰寫之嘟文內容。您是否仍要繼續?", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "您確定要登出嗎?", "confirmations.mute.confirm": "靜音", - "confirmations.mute.explanation": "此操作將隱藏來自他們的嘟文與通知,但是他們還是可以查閱您的嘟文與跟隨您。", - "confirmations.mute.message": "您確定要靜音 {name} 嗎?", "confirmations.redraft.confirm": "刪除並重新編輯", "confirmations.redraft.message": "您確定要刪除這則嘟文並重新編輯嗎?您將失去這則嘟文之轉嘟及最愛,且對此嘟文之回覆會變成獨立的嘟文。", "confirmations.reply.confirm": "回覆", @@ -205,6 +209,27 @@ "dismissable_banner.explore_statuses": "這些於此伺服器以及去中心化網路中其他伺服器發出的嘟文正在被此伺服器上的人們熱烈討論著。越多不同人轉嘟及最愛排名更高。", "dismissable_banner.explore_tags": "這些主題標籤正在被此伺服器以及去中心化網路上的人們熱烈討論著。越多不同人所嘟出的主題標籤排名更高。", "dismissable_banner.public_timeline": "這些是來自 {domain} 使用者們跟隨中帳號所發表之最新公開嘟文。", + "domain_block_modal.block": "封鎖伺服器", + "domain_block_modal.block_account_instead": "改為封鎖 @{name}", + "domain_block_modal.they_can_interact_with_old_posts": "來自此伺服器之使用者能與您以往的嘟文互動。", + "domain_block_modal.they_cant_follow": "來自此伺服器之使用者將無法跟隨您。", + "domain_block_modal.they_wont_know": "他們不會知道他們已被封鎖。", + "domain_block_modal.title": "是否封鎖該網域?", + "domain_block_modal.you_will_lose_followers": "所有您來自此伺服器之跟隨者將被移除。", + "domain_block_modal.you_wont_see_posts": "您不會見到來自此伺服器使用者之任何嘟文或通知。", + "domain_pill.activitypub_lets_connect": "它使您能於 Mastodon 及其他不同的社群應用程式與人連結及互動。", + "domain_pill.activitypub_like_language": "ActivityPub 像是 Mastodon 與其他社群網路溝通時所用的語言。", + "domain_pill.server": "伺服器", + "domain_pill.their_handle": "他們的帳號:", + "domain_pill.their_server": "他們數位世界的家,他們所有的嘟文都在這裡。", + "domain_pill.their_username": "他們於他們的伺服器中獨一無二的識別。於不同的伺服器上可能找到具有相同帳號的使用者。", + "domain_pill.username": "使用者名稱", + "domain_pill.whats_in_a_handle": "什麼是帳號 (@handle) ?", + "domain_pill.who_they_are": "由於帳號 (@handle) 能說明某人是誰以及他們來自何方,您能於 之社群網路上與人們互動。", + "domain_pill.who_you_are": "由於帳號 (@handle) 能說明您是誰以及您來自何方,人們能於 之社群網路上與您互動。", + "domain_pill.your_handle": "您的帳號:", + "domain_pill.your_server": "您數位世界的家,您所有的嘟文都在這裡。不喜歡這台伺服器嗎?您能隨時搬家至其他伺服器並且仍保有您的跟隨者。", + "domain_pill.your_username": "您於您的伺服器中獨一無二的識別。於不同的伺服器上可能找到具有相同帳號的使用者。", "embed.instructions": "若您欲於您的網站嵌入此嘟文,請複製以下程式碼。", "embed.preview": "它將顯示成這樣:", "emoji_button.activity": "活動", @@ -402,9 +427,15 @@ "loading_indicator.label": "正在載入...", "media_gallery.toggle_visible": "切換可見性", "moved_to_account_banner.text": "您的帳號 {disabledAccount} 目前已停用,因為您已搬家至 {movedToAccount}。", - "mute_modal.duration": "持續時間", - "mute_modal.hide_notifications": "是否隱藏來自這位使用者的通知?", - "mute_modal.indefinite": "無期限", + "mute_modal.hide_from_notifications": "於通知中隱藏", + "mute_modal.hide_options": "隱藏選項", + "mute_modal.indefinite": "直到我解除靜音他們", + "mute_modal.show_options": "顯示選項", + "mute_modal.they_can_mention_and_follow": "他們仍可提及或跟隨您,但您不會見到他們。", + "mute_modal.they_wont_know": "他們不會知道他們已被靜音。", + "mute_modal.title": "是否靜音該使用者?", + "mute_modal.you_wont_see_mentions": "您不會見到提及他們的嘟文。", + "mute_modal.you_wont_see_posts": "他們仍可讀取您的嘟文,但您不會見到他們的。", "navigation_bar.about": "關於", "navigation_bar.advanced_interface": "以進階網頁介面開啟", "navigation_bar.blocks": "已封鎖的使用者", diff --git a/config/locales/be.yml b/config/locales/be.yml index d0cc96d6d8..7d32ff1366 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1931,7 +1931,11 @@ be: follows_subtitle: Падпішыцеся на папулярных карыстальнікаў follows_title: На каго падпісацца follows_view_more: Прагледзець больш людзей, на якіх варта падпісацца - hashtags_recent_count: "%{people} людзей за апошнія %{days} дні" + hashtags_recent_count: + few: "%{people} чалавекі за апошнія 2 дні" + many: "%{people} чалавек за апошнія 2 дні" + one: "%{people} чалавек за апошнія 2 дні" + other: "%{people} чалавека за апошнія 2 дні" hashtags_subtitle: Даведайцеся што было папулярна ў апошнія 2 дні hashtags_title: Папулярныя хэштэгі hashtags_view_more: Прагледзець іншыя папулярныя хэштэгі diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 8689b0359e..5b4a828dd7 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1867,7 +1867,9 @@ bg: follows_subtitle: Следвайте добре известни акаунти follows_title: Кого да се последва follows_view_more: Преглед на още хора за последване - hashtags_recent_count: "%{people} души за последните %{days} дни" + hashtags_recent_count: + one: "%{people} лице през последните 2 дни" + other: "%{people} души през последните 2 дни" hashtags_subtitle: Проучете какво изгрява от последните 2 дни hashtags_title: Изгряващи хаштагове hashtags_view_more: Преглед на още изгряващи хаштагове diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 15a06559be..f5a0143ef6 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1582,7 +1582,7 @@ ca: rss: content_warning: 'Avís de contingut:' descriptions: - account: Publicacions des de @%{acct} + account: Publicacions públiques de @%{acct} tag: 'Tuts etiquetats #%{hashtag}' scheduled_statuses: over_daily_limit: Has superat el límit de %{limit} tuts programats per a avui @@ -1729,7 +1729,7 @@ ca: keep_self_bookmark: Mantenir els tuts que has desat a les adreces d'interès keep_self_bookmark_hint: No esborra els teus propis tuts si els has desat en les adreces d'interès keep_self_fav: Mantenir els tuts que has afavorit - keep_self_fav_hint: No esborra els teus propis tuts si les has afavorit + keep_self_fav_hint: No esborra les teves publicacions si les has afavorit min_age: '1209600': 2 setmanes '15778476': 6 mesos @@ -1867,7 +1867,9 @@ ca: follows_subtitle: Seguiu comptes populars follows_title: A qui seguir follows_view_more: Més persones a qui seguir - hashtags_recent_count: "%{people} persones en els últims %{days} dies" + hashtags_recent_count: + one: "%{people} persona en els 2 últims dies" + other: "%{people} persones en els 2 últims dies" hashtags_subtitle: Exploreu què és tendència des de fa 2 dies hashtags_title: Etiquetes en tendència hashtags_view_more: Més etiquetes en tendència diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 17c4280508..8fcd10fe4d 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1995,7 +1995,6 @@ cy: follows_subtitle: Dilynwch gyfrifon adnabyddus follows_title: Pwy i ddilyn follows_view_more: Gweld mwy o bobl i ddilyn - hashtags_recent_count: "%{people} person yn y %{days} diwrnod diwethaf" hashtags_subtitle: Gweld beth sy'n tueddu dros y 2 ddiwrnod diwethaf hashtags_title: Hashnodau tuedd hashtags_view_more: Gweld mwy o hashnodau tuedd diff --git a/config/locales/da.yml b/config/locales/da.yml index 527f2240c7..59de5327d0 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1867,7 +1867,9 @@ da: follows_subtitle: Følg velkendte konti follows_title: Hvem, som skal følges follows_view_more: Vis nogle personer at følge - hashtags_recent_count: "%{people} personer de seneste %{days} dage" + hashtags_recent_count: + one: "%{people} person de seneste 2 dage" + other: "%{people} personer de seneste 2 dage" hashtags_subtitle: Udforsk de seneste 2 dages tendenser hashtags_title: Populære hashtags hashtags_view_more: Se flere populære hashtags diff --git a/config/locales/de.yml b/config/locales/de.yml index 262c0166c9..fa66754346 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1867,8 +1867,10 @@ de: follows_subtitle: Folge bekannten Profilen follows_title: Empfohlene Profile follows_view_more: Weitere Profile zum Folgen entdecken - hashtags_recent_count: "%{people} Personen in den letzten %{days} Tagen" - hashtags_subtitle: Entdecke, was in den letzten 2 Tagen angesagt war + hashtags_recent_count: + one: "%{people} Profil in den vergangenen 2 Tagen" + other: "%{people} Profile in den vergangenen 2 Tagen" + hashtags_subtitle: Entdecke, was in den vergangenen 2 Tagen angesagt war hashtags_title: Angesagte Hashtags hashtags_view_more: Weitere angesagte Hashtags entdecken post_action: Verfassen diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 398345d8c8..9337291399 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1867,7 +1867,9 @@ es-AR: follows_subtitle: Seguí cuentas populares follows_title: A quién seguir follows_view_more: Encontrá más cuentas para seguir - hashtags_recent_count: "%{people} cuentas en los últimos %{days} días" + hashtags_recent_count: + one: "%{people} cuenta en los últimos 2 días" + other: "%{people} cuenta en los últimos 2 días" hashtags_subtitle: Explora las tendencias de los últimos 2 días hashtags_title: Etiquetas en tendencia hashtags_view_more: Ver más etiquetas en tendencias diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 3d7c8b9ea4..511b392006 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -1867,7 +1867,6 @@ es-MX: follows_subtitle: Seguir cuentas conocidas follows_title: A quién seguir follows_view_more: Ver más personas para seguir - hashtags_recent_count: "%{people} personas en los últimos %{days} días" hashtags_subtitle: Explora las tendencias de los últimos 2 días hashtags_title: Etiquetas en tendencia hashtags_view_more: Ver más etiquetas en tendencia diff --git a/config/locales/es.yml b/config/locales/es.yml index 946ba1cbeb..67e7e68760 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1867,7 +1867,9 @@ es: follows_subtitle: Seguir cuentas conocidas follows_title: A quién seguir follows_view_more: Ver más personas para seguir - hashtags_recent_count: "%{people} personas en los últimos %{days} días" + hashtags_recent_count: + one: "%{people} persona en los últimos 2 días" + other: "%{people} personas en los últimos 2 días" hashtags_subtitle: Explora las tendencias de los últimos 2 días hashtags_title: Etiquetas en tendencia hashtags_view_more: Ver más etiquetas en tendencia diff --git a/config/locales/et.yml b/config/locales/et.yml index cd944d9c19..d9220a72d6 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -1869,7 +1869,6 @@ et: follows_subtitle: Jälgi teada-tuntud kasutajaid follows_title: Keda jälgida follows_view_more: Vaata lähemalt, keda jälgida - hashtags_recent_count: "%{people} inimest viimase %{days} päeva jooksul" hashtags_subtitle: Avasta, mis viimase 2 päeva jooksul on toimunud hashtags_title: Populaarsed märksõnad hashtags_view_more: Vaata teisi trendikaid märksõnu diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 4c88ac0e59..b2292b80f4 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -1871,7 +1871,9 @@ eu: follows_subtitle: Jarraitu kontu ospetsuak follows_title: Nor jarraitu follows_view_more: Ikusi jarrai dezakezun jende gehiago - hashtags_recent_count: "%{people} pertsona azken %{days} egunetan" + hashtags_recent_count: + one: Pertson %{people} azken 2 egunetan + other: "%{people} pertson azken 2 egunetan" hashtags_subtitle: Arakatu azken 2 egunetan pil-pilean dagoena hashtags_title: Pil-pilean dauden traolak hashtags_view_more: Ikusi pil-pilean dauden traol gehiago diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 93dbd01627..01203cf484 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1846,10 +1846,10 @@ fi: apps_ios_action: Lataa App Storesta apps_step: Lataa viralliset sovelluksemme. apps_title: Mastodon-sovellukset - checklist_subtitle: 'Aloitetaan, sinä aloitat uudella sosiaalisella seudulla:' - checklist_title: Tervetuloa tarkistuslista + checklist_subtitle: 'Aloitetaan tällä uudella sosiaalisella seudulla:' + checklist_title: Tervetulon tarkistuslista edit_profile_action: Mukauta - edit_profile_step: Täydentämällä profiilisi tietoja tehostat vaikutemaa. + edit_profile_step: Tehosta vuorovaikutuksiasi täydennetyllä profiililla. edit_profile_title: Mukauta profiiliasi explanation: Näillä vinkeillä pääset alkuun feature_action: Lue lisää @@ -1867,7 +1867,9 @@ fi: follows_subtitle: Seuraa tunnettuja tilejä follows_title: Ehdotuksia seurattavaksi follows_view_more: Näytä lisää seurattavia henkilöitä - hashtags_recent_count: "%{people} henkilöä viimeisenä %{days} päivänä" + hashtags_recent_count: + one: "%{people} henkilö viimeisenä 2 päivänä" + other: "%{people} henkilöä viimeisenä 2 päivänä" hashtags_subtitle: Tutki, mikä on ollut suosittua viimeisenä 2 päivänä hashtags_title: Suositut aihetunnisteet hashtags_view_more: Näytä lisää suosittuja aihetunnisteita diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 64c26a62f2..b78b9926db 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1867,7 +1867,6 @@ fo: follows_subtitle: Fylg vælkendar kontur follows_title: Hvørji tú átti at fylgt follows_view_more: Sí fleiri fólk at fylgja - hashtags_recent_count: "%{people} fólk seinastu %{days} dagarnar" hashtags_subtitle: Kanna rákið seinastu 2 dagarnar hashtags_title: Vælumtókt frámerki hashtags_view_more: Sí fleiri vælumtókt frámerki diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 860c591a0a..492fe25181 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -1867,7 +1867,6 @@ fr-CA: follows_subtitle: Suivez des comptes populaires follows_title: Qui suivre follows_view_more: Voir plus de personnes à suivre - hashtags_recent_count: "%{people} personnes dans les %{days} derniers jours" hashtags_subtitle: Explorez les tendances depuis les 2 derniers jours hashtags_title: Hashtags populaires hashtags_view_more: Voir plus de hashtags populaires diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 46b22cf8b3..6f8df69ee7 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1867,7 +1867,6 @@ fr: follows_subtitle: Suivez des comptes populaires follows_title: Qui suivre follows_view_more: Voir plus de personnes à suivre - hashtags_recent_count: "%{people} personnes dans les %{days} derniers jours" hashtags_subtitle: Explorez les tendances depuis les 2 derniers jours hashtags_title: Hashtags populaires hashtags_view_more: Voir plus de hashtags populaires diff --git a/config/locales/fy.yml b/config/locales/fy.yml index ad2c37e23f..0dad09baf4 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -1848,7 +1848,6 @@ fy: follow_action: Folgje follows_title: Wa te folgjen follows_view_more: Mear minsken om te folgjen besjen - hashtags_recent_count: "%{people} minsken yn de ôfrûne %{days} dagen" hashtags_subtitle: Wat der yn de ôfrûne 2 dagen bard is ferkenne hashtags_title: Populêre hashtags hashtags_view_more: Mear populêre hashtags besjen diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 16f046baab..c9a4467b12 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -903,7 +903,7 @@ gd: message_html: "Chaidh stòras nan oibseactan agad a dhroch-rèiteachadh. Tha prìobhaideachd an luchd-cleachdaidh agad fo chunnart." tags: review: Dèan lèirmheas air an staid - updated_msg: Chaidh roghainnean nan tagaichean hais ùrachadh + updated_msg: Chaidh roghainnean an taga hais ùrachadh title: Rianachd trends: allow: Ceadaich @@ -1209,7 +1209,7 @@ gd: appealed_msg: Chaidh an t-ath-thagradh agad a chur a-null. Ma thèid aontachadh ris, gheibh thu brath mu dhèidhinn. appeals: submit: Cuir a-null an t-ath-thagradh - approve_appeal: Zatwierdź odwołanie + approve_appeal: Thoir aonta ris an ath-thagradh associated_report: An gearan co-cheangailte created_at: Ceann-là description_html: Seo na gnìomhan a chaidh a ghabhail an aghaidh a’ chunntais agad agus na rabhaidhean a chaidh a chur thugad le luchd-obrach %{instance}. @@ -1929,9 +1929,13 @@ gd: follow_step: Tha leantainn dhaoine inntinneach air cridhe Mhastodon. follow_title: Cuir dreach pearsanta air do dhachaigh follows_subtitle: Lean cunntasan cliùiteach - follows_title: Cò a leanas tu + follows_title: Molaidhean leantainn follows_view_more: Seall barrachd dhaoine ri leantainn - hashtags_recent_count: 'Daoine sna %{days} là(ithean) seo chaidh: %{people}' + hashtags_recent_count: + few: "%{people} daoine san 2 latha seo chaidh" + one: "%{people} neach san 2 latha seo chaidh" + other: "%{people} daoine san 2 latha seo chaidh" + two: "%{people} daoine san 2 latha seo chaidh" hashtags_subtitle: Rùraich na tha a’ treandadh san 2 latha seo chaidh hashtags_title: Tagaichean hais a’ treandadh hashtags_view_more: Seall barrachd thagaichean hais a’ treandadh diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 61a6086c5e..0c2b9af1b0 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1867,7 +1867,6 @@ gl: follows_subtitle: Sigue estas contas populares follows_title: A quen seguir follows_view_more: Ver máis persoas para seguir - hashtags_recent_count: "%{people} persoas nos últimos %{days} días" hashtags_subtitle: Descubre os temas en voga nos últimos 2 días hashtags_title: Cancelos en voga hashtags_view_more: Ver máis cancelos en voga diff --git a/config/locales/he.yml b/config/locales/he.yml index 59f562c2c9..cc1f9dc7fb 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1931,7 +1931,11 @@ he: follows_subtitle: לעקיבה אחרי חלשבונות ידועים follows_title: אחרי מי לעקוב follows_view_more: ראו עוד א.נשים לעקוב אחריהן.ם - hashtags_recent_count: "%{people} אנשים ב־%{days} ימים" + hashtags_recent_count: + many: "%{people} אנשים ביומיים האחרונים" + one: איש אחד ביומיים האחרונים + other: "%{people} אנשים ביומיים האחרונים" + two: שני אנשים ביומיים האחרונים hashtags_subtitle: לחקור מהם הנושאים החמים ביומיים האחרונים hashtags_title: תגיות חמות hashtags_view_more: צפיה בעוד תגיות שכרגע חוזרות הרבה diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 76fef4633a..418c6ffe75 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -778,7 +778,7 @@ hu: warning_hint: Javasoljuk a "Jóváhagyás szükséges a regisztrációhoz” lehetőség használatát, hacsak nem vagy biztos abban, hogy a moderátor csapatod időben tudja kezelni a szemetet és a rosszindulatú regisztrációkat. security: authorized_fetch: Hitelesítés szükséges a föderációs kiszolgálóktól - authorized_fetch_hint: A föderációs szerverek hitelesítésének szükségessége lehetővé teszi mind a felhasználói mind a szerver szintű blokkok szigorúbb végrehajtását. Ez azonban a teljesítménybüntetés árán jár, csökkenti a válaszok elérhetőségét és kompatibilitási problémákat vethet fel egyes föderációs szolgáltatásokkal. Emellett ez nem akadályozza meg a dedikált szereplőket abban, hogy nyilvános bejegyzéseiket és fiókjaikat letöltsék. + authorized_fetch_hint: A hitelesítés megkövetelése föderált kiszolgálók felé lehetővé teszi a felhasználó- és kiszolgáló szintű letiltások szigorúbb kikényszerítését. Azonban ennek az ára teljesítménycsökkenés, a válaszaid elérésének csökkenése, és vezethet kombatibilitási problémákhoz is bizonyos föderációs szolgáltatásokkal. Ráadásul ez nem akadályozza meg, hogy eltökélt aktorok letöltsék a nyilvános bejegyzéseidet és fiókjaidat. authorized_fetch_overridden_hint: Jelenleg nem lehet ezt a beállítást megváltoztatni, mert azt egy környezeti változó felülbírálja. federation_authentication: Föderációs hitelesítés kikényszerítése title: Kiszolgáló-beállítások @@ -1452,9 +1452,9 @@ hu: moderation: title: Moderáció move_handler: - carry_blocks_over_text: Ez a fiók elköltözött innen %{acct}, melyet letiltottatok. - carry_mutes_over_text: Ez a fiók elköltözött innen %{acct}, melyet lenémítottatok. - copy_account_note_text: 'Ez a fiók elköltözött innen %{acct}, itt vannak a bejegyzéseitek róla:' + carry_blocks_over_text: 'Ez a felhasználó elköltözött innen: %{acct}, korábban letiltottad.' + carry_mutes_over_text: 'Ez a felhasználó elköltözött innen: %{acct}, korábban lenémítottad.' + copy_account_note_text: 'Ez a fiók elköltözött innen: %{acct}, itt vannak a bejegyzéseid róla:' navigation: toggle_menu: Menü be/ki notification_mailer: @@ -1867,7 +1867,9 @@ hu: follows_subtitle: Jól ismert fiókok követése follows_title: Kit érdemes követni follows_view_more: További követendő személyek megtekintése - hashtags_recent_count: "%{people} személy az elmúlt %{days} napban" + hashtags_recent_count: + one: "%{people} személy az elmúlt 2 napban" + other: "%{people} személy az elmúlt 2 napban" hashtags_subtitle: Fedezd fel, mi felkapott az elmúlt 2 napban hashtags_title: Felkapott hashtagek hashtags_view_more: További felkapott hashtagek megtekintése diff --git a/config/locales/ie.yml b/config/locales/ie.yml index 222b82ba80..0513d5925d 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -1867,7 +1867,6 @@ ie: follows_subtitle: Sequer famosi contos follows_title: Persones a sequer follows_view_more: Vider plu persones a sequer - hashtags_recent_count: "%{people} persones in li passat %{days} dies" hashtags_subtitle: Explorar li postas de tendentie durant li passat 2 dies hashtags_title: Populari hashtags hashtags_view_more: Vider plu hashtags in tendentie diff --git a/config/locales/is.yml b/config/locales/is.yml index df0391bfa3..110cf1e697 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -1871,7 +1871,9 @@ is: follows_subtitle: Fylgstu með vel þekktum notendum follows_title: Hverjum ætti að fylgjast með follows_view_more: Skoða fleira fólk til að fylgjast með - hashtags_recent_count: "%{people} manns á síðustu %{days} dögum" + hashtags_recent_count: + one: "%{people} aðili síðustu 2 daga" + other: "%{people} manns á síðustu 2 dögum" hashtags_subtitle: Skoðaðu hvað sé búið að vera í umræðunni síðustu 2 dagana hashtags_title: Vinsæl myllumerki hashtags_view_more: Sjá fleiri vinsæl myllumerki diff --git a/config/locales/it.yml b/config/locales/it.yml index 64015bd98d..b84803c009 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1869,7 +1869,6 @@ it: follows_subtitle: Segui account ben noti follows_title: Chi seguire follows_view_more: Visualizza più persone da seguire - hashtags_recent_count: "%{people} persone negli ultimi %{days} giorni" hashtags_subtitle: Esplora le tendenze degli ultimi 2 giorni hashtags_title: Hashtag di tendenza hashtags_view_more: Visualizza altri hashtag di tendenza diff --git a/config/locales/ja.yml b/config/locales/ja.yml index ae5203baee..c51d0a8ea9 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1835,7 +1835,6 @@ ja: follows_subtitle: 人気アカウントをフォロー follows_title: フォローを増やしてみませんか? follows_view_more: フォローするユーザーを探す - hashtags_recent_count: "%{days} 日間で %{people} 人が共有" hashtags_subtitle: 過去2日間のトレンドを見る hashtags_title: トレンドのハッシュタグ hashtags_view_more: トレンドのハッシュタグをもっと見る diff --git a/config/locales/kab.yml b/config/locales/kab.yml index b19424c0fa..0c36059406 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -876,8 +876,11 @@ kab: follows_title: Anwa ara ḍefṛeḍ follows_view_more: Ssken-d ugar n medden ay tzemred ad tḍefred post_step: Ini-as azul i umaḍal s uḍris, s tiwlafin, s tividyutin neɣ s tefranin. + post_title: Aru tasuffeɣt-inek·inem tamezwarut share_action: Bḍu share_step: Init-asen i yimeddukal-nwen amek ara ken-id-afen deg Mastodon. + share_title: Bḍu amaɣnu-inek·inem n Mastodon + sign_in_action: Qqen subject: Ansuf ɣer Maṣṭudun title: Ansuf yessek·em, %{name}! users: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 40af97c628..6f8c7c6146 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1824,6 +1824,7 @@ ko: explanation: 시작하기 전에 몇가지 팁들을 준비했습니다 feature_action: 더 알아보기 feature_audience: 마스토돈은 중개자 없이 청중을 관리할 수 있는 특별한 가능성을 제공합니다. 자체 인프라에 배포된 마스토돈을 사용하면 온라인에 있는 다른 마스토돈 서버에도 팔로우하거나 팔로우할 수 있으며, 본인 외에는 누구의 통제도 받지 않습니다. + feature_audience_title: 신뢰 있는 청중 구축 feature_control_title: 내 타임라인에 대해 통제권을 유지하세요 feature_creativity: 마스토돈은 오디오, 비디오, 사진, 접근성 설명(alt), 투표, 콘텐츠 주의 (블라인드), 움직이는 아바타, 커스텀 이모티콘, 썸네일 자르기, 그리고 더 많은 것들을 당신이 온라인에서 당신을 더 잘 드러낼 수 있도록 돕기위해 지원합니다. 당신이 그림이나 음악을 올리던, 팟캐스트 같은것을 진행하던 마스토돈이 함께합니다. feature_moderation: 마스토돈은 의사 결정권을 사용자에게 돌려줍니다. 각 서버는 기업 소셜 미디어처럼 하향식이 아닌 로컬에서 시행되는 자체 규칙과 규정을 만들 수 있어 다양한 그룹의 요구에 가장 유연하게 대응할 수 있습니다. 동의하는 규칙이 있는 서버에 가입하거나 직접 서버를 호스팅하세요. @@ -1834,7 +1835,8 @@ ko: follows_subtitle: 잘 알려진 계정들을 팔로우 follows_title: 누구를 팔로우 할 지 follows_view_more: 팔로우 할 사람들 더 보기 - hashtags_recent_count: 최근 %{days}일동안 %{people} 명 + hashtags_recent_count: + other: 최근 2일동안 %{people} 명 hashtags_subtitle: 최근 2일간 무엇이 유행했는지 둘러보기 hashtags_title: 유행하는 해시태그 hashtags_view_more: 유행하는 해시태그 더 보기 diff --git a/config/locales/lad.yml b/config/locales/lad.yml index 8affb2a88b..cd62cbc0f8 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -1857,11 +1857,11 @@ lad: feature_creativity_title: Kreativita sin paralelas feature_moderation_title: La moderasyon komo deveria ser follow_action: Sige + follow_step: El buto de Mastodon es segir a djente interesante. follow_title: Personaliza tu linya prinsipala follows_subtitle: Sige kuentos konesidos follows_title: A ken segir follows_view_more: Ve mas personas para segir - hashtags_recent_count: "%{people} personas en los ultimos %{days} diyas" hashtags_subtitle: Eksplora los trendes de los ultimos 2 diyas hashtags_title: Etiketas en trend hashtags_view_more: Ve mas etiketas en trend diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 52321b87bc..610b4437c8 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -851,7 +851,6 @@ lt: follows_subtitle: Sek gerai žinomas paskyras. follows_title: Ką sekti follows_view_more: Peržiūrėti daugiau sekamų žmonių - hashtags_recent_count: "%{people} žmonių per pastarąsias %{days} dienas" hashtags_subtitle: Naršyk, kas tendencinga per pastarąsias 2 dienas. hashtags_title: Tendencijos saitažodžiai hashtags_view_more: Peržiūrėti daugiau tendencingų saitažodžių diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 8f7cb06b66..6870578a87 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -386,12 +386,12 @@ nl: confirm_suspension: cancel: Annuleren confirm: Opschorten - permanent_action: De schorsing ongedaan maken zal geen gegevens of volgrelaties herstellen. + permanent_action: Het ongedaan maken van de schorsing herstelt geen gegevens of volgrelaties. preamble_html: Je staat op het punt om %{domain} en subdomeinen op te schorten. remove_all_data: Dit verwijdert alle inhoud, media en profielgegevens van de accounts van dit domein van jouw server. - stop_communication: Jouw server zal niet langer met deze servers communiceren. + stop_communication: Jouw server communiceert niet langer meer met deze servers. title: Domeinblokkade voor %{domain} bevestigen - undo_relationships: Dit zal elke volgrelatie tussen de accounts van deze servers en die van jou ongedaan maken. + undo_relationships: Dit maakt elke volgrelatie tussen de accounts van deze servers en die van jou ongedaan. created_msg: Domeinblokkade wordt nu verwerkt destroyed_msg: Domeinblokkade is ongedaan gemaakt domain: Domein @@ -470,8 +470,8 @@ nl: instances: availability: description_html: - one: Als de bezorging aan het domein gedurende %{count} dag blijft mislukken, dan zullen er geen verdere pogingen tot bezorging worden gedaan tot een bezorging van het domein is ontvangen. - other: Als de bezorging aan het domein gedurende %{count} verschillende dagen blijft mislukken, dan zullen er geen verdere pogingen tot bezorging worden gedaan tot een bezorging van het domein is ontvangen. + one: Wanneer de bezorging aan het domein gedurende %{count} dag blijft mislukken dan worden er geen bezorgpogingen meer gedaan, totdat een bezorging van het domein wordt ontvangen. + other: Als de bezorging aan het domein gedurende %{count} verschillende dagen blijft mislukken dan worden er geen bezorgpogingen meer gedaan, totdat een bezorging van het domein wordt ontvangen. failure_threshold_reached: Foutieve drempelwaarde bereikt op %{date}. failures_recorded: one: Mislukte poging op %{count} dag. @@ -593,7 +593,7 @@ nl: other_description_html: Bekijk meer opties voor het controleren van het gedrag van en de communicatie met het gerapporteerde account. resolve_description_html: Er wordt tegen het gerapporteerde account geen maatregel genomen, geen overtreding geregistreerd en de rapportage wordt gemarkeerd als opgelost. silence_description_html: Het account is alleen zichtbaar voor degenen die het al volgen of handmatig opzoeken, waardoor het bereik ernstig wordt beperkt. Dit kan altijd ongedaan worden gemaakt. Dit sluit alle rapporten tegen dit account af. - suspend_description_html: Het account en al zijn inhoud zullen niet toegankelijk zijn en uiteindelijk verwijderd worden en er zal geen interactie met het account mogelijk zijn. Dit is omkeerbaar binnen 30 dagen. Dit sluit alle rapporten tegen dit account af. + suspend_description_html: Het account en de inhoud hiervan is niet meer toegankelijk, en het is ook niet meer mogelijk om ermee interactie te hebben. Uiteindelijk wordt het account volledig verwijderd. Dit is omkeerbaar binnen 30 dagen. Dit sluit alle rapporten tegen dit account af. actions_description_html: Beslis welke maatregel moet worden genomen om deze rapportage op te lossen. Wanneer je een (straf)maatregel tegen het gerapporteerde account neemt, krijgt het account een e-mailmelding, behalve wanneer de spam-categorie is gekozen. actions_description_remote_html: Beslis welke actie moet worden ondernomen om deze rapportage op te lossen. Dit is alleen van invloed op hoe jouw server met dit externe account communiceert en de inhoud ervan beheert. add_to_report: Meer aan de rapportage toevoegen @@ -653,7 +653,7 @@ nl: close_report: 'Rapportage #%{id} als opgelost markeren' close_reports_html: "Alle rapportages tegen @%{acct} als opgelost markeren" delete_data_html: Het account en inhoud van @%{acct} over 30 dagen verwijderen, tenzij die in de tussentijd wordt gedeblokkeerd - preview_preamble_html: "@%{acct} zal een waarschuwing ontvangen met de volgende inhoud:" + preview_preamble_html: "@%{acct} ontvangt een waarschuwing met de volgende inhoud:" record_strike_html: Registreer een overtreding van @%{acct} om je te helpen met het sneller afhandelen van toekomstige overtredingen van dit account send_email_html: Een waarschuwingsmail naar @%{acct} sturen warning_placeholder: Optionele aanvullende redenen voor de moderatie-actie. @@ -778,7 +778,7 @@ nl: warning_hint: We raden je aan om “Goedkeuring vereist om te kunnen registreren” te gebruiken, tenzij je er zeker van bent dat jouw moderatieteam spam en kwaadwillende registraties tijdig kan afhandelen. security: authorized_fetch: Verificatie van gefedeerde servers vereisen - authorized_fetch_hint: Verificatie vereisen van gefedereerde servers maakt een striktere handhaving van blokkades op gebruikersniveau en serverniveau mogelijk. Dit gaat echter ten koste van de prestaties, vermindert het bereik van je reacties en kan compatibiliteitsproblemen met sommige gefedereerde services opleveren. Bovendien zal dit niet voorkomen dat personen met slechte bedoelingen je openbare berichten en accounts kunnen ophalen. + authorized_fetch_hint: Verificatie vereisen van gefedereerde servers maakt een striktere handhaving van blokkades op gebruikersniveau en serverniveau mogelijk. Dit gaat echter ten koste van de prestaties, vermindert het bereik van je reacties en kan compatibiliteitsproblemen met sommige gefedereerde services opleveren. Bovendien voorkomt dit niet dat personen met slechte bedoelingen je openbare berichten en accounts kunnen ophalen. authorized_fetch_overridden_hint: Je kunt momenteel deze instelling niet wijzigen, omdat deze is overschreven door een omgevingsvariabele. federation_authentication: Afgedwongen federatie-verificatie title: Serverinstellingen @@ -900,7 +900,7 @@ nl: pending_review: In afwachting van beoordeling preview_card_providers: allowed: Links van deze website kunnen trending worden - description_html: Dit zijn domeinen waarvan er links vaak op jouw server worden gedeeld. Links zullen niet in het openbaar trending worden, voordat het domein van de link wordt goedgekeurd. Jouw goedkeuring (of afwijzing) geldt ook voor subdomeinen. + description_html: Dit zijn domeinen waarvan er vaak links op jouw server worden gedeeld. Links worden niet in het openbaar trending, voordat het domein van de link wordt goedgekeurd. Jouw goedkeuring (of afwijzing) geldt ook voor subdomeinen. rejected: Links naar deze nieuwssite kunnen niet trending worden title: Websites rejected: Afgekeurd @@ -928,7 +928,7 @@ nl: listable: Kan worden aanbevolen no_tag_selected: Er werden geen hashtags gewijzigd, omdat er geen enkele werd geselecteerd not_listable: Wordt niet aanbevolen - not_trendable: Zal niet onder trends verschijnen + not_trendable: Verschijnt niet onder trends not_usable: Kan niet worden gebruikt peaked_on_and_decaying: Piekte op %{date} en is nu weer op diens retour title: Trending hashtags @@ -1159,10 +1159,10 @@ nl: email_change_html: Je kunt je e-mailadres wijzigen zonder dat je jouw account hoeft te verwijderen email_contact_html: Wanneer het nog steeds niet aankomt, kun je voor hulp e-mailen naar %{email} email_reconfirmation_html: Wanneer je de bevestigingsmail niet hebt ontvangen, kun je deze opnieuw aanvragen - irreversible: Je zult niet in staat zijn om jouw account te herstellen of te deactiveren + irreversible: Je bent niet meer in staat om jouw account te herstellen of te deactiveren more_details_html: Zie het privacybeleid voor meer informatie. - username_available: Jouw gebruikersnaam zal weer beschikbaar komen - username_unavailable: Jouw gebruikersnaam zal onbeschikbaar blijven + username_available: Jouw gebruikersnaam komt weer beschikbaar + username_unavailable: Jouw gebruikersnaam blijft onbeschikbaar disputes: strikes: action_taken: Genomen maatregel @@ -1197,7 +1197,7 @@ nl: invalid_domain: is een ongeldige domeinnaam edit_profile: basic_information: Algemene informatie - hint_html: "Pas aan wat mensen op jouw openbare profiel en naast je berichten zien. Andere mensen zullen je eerder volgen en met je communiceren wanneer je profiel is ingevuld en je een profielfoto hebt." + hint_html: "Wat mensen op jouw openbare profiel en naast je berichten zien aanpassen. Andere mensen gaan je waarschijnlijk eerder volgen en hebben vaker interactie met je, wanneer je profiel is ingevuld en je een profielfoto hebt." other: Overige errors: '400': De aanvraag die je hebt ingediend was ongeldig of foutief. @@ -1323,7 +1323,7 @@ nl: 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}. Tot %{total_items} accounts zullen aan nieuwe lijsten worden toegevoegd. + 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}. preambles: blocking_html: Je staat op het punt om %{total_items} accounts te blokkeren vanuit %{filename}. @@ -1421,7 +1421,7 @@ nl: migrations: acct: Verhuisd naar cancel: Doorverwijzing annuleren - cancel_explanation: Het annuleren van de doorverwijzing zal jouw huidige account opnieuw activeren, maar brengt geen volgers terug die naar het andere account zijn verhuisd. + cancel_explanation: Het annuleren van de doorverwijzing activeert opnieuw jouw huidige account, maar brengt geen volgers terug die naar het andere account zijn verhuisd. cancelled_msg: De doorverwijzing is succesvol geannuleerd. errors: already_moved: is hetzelfde account waarnaar je al naar toe bent verhuisd @@ -1822,7 +1822,7 @@ nl: mark_statuses_as_sensitive: Sommige van jouw berichten zijn als gevoelig gemarkeerd door de moderatoren van %{instance}. Dit betekent dat mensen op de media in de berichten moeten klikken/tikken om deze weer te geven. Je kunt media in de toekomst ook zelf als gevoelig markeren. sensitive: Vanaf nu worden al jouw geüploade media als gevoelig gemarkeerd en verborgen achter een waarschuwing. silence: Je kunt nog steeds jouw account gebruiken, maar alleen mensen die jou al volgen kunnen jouw berichten zien, en je kunt minder goed worden gevonden. Andere kunnen je echter nog wel steeds handmatig volgen. - suspend: Je kunt niet langer jouw account gebruiken, en jouw profiel en andere gegevens zijn niet langer toegankelijk. Je kunt nog steeds inloggen om een backup van jouw gegevens op te vragen, totdat deze na 30 dagen volledig worden verwijderd. We zullen wel enkele basisgegevens behouden om te voorkomen dat je onder je schorsing uit probeert te komen. + suspend: Je kunt niet langer jouw account gebruiken, en jouw profiel en andere gegevens zijn niet langer toegankelijk. Je kunt nog steeds inloggen om een backup van jouw gegevens op te vragen, totdat deze na 30 dagen volledig worden verwijderd. We behouden wel enkele basisgegevens, om te voorkomen dat je onder je schorsing uit probeert te komen. reason: 'Reden:' statuses: 'Gerapporteerde berichten:' subject: @@ -1830,7 +1830,7 @@ nl: disable: Jouw account %{acct} is bevroren mark_statuses_as_sensitive: Deze berichten van %{acct} zijn als gevoelig gemarkeerd none: Waarschuwing voor %{acct} - sensitive: Berichten van %{acct} zullen vanaf nu altijd als gevoelig worden gemarkeerd + sensitive: Berichten van %{acct} worden vanaf nu altijd als gevoelig gemarkeerd silence: Jouw account %{acct} is nu beperkt suspend: Jouw account %{acct} is opgeschort title: @@ -1849,7 +1849,7 @@ nl: checklist_subtitle: 'Laten we aan dit nieuwe sociale avontuur beginnen:' checklist_title: Welkomstchecklist edit_profile_action: Personaliseren - edit_profile_step: Anderen zullen eerder met je in contact treden als je wat over jezelf vertelt. + edit_profile_step: Wanneer je meer over jezelf vertelt, krijg je meer interactie met andere mensen. edit_profile_title: Je profiel aanpassen explanation: Hier zijn enkele tips om je op weg te helpen feature_action: Meer informatie @@ -1867,7 +1867,9 @@ nl: follows_subtitle: Volg bekende accounts follows_title: Wie te volgen follows_view_more: Meer mensen om te volgen bekijken - hashtags_recent_count: "%{people} mensen in de afgelopen %{days} dagen" + hashtags_recent_count: + one: "%{people} persoon in de afgelopen 2 dagen" + other: "%{people} mensen in de afgelopen 2 dagen" hashtags_subtitle: Wat er in de afgelopen 2 dagen is gebeurd verkennen hashtags_title: Populaire hashtags hashtags_view_more: Meer populaire hashtags bekijken @@ -1891,7 +1893,7 @@ nl: verification: extra_instructions_html: Tip: De link op je website kan onzichtbaar zijn. Het belangrijke onderdeel is rel="me" dat impersonatie op websites met user-generated content voorkomt. Je kunt zelfs een link-tag gebruiken in de header van de pagina in plaats van a, maar de HTML moet ook zonder JavaScript toegankelijk zijn. here_is_how: Zo werkt het - hint_html: "Verificatie van je identiteit op Mastodon is voor iedereen. Het is gebaseerd op open webstandaarden, en is en blijft altijd gratis. Alles wat nodig is is een persoonlijke website waar mensen je aan kunnen herkennen. Wanneer je vanuit jouw profiel naar deze website linkt, zullen wij controleren of de website naar jouw profiel teruglinkt en daar een visuele indicator van tonen." + hint_html: "Verificatie van je identiteit op Mastodon is voor iedereen. Het is gebaseerd op open webstandaarden, en is en blijft altijd gratis. Alles wat nodig is is een persoonlijke website waar mensen je aan kunnen herkennen. Wanneer je vanuit jouw profiel naar deze website linkt, controleren wij of de website naar jouw profiel teruglinkt en geven wij dit duidelijk hierop aan." instructions_html: Kopieer en plak de onderstaande code in de HTML van je website. Voeg vervolgens het adres van je website toe aan een van de extra velden op je profiel op het tabblad "Profiel bewerken" en sla de wijzigingen op. verification: Verificatie verified_links: Jouw geverifieerde links diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 73821e5e28..43b7768a9c 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -1867,7 +1867,6 @@ nn: follows_subtitle: Fylg kjende folk follows_title: Kven du kan fylgja follows_view_more: Sjå fleire du kan fylgja - hashtags_recent_count: "%{people} folk dei siste %{days} dagane" hashtags_subtitle: Sjå kva som har vore populært dei siste to dagane hashtags_title: Populære emneknaggar hashtags_view_more: Sjå fleire populære emneknaggar diff --git a/config/locales/no.yml b/config/locales/no.yml index ba3d40a522..22292a3212 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -1854,7 +1854,6 @@ follows_subtitle: Følg godt kjente kontoer follows_title: Hvem å følge follows_view_more: Vis flere personer å følge - hashtags_recent_count: "%{people} personer i de siste %{days} dagene" hashtags_title: Populære emneknagger hashtags_view_more: Vis flere populære emneknagger post_step: Si hallo til verdenen med tekst, bilder, videoer, eller meningsmålinger. diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 70e772c4c7..e77a8d315b 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1931,7 +1931,11 @@ pl: follows_subtitle: Obserwuj dobrze znane konta follows_title: Kogo obserwować follows_view_more: Zobacz więcej osób do obserwowania - hashtags_recent_count: "%{people} osób w ostatnie %{days} dni" + hashtags_recent_count: + few: "%{people} osoby w ostatnie 2 dni" + many: "%{people} osób w ostatnie 2 dni" + one: "%{people} osoba w ostatnie 2 dni" + other: "%{people} osób w ostatnie 2 dni" hashtags_subtitle: Zobacz, co było popularne przez ostatnie 2 dni hashtags_title: Popularne hashtagi hashtags_view_more: Zobacz więcej popularnych hashtagów diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index bd635d12b6..da1bf9f2f4 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -1867,7 +1867,6 @@ pt-PT: follows_subtitle: Siga contas bem conhecidas follows_title: Quem seguir follows_view_more: Veja mais pessoas para seguir - hashtags_recent_count: "%{people} pessoas nos últimos %{days} dias" hashtags_subtitle: Explore o que está em tendência desde os últimos 2 dias hashtags_title: Trending hashtags hashtags_view_more: Ver mais hashtags em alta diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 747402bb1e..1099e3d0d7 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -122,6 +122,8 @@ ro: removed_header_msg: S-a îndepărtat cu succes coperta utilizatorului %{username} resend_confirmation: already_confirmed: Acest utilizator este deja confirmat + send: Retrimite link-ul de confirmare + success: Link-ul de confirmare a fost trimis cu succes! reset: Resetează reset_password: Resetează parola resubscribe: Resubscrie-te @@ -129,6 +131,7 @@ ro: search: Caută search_same_email_domain: Alţi utilizatori cu acelaşi domeniu de e-mail search_same_ip: Alţi utilizatori cu acelaşi IP + security: Securitate security_measures: only_password: Doar parola password_and_2fa: Parolă și Conectarea în 2 pași @@ -189,6 +192,7 @@ ro: destroy_ip_block: Șterge regula IP destroy_status: Șterge starea destroy_unavailable_domain: Șterge Domeniul Indisponibil + destroy_user_role: Distruge Rolul disable_2fa_user: Dezactivează 2FA disable_custom_emoji: Dezactivează Emoji-urile Personalizate disable_sign_in_token_auth_user: Dezactivează Autentificarea prin Token E-mail pentru Utilizator @@ -202,6 +206,7 @@ ro: reject_user: Respinge Utilizatorul remove_avatar_user: Elimină avatar reopen_report: Redeschide Raport + resend_user: Retrimite E-Mail-ul de Confirmare reset_password_user: Resetează Parola resolve_report: Rezolvă Raport sensitive_account: Cont Sensibil @@ -213,7 +218,9 @@ ro: unsuspend_account: Anulează Suspendarea Contului update_announcement: Actualizare Anunț update_custom_emoji: Actualizare Emoji Personalizat + update_ip_block: Actualizați regula IP update_status: Actualizează Starea + update_user_role: Actualizare Rol actions: create_custom_emoji_html: "%{name} a încărcat noi emoji %{target}" deleted_account: cont șters @@ -238,6 +245,7 @@ ro: unpublish: Revocă publicarea unpublished_msg: Publicarea anunțului a fost revocată cu succes! updated_msg: Anunț actualizat cu succes! + critical_update_pending: Actualizare critică în așteptare custom_emojis: assign_category: Atribuie o categorie by_domain: Domeniu @@ -272,6 +280,37 @@ ro: update_failed_msg: Nu s-a putut actualiza emoticonul respectiv updated_msg: Emoticon actualizat cu succes! upload: Încarcă + dashboard: + active_users: utilizatori activi + interactions: interacțiuni + media_storage: Stocare media + new_users: utilizatori noi + opened_reports: rapoarte deschise + resolved_reports: rapoarte rezolvate + software: Software + sources: Surse de înscriere + space: Utilizare spațiu + title: Tablou de bord + top_languages: Limbi active de top + top_servers: Top servere active + website: Site web + disputes: + appeals: + empty: Niciun recurs găsit. + title: Recursuri + domain_allows: + export: Exportare + import: Importare + domain_blocks: + confirm_suspension: + cancel: Anulare + confirm: Suspendă + permanent_action: Anularea suspendării nu va restabili nicio dată sau relație. + preamble_html: Sunteți pe cale să suspendați %{domain} și subdomeniile sale. + remove_all_data: Acest lucru va elimina tot conținutul, media și datele profilului contului acestui domeniu de pe server. + stop_communication: Serverul tău nu va mai comunica cu aceste servere. + title: Confirmați blocarea domeniului pentru %{domain} + undo_relationships: Această acțiune va anula orice relație de urmărire între conturile acestor servere și ale tale. email_domain_blocks: delete: Șterge dns: diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 1d608af08b..1d3fba7876 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -149,7 +149,7 @@ de: show_collections: Follower und „Folge ich“ im Profil anzeigen unlocked: Neue Follower automatisch akzeptieren account_alias: - acct: Profilname des alten Kontos + acct: Adresse des alten Kontos account_migration: acct: Adresse des neuen Kontos account_warning_preset: diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 8855494fdf..1d5e149339 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -149,9 +149,9 @@ hu: show_collections: Követők és követettek megjelnítése a profilban unlocked: Új követők automatikus elfogadása account_alias: - acct: Régi fiók kezelése + acct: A régi fiók fiókneve account_migration: - acct: Új fiók kezelése + acct: Az új fiók fiókneve account_warning_preset: text: Figyelmeztető szöveg title: Cím @@ -252,7 +252,7 @@ hu: registrations_mode: Ki regisztrálhat require_invite_text: Indok megkövetelése a csatlakozáshoz show_domain_blocks: Domain tiltások megjelenitése - show_domain_blocks_rationale: A domainok blokkolásának okának megjelenítése + show_domain_blocks_rationale: A domainek letiltási okainak megjelenítése site_contact_email: Kapcsolattartó e-mail site_contact_username: Kapcsolattartó felhasználóneve site_extended_description: Bővített leírás diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml index 4f7357c572..8723e83efa 100644 --- a/config/locales/simple_form.kab.yml +++ b/config/locales/simple_form.kab.yml @@ -91,8 +91,8 @@ kab: site_terms: Tasertit tabaḍnit site_title: Isem n uqeddac interactions: - must_be_follower: Ssewḥel ilɣa seg wid akked tid ur yellin ara d imeḍfaren-ik·im - must_be_following: Ssewḥel ilɣa seg wid akked tid ur tettḍafareḍ ara + must_be_follower: Ssewḥel ilɣa sɣur wid akked tid ur yellin ara d imeḍfaren-ik·im + must_be_following: Ssewḥel ilɣa sɣur wid akked tid ur tettḍafareḍ ara must_be_following_dm: Sewḥel iznan usriden sɣur wid akked tid ur tettḍafareḍ ara invite: comment: Awennit @@ -111,6 +111,7 @@ kab: mention: Yuder-ik·em-id walbɛaḍ reblog: Yella win yesselhan adda-dik·im rule: + hint: Isallen-nniḍen text: Alugen tag: name: Ahacṭag diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 3a4e99a0d1..676f5e37a3 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -39,12 +39,14 @@ pt-BR: text: Você só pode solicitar uma revisão uma vez defaults: autofollow: Pessoas que criarem conta através de seu convite te seguirão automaticamente + avatar: WEBP, PNG, GIF ou JPG. No máximo %{size}. Será reduzido para %{dimensions}px bot: Essa conta executa principalmente ações automatizadas e pode não ser monitorada context: Um ou mais contextos onde o filtro deve atuar current_password: Para fins de segurança, digite a senha da conta atual current_username: Para confirmar, digite o nome de usuário da conta atual digest: Enviado apenas após um longo período de inatividade com um resumo das menções recebidas durante ausência email: Você receberá um e-mail de confirmação + header: WEBP, PNG, GIF ou JPG. No máximo %{size}. Será reduzido para %{dimensions}px inbox_url: Copie o link da página inicial do repetidor que você deseja usar irreversible: As publicações filtradas desaparecerão irreversivelmente, mesmo se o filtro for removido depois locale: O idioma da interface do usuário, e-mails e notificações @@ -297,6 +299,7 @@ pt-BR: patch: Notificar sobre atualizações de correções trending_tag: Uma nova tendência requer revisão rule: + hint: Informações adicionais text: Regra settings: indexable: Incluir página de perfil nos motores de busca diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index 6fa052082e..f6e40720fe 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -39,12 +39,14 @@ zh-HK: text: 你每次只能提出一次申訴 defaults: autofollow: 通過邀請網址註冊的用戶將會自動關注你 + avatar: WEBP、PNG、GIF 或 JPG 格式圖片,最大為 %{size},並將縮小至 %{dimensions} px bot: 這個帳號是機械人,所做的事情可能沒有經人為監察 context: 過濾器應該套用的一項或多項條件 current_password: 基於保安緣故,請輸入目前帳號的密碼 current_username: 請輸入目前帳戶的使用者名稱以確認 digest: 僅在你長時間未登錄,且收到了私信時發送 email: 你將收到一封確認電郵 + header: WEBP、PNG、GIF 或 JPG 格式圖片,最大為 %{size},並將縮小至 %{dimensions} px inbox_url: 在你想要使用的中繼站首頁,複製它的網址 irreversible: 文章過濾是不可還原的,即使日後過濾器被移除,也無法重新看到被它濾走的文章 locale: 使用者介面、電郵和通知的語言 @@ -114,6 +116,7 @@ zh-HK: sign_up_requires_approval: 新登記申請正等候你審批 severity: 請設定伺服器將如何處理來自這個 IP 位址的請求 rule: + hint: 選填。提供有關規則的更多細節 text: 請描述在此伺服器上用戶需要遵守的規則或要求。請盡量保持簡短易明。 sessions: otp: 輸入你手機上生成的雙重認證碼,或者任意一個恢復代碼: @@ -297,6 +300,7 @@ zh-HK: patch: 通知除錯更新 trending_tag: 新趨勢須經過審核 rule: + hint: 其他資訊 text: 規則 settings: indexable: 在搜尋引擎中顯示個人檔案 diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 103e16a1f5..4583219b77 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1931,7 +1931,6 @@ sl: follows_subtitle: Sledite dobro znanim računom follows_title: Komu slediti follows_view_more: Pokaži več oseb za sledenje - hashtags_recent_count: "%{people} oseb v zadnjih %{days} dneh" hashtags_subtitle: Raziščite, kaj je v trendu zadnja dva dni hashtags_title: Ključniki v trendu hashtags_view_more: Pokaži več ključnikov v trendu diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 0aa7ad34bc..9b3b4a6bdb 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1863,7 +1863,9 @@ sq: follows_subtitle: Ndiqni llogari të mirënjohura follows_title: Cilët të ndiqen follows_view_more: Shihni më tepër vetë për ndjekje - hashtags_recent_count: "%{people} vetë në %{days} ditët e shkuara" + hashtags_recent_count: + one: "%{people} person në 2 ditët e shkuara" + other: "%{people} vetë në 2 ditët e shkuara" hashtags_subtitle: Eksploroni ç’është në modëë që prej 2 ditëve të fundit hashtags_title: Hashtag-ë në modë hashtags_view_more: Shihni më tepër hashtagë në modë diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index c2f9295f1c..51067390ab 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -1899,7 +1899,6 @@ sr-Latn: follows_subtitle: Pratite dobro poznate naloge follows_title: Koga pratiti follows_view_more: Pogledajte još ljudi za praćenje - hashtags_recent_count: "%{people} ljudi u prošlih %{days} dana" hashtags_subtitle: Istražite šta je u trendu u poslednja 2 dana hashtags_title: Heš oznake u trendu hashtags_view_more: Pogledajte još heš oznaka u trendu diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 19b6b66dd8..f97dc49c02 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -1899,7 +1899,10 @@ sr: follows_subtitle: Пратите добро познате налоге follows_title: Кога пратити follows_view_more: Погледајте још људи за праћење - hashtags_recent_count: "%{people} људи у прошлих %{days} дана" + hashtags_recent_count: + few: "%{people} особе у последња 2 дана" + one: "%{people} особа у последња 2 дана" + other: "%{people} особа у последња 2 дана" hashtags_subtitle: Истражите шта је у тренду у последња 2 дана hashtags_title: Хеш ознаке у тренду hashtags_view_more: Погледајте још хеш ознака у тренду diff --git a/config/locales/sv.yml b/config/locales/sv.yml index a40808eed6..1ab7a63042 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -1867,7 +1867,9 @@ sv: follows_subtitle: Följ välkända konton follows_title: Rekommenderade profiler follows_view_more: Visa fler personer att följa - hashtags_recent_count: "%{people} personer under de senaste %{days} dagarna" + hashtags_recent_count: + one: "%{people} personer de senaste 2 dagarna" + other: "%{people} personer under de senaste 2 dagarna" hashtags_subtitle: Utforska vad som har trendat de senaste 2 dagarna hashtags_title: Trendande hashtaggar hashtags_view_more: Visa fler trendande hashtaggar diff --git a/config/locales/th.yml b/config/locales/th.yml index 1b4ce0d6ab..10571af9d2 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1827,7 +1827,8 @@ th: follows_subtitle: ติดตามบัญชีที่มีชื่อเสียง follows_title: ติดตามใครดี follows_view_more: ดูผู้คนที่จะติดตามเพิ่มเติม - hashtags_recent_count: "%{people} คนใน %{days} วันที่ผ่านมา" + hashtags_recent_count: + other: "%{people} คนใน 2 วันที่ผ่านมา" hashtags_subtitle: สำรวจสิ่งที่กำลังนิยมตั้งแต่ 2 วันที่ผ่านมา hashtags_title: แฮชแท็กที่กำลังนิยม hashtags_view_more: ดูแฮชแท็กที่กำลังนิยมเพิ่มเติม diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 58436690ca..f80a21ed72 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1867,7 +1867,9 @@ tr: follows_subtitle: Tanınmış hesapları takip edin follows_title: Takip edebileceklerin follows_view_more: Takip edecek daha fazla kişi görüntüleyin - hashtags_recent_count: "%{days} günde %{people} kişi" + hashtags_recent_count: + one: Son 2 günde %{people} kişi + other: Son 2 günde %{people} kişi hashtags_subtitle: Son 2 günde öne çıkanları keşfedin hashtags_title: Öne çıkan etiketler hashtags_view_more: Daha fazla öne çıkan etiket görüntüleyin diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 3ceaad92ef..14e60dc124 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1835,7 +1835,6 @@ vi: follows_subtitle: Theo dõi những người thú vị follows_title: Gợi ý theo dõi follows_view_more: Xem thêm những người khác - hashtags_recent_count: "%{people} người dùng trong %{days} ngày qua" hashtags_subtitle: Khám phá xu hướng 2 ngày qua hashtags_title: Hashtag xu hướng hashtags_view_more: Xem thêm hashtag xu hướng diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 6296a4bb7c..17a66f72b3 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1835,7 +1835,8 @@ zh-CN: follows_subtitle: 关注知名账户 follows_title: 推荐关注 follows_view_more: 查看更多可关注的人 - hashtags_recent_count: 在过去的 %{days} 天中有 %{people} 人 + hashtags_recent_count: + other: 过去2天内有 %{people} 人 hashtags_subtitle: 探索过去2天以来的热门内容 hashtags_title: 热门话题标签 hashtags_view_more: 查看更多热门话题标签 diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 0d3e109b19..43e3ef51d0 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -753,6 +753,7 @@ zh-HK: disabled: 給沒有人 users: 所有已登入的帳號 registrations: + moderation_recommandation: 在向所有人開放註冊之前,請確保擁有一個準備充足且反應迅速的審核團隊! preamble: 控制誰可在你的伺服器上建立帳號。 title: 註冊 registrations_mode: @@ -760,6 +761,7 @@ zh-HK: approved: 註冊需要核准 none: 沒有人可註冊 open: 任何人皆能註冊 + warning_hint: 我們建議你使用「需要審核註冊」的設定,除非你確信審核團隊能夠及時處理垃圾訊息和惡意註冊。 security: authorized_fetch: 要求跨站驗證 authorized_fetch_hint: 要求跨站驗證可更嚴謹地執行使用者級及伺服器級的封鎖。然而,這會犧牲性能,降低你回覆的觸及範圍,跨站服務亦可能出現兼容問題。此外,這並無法阻止他人蓄意擷取你的公開帖文和帳號。 @@ -948,6 +950,9 @@ zh-HK: title: Webhooks webhook: Webhook admin_mailer: + auto_close_registrations: + body: 由於管理員最近較少活動,為防止 %{instance} 被惡意利用,註冊流程已自動改為手動審核。你可以隨時將它切換回開放註冊。 + subject: "%{instance} 上的註冊已自動切換為需要審核批准" new_appeal: actions: delete_statuses: 刪除他們的帖文 @@ -1805,7 +1810,43 @@ zh-HK: silence: 賬戶已被限制 suspend: 帳號已停用 welcome: + apps_android_action: 從 Google Play 下載 + apps_ios_action: 從 App Store 下載 + apps_step: 下載官方應用程式。 + apps_title: Mastodon 應用程式 + checklist_subtitle: 讓我們帶你進入全新的社交領域: + checklist_title: 歡迎清單 + edit_profile_action: 自訂 + edit_profile_step: 完善個人檔案來促進互動。 + edit_profile_title: 自訂你的個人檔案。 explanation: 下面是幾個小貼士,希望它們能幫到你 + feature_action: 了解更多 + feature_audience: 在 Mastodon 上,無需仲介,你也可以管理受眾。將 Mastodon 部署在自己的基礎架構上,既可以追蹤來自其他 Mastodon 伺服器上的人,也可以被他們追蹤。完全不受他人控制,一切由你掌控。 + feature_audience_title: 自信地建立受眾 + feature_control: 由你決定首頁時間軸的內容,不讓演算法和廣告干擾你!你可以使用同一帳號追蹤 Mastodon 伺服器上的使用者,並按時序瀏覽帖文,打造你專屬的網絡世界,讓這角落更貼近你的喜好。 + feature_control_title: 掌控自己的時間軸 + feature_creativity: Mastodon 囊括多元格式,助你盡情表達自我:干台支援音訊、影片、圖片帖文、無障礙描述、投票、內容警告,還有動態頭像、自訂表情符號、縮圖裁剪控制等功能。無論你想發佈藝術作品、音樂還是 podcast,Mastodon 都是你的理想平台。 + feature_creativity_title: 無與倫比的創意 + feature_moderation: 在 Mastodon,一切由你掌控。每台伺服器都能各自制訂並實施自身守則,而非像企業社交媒體那樣由上而下。這讓 Mastodon 能夠靈活地滿足不同群體的需要。你可以加入你認同其規則的伺服器,也可以自行架設。 + feature_moderation_title: 以應有的方式管理社群 + follow_action: 追蹤 + follow_step: 追蹤有趣的人正是 Mastodon 的核心所在。 + follow_title: 自訂你的首頁時間軸 + follows_subtitle: 追蹤知名帳號 + follows_title: 追蹤對象 + follows_view_more: 查看更多追蹤對象 + hashtags_recent_count: + other: 過去兩天內有 %{people} 人 + hashtags_subtitle: 查看過去兩天的流行話題 + hashtags_title: 熱門標籤 + hashtags_view_more: 查看更多熱門標籤 + post_action: 撰寫 + post_step: 用文字、相片、影片或投票跟大家打個招呼吧。 + post_title: 發表你的第一則帖文 + share_action: 分享 + share_step: 讓你的朋友知道如何在 Mastodon 上找到你。 + share_title: 分享你的 Mastodon 個人檔案 + sign_in_action: 登入 subject: 歡迎來到 Mastodon (萬象) title: 歡迎 %{name} 加入! users: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 2eecfa7b46..592f41c1c5 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1837,7 +1837,8 @@ zh-TW: follows_subtitle: 跟隨家喻戶曉的熱門帳號 follows_title: 推薦跟隨帳號 follows_view_more: 檢視更多人以跟隨 - hashtags_recent_count: 於過去 %{days} 天 %{people} 人 + hashtags_recent_count: + other: 於過去二天 %{people} 人 hashtags_subtitle: 探索過去兩天內的熱門主題標籤 hashtags_title: 熱門主題標籤 hashtags_view_more: 檢視更多熱門主題標籤 From 5d3d525d0e3a898f63c1f06c22756e5efc7f809c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 09:48:13 +0100 Subject: [PATCH 211/954] Update DefinitelyTyped types (non-major) (#29631) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index f185ad8d68..0be10a4085 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3208,9 +3208,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.195": - version: 4.14.202 - resolution: "@types/lodash@npm:4.14.202" - checksum: 10c0/6064d43c8f454170841bd67c8266cc9069d9e570a72ca63f06bceb484cb4a3ee60c9c1f305c1b9e3a87826049fd41124b8ef265c4dd08b00f6766609c7fe9973 + version: 4.17.0 + resolution: "@types/lodash@npm:4.17.0" + checksum: 10c0/4c5b41c9a6c41e2c05d08499e96f7940bcf194dcfa84356235b630da920c2a5e05f193618cea76006719bec61c76617dff02defa9d29934f9f6a76a49291bd8f languageName: node linkType: hard @@ -3326,11 +3326,11 @@ __metadata: linkType: hard "@types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.2.4": - version: 18.2.21 - resolution: "@types/react-dom@npm:18.2.21" + version: 18.2.22 + resolution: "@types/react-dom@npm:18.2.22" dependencies: "@types/react": "npm:*" - checksum: 10c0/a887b4b647071df48173f054854713b68fdacfceeba7fa14f64ba26688d7d43574d7dc88a2a346e28f2e667eeab1b9bdbcad8a54353869835e52638607f61ff5 + checksum: 10c0/cd85b5f402126e44b8c7b573e74737389816abcc931b2b14d8f946ba81cce8637ea490419488fcae842efb1e2f69853bc30522e43fd8359e1007d4d14b8d8146 languageName: node linkType: hard @@ -3456,13 +3456,13 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7": - version: 18.2.64 - resolution: "@types/react@npm:18.2.64" + version: 18.2.66 + resolution: "@types/react@npm:18.2.66" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/ab3ba9597990d08ffd419a5ad28fd22393c7a9a241ae455fb1d5d193d209471aa1909fa7ad016fd8d161eab6d0babba77b013b56a5170bedf78833085b9ee424 + checksum: 10c0/56e4b841f2daf03a0b3268d4f2bcf5841167fe56742b9f1c076fad66587fb59191bdaba4d5727dbfbcff750d5e8797fdd4e57d8d9704b0bfc6ad31ee1e268a70 languageName: node linkType: hard From cf7d412367c6748111d3c0b50a6827e4ea25afd2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 09:48:37 +0100 Subject: [PATCH 212/954] Update peter-evans/create-pull-request action to v6.0.2 (#29630) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/crowdin-download.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/crowdin-download.yml b/.github/workflows/crowdin-download.yml index 45580bd06f..e3ad7371a8 100644 --- a/.github/workflows/crowdin-download.yml +++ b/.github/workflows/crowdin-download.yml @@ -52,7 +52,7 @@ jobs: # Create or update the pull request - name: Create Pull Request - uses: peter-evans/create-pull-request@v6.0.1 + uses: peter-evans/create-pull-request@v6.0.2 with: commit-message: 'New Crowdin translations' title: 'New Crowdin Translations (automated)' From 2f653174b106ef7973b15699731728815b23eec9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 08:49:18 +0000 Subject: [PATCH 213/954] Update libretranslate/libretranslate Docker tag to v1.5.6 (#29629) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .devcontainer/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index ecdf9f5f53..d14af5d7d9 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -70,7 +70,7 @@ services: hard: -1 libretranslate: - image: libretranslate/libretranslate:v1.5.5 + image: libretranslate/libretranslate:v1.5.6 restart: unless-stopped volumes: - lt-data:/home/libretranslate/.local From a0fcac9652536df9c880fcfd4aa07bc1e61d74ed Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 08:49:34 +0000 Subject: [PATCH 214/954] Update dependency postcss to v8.4.36 (#29628) 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 0be10a4085..971e6418f1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13071,13 +13071,13 @@ __metadata: linkType: hard "postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.33": - version: 8.4.35 - resolution: "postcss@npm:8.4.35" + version: 8.4.36 + resolution: "postcss@npm:8.4.36" dependencies: nanoid: "npm:^3.3.7" picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.0.2" - checksum: 10c0/e8dd04e48001eb5857abc9475365bf08f4e508ddf9bc0b8525449a95d190f10d025acebc5b56ac2e94b3c7146790e4ae78989bb9633cb7ee20d1cc9b7dc909b2 + source-map-js: "npm:^1.1.0" + checksum: 10c0/e7c834e31d8f4e8dfd0a427df36fdc7bdc58a16e373551618e2c3ac172019eb816b24f1b4709311ebcade8d3ba31b2d75522d28ef45ecbbeb11eb01f265579fb languageName: node linkType: hard @@ -15018,10 +15018,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: 10c0/32f2dfd1e9b7168f9a9715eb1b4e21905850f3b50cf02cf476e47e4eebe8e6b762b63a64357896aa29b37e24922b4282df0f492e0d2ace572b43d15525976ff8 +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.1.0": + version: 1.1.0 + resolution: "source-map-js@npm:1.1.0" + checksum: 10c0/d1f016efe4fcf67fd92e36da0670f2889b13a36cc453329758336450e811c61164376eb451b453b4dd4e89a760f841b0a014942d54f240af31a791829bc0e336 languageName: node linkType: hard From 97a229d5f42afecfa328c676271279b484e65f4b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 08:53:29 +0000 Subject: [PATCH 215/954] Update dependency nokogiri to v1.16.3 (#29622) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index cb76abafcc..9766c38471 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -455,7 +455,7 @@ GEM net-smtp (0.4.0.1) net-protocol nio4r (2.5.9) - nokogiri (1.16.2) + nokogiri (1.16.3) mini_portile2 (~> 2.8.2) racc (~> 1.4) nsa (0.3.0) From ecdbf15ebef3bae688528b347fec50583c6cc04d Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 18 Mar 2024 04:54:46 -0400 Subject: [PATCH 216/954] Remove unused `link_to_older` and `link_to_newer` helper methods (#29620) --- app/helpers/statuses_helper.rb | 8 -------- config/locales/an.yml | 2 -- config/locales/ar.yml | 2 -- config/locales/be.yml | 2 -- config/locales/bg.yml | 2 -- config/locales/ca.yml | 2 -- config/locales/ckb.yml | 2 -- config/locales/co.yml | 2 -- config/locales/cs.yml | 2 -- config/locales/cy.yml | 2 -- config/locales/da.yml | 2 -- config/locales/de.yml | 2 -- config/locales/el.yml | 2 -- config/locales/en-GB.yml | 2 -- config/locales/en.yml | 2 -- config/locales/eo.yml | 2 -- config/locales/es-AR.yml | 2 -- config/locales/es-MX.yml | 2 -- config/locales/es.yml | 2 -- config/locales/et.yml | 2 -- config/locales/eu.yml | 2 -- config/locales/fa.yml | 2 -- config/locales/fi.yml | 2 -- config/locales/fo.yml | 2 -- config/locales/fr-CA.yml | 2 -- config/locales/fr.yml | 2 -- config/locales/fy.yml | 2 -- config/locales/ga.yml | 1 - config/locales/gd.yml | 2 -- config/locales/gl.yml | 2 -- config/locales/he.yml | 2 -- config/locales/hu.yml | 2 -- config/locales/hy.yml | 2 -- config/locales/id.yml | 2 -- config/locales/ie.yml | 2 -- config/locales/io.yml | 2 -- config/locales/is.yml | 2 -- config/locales/it.yml | 2 -- config/locales/ja.yml | 2 -- config/locales/kab.yml | 2 -- config/locales/ko.yml | 2 -- config/locales/ku.yml | 2 -- config/locales/lad.yml | 2 -- config/locales/lv.yml | 2 -- config/locales/ms.yml | 2 -- config/locales/my.yml | 2 -- config/locales/nl.yml | 2 -- config/locales/nn.yml | 2 -- config/locales/no.yml | 2 -- config/locales/oc.yml | 2 -- config/locales/pl.yml | 2 -- config/locales/pt-BR.yml | 2 -- config/locales/pt-PT.yml | 2 -- config/locales/ru.yml | 2 -- config/locales/sc.yml | 2 -- config/locales/sco.yml | 2 -- config/locales/si.yml | 2 -- config/locales/sl.yml | 2 -- config/locales/sq.yml | 2 -- config/locales/sr-Latn.yml | 2 -- config/locales/sr.yml | 2 -- config/locales/sv.yml | 2 -- config/locales/th.yml | 2 -- config/locales/tr.yml | 2 -- config/locales/uk.yml | 2 -- config/locales/vi.yml | 2 -- config/locales/zh-CN.yml | 2 -- config/locales/zh-HK.yml | 2 -- config/locales/zh-TW.yml | 2 -- spec/helpers/statuses_helper_spec.rb | 20 -------------------- 70 files changed, 163 deletions(-) diff --git a/app/helpers/statuses_helper.rb b/app/helpers/statuses_helper.rb index 286c53d834..ca693a8a78 100644 --- a/app/helpers/statuses_helper.rb +++ b/app/helpers/statuses_helper.rb @@ -4,14 +4,6 @@ module StatusesHelper EMBEDDED_CONTROLLER = 'statuses' EMBEDDED_ACTION = 'embed' - def link_to_newer(url) - link_to t('statuses.show_newer'), url, class: 'load-more load-gap' - end - - def link_to_older(url) - link_to t('statuses.show_older'), url, class: 'load-more load-gap' - end - def nothing_here(extra_classes = '') content_tag(:div, class: "nothing-here #{extra_classes}") do t('accounts.nothing_here') diff --git a/config/locales/an.yml b/config/locales/an.yml index 27abf2203a..5ac57f4238 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -1468,8 +1468,6 @@ an: other: "%{count} votos" vote: Vota show_more: Amostrar mas - show_newer: Amostrar mas recients - show_older: Amostrar mas antigos show_thread: Amostrar discusión title: "%{name}: «%{quote}»" visibilities: diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 2e227f53a7..5b932f525c 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -1820,8 +1820,6 @@ ar: zero: بدون صوت %{count} vote: صوّت show_more: أظهر المزيد - show_newer: إظهار أحدث - show_older: إظهار أقدم show_thread: اعرض خيط المحادثة title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/be.yml b/config/locales/be.yml index 7d32ff1366..d04409ca9a 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1761,8 +1761,6 @@ be: other: "%{count} голасу" vote: Прагаласаваць show_more: Паказаць больш - show_newer: Паказаць навейшыя - show_older: Паказаць старэйшыя show_thread: Паказаць ланцуг title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 5b4a828dd7..3f05bfa0c0 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1697,8 +1697,6 @@ bg: other: "%{count} гласа" vote: Гласуване show_more: Покажи повече - show_newer: Показване на по-нови - show_older: Показване на по-стари show_thread: Показване на нишката title: "%{name}: „%{quote}“" visibilities: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index f5a0143ef6..dedf69d7b2 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1697,8 +1697,6 @@ ca: other: "%{count} vots" vote: Vota show_more: Mostra'n més - show_newer: Mostra els més nous - show_older: Mostra els més vells show_thread: Mostra el fil title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index f4733c27e5..c1f280a24c 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -982,8 +982,6 @@ ckb: other: "%{count} دەنگەکان" vote: دەنگ show_more: زیاتر پیشان بدە - show_newer: نوێتر پیشان بدە - show_older: پیشاندانی کۆنتر show_thread: نیشاندانی ڕشتە visibilities: private: شوێنکەوتوانی تەنها diff --git a/config/locales/co.yml b/config/locales/co.yml index 8668cc6953..13c8b74313 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -966,8 +966,6 @@ co: other: "%{count} voti" vote: Vutà show_more: Vede di più - show_newer: Vede i più ricenti - show_older: Vede i più anziani show_thread: Vede u filu title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 2ecc360666..7e4e380541 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1761,8 +1761,6 @@ cs: other: "%{count} hlasů" vote: Hlasovat show_more: Zobrazit více - show_newer: Zobrazit novější - show_older: Zobrazit starší show_thread: Zobrazit vlákno title: "%{name}: „%{quote}“" visibilities: diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 8fcd10fe4d..067d939deb 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1825,8 +1825,6 @@ cy: zero: "%{count} o bleidleisiau" vote: Pleidlais show_more: Dangos mwy - show_newer: Dangos y diweddaraf - show_older: Dangos pethau hŷn show_thread: Dangos edefyn title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/da.yml b/config/locales/da.yml index 59de5327d0..fcb600d7b9 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1697,8 +1697,6 @@ da: other: "%{count} stemmer" vote: Stem show_more: Vis flere - show_newer: Vis nyere - show_older: Vis ældre show_thread: Vis tråd title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/de.yml b/config/locales/de.yml index fa66754346..84f10d8e08 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1697,8 +1697,6 @@ de: other: "%{count} Stimmen" vote: Abstimmen show_more: Mehr anzeigen - show_newer: Neuere anzeigen - show_older: Ältere anzeigen show_thread: Thread anzeigen title: "%{name}: „%{quote}“" visibilities: diff --git a/config/locales/el.yml b/config/locales/el.yml index 1b7dcddc6f..d3d91abc2b 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -1569,8 +1569,6 @@ el: other: "%{count} ψήφοι" vote: Ψήφισε show_more: Δείξε περισσότερα - show_newer: Εμφάνιση νεότερων - show_older: Εμφάνιση παλαιότερων show_thread: Εμφάνιση νήματος title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 292365ed56..b5d92541df 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -1692,8 +1692,6 @@ en-GB: other: "%{count} votes" vote: Vote show_more: Show more - show_newer: Show newer - show_older: Show older show_thread: Show thread title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/en.yml b/config/locales/en.yml index c874a712da..b6f9689ac4 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1698,8 +1698,6 @@ en: other: "%{count} votes" vote: Vote show_more: Show more - show_newer: Show newer - show_older: Show older show_thread: Show thread title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 9d27dace97..cb5654b4c7 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1624,8 +1624,6 @@ eo: other: "%{count} voĉdonoj" vote: Voĉdoni show_more: Montri pli - show_newer: Montri pli novajn - show_older: Montri pli malnovajn show_thread: Montri la mesaĝaron title: "%{name}: “%{quote}”" visibilities: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 9337291399..aae437b954 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1697,8 +1697,6 @@ es-AR: other: "%{count} votos" vote: Votar show_more: Mostrar más - show_newer: Mostrar más recientes - show_older: Mostrar más antiguos show_thread: Mostrar hilo title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 511b392006..e7e1a4ff88 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -1697,8 +1697,6 @@ es-MX: other: "%{count} votos" vote: Vota show_more: Mostrar más - show_newer: Mostrar más recientes - show_older: Mostrar más antiguos show_thread: Mostrar discusión title: "%{name}: «%{quote}»" visibilities: diff --git a/config/locales/es.yml b/config/locales/es.yml index 67e7e68760..24822116ca 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1697,8 +1697,6 @@ es: other: "%{count} votos" vote: Vota show_more: Mostrar más - show_newer: Mostrar más recientes - show_older: Mostrar más antiguos show_thread: Mostrar discusión title: "%{name}: «%{quote}»" visibilities: diff --git a/config/locales/et.yml b/config/locales/et.yml index d9220a72d6..80e3d3ef68 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -1697,8 +1697,6 @@ et: other: "%{count} häält" vote: Hääleta show_more: Näita rohkem - show_newer: Uuemate kuvamine - show_older: Vanemate kuvamine show_thread: Kuva lõim title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/eu.yml b/config/locales/eu.yml index b2292b80f4..ac641ab454 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -1701,8 +1701,6 @@ eu: other: "%{count} boto" vote: Bozkatu show_more: Erakutsi gehiago - show_newer: Erakutsi berriagoak - show_older: Erakutsi zaharragoak show_thread: Erakutsi haria title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index af5e1cfea8..df9b926276 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -1461,8 +1461,6 @@ fa: other: "%{count} رأی" vote: رأی show_more: نمایش - show_newer: نمایش جدیدتر - show_older: نمایش قدیمی‌تر show_thread: نمایش رشته title: "%{name}: «%{quote}»" visibilities: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 01203cf484..a92ad4ecb6 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1697,8 +1697,6 @@ fi: other: "%{count} ääntä" vote: Äänestä show_more: Näytä lisää - show_newer: Näytä uudemmat - show_older: Näytä vanhempi show_thread: Näytä ketju title: "%{name}: ”%{quote}”" visibilities: diff --git a/config/locales/fo.yml b/config/locales/fo.yml index b78b9926db..45633d85b3 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1697,8 +1697,6 @@ fo: other: "%{count} atkvøður" vote: Atkvøð show_more: Vís meira - show_newer: Vís nýggjari - show_older: Vís eldri show_thread: Vís tráð title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 492fe25181..2ed482770c 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -1697,8 +1697,6 @@ fr-CA: other: "%{count} votes" vote: Voter show_more: Déplier - show_newer: Plus récents - show_older: Plus anciens show_thread: Afficher le fil de discussion title: "%{name} : « %{quote} »" visibilities: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 6f8df69ee7..ae012c1531 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1697,8 +1697,6 @@ fr: other: "%{count} votes" vote: Voter show_more: Déplier - show_newer: Plus récents - show_older: Plus anciens show_thread: Afficher le fil de discussion title: "%{name} : « %{quote} »" visibilities: diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 0dad09baf4..742b2903a0 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -1692,8 +1692,6 @@ fy: other: "%{count} stimmen" vote: Stimme show_more: Mear toane - show_newer: Nijere toane - show_older: Aldere toane show_thread: Petear toane title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 527512053b..5c61898ef5 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -471,7 +471,6 @@ ga: poll: vote: Vótáil show_more: Taispeáin níos mó - show_newer: Taispeáin níos nuaí show_thread: Taispeáin snáithe visibilities: private: Leantóirí amháin diff --git a/config/locales/gd.yml b/config/locales/gd.yml index c9a4467b12..79bbbea0f5 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -1761,8 +1761,6 @@ gd: two: "%{count} bhòt" vote: Bhòt show_more: Seall barrachd dheth - show_newer: Seall feadhainn as ùire - show_older: Seall feadhainn as sine show_thread: Seall an snàithlean title: "%{name}: “%{quote}”" visibilities: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 0c2b9af1b0..dc4a62f701 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1697,8 +1697,6 @@ gl: other: "%{count} votos" vote: Votar show_more: Mostrar máis - show_newer: Mostrar o máis novo - show_older: Mostrar o máis vello show_thread: Amosar fío title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/he.yml b/config/locales/he.yml index cc1f9dc7fb..1388a71632 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1761,8 +1761,6 @@ he: two: "%{count} קולות" vote: הצבעה show_more: עוד - show_newer: הצג חדשים יותר - show_older: הצג ישנים יותר show_thread: הצג שרשור title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 418c6ffe75..f09f7e4285 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1697,8 +1697,6 @@ hu: other: "%{count} szavazat" vote: Szavazás show_more: Több megjelenítése - show_newer: Újabbak mutatása - show_older: Régebbiek mutatása show_thread: Szál mutatása title: "%{name}: „%{quote}”" visibilities: diff --git a/config/locales/hy.yml b/config/locales/hy.yml index 4125c1110e..9d596dd834 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -808,8 +808,6 @@ hy: other: "%{count} ձայներ" vote: Քուէարկել show_more: Աւելին - show_newer: Ցուցադրել նորերը - show_older: Ցուցադրել հները show_thread: Բացել շղթան title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/id.yml b/config/locales/id.yml index 1655b744ff..d1c04ad1d4 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -1428,8 +1428,6 @@ id: other: "%{count} memilih" vote: Pilih show_more: Tampilkan selengkapnya - show_newer: Tampilkan lebih baru - show_older: Tampilkan lebih lama show_thread: Tampilkan utas title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/ie.yml b/config/locales/ie.yml index 0513d5925d..7a0ae6292e 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -1697,8 +1697,6 @@ ie: other: "%{count} votes" vote: Votar show_more: Monstrar plu - show_newer: Monstrar plu nov - show_older: Monstrar plu old show_thread: Monstrar fil title: "%{name}: «%{quote}»" visibilities: diff --git a/config/locales/io.yml b/config/locales/io.yml index 32769effa4..4561a43e8e 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -1666,8 +1666,6 @@ io: other: "%{count} voti" vote: Votez show_more: Montrar plue - show_newer: Montrez plu nova kozo - show_older: Montrez plu olda kozo show_thread: Montrez postaro title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/is.yml b/config/locales/is.yml index 110cf1e697..d7a3f8e2cc 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -1701,8 +1701,6 @@ is: other: "%{count} atkvæði" vote: Greiða atkvæði show_more: Sýna meira - show_newer: Sýna nýrri - show_older: Sýna eldri show_thread: Birta þráð title: "%{name}: „%{quote}‟" visibilities: diff --git a/config/locales/it.yml b/config/locales/it.yml index b84803c009..6e7f9a7ce1 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1699,8 +1699,6 @@ it: other: "%{count} voti" vote: Vota show_more: Mostra di più - show_newer: Mostra più nuovi - show_older: Mostra più vecchi show_thread: Mostra thread title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index c51d0a8ea9..f5e874f98d 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1665,8 +1665,6 @@ ja: other: "%{count}票" vote: 投票 show_more: もっと見る - show_newer: 新しいものを表示 - show_older: 古いものを表示 show_thread: スレッドを表示 title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/kab.yml b/config/locales/kab.yml index 0c36059406..566ba0dee1 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -813,8 +813,6 @@ kab: other: "%{count} n yedɣaren" vote: Dɣeṛ show_more: Ssken-d ugar - show_newer: Ssken-d timaynutin - show_older: Ssken-d tiqburin show_thread: Ssken-d lxiḍ title: '%{name} : "%{quote}"' visibilities: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 6f8c7c6146..c4dcb5687b 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1667,8 +1667,6 @@ ko: other: "%{count}명 투표함" vote: 투표 show_more: 더 보기 - show_newer: 새로운 것 표시 - show_older: 오래된 것 표시 show_thread: 글타래 보기 title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/ku.yml b/config/locales/ku.yml index 0c44b7555b..f8d9cd80d4 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -1462,8 +1462,6 @@ ku: other: "%{count} deng" vote: Deng bide show_more: Bêtir nîşan bide - show_newer: Nûtirîn nîşan bide - show_older: Kevntirîn nîşan bide show_thread: Mijarê nîşan bide title: "%{name}%{quote}" visibilities: diff --git a/config/locales/lad.yml b/config/locales/lad.yml index cd62cbc0f8..c0ab028b9c 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -1697,8 +1697,6 @@ lad: other: "%{count} votos" vote: Vota show_more: Amostra mas - show_newer: Amostra mas muevos - show_older: Amostra mas viejos show_thread: Amostra diskusyon title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 83489f7e7b..bd2500a912 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -1718,8 +1718,6 @@ lv: zero: "%{count} balsu" vote: Balsu skaits show_more: Rādīt vairāk - show_newer: Nekad nerādīt - show_older: Rādīt senākus show_thread: Rādīt tematu title: "%{name}: “%{quote}”" visibilities: diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 1704aed3e0..bfd6591ddb 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -1634,8 +1634,6 @@ ms: other: "%{count} undi" vote: Undi show_more: Tunjuk lebih banyak - show_newer: Tunjuk lebih baharu - show_older: Tunjuk lebih tua show_thread: Tunjuk bebenang title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/my.yml b/config/locales/my.yml index a01755b6c4..6898db877c 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -1633,8 +1633,6 @@ my: other: မဲအရေအတွက် %{count} မဲ vote: မဲပေးမည် show_more: ပိုမိုပြရန် - show_newer: ပို့စ်အသစ်များပြရန် - show_older: ပို့စ်အဟောင်းများပြရန် show_thread: Thread ကို ပြပါ title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 6870578a87..3b4c586dc5 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1697,8 +1697,6 @@ nl: other: "%{count} stemmen" vote: Stemmen show_more: Meer tonen - show_newer: Nieuwere tonen - show_older: Oudere tonen show_thread: Gesprek tonen title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 43b7768a9c..f53b67d098 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -1697,8 +1697,6 @@ nn: other: "%{count} røyster" vote: Røyst show_more: Vis meir - show_newer: Vis nyere - show_older: Vis eldre show_thread: Vis tråden title: "%{name}: «%{quote}»" visibilities: diff --git a/config/locales/no.yml b/config/locales/no.yml index 22292a3212..4cdf2ca82a 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -1694,8 +1694,6 @@ other: "%{count} stemmer" vote: Stem show_more: Vis mer - show_newer: Vis nyere - show_older: Vis eldre show_thread: Vis tråden title: "%{name}: «%{quote}»" visibilities: diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 9f9f04ba9b..569f76715b 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -875,8 +875,6 @@ oc: other: "%{count} vòtes" vote: Votar show_more: Ne veire mai - show_newer: Veire mai recents - show_older: Veire mai ancians show_thread: Mostrar lo fil title: '%{name} : "%{quote}"' visibilities: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index e77a8d315b..e43f9a6050 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1761,8 +1761,6 @@ pl: other: "%{count} głosy" vote: Głosuj show_more: Pokaż więcej - show_newer: Pokaż nowsze - show_older: Pokaż starsze show_thread: Pokaż wątek title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 82b970ce58..194de9a3eb 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -1697,8 +1697,6 @@ pt-BR: other: "%{count} votos" vote: Votar show_more: Mostrar mais - show_newer: Mostrar mais recentes - show_older: Mostrar mais antigos show_thread: Mostrar conversa title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index da1bf9f2f4..57a698e1d1 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -1697,8 +1697,6 @@ pt-PT: other: "%{count} votos" vote: Votar show_more: Mostrar mais - show_newer: Mostrar mais recentes - show_older: Mostrar mais antigos show_thread: Mostrar conversa title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 83fbe373a0..d2c4609700 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1756,8 +1756,6 @@ ru: other: "%{count} голосов" vote: Голосовать show_more: Развернуть - show_newer: Показать более новое - show_older: Показать старые show_thread: Открыть обсуждение title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/sc.yml b/config/locales/sc.yml index ec16c6027d..e51ac84eac 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -1025,8 +1025,6 @@ sc: other: "%{count} votos" vote: Vota show_more: Ammustra·nde prus - show_newer: Ammustra is prus noos - show_older: Ammustra is prus betzos show_thread: Ammustra su tema title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/sco.yml b/config/locales/sco.yml index 5b452fc6bb..8382dec76e 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -1452,8 +1452,6 @@ sco: other: "%{count} votes" vote: Vote show_more: Shaw mair - show_newer: Shaw newer - show_older: Shaw aulder show_thread: Shaw threid title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/si.yml b/config/locales/si.yml index 6afa8f8ef3..e0be7ff8e9 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -1316,8 +1316,6 @@ si: other: ඡන්ද %{count} යි vote: ඡන්දය show_more: තව පෙන්වන්න - show_newer: අලුත්ම පෙන්වන්න - show_older: පැරණි පෙන්වන්න show_thread: නූල් පෙන්වන්න title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 4583219b77..3f2b65b76a 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1761,8 +1761,6 @@ sl: two: "%{count} glasova" vote: Glasuj show_more: Pokaži več - show_newer: Pokaži novejše - show_older: Pokaži starejše show_thread: Pokaži nit title: "%{name}: »%{quote}«" visibilities: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 9b3b4a6bdb..759f995470 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1693,8 +1693,6 @@ sq: other: "%{count} vota" vote: Votë show_more: Shfaq më tepër - show_newer: Shfaq më të reja - show_older: Shfaq më të vjetra show_thread: Shfaq rrjedhën title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 51067390ab..74a5e0b1c0 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -1729,8 +1729,6 @@ sr-Latn: other: "%{count} glasova" vote: Glasajte show_more: Prikaži još - show_newer: Nikad ne prikazuj - show_older: Prikaži starije show_thread: Prikaži niz title: "%{name}: „%{quote}”" visibilities: diff --git a/config/locales/sr.yml b/config/locales/sr.yml index f97dc49c02..9e7dd9c35c 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -1729,8 +1729,6 @@ sr: other: "%{count} гласова" vote: Гласајте show_more: Прикажи још - show_newer: Никад не приказуј - show_older: Прикажи старије show_thread: Прикажи низ title: "%{name}: „%{quote}”" visibilities: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 1ab7a63042..d282d92222 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -1697,8 +1697,6 @@ sv: other: "%{count} röster" vote: Rösta show_more: Visa mer - show_newer: Visa nyare - show_older: Visa äldre show_thread: Visa tråd title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/th.yml b/config/locales/th.yml index 10571af9d2..67d2b94793 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1665,8 +1665,6 @@ th: other: "%{count} การลงคะแนน" vote: ลงคะแนน show_more: แสดงเพิ่มเติม - show_newer: แสดงที่ใหม่กว่า - show_older: แสดงที่เก่ากว่า show_thread: แสดงกระทู้ title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index f80a21ed72..a942e5b394 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1697,8 +1697,6 @@ tr: other: "%{count} oylar" vote: Oy Ver show_more: Daha fazlasını göster - show_newer: Yenileri göster - show_older: Eskileri göster show_thread: Konuyu göster title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index eb3ca2a4ae..9c343489eb 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1761,8 +1761,6 @@ uk: other: "%{count} голоси" vote: Проголосувати show_more: Розгорнути - show_newer: Показати новіші - show_older: Показати давніші show_thread: Відкрити обговорення title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 14e60dc124..bb3bd27b50 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1665,8 +1665,6 @@ vi: other: "%{count} người bình chọn" vote: Bình chọn show_more: Đọc thêm - show_newer: Mới hơn - show_older: Cũ hơn show_thread: Nội dung gốc title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 17a66f72b3..2d1d82b306 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1665,8 +1665,6 @@ zh-CN: other: "%{count} 票" vote: 投票 show_more: 显示更多 - show_newer: 显示更新内容 - show_older: 显示更早内容 show_thread: 显示全部对话 title: "%{name}:“%{quote}”" visibilities: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 43e3ef51d0..0bb362eadf 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1665,8 +1665,6 @@ zh-HK: other: "%{count} 票" vote: 投票 show_more: 顯示更多 - show_newer: 顯示較新嘟文 - show_older: 顯示較舊嘟文 show_thread: 顯示討論串 title: "%{name}:「%{quote}」" visibilities: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 592f41c1c5..4c450f3c1b 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1667,8 +1667,6 @@ zh-TW: other: "%{count} 票" vote: 投票 show_more: 顯示更多 - show_newer: 顯示較新嘟文 - show_older: 顯示較舊嘟文 show_thread: 顯示討論串 title: "%{name}:「%{quote}」" visibilities: diff --git a/spec/helpers/statuses_helper_spec.rb b/spec/helpers/statuses_helper_spec.rb index c67e1f3f2b..73d7d80e46 100644 --- a/spec/helpers/statuses_helper_spec.rb +++ b/spec/helpers/statuses_helper_spec.rb @@ -29,26 +29,6 @@ describe StatusesHelper do I18n.t('statuses.content_warning', warning: status.spoiler_text) end - describe 'link_to_newer' do - it 'returns a link to newer content' do - url = 'https://example.com' - result = helper.link_to_newer(url) - - expect(result).to match('load-more') - expect(result).to match(I18n.t('statuses.show_newer')) - end - end - - describe 'link_to_older' do - it 'returns a link to older content' do - url = 'https://example.com' - result = helper.link_to_older(url) - - expect(result).to match('load-more') - expect(result).to match(I18n.t('statuses.show_older')) - end - end - describe 'fa_visibility_icon' do context 'with a status that is public' do let(:status) { Status.new(visibility: 'public') } From 92855948a000563f1a6d715721892dfc18606baf Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 18 Mar 2024 04:55:54 -0400 Subject: [PATCH 217/954] Remove unused `show_landing_strip?` helper method (#29618) --- app/helpers/application_helper.rb | 4 --- spec/helpers/application_helper_spec.rb | 30 ---------------------- spec/views/statuses/show.html.haml_spec.rb | 2 +- 3 files changed, 1 insertion(+), 35 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index a4f92743c5..18c9663275 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -32,10 +32,6 @@ module ApplicationHelper paths.any? { |path| current_page?(path) } ? 'active' : '' end - def show_landing_strip? - !user_signed_in? && !single_user_mode? - end - def open_registrations? Setting.registrations_mode == 'open' end diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index ef1463e64c..6fc6b3c087 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -99,36 +99,6 @@ describe ApplicationHelper do end end - describe 'show_landing_strip?', :without_verify_partial_doubles do - describe 'when signed in' do - before do - allow(helper).to receive(:user_signed_in?).and_return(true) - end - - it 'does not show landing strip' do - expect(helper.show_landing_strip?).to be false - end - end - - describe 'when signed out' do - before do - allow(helper).to receive(:user_signed_in?).and_return(false) - end - - it 'does not show landing strip on single user instance' do - allow(helper).to receive(:single_user_mode?).and_return(true) - - expect(helper.show_landing_strip?).to be false - end - - it 'shows landing strip on multi user instance' do - allow(helper).to receive(:single_user_mode?).and_return(false) - - expect(helper.show_landing_strip?).to be true - end - end - end - describe 'available_sign_up_path' do context 'when registrations are closed' do before do diff --git a/spec/views/statuses/show.html.haml_spec.rb b/spec/views/statuses/show.html.haml_spec.rb index 233965883a..92ba678b6d 100644 --- a/spec/views/statuses/show.html.haml_spec.rb +++ b/spec/views/statuses/show.html.haml_spec.rb @@ -4,7 +4,7 @@ require 'rails_helper' describe 'statuses/show.html.haml', :without_verify_partial_doubles do before do - allow(view).to receive_messages(api_oembed_url: '', show_landing_strip?: true, site_title: 'example site', site_hostname: 'example.com', full_asset_url: '//asset.host/image.svg', current_account: nil, single_user_mode?: false) + allow(view).to receive_messages(api_oembed_url: '', site_title: 'example site', site_hostname: 'example.com', full_asset_url: '//asset.host/image.svg', current_account: nil, single_user_mode?: false) allow(view).to receive(:local_time) allow(view).to receive(:local_time_ago) assign(:instance_presenter, InstancePresenter.new) From 307efe41c6c906fb2e6a49a6f08c9a09ec58ba7e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 10:15:03 +0100 Subject: [PATCH 218/954] Update dependency axios to v1.6.8 (#29613) 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 971e6418f1..fbb747899f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4687,13 +4687,13 @@ __metadata: linkType: hard "axios@npm:^1.4.0": - version: 1.6.7 - resolution: "axios@npm:1.6.7" + version: 1.6.8 + resolution: "axios@npm:1.6.8" dependencies: - follow-redirects: "npm:^1.15.4" + follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 10c0/131bf8e62eee48ca4bd84e6101f211961bf6a21a33b95e5dfb3983d5a2fe50d9fffde0b57668d7ce6f65063d3dc10f2212cbcb554f75cfca99da1c73b210358d + checksum: 10c0/0f22da6f490335479a89878bc7d5a1419484fbb437b564a80c34888fc36759ae4f56ea28d55a191695e5ed327f0bad56e7ff60fb6770c14d1be6501505d47ab9 languageName: node linkType: hard @@ -8108,13 +8108,13 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.4": - version: 1.15.4 - resolution: "follow-redirects@npm:1.15.4" +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.6": + version: 1.15.6 + resolution: "follow-redirects@npm:1.15.6" peerDependenciesMeta: debug: optional: true - checksum: 10c0/5f37ed9170c9eb19448c5418fdb0f2b73f644b5364834e70791a76ecc7db215246f9773bbef4852cfae4067764ffc852e047f744b661b0211532155b73556a6a + checksum: 10c0/9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071 languageName: node linkType: hard From f279ff3bd69bd4115e247e81d1930dc85eb64ae2 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 18 Mar 2024 05:19:38 -0400 Subject: [PATCH 219/954] Update `rspec-*` gems (#29616) --- Gemfile.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9766c38471..9fb549c194 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -622,16 +622,16 @@ GEM chunky_png (~> 1.0) rqrcode_core (~> 1.0) rqrcode_core (1.2.0) - rspec-core (3.12.2) - rspec-support (~> 3.12.0) - rspec-expectations (3.12.3) + rspec-core (3.13.0) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.12.0) + rspec-support (~> 3.13.0) rspec-github (2.4.0) rspec-core (~> 3.0) - rspec-mocks (3.12.6) + rspec-mocks (3.13.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.12.0) + rspec-support (~> 3.13.0) rspec-rails (6.1.1) actionpack (>= 6.1) activesupport (>= 6.1) @@ -645,7 +645,7 @@ GEM rspec-expectations (~> 3.0) rspec-mocks (~> 3.0) sidekiq (>= 5, < 8) - rspec-support (3.12.1) + rspec-support (3.13.1) rubocop (1.60.2) json (~> 2.3) language_server-protocol (>= 3.17.0) From 1164c7005ec342398a37ae16c4cc256b9922a524 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 10:33:54 +0100 Subject: [PATCH 220/954] Update dependency http-link-header to v1.1.3 (#29625) 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 fbb747899f..e36acff5be 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8862,9 +8862,9 @@ __metadata: linkType: hard "http-link-header@npm:^1.1.1": - version: 1.1.2 - resolution: "http-link-header@npm:1.1.2" - checksum: 10c0/d4ae44b912dd1f5a37c11438878b51635a7a8f9228bf004b2ecf9e1d23a9d912942b02e5f41695bbe9fa93ab380bdd10c58db717c3531c705116e61014aba3f0 + version: 1.1.3 + resolution: "http-link-header@npm:1.1.3" + checksum: 10c0/56698a9d3aee4d5319d1cdfe62ef5d7179f179ec1e6432d23c9e6a0c896be642ba47a4985a45419cff91008032aef920aca9df94ff9e763e646c83bf54b7243d languageName: node linkType: hard From a732ef21b0bd010e5c78dfcaab7e0ba42457d74d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 10:37:33 +0100 Subject: [PATCH 221/954] Update dependency json-schema to v4.2.0 (#29604) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9fb549c194..e3239f3411 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -372,7 +372,7 @@ GEM json-ld-preloaded (3.3.0) json-ld (~> 3.3) rdf (~> 3.3) - json-schema (4.1.1) + json-schema (4.2.0) addressable (>= 2.8) jsonapi-renderer (0.2.2) jwt (2.7.1) From 9142805ca898da48c256145d1d1f0122da10ed01 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 18 Mar 2024 10:58:28 +0100 Subject: [PATCH 222/954] =?UTF-8?q?Remove=20deprecated=20`@types/=E2=80=A6?= =?UTF-8?q?`=20packages=20(#29633)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 --- yarn.lock | 36 +++--------------------------------- 2 files changed, 3 insertions(+), 36 deletions(-) diff --git a/package.json b/package.json index 9f20a981ae..338c440f87 100644 --- a/package.json +++ b/package.json @@ -157,14 +157,11 @@ "@types/react-helmet": "^6.1.6", "@types/react-immutable-proptypes": "^2.1.0", "@types/react-motion": "^0.0.40", - "@types/react-overlays": "^3.1.0", "@types/react-router": "^5.1.20", "@types/react-router-dom": "^5.3.3", - "@types/react-select": "^5.0.1", "@types/react-sparklines": "^1.7.2", "@types/react-swipeable-views": "^0.13.1", "@types/react-test-renderer": "^18.0.0", - "@types/react-textarea-autosize": "^8.0.0", "@types/react-toggle": "^4.0.3", "@types/redux-immutable": "^4.0.3", "@types/requestidlecallback": "^0.3.5", diff --git a/yarn.lock b/yarn.lock index e36acff5be..6a2b98c3c0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2322,14 +2322,11 @@ __metadata: "@types/react-helmet": "npm:^6.1.6" "@types/react-immutable-proptypes": "npm:^2.1.0" "@types/react-motion": "npm:^0.0.40" - "@types/react-overlays": "npm:^3.1.0" "@types/react-router": "npm:^5.1.20" "@types/react-router-dom": "npm:^5.3.3" - "@types/react-select": "npm:^5.0.1" "@types/react-sparklines": "npm:^1.7.2" "@types/react-swipeable-views": "npm:^0.13.1" "@types/react-test-renderer": "npm:^18.0.0" - "@types/react-textarea-autosize": "npm:^8.0.0" "@types/react-toggle": "npm:^4.0.3" "@types/redux-immutable": "npm:^4.0.3" "@types/requestidlecallback": "npm:^0.3.5" @@ -3362,15 +3359,6 @@ __metadata: languageName: node linkType: hard -"@types/react-overlays@npm:^3.1.0": - version: 3.1.0 - resolution: "@types/react-overlays@npm:3.1.0" - dependencies: - react-overlays: "npm:*" - checksum: 10c0/99a4de7c56a286cf72dbf135ad6f9da7c095483987ab548ba7e63d1d885fd54939e78e8bd3dd3cf275a6f4c3d6bdcd00c6923c92cc6c3a4c9bacf5a55550f18b - languageName: node - linkType: hard - "@types/react-router-dom@npm:^5.3.3": version: 5.3.3 resolution: "@types/react-router-dom@npm:5.3.3" @@ -3392,15 +3380,6 @@ __metadata: languageName: node linkType: hard -"@types/react-select@npm:^5.0.1": - version: 5.0.1 - resolution: "@types/react-select@npm:5.0.1" - dependencies: - react-select: "npm:*" - checksum: 10c0/6ea7f3beaebb38e537e5b742a0d8b49f212bdf1dade9f9ce5e3c91e24aad95284aeda0efc8a235e05a7102748f475c4476fb6830030b5574fdf19c3f1d908027 - languageName: node - linkType: hard - "@types/react-sparklines@npm:^1.7.2": version: 1.7.5 resolution: "@types/react-sparklines@npm:1.7.5" @@ -3428,15 +3407,6 @@ __metadata: languageName: node linkType: hard -"@types/react-textarea-autosize@npm:^8.0.0": - version: 8.0.0 - resolution: "@types/react-textarea-autosize@npm:8.0.0" - dependencies: - react-textarea-autosize: "npm:*" - checksum: 10c0/8d6a40e53aa3452ddda53a2b9eb8668ffdfdabc8133d731a3ea2205309376f66fb7537832170def243520fefec70e02b7f05043cf4fdeac520b5883fbb66dc12 - languageName: node - linkType: hard - "@types/react-toggle@npm:^4.0.3": version: 4.0.5 resolution: "@types/react-toggle@npm:4.0.5" @@ -13605,7 +13575,7 @@ __metadata: languageName: node linkType: hard -"react-overlays@npm:*, react-overlays@npm:^5.2.1": +"react-overlays@npm:^5.2.1": version: 5.2.1 resolution: "react-overlays@npm:5.2.1" dependencies: @@ -13712,7 +13682,7 @@ __metadata: languageName: node linkType: hard -"react-select@npm:*, react-select@npm:^5.7.3": +"react-select@npm:^5.7.3": version: 5.8.0 resolution: "react-select@npm:5.8.0" dependencies: @@ -13817,7 +13787,7 @@ __metadata: languageName: node linkType: hard -"react-textarea-autosize@npm:*, react-textarea-autosize@npm:^8.4.1": +"react-textarea-autosize@npm:^8.4.1": version: 8.5.3 resolution: "react-textarea-autosize@npm:8.5.3" dependencies: From 6ebb971aadee77b9b5ebc9565fca10b93d107272 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 10:59:31 +0100 Subject: [PATCH 223/954] Update dependency async-mutex to ^0.5.0 (#29552) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 338c440f87..a42767580e 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@reduxjs/toolkit": "^2.0.1", "@svgr/webpack": "^5.5.0", "arrow-key-navigation": "^1.2.0", - "async-mutex": "^0.4.0", + "async-mutex": "^0.5.0", "autoprefixer": "^10.4.14", "axios": "^1.4.0", "babel-loader": "^8.3.0", diff --git a/yarn.lock b/yarn.lock index 6a2b98c3c0..06cf1fddfb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2334,7 +2334,7 @@ __metadata: "@typescript-eslint/eslint-plugin": "npm:^7.0.0" "@typescript-eslint/parser": "npm:^7.0.0" arrow-key-navigation: "npm:^1.2.0" - async-mutex: "npm:^0.4.0" + async-mutex: "npm:^0.5.0" autoprefixer: "npm:^10.4.14" axios: "npm:^1.4.0" babel-jest: "npm:^29.5.0" @@ -4558,12 +4558,12 @@ __metadata: languageName: node linkType: hard -"async-mutex@npm:^0.4.0": - version: 0.4.1 - resolution: "async-mutex@npm:0.4.1" +"async-mutex@npm:^0.5.0": + version: 0.5.0 + resolution: "async-mutex@npm:0.5.0" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/3c412736c0bc4a9a2cfd948276a8caab8686aa615866a5bd20986e616f8945320acb310058a17afa1b31b8de6f634a78b7ec2217a33d7559b38f68bb85a95854 + checksum: 10c0/9096e6ad6b674c894d8ddd5aa4c512b09bb05931b8746ebd634952b05685608b2b0820ed5c406e6569919ff5fe237ab3c491e6f2887d6da6b6ba906db3ee9c32 languageName: node linkType: hard From 0dd1c772a867d21afc542aa807909cd4017e4816 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 10:59:45 +0100 Subject: [PATCH 224/954] Update dependency cocoon-js-vanilla to v1.5.1 (#29461) 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 06cf1fddfb..f857c5738c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5624,9 +5624,9 @@ __metadata: linkType: hard "cocoon-js-vanilla@npm:^1.3.0": - version: 1.4.0 - resolution: "cocoon-js-vanilla@npm:1.4.0" - checksum: 10c0/3a3976d325d24518317ca38536ad5f4e570c139b86082dd33c64d38c2a4b2c58fa9cc9aac4624d8fd2f4c9f0eafe681bb8872360010e6b36d9974d8abc57f520 + version: 1.5.1 + resolution: "cocoon-js-vanilla@npm:1.5.1" + checksum: 10c0/0449084ef5864fc4159aa127592995657224bfcec6b7fd6270f2f9af545fc711e7ddbeb673a7cafc9dc0985be4c20b76ba413905fcaeddc3c6f6a5397d80cdd6 languageName: node linkType: hard From 7f171622426d769128f6d35d87c2b6b3fa1d5236 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 10:00:13 +0000 Subject: [PATCH 225/954] Update dependency cssnano to v6.1.0 (#29514) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 321 +++++++++++++++++++++++++++--------------------------- 1 file changed, 161 insertions(+), 160 deletions(-) diff --git a/yarn.lock b/yarn.lock index f857c5738c..5cc5a265e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6207,63 +6207,64 @@ __metadata: languageName: node linkType: hard -"cssnano-preset-default@npm:^6.0.5": - version: 6.0.5 - resolution: "cssnano-preset-default@npm:6.0.5" +"cssnano-preset-default@npm:^6.1.0": + version: 6.1.0 + resolution: "cssnano-preset-default@npm:6.1.0" dependencies: + browserslist: "npm:^4.23.0" css-declaration-sorter: "npm:^7.1.1" - cssnano-utils: "npm:^4.0.1" + cssnano-utils: "npm:^4.0.2" postcss-calc: "npm:^9.0.1" - postcss-colormin: "npm:^6.0.3" - postcss-convert-values: "npm:^6.0.4" - postcss-discard-comments: "npm:^6.0.1" - postcss-discard-duplicates: "npm:^6.0.2" - postcss-discard-empty: "npm:^6.0.2" - postcss-discard-overridden: "npm:^6.0.1" - postcss-merge-longhand: "npm:^6.0.3" - postcss-merge-rules: "npm:^6.0.4" - postcss-minify-font-values: "npm:^6.0.2" - postcss-minify-gradients: "npm:^6.0.2" - postcss-minify-params: "npm:^6.0.3" - postcss-minify-selectors: "npm:^6.0.2" - postcss-normalize-charset: "npm:^6.0.1" - postcss-normalize-display-values: "npm:^6.0.1" - postcss-normalize-positions: "npm:^6.0.1" - postcss-normalize-repeat-style: "npm:^6.0.1" - postcss-normalize-string: "npm:^6.0.1" - postcss-normalize-timing-functions: "npm:^6.0.1" - postcss-normalize-unicode: "npm:^6.0.3" - postcss-normalize-url: "npm:^6.0.1" - postcss-normalize-whitespace: "npm:^6.0.1" - postcss-ordered-values: "npm:^6.0.1" - postcss-reduce-initial: "npm:^6.0.3" - postcss-reduce-transforms: "npm:^6.0.1" - postcss-svgo: "npm:^6.0.2" - postcss-unique-selectors: "npm:^6.0.2" + postcss-colormin: "npm:^6.1.0" + postcss-convert-values: "npm:^6.1.0" + postcss-discard-comments: "npm:^6.0.2" + postcss-discard-duplicates: "npm:^6.0.3" + postcss-discard-empty: "npm:^6.0.3" + postcss-discard-overridden: "npm:^6.0.2" + postcss-merge-longhand: "npm:^6.0.4" + postcss-merge-rules: "npm:^6.1.0" + postcss-minify-font-values: "npm:^6.0.3" + postcss-minify-gradients: "npm:^6.0.3" + postcss-minify-params: "npm:^6.1.0" + postcss-minify-selectors: "npm:^6.0.3" + postcss-normalize-charset: "npm:^6.0.2" + postcss-normalize-display-values: "npm:^6.0.2" + postcss-normalize-positions: "npm:^6.0.2" + postcss-normalize-repeat-style: "npm:^6.0.2" + postcss-normalize-string: "npm:^6.0.2" + postcss-normalize-timing-functions: "npm:^6.0.2" + postcss-normalize-unicode: "npm:^6.1.0" + postcss-normalize-url: "npm:^6.0.2" + postcss-normalize-whitespace: "npm:^6.0.2" + postcss-ordered-values: "npm:^6.0.2" + postcss-reduce-initial: "npm:^6.1.0" + postcss-reduce-transforms: "npm:^6.0.2" + postcss-svgo: "npm:^6.0.3" + postcss-unique-selectors: "npm:^6.0.3" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/b51072bf808ad7af0e7d38eb2490fc9dd27bfa95c0de804f7b5f242a283cedd6446ef55936843e4c7c9856540e225e322a794e70b47ae515b894e84b629a58ea + checksum: 10c0/47b7026b66b80a03f043929f825f48a13ed3a4086a6f335f25312c77fe73977a74cf718a486f91d9513b652e7d34312394380141c3bf6b8c8027ebc96710b6f6 languageName: node linkType: hard -"cssnano-utils@npm:^4.0.1": - version: 4.0.1 - resolution: "cssnano-utils@npm:4.0.1" +"cssnano-utils@npm:^4.0.2": + version: 4.0.2 + resolution: "cssnano-utils@npm:4.0.2" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/20513a393402f283c85c450ece43d1a6a06a9906b524481043ac203a86888a4ca5cbef878c615a58fdd82a9e870ce62c6f3fea9f51814034a084d8980e17cf96 + checksum: 10c0/260b8c8ffa48b908aa77ef129f9b8648ecd92aed405b20e7fe6b8370779dd603530344fc9d96683d53533246e48b36ac9d2aa5a476b4f81c547bbad86d187f35 languageName: node linkType: hard "cssnano@npm:^6.0.1": - version: 6.0.5 - resolution: "cssnano@npm:6.0.5" + version: 6.1.0 + resolution: "cssnano@npm:6.1.0" dependencies: - cssnano-preset-default: "npm:^6.0.5" + cssnano-preset-default: "npm:^6.1.0" lilconfig: "npm:^3.1.1" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/f802b563bf4a3a973d91e0327803536d56c4667138587d84f6341f68862d7514bceb2f1258d7bbf66b2fdedf1e9c1b7fd0b4848bb0069296ecbebbdc70f2ccca + checksum: 10c0/ffe0d8c9110cce01692f51d21ae2fe6d319f2329989d28ef0dddb67a6fba2780c525f00682f0788bdbba380f37893d27ee870b3e99fb97c1fb8edccbd68a1d92 languageName: node linkType: hard @@ -12639,9 +12640,9 @@ __metadata: languageName: node linkType: hard -"postcss-colormin@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-colormin@npm:6.0.3" +"postcss-colormin@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-colormin@npm:6.1.0" dependencies: browserslist: "npm:^4.23.0" caniuse-api: "npm:^3.0.0" @@ -12649,55 +12650,55 @@ __metadata: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/beddf9fd1bda3f456e1235829297341de34ca40f9a2e16f23930e13d9df6b6186ca3717817da0adab266bf5e8fcde7bd056ab54187f959eb53d2bfbde7f441e6 + checksum: 10c0/0802963fa0d8f2fe408b2e088117670f5303c69a58c135f0ecf0e5ceff69e95e87111b22c4e29c9adb2f69aa8d3bc175f4e8e8708eeb99c9ffc36c17064de427 languageName: node linkType: hard -"postcss-convert-values@npm:^6.0.4": - version: 6.0.4 - resolution: "postcss-convert-values@npm:6.0.4" +"postcss-convert-values@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-convert-values@npm:6.1.0" dependencies: browserslist: "npm:^4.23.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/c267ae8f2dbfc7fff5e46cd984bb6191405fe76f1eee04fd10a69fe10065ad7c3b62fa36e4bef3fa3a730284cd7295cb66968afb6cdaad0571a57cfcb25248fc + checksum: 10c0/a80066965cb58fe8fcaf79f306b32c83fc678e1f0678e43f4db3e9fee06eed6db92cf30631ad348a17492769d44757400493c91a33ee865ee8dedea9234a11f5 languageName: node linkType: hard -"postcss-discard-comments@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-discard-comments@npm:6.0.1" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/5e9128ffb8c005081bb0521f5a23cf090e8513d928ed39935504ffde2e335a62a7e1a749c5c7bc2d03f06a8667900d19dd7eed19dfa4273043b5fd760476260d - languageName: node - linkType: hard - -"postcss-discard-duplicates@npm:^6.0.2": +"postcss-discard-comments@npm:^6.0.2": version: 6.0.2 - resolution: "postcss-discard-duplicates@npm:6.0.2" + resolution: "postcss-discard-comments@npm:6.0.2" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/316b8263c3a06d3303288d99e093ed2922757222fe5ea457b70d8d3fccadf0a1a452a6cc3b8296e749e70b0a231b68a742f9e01c606baa7fe3e14327bae3094b + checksum: 10c0/338a1fcba7e2314d956e5e5b9bd1e12e6541991bf85ac72aed6e229a029bf60edb31f11576b677623576169aa7d9c75e1be259ac7b50d0b735b841b5518f9da9 languageName: node linkType: hard -"postcss-discard-empty@npm:^6.0.2": +"postcss-discard-duplicates@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-discard-duplicates@npm:6.0.3" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/24d2f00e54668f2837eb38a64b1751d7a4a73b2752f9749e61eb728f1fae837984bc2b339f7f5207aff5f66f72551253489114b59b9ba21782072677a81d7d1b + languageName: node + linkType: hard + +"postcss-discard-empty@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-discard-empty@npm:6.0.3" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/1af08bb29f18eda41edf3602b257d89a4cf0a16f79fc773cfebd4a37251f8dbd9b77ac18efe55d0677d000b43a8adf2ef9328d31961c810e9433a38494a1fa65 + languageName: node + linkType: hard + +"postcss-discard-overridden@npm:^6.0.2": version: 6.0.2 - resolution: "postcss-discard-empty@npm:6.0.2" + resolution: "postcss-discard-overridden@npm:6.0.2" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/abae41eecf93ed7b2b34bb77d319d70093e663ee4b23dc0b1e0007044bbf4315d980539bb67466a8ed24a475afdd52bd465f92433466cf3bf2057591c7124ab1 - languageName: node - linkType: hard - -"postcss-discard-overridden@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-discard-overridden@npm:6.0.1" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/22f9d56e53b90bc0f8e6d1c24d6da6c7c1a9d757644a128a7a4263a5479aaa8eca4ce3bfe9db10358051635ed40e8778a68c3f1831b7163eae10ced001db4a87 + checksum: 10c0/fda70ef3cd4cb508369c5bbbae44d7760c40ec9f2e65df1cd1b6e0314317fb1d25ae7f64987ca84e66889c1e9d1862487a6ce391c159dfe04d536597bfc5030d languageName: node linkType: hard @@ -12724,77 +12725,77 @@ __metadata: languageName: node linkType: hard -"postcss-merge-longhand@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-merge-longhand@npm:6.0.3" +"postcss-merge-longhand@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-merge-longhand@npm:6.0.4" dependencies: postcss-value-parser: "npm:^4.2.0" - stylehacks: "npm:^6.0.3" + stylehacks: "npm:^6.1.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/a71758832e198af58a3d1c5013731c8dcd646611bd6ce099a5cbcef4dc2fd7c574e2f28f80bfe67887b046abfacca94bbeb2982bef3b087e9b52bd4acd3d8a38 + checksum: 10c0/6c05cfe60d86cb0b6f40abe4649e1c0c21cf416fbf17aa15f04c315fcef4887827db5ef2593eca27b2b14127f5338ab179b147940c22315b5a9bcb0bdbbfa768 languageName: node linkType: hard -"postcss-merge-rules@npm:^6.0.4": - version: 6.0.4 - resolution: "postcss-merge-rules@npm:6.0.4" +"postcss-merge-rules@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-merge-rules@npm:6.1.0" dependencies: browserslist: "npm:^4.23.0" caniuse-api: "npm:^3.0.0" - cssnano-utils: "npm:^4.0.1" + cssnano-utils: "npm:^4.0.2" postcss-selector-parser: "npm:^6.0.15" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/57a16817c099dfc644bf2619831208bafcfd91225cccc8f6d2913241fe4a7225b3dc565bc92402902b4271771ad5d56358afd8eb7f709827a6576177e0bf9433 + checksum: 10c0/3ce76c87e29003fe46fbeba64348ed61d50d8966cfd56ec59b70b6fbf2e2ea8866b8399eec09e036fc636c84207ba12037a1dbc1374fd313a885511947699cad languageName: node linkType: hard -"postcss-minify-font-values@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-minify-font-values@npm:6.0.2" +"postcss-minify-font-values@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-minify-font-values@npm:6.0.3" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/6a9407441531efd83683d529c9632c5c4ac7d971716dffa708b3775f36382ca9a960372793c4f9df68aaae513213a53400860d9a6bd233da6f68f8fc985efe72 + checksum: 10c0/c1ae31099e3ae79169405d3d46cd49cff35c70c63d1f36f24b16fcce43999c130db396e1fde071a375bd5b4853b14058111034a8da278a3a31f9ca12e091116e languageName: node linkType: hard -"postcss-minify-gradients@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-minify-gradients@npm:6.0.2" +"postcss-minify-gradients@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-minify-gradients@npm:6.0.3" dependencies: colord: "npm:^2.9.3" - cssnano-utils: "npm:^4.0.1" + cssnano-utils: "npm:^4.0.2" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/7a72edf3fe0028010d85af77d8c6bfa6147785bc9b3758efb0d09b51a8254ce3f8bc3f67220af6f204bb175e95b9e8355baf29b9c32b1df590506bca835b02f4 + checksum: 10c0/7fcbcec94fe5455b89fe1b424a451198e60e0407c894bbacdc062d9fdef2f8571b483b5c3bb17f22d2f1249431251b2de22e1e4e8b0614d10624f8ee6e71afd2 languageName: node linkType: hard -"postcss-minify-params@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-minify-params@npm:6.0.3" +"postcss-minify-params@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-minify-params@npm:6.1.0" dependencies: browserslist: "npm:^4.23.0" - cssnano-utils: "npm:^4.0.1" + cssnano-utils: "npm:^4.0.2" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/65a8bc0f75e7dc8a292797209ec0b1adef52923daf181ad34a7e83cbc974e2192e0e35ce0f35dbcb0177828991f92da8e239564f56588482d99c04a3e0755266 + checksum: 10c0/e5c38c3e5fb42e2ca165764f983716e57d854a63a477f7389ccc94cd2ab8123707006613bd7f29acc6eafd296fff513aa6d869c98ac52590f886d641cb21a59e languageName: node linkType: hard -"postcss-minify-selectors@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-minify-selectors@npm:6.0.2" +"postcss-minify-selectors@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-minify-selectors@npm:6.0.3" dependencies: postcss-selector-parser: "npm:^6.0.15" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/5437b586c1237fc442e7e6078d4f23c987efc456366368b07a0da67332b04bd55821cedf0441e73e1209689f63139e272d930508e2963ba6e27c46561a661128 + checksum: 10c0/6abc83edf3fd746979ef709182fd613a764c5c2f68ae20aaa1b38940153a1078c0b270d657fe3bcfe6cda44b61f5af762fe9b31b8b62f63b897bfc2d2bc02b88 languageName: node linkType: hard @@ -12842,136 +12843,136 @@ __metadata: languageName: node linkType: hard -"postcss-normalize-charset@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-normalize-charset@npm:6.0.1" +"postcss-normalize-charset@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-charset@npm:6.0.2" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/8c09eedaf8813123875c65ab35120f14a87d6b9e8d6805fa808e3a714a8f868d15123f34f61e2240d89225f2f5c2bdabbcdf6385ce86b2487370d8994a65a857 + checksum: 10c0/af32a3b4cf94163d728b8aa935b2494c9f69fbc96a33b35f67ae15dbdef7fcc8732569df97cbaaf20ca6c0103c39adad0cfce2ba07ffed283796787f6c36f410 languageName: node linkType: hard -"postcss-normalize-display-values@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-normalize-display-values@npm:6.0.1" +"postcss-normalize-display-values@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-display-values@npm:6.0.2" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/d08a92c653fb4f2506e029ceb8e3fdae9bc937fb1a7e80ecde759d02f6d15f69211af384d89d8582b160fd129abd9c77c8c64d75379417098ee5a2ba779e33d3 + checksum: 10c0/782761850c7e697fdb6c3ff53076de716a71b60f9e835efb2f7ef238de347c88b5d55f0d43cf5c608e1ee58de65360e3d9fccd5f20774bba08ded7c87d8a5651 languageName: node linkType: hard -"postcss-normalize-positions@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-normalize-positions@npm:6.0.1" +"postcss-normalize-positions@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-positions@npm:6.0.2" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/bb0267b13c92791543f5e9f94b119a0540e08aa46f600acd73a692cd38d07d2d2fddb11148a81adb58e3f65671eebb05ea38d2ded48f3202b2582f1199aa848e + checksum: 10c0/9fdd42a47226bbda5f68774f3c4c3a90eb4fa708aef5a997c6a52fe6cac06585c9774038fe3bc1aa86a203c29223b8d8db6ebe7580c1aa293154f2b48db0b038 languageName: node linkType: hard -"postcss-normalize-repeat-style@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-normalize-repeat-style@npm:6.0.1" +"postcss-normalize-repeat-style@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-repeat-style@npm:6.0.2" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/f6e943dbbf9341dd6ce2c9fc6820e8ae2a838d1db84f58f75b1e5c1b8b9d6895d17fb30b320e2189b8747f844713ec687540b5b1d52ccd6c9108d6d35328c659 + checksum: 10c0/9133ccbdf1286920c1cd0d01c1c5fa0bd3251b717f2f3e47d691dcc44978ac1dc419d20d9ae5428bd48ee542059e66b823ba699356f5968ccced5606c7c7ca34 languageName: node linkType: hard -"postcss-normalize-string@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-normalize-string@npm:6.0.1" +"postcss-normalize-string@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-string@npm:6.0.2" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/afcdd69522fc3ebafc349c2ef4b62f1e734ade9b6148fd20f2b841477808ac6cf6e5bfbb533c492fdc6bb2184b84be8ebb800a6ae174c4313f87fb0695088cc0 + checksum: 10c0/fecc2d52c4029b24fecf2ca2fb45df5dbdf9f35012194ad4ea80bc7be3252cdcb21a0976400902320595aa6178f2cc625cc804c6b6740aef6efa42105973a205 languageName: node linkType: hard -"postcss-normalize-timing-functions@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-normalize-timing-functions@npm:6.0.1" +"postcss-normalize-timing-functions@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-timing-functions@npm:6.0.2" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/c1c81d0dcb2f74fbd69cc45b0b6bd6cde390a0c9df602aabbf3eb2149a49da48e808837e811d22a525ffb036e158e63b4b2cf12c94cf28f2c2f6af858876134e + checksum: 10c0/a22af0b3374704e59ae70bbbcc66b7029137e284f04e30a2ad548818d1540d6c1ed748dd8f689b9b6df5c1064085a00ad07b6f7e25ffaad49d4e661b616cdeae languageName: node linkType: hard -"postcss-normalize-unicode@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-normalize-unicode@npm:6.0.3" +"postcss-normalize-unicode@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-normalize-unicode@npm:6.1.0" dependencies: browserslist: "npm:^4.23.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/9a79ff4fcdfc876e12fa595271f2fca655a5022fd63a202387fa9be1f6705a6e34395d555de8878ffed8b0305281ff452e26045bdc710e161f4103380b1d05d8 + checksum: 10c0/ff5746670d94dd97b49a0955c3c71ff516fb4f54bbae257f877d179bacc44a62e50a0fd6e7ddf959f2ca35c335de4266b0c275d880bb57ad7827189339ab1582 languageName: node linkType: hard -"postcss-normalize-url@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-normalize-url@npm:6.0.1" +"postcss-normalize-url@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-url@npm:6.0.2" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/4e3e713a95e01f263feccd041b2b10016a0a09e494c81567f012d1326d9b2d57dc4a68956a820313630370c0ef591bdbb37cc96ed259022559623be179aad436 + checksum: 10c0/4718f1c0657788d2c560b340ee8e0a4eb3eb053eba6fbbf489e9a6e739b4c5f9ce1957f54bd03497c50a1f39962bf6ab9ff6ba4976b69dd160f6afd1670d69b7 languageName: node linkType: hard -"postcss-normalize-whitespace@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-normalize-whitespace@npm:6.0.1" +"postcss-normalize-whitespace@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-whitespace@npm:6.0.2" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/259c0b7653f033ed14303602a30e458c37dc63ee55f47226b6379a6ea553ca7c9b971d49715b8f3f36a3a06927f6f87d7997c027ad4664af3bca37a5fe30352e + checksum: 10c0/d5275a88e29a894aeb83a2a833e816d2456dbf3f39961628df596ce205dcc4895186a023812ff691945e0804241ccc53e520d16591b5812288474b474bbaf652 languageName: node linkType: hard -"postcss-ordered-values@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-ordered-values@npm:6.0.1" +"postcss-ordered-values@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-ordered-values@npm:6.0.2" dependencies: - cssnano-utils: "npm:^4.0.1" + cssnano-utils: "npm:^4.0.2" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/2e71f035c90b26d7a8d31e1b716f977532367f75bc76de3318b6ba7b2e1ec43c011cc09e741f59f7d93dff427b7d90a35db0b460d2f171a6f0c6e8c938ef30ad + checksum: 10c0/aece23a289228aa804217a85f8da198d22b9123f02ca1310b81834af380d6fbe115e4300683599b4a2ab7f1c6a1dbd6789724c47c38e2b0a3774f2ea4b4f0963 languageName: node linkType: hard -"postcss-reduce-initial@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-reduce-initial@npm:6.0.3" +"postcss-reduce-initial@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-reduce-initial@npm:6.1.0" dependencies: browserslist: "npm:^4.23.0" caniuse-api: "npm:^3.0.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/824813d56f1f0d502b35781de5dd3caa5af71c9652710c95266ef8602a36cd9ea757033fb7206562d0a03e21f7a4198c09538dbf8c7548d014631a64bdcbb406 + checksum: 10c0/a8f28cf51ce9a1b9423cce1a01c1d7cbee90125930ec36435a0073e73aef402d90affe2fd3600c964b679cf738869fda447b95a9acce74414e9d67d5c6ba8646 languageName: node linkType: hard -"postcss-reduce-transforms@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-reduce-transforms@npm:6.0.1" +"postcss-reduce-transforms@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-reduce-transforms@npm:6.0.2" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/de7631302311071d86622166539162e69df506785e3674afab0602c86ed9aa67799e44405b40327f0011d58089d2dc4e2ae481b21812177818e28f9272d350a5 + checksum: 10c0/755ef27b3d083f586ac831f0c611a66e76f504d27e2100dc7674f6b86afad597901b4520cb889fe58ca70e852aa7fd0c0acb69a63d39dfe6a95860b472394e7c languageName: node linkType: hard @@ -13010,26 +13011,26 @@ __metadata: languageName: node linkType: hard -"postcss-svgo@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-svgo@npm:6.0.2" +"postcss-svgo@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-svgo@npm:6.0.3" dependencies: postcss-value-parser: "npm:^4.2.0" svgo: "npm:^3.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/db607404d09af256c7957a0ace822d651a00a52a1796da603f93ba3f0a095ac7595e1f624b9dc53f362ab10e382845d7873f485980f9c92fcb86256833f5e835 + checksum: 10c0/994b15a88cbb411f32cfa98957faa5623c76f2d75fede51f5f47238f06b367ebe59c204fecbdaf21ccb9e727239a4b290087e04c502392658a0c881ddfbd61f2 languageName: node linkType: hard -"postcss-unique-selectors@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-unique-selectors@npm:6.0.2" +"postcss-unique-selectors@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-unique-selectors@npm:6.0.3" dependencies: postcss-selector-parser: "npm:^6.0.15" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/a0fe112d1094f90e1bfcfd2174a74b2fd0630a24449e9942923d02956c7d64ea4add5adede53d9efb3f6d40cd388ac150d032a115f6a46b73d5f3d3d26fa1bb7 + checksum: 10c0/884c5da4c3bfdacf6a61bb3bd23d212e61d2b3e99ba5099d4d646d18970d2c72d8f6bd8f2ab244ee68d7214e576dc3fd9004fc946ff872e745a965da29f7b18b languageName: node linkType: hard @@ -15530,15 +15531,15 @@ __metadata: languageName: node linkType: hard -"stylehacks@npm:^6.0.3": - version: 6.0.3 - resolution: "stylehacks@npm:6.0.3" +"stylehacks@npm:^6.1.0": + version: 6.1.0 + resolution: "stylehacks@npm:6.1.0" dependencies: browserslist: "npm:^4.23.0" postcss-selector-parser: "npm:^6.0.15" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/780c147a695d77794f60e993824f3c67f1cde04905163e5a1b50ba8a1715ddda789cfdf86d46711713afe4a38252d5e3f6d79b103dc29d3b6f3749c24749de1d + checksum: 10c0/0e9624d2b12d00d5593e3ef9ef8ed1f4c2029087b4862567cfab9ea3d3fc21efeb9aa00251c13defdfff4481abff8d6e0c48e3e27fac967c959acc7dcb0d5b67 languageName: node linkType: hard From 58ce0002cdb340529dae81e0e0c61c629a05d9b3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 10:00:29 +0000 Subject: [PATCH 226/954] Update dependency typescript to v5.4.2 (#29632) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5cc5a265e0..dd80cc8430 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16263,22 +16263,22 @@ __metadata: linkType: hard "typescript@npm:5, typescript@npm:^5.0.4": - version: 5.3.3 - resolution: "typescript@npm:5.3.3" + version: 5.4.2 + resolution: "typescript@npm:5.4.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/e33cef99d82573624fc0f854a2980322714986bc35b9cb4d1ce736ed182aeab78e2cb32b385efa493b2a976ef52c53e20d6c6918312353a91850e2b76f1ea44f + checksum: 10c0/583ff68cafb0c076695f72d61df6feee71689568179fb0d3a4834dac343df6b6ed7cf7b6f6c801fa52d43cd1d324e2f2d8ae4497b09f9e6cfe3d80a6d6c9ca52 languageName: node linkType: hard "typescript@patch:typescript@npm%3A5#optional!builtin, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin": - version: 5.3.3 - resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" + version: 5.4.2 + resolution: "typescript@patch:typescript@npm%3A5.4.2#optional!builtin::version=5.4.2&hash=5adc0c" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/1d0a5f4ce496c42caa9a30e659c467c5686eae15d54b027ee7866744952547f1be1262f2d40de911618c242b510029d51d43ff605dba8fb740ec85ca2d3f9500 + checksum: 10c0/fcf6658073d07283910d9a0e04b1d5d0ebc822c04dbb7abdd74c3151c7aa92fcddbac7d799404e358197222006ccdc4c0db219d223d2ee4ccd9e2b01333b49be languageName: node linkType: hard From b5115850bb22a3676456732b61408fba07bb4b64 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 18 Mar 2024 06:11:53 -0400 Subject: [PATCH 227/954] Move repeated `insert_pagination_headers` method to api base class (#29606) --- app/controllers/api/base_controller.rb | 4 ++++ .../api/v1/accounts/follower_accounts_controller.rb | 4 ---- .../api/v1/accounts/following_accounts_controller.rb | 4 ---- app/controllers/api/v1/accounts/statuses_controller.rb | 4 ---- app/controllers/api/v1/admin/accounts_controller.rb | 4 ---- .../api/v1/admin/canonical_email_blocks_controller.rb | 4 ---- app/controllers/api/v1/admin/domain_allows_controller.rb | 4 ---- app/controllers/api/v1/admin/domain_blocks_controller.rb | 4 ---- .../api/v1/admin/email_domain_blocks_controller.rb | 4 ---- app/controllers/api/v1/admin/ip_blocks_controller.rb | 4 ---- app/controllers/api/v1/admin/reports_controller.rb | 4 ---- app/controllers/api/v1/admin/tags_controller.rb | 4 ---- .../admin/trends/links/preview_card_providers_controller.rb | 4 ---- app/controllers/api/v1/blocks_controller.rb | 4 ---- app/controllers/api/v1/bookmarks_controller.rb | 4 ---- app/controllers/api/v1/conversations_controller.rb | 4 ---- .../api/v1/crypto/encrypted_messages_controller.rb | 4 ---- app/controllers/api/v1/domain_blocks_controller.rb | 4 ---- app/controllers/api/v1/endorsements_controller.rb | 4 ---- app/controllers/api/v1/favourites_controller.rb | 4 ---- app/controllers/api/v1/follow_requests_controller.rb | 4 ---- app/controllers/api/v1/followed_tags_controller.rb | 4 ---- app/controllers/api/v1/lists/accounts_controller.rb | 4 ---- app/controllers/api/v1/mutes_controller.rb | 4 ---- app/controllers/api/v1/notifications/requests_controller.rb | 4 ---- app/controllers/api/v1/notifications_controller.rb | 4 ---- app/controllers/api/v1/scheduled_statuses_controller.rb | 4 ---- .../api/v1/statuses/favourited_by_accounts_controller.rb | 4 ---- .../api/v1/statuses/reblogged_by_accounts_controller.rb | 4 ---- app/controllers/api/v1/timelines/base_controller.rb | 4 ---- app/controllers/api/v1/trends/links_controller.rb | 4 ---- app/controllers/api/v1/trends/statuses_controller.rb | 4 ---- app/controllers/api/v1/trends/tags_controller.rb | 4 ---- 33 files changed, 4 insertions(+), 128 deletions(-) diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index bf7deac5cf..f87d596ce3 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -104,6 +104,10 @@ class Api::BaseController < ApplicationController private + def insert_pagination_headers + set_pagination_headers(next_path, prev_path) + end + def pagination_options_invalid? params.slice(:limit, :offset).values.map(&:to_i).any?(&:negative?) end diff --git a/app/controllers/api/v1/accounts/follower_accounts_controller.rb b/app/controllers/api/v1/accounts/follower_accounts_controller.rb index f60181f1eb..449866fa55 100644 --- a/app/controllers/api/v1/accounts/follower_accounts_controller.rb +++ b/app/controllers/api/v1/accounts/follower_accounts_controller.rb @@ -41,10 +41,6 @@ class Api::V1::Accounts::FollowerAccountsController < Api::BaseController ) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_account_followers_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/accounts/following_accounts_controller.rb b/app/controllers/api/v1/accounts/following_accounts_controller.rb index 3ab8c1efd6..c4f4313f8f 100644 --- a/app/controllers/api/v1/accounts/following_accounts_controller.rb +++ b/app/controllers/api/v1/accounts/following_accounts_controller.rb @@ -41,10 +41,6 @@ class Api::V1::Accounts::FollowingAccountsController < Api::BaseController ) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_account_following_index_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb index 56d4e69091..35ea9c8ec1 100644 --- a/app/controllers/api/v1/accounts/statuses_controller.rb +++ b/app/controllers/api/v1/accounts/statuses_controller.rb @@ -35,10 +35,6 @@ class Api::V1::Accounts::StatusesController < Api::BaseController params.slice(:limit, *AccountStatusesFilter::KEYS).permit(:limit, *AccountStatusesFilter::KEYS).merge(core_params) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_account_statuses_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/admin/accounts_controller.rb b/app/controllers/api/v1/admin/accounts_controller.rb index 06cebffcb6..ff6f41e01d 100644 --- a/app/controllers/api/v1/admin/accounts_controller.rb +++ b/app/controllers/api/v1/admin/accounts_controller.rb @@ -125,10 +125,6 @@ class Api::V1::Admin::AccountsController < Api::BaseController translated_params end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_admin_accounts_url(pagination_params(max_id: pagination_max_id)) if records_continue? end diff --git a/app/controllers/api/v1/admin/canonical_email_blocks_controller.rb b/app/controllers/api/v1/admin/canonical_email_blocks_controller.rb index f81e480bd7..701f668de6 100644 --- a/app/controllers/api/v1/admin/canonical_email_blocks_controller.rb +++ b/app/controllers/api/v1/admin/canonical_email_blocks_controller.rb @@ -65,10 +65,6 @@ class Api::V1::Admin::CanonicalEmailBlocksController < Api::BaseController @canonical_email_block = CanonicalEmailBlock.find(params[:id]) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_admin_canonical_email_blocks_url(pagination_params(max_id: pagination_max_id)) if records_continue? end diff --git a/app/controllers/api/v1/admin/domain_allows_controller.rb b/app/controllers/api/v1/admin/domain_allows_controller.rb index 1841292843..a7ae84e306 100644 --- a/app/controllers/api/v1/admin/domain_allows_controller.rb +++ b/app/controllers/api/v1/admin/domain_allows_controller.rb @@ -61,10 +61,6 @@ class Api::V1::Admin::DomainAllowsController < Api::BaseController DomainAllow.all end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_admin_domain_allows_url(pagination_params(max_id: pagination_max_id)) if records_continue? end diff --git a/app/controllers/api/v1/admin/domain_blocks_controller.rb b/app/controllers/api/v1/admin/domain_blocks_controller.rb index 8cd90b7c52..b589d277d5 100644 --- a/app/controllers/api/v1/admin/domain_blocks_controller.rb +++ b/app/controllers/api/v1/admin/domain_blocks_controller.rb @@ -72,10 +72,6 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController params.permit(:severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_admin_domain_blocks_url(pagination_params(max_id: pagination_max_id)) if records_continue? end diff --git a/app/controllers/api/v1/admin/email_domain_blocks_controller.rb b/app/controllers/api/v1/admin/email_domain_blocks_controller.rb index 34489e19b4..bdedb9d040 100644 --- a/app/controllers/api/v1/admin/email_domain_blocks_controller.rb +++ b/app/controllers/api/v1/admin/email_domain_blocks_controller.rb @@ -58,10 +58,6 @@ class Api::V1::Admin::EmailDomainBlocksController < Api::BaseController params.permit(:domain, :allow_with_approval) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_admin_email_domain_blocks_url(pagination_params(max_id: pagination_max_id)) if records_continue? end diff --git a/app/controllers/api/v1/admin/ip_blocks_controller.rb b/app/controllers/api/v1/admin/ip_blocks_controller.rb index 0f666476c5..3625781149 100644 --- a/app/controllers/api/v1/admin/ip_blocks_controller.rb +++ b/app/controllers/api/v1/admin/ip_blocks_controller.rb @@ -63,10 +63,6 @@ class Api::V1::Admin::IpBlocksController < Api::BaseController params.permit(:ip, :severity, :comment, :expires_in) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_admin_ip_blocks_url(pagination_params(max_id: pagination_max_id)) if records_continue? end diff --git a/app/controllers/api/v1/admin/reports_controller.rb b/app/controllers/api/v1/admin/reports_controller.rb index f0598aa81e..9b5beeab67 100644 --- a/app/controllers/api/v1/admin/reports_controller.rb +++ b/app/controllers/api/v1/admin/reports_controller.rb @@ -89,10 +89,6 @@ class Api::V1::Admin::ReportsController < Api::BaseController params.permit(*FILTER_PARAMS) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_admin_reports_url(pagination_params(max_id: pagination_max_id)) if records_continue? end diff --git a/app/controllers/api/v1/admin/tags_controller.rb b/app/controllers/api/v1/admin/tags_controller.rb index 989e7e610a..c754980720 100644 --- a/app/controllers/api/v1/admin/tags_controller.rb +++ b/app/controllers/api/v1/admin/tags_controller.rb @@ -44,10 +44,6 @@ class Api::V1::Admin::TagsController < Api::BaseController params.permit(:display_name, :trendable, :usable, :listable) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_admin_tags_url(pagination_params(max_id: pagination_max_id)) if records_continue? end diff --git a/app/controllers/api/v1/admin/trends/links/preview_card_providers_controller.rb b/app/controllers/api/v1/admin/trends/links/preview_card_providers_controller.rb index 7ab7e6bd04..8bb5e22716 100644 --- a/app/controllers/api/v1/admin/trends/links/preview_card_providers_controller.rb +++ b/app/controllers/api/v1/admin/trends/links/preview_card_providers_controller.rb @@ -42,10 +42,6 @@ class Api::V1::Admin::Trends::Links::PreviewCardProvidersController < Api::BaseC @providers = PreviewCardProvider.all.to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_admin_trends_links_preview_card_providers_url(pagination_params(max_id: pagination_max_id)) if records_continue? end diff --git a/app/controllers/api/v1/blocks_controller.rb b/app/controllers/api/v1/blocks_controller.rb index 7826a3c681..234ab2e82c 100644 --- a/app/controllers/api/v1/blocks_controller.rb +++ b/app/controllers/api/v1/blocks_controller.rb @@ -28,10 +28,6 @@ class Api::V1::BlocksController < Api::BaseController ) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_blocks_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/bookmarks_controller.rb b/app/controllers/api/v1/bookmarks_controller.rb index 08d3cf8344..b6bb987b6b 100644 --- a/app/controllers/api/v1/bookmarks_controller.rb +++ b/app/controllers/api/v1/bookmarks_controller.rb @@ -31,10 +31,6 @@ class Api::V1::BookmarksController < Api::BaseController current_account.bookmarks end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_bookmarks_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/conversations_controller.rb b/app/controllers/api/v1/conversations_controller.rb index 6a3567e624..a95c816e1c 100644 --- a/app/controllers/api/v1/conversations_controller.rb +++ b/app/controllers/api/v1/conversations_controller.rb @@ -53,10 +53,6 @@ class Api::V1::ConversationsController < Api::BaseController .to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_conversations_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/crypto/encrypted_messages_controller.rb b/app/controllers/api/v1/crypto/encrypted_messages_controller.rb index c70ae46d18..d3de220393 100644 --- a/app/controllers/api/v1/crypto/encrypted_messages_controller.rb +++ b/app/controllers/api/v1/crypto/encrypted_messages_controller.rb @@ -29,10 +29,6 @@ class Api::V1::Crypto::EncryptedMessagesController < Api::BaseController @encrypted_messages = @current_device.encrypted_messages.to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_crypto_encrypted_messages_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/domain_blocks_controller.rb b/app/controllers/api/v1/domain_blocks_controller.rb index 5774c4d1c7..3dee2d176c 100644 --- a/app/controllers/api/v1/domain_blocks_controller.rb +++ b/app/controllers/api/v1/domain_blocks_controller.rb @@ -38,10 +38,6 @@ class Api::V1::DomainBlocksController < Api::BaseController current_account.domain_blocks end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_domain_blocks_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/endorsements_controller.rb b/app/controllers/api/v1/endorsements_controller.rb index 449a9ac245..9a723d89e4 100644 --- a/app/controllers/api/v1/endorsements_controller.rb +++ b/app/controllers/api/v1/endorsements_controller.rb @@ -28,10 +28,6 @@ class Api::V1::EndorsementsController < Api::BaseController current_account.endorsed_accounts.includes(:account_stat, :user).without_suspended end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path return if unlimited? diff --git a/app/controllers/api/v1/favourites_controller.rb b/app/controllers/api/v1/favourites_controller.rb index 85e46b1166..73da538f5c 100644 --- a/app/controllers/api/v1/favourites_controller.rb +++ b/app/controllers/api/v1/favourites_controller.rb @@ -31,10 +31,6 @@ class Api::V1::FavouritesController < Api::BaseController current_account.favourites end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_favourites_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/follow_requests_controller.rb b/app/controllers/api/v1/follow_requests_controller.rb index 87f6df5f94..7ffd7614bb 100644 --- a/app/controllers/api/v1/follow_requests_controller.rb +++ b/app/controllers/api/v1/follow_requests_controller.rb @@ -48,10 +48,6 @@ class Api::V1::FollowRequestsController < Api::BaseController ) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_follow_requests_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/followed_tags_controller.rb b/app/controllers/api/v1/followed_tags_controller.rb index 0ea4a95ef5..8888612b16 100644 --- a/app/controllers/api/v1/followed_tags_controller.rb +++ b/app/controllers/api/v1/followed_tags_controller.rb @@ -22,10 +22,6 @@ class Api::V1::FollowedTagsController < Api::BaseController ) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_followed_tags_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/lists/accounts_controller.rb b/app/controllers/api/v1/lists/accounts_controller.rb index 5ae74bf04d..aecf391049 100644 --- a/app/controllers/api/v1/lists/accounts_controller.rb +++ b/app/controllers/api/v1/lists/accounts_controller.rb @@ -55,10 +55,6 @@ class Api::V1::Lists::AccountsController < Api::BaseController params.permit(account_ids: []) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path return if unlimited? diff --git a/app/controllers/api/v1/mutes_controller.rb b/app/controllers/api/v1/mutes_controller.rb index 9542d96110..dbfd7e103a 100644 --- a/app/controllers/api/v1/mutes_controller.rb +++ b/app/controllers/api/v1/mutes_controller.rb @@ -28,10 +28,6 @@ class Api::V1::MutesController < Api::BaseController ) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_mutes_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/notifications/requests_controller.rb b/app/controllers/api/v1/notifications/requests_controller.rb index 35f5d58a81..6a26cc0e8a 100644 --- a/app/controllers/api/v1/notifications/requests_controller.rb +++ b/app/controllers/api/v1/notifications/requests_controller.rb @@ -53,10 +53,6 @@ class Api::V1::Notifications::RequestsController < Api::BaseController @request = NotificationRequest.where(account: current_account).find(params[:id]) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_notifications_requests_url pagination_params(max_id: pagination_max_id) unless @requests.empty? end diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb index 777740751f..c41a0bb05d 100644 --- a/app/controllers/api/v1/notifications_controller.rb +++ b/app/controllers/api/v1/notifications_controller.rb @@ -58,10 +58,6 @@ class Api::V1::NotificationsController < Api::BaseController @notifications.reject { |notification| notification.target_status.nil? }.map(&:target_status) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_notifications_url pagination_params(max_id: pagination_max_id) unless @notifications.empty? end diff --git a/app/controllers/api/v1/scheduled_statuses_controller.rb b/app/controllers/api/v1/scheduled_statuses_controller.rb index f6c0703833..1217ed014e 100644 --- a/app/controllers/api/v1/scheduled_statuses_controller.rb +++ b/app/controllers/api/v1/scheduled_statuses_controller.rb @@ -47,10 +47,6 @@ class Api::V1::ScheduledStatusesController < Api::BaseController params.slice(:limit).permit(:limit).merge(core_params) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_scheduled_statuses_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb b/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb index 069ad37cb2..bbc8082e0c 100644 --- a/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb +++ b/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb @@ -34,10 +34,6 @@ class Api::V1::Statuses::FavouritedByAccountsController < Api::V1::Statuses::Bas ) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_status_favourited_by_index_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb b/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb index b8a997518d..eaa5ef7255 100644 --- a/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb +++ b/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb @@ -30,10 +30,6 @@ class Api::V1::Statuses::RebloggedByAccountsController < Api::V1::Statuses::Base ) end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def next_path api_v1_status_reblogged_by_index_url pagination_params(max_id: pagination_max_id) if records_continue? end diff --git a/app/controllers/api/v1/timelines/base_controller.rb b/app/controllers/api/v1/timelines/base_controller.rb index 7735cf1dc0..e79eba79ee 100644 --- a/app/controllers/api/v1/timelines/base_controller.rb +++ b/app/controllers/api/v1/timelines/base_controller.rb @@ -5,10 +5,6 @@ class Api::V1::Timelines::BaseController < Api::BaseController private - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def pagination_collection @statuses end diff --git a/app/controllers/api/v1/trends/links_controller.rb b/app/controllers/api/v1/trends/links_controller.rb index 57cfa0b7e4..8edf5bbcef 100644 --- a/app/controllers/api/v1/trends/links_controller.rb +++ b/app/controllers/api/v1/trends/links_controller.rb @@ -34,10 +34,6 @@ class Api::V1::Trends::LinksController < Api::BaseController scope end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def pagination_params(core_params) params.slice(:limit).permit(:limit).merge(core_params) end diff --git a/app/controllers/api/v1/trends/statuses_controller.rb b/app/controllers/api/v1/trends/statuses_controller.rb index c186864c3b..48bfe11991 100644 --- a/app/controllers/api/v1/trends/statuses_controller.rb +++ b/app/controllers/api/v1/trends/statuses_controller.rb @@ -32,10 +32,6 @@ class Api::V1::Trends::StatusesController < Api::BaseController scope end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def pagination_params(core_params) params.slice(:limit).permit(:limit).merge(core_params) end diff --git a/app/controllers/api/v1/trends/tags_controller.rb b/app/controllers/api/v1/trends/tags_controller.rb index aca3dd7089..6d3855a90a 100644 --- a/app/controllers/api/v1/trends/tags_controller.rb +++ b/app/controllers/api/v1/trends/tags_controller.rb @@ -30,10 +30,6 @@ class Api::V1::Trends::TagsController < Api::BaseController Trends.tags.query.allowed end - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - def pagination_params(core_params) params.slice(:limit).permit(:limit).merge(core_params) end From d5063072c3d7a882456f09cb70e664a2aeec7d81 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 18 Mar 2024 13:57:21 +0100 Subject: [PATCH 228/954] Revert friends-of-friends follow recommendation query to using a CTE (#29619) --- .../friends_of_friends_source.rb | 37 +++++++++++++++---- .../friends_of_friends_source_spec.rb | 12 +++--- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/app/models/account_suggestions/friends_of_friends_source.rb b/app/models/account_suggestions/friends_of_friends_source.rb index b4f549bf31..825b24f419 100644 --- a/app/models/account_suggestions/friends_of_friends_source.rb +++ b/app/models/account_suggestions/friends_of_friends_source.rb @@ -7,14 +7,35 @@ class AccountSuggestions::FriendsOfFriendsSource < AccountSuggestions::Source end def source_query(account, limit: DEFAULT_LIMIT) - first_degree = account.following.where.not(hide_collections: true).select(:id).reorder(nil) - base_account_scope(account) - .joins(:account_stat) - .joins(:passive_relationships).where(passive_relationships: { account_id: first_degree }) - .group('accounts.id, account_stats.id') - .reorder(frequency: :desc, followers_count: :desc) - .limit(limit) - .pluck(Arel.sql('accounts.id, COUNT(*) AS frequency, followers_count')) + Account.find_by_sql([<<~SQL.squish, { id: account.id, limit: limit }]).map { |row| [row.id, row.frequency, row.followers_count] } + WITH first_degree AS ( + SELECT target_account_id + FROM follows + JOIN accounts AS target_accounts ON follows.target_account_id = target_accounts.id + WHERE account_id = :id + AND NOT target_accounts.hide_collections + ) + SELECT accounts.id, COUNT(*) AS frequency, account_stats.followers_count as followers_count + FROM accounts + JOIN follows ON follows.target_account_id = accounts.id + JOIN account_stats ON account_stats.account_id = accounts.id + LEFT OUTER JOIN follow_recommendation_mutes ON follow_recommendation_mutes.target_account_id = accounts.id AND follow_recommendation_mutes.account_id = :id + WHERE follows.account_id IN (SELECT * FROM first_degree) + AND NOT EXISTS (SELECT 1 FROM blocks b WHERE b.target_account_id = follows.target_account_id AND b.account_id = :id) + AND NOT EXISTS (SELECT 1 FROM blocks b WHERE b.target_account_id = :id AND b.account_id = follows.target_account_id) + AND NOT EXISTS (SELECT 1 FROM mutes m WHERE m.target_account_id = follows.target_account_id AND m.account_id = :id) + AND (accounts.domain IS NULL OR NOT EXISTS (SELECT 1 FROM account_domain_blocks b WHERE b.account_id = :id AND b.domain = accounts.domain)) + AND NOT EXISTS (SELECT 1 FROM follows f WHERE f.target_account_id = follows.target_account_id AND f.account_id = :id) + AND follows.target_account_id <> :id + AND accounts.discoverable + AND accounts.suspended_at IS NULL + AND accounts.silenced_at IS NULL + AND accounts.moved_to_account_id IS NULL + AND follow_recommendation_mutes.target_account_id IS NULL + GROUP BY accounts.id, account_stats.id + ORDER BY frequency DESC, account_stats.followers_count ASC + LIMIT :limit + SQL end private diff --git a/spec/models/account_suggestions/friends_of_friends_source_spec.rb b/spec/models/account_suggestions/friends_of_friends_source_spec.rb index d7915985f8..c2f8d0f86c 100644 --- a/spec/models/account_suggestions/friends_of_friends_source_spec.rb +++ b/spec/models/account_suggestions/friends_of_friends_source_spec.rb @@ -76,19 +76,19 @@ RSpec.describe AccountSuggestions::FriendsOfFriendsSource do it 'contains correct underlying source data' do expect(source_query_values) .to contain_exactly( - [eugen.id, 2, 3], # Followed by 2 friends of bob (eve, mallory), 3 followers total (breaks tie) - [john.id, 2, 2], # Followed by 2 friends of bob (eve, mallory), 2 followers total - [neil.id, 1, 2], # Followed by 1 friends of bob (mallory), 2 followers total (breaks tie) - [jerk.id, 1, 1] # Followed by 1 friends of bob (eve), 1 followers total + [john.id, 2, 2], # Followed by 2 friends of bob (eve, mallory), 2 followers total (breaks tie) + [eugen.id, 2, 3], # Followed by 2 friends of bob (eve, mallory), 3 followers total + [jerk.id, 1, 1], # Followed by 1 friends of bob (eve), 1 followers total (breaks tie) + [neil.id, 1, 2] # Followed by 1 friends of bob (mallory), 2 followers total ) end def expected_results [ - [eugen.id, :friends_of_friends], [john.id, :friends_of_friends], - [neil.id, :friends_of_friends], + [eugen.id, :friends_of_friends], [jerk.id, :friends_of_friends], + [neil.id, :friends_of_friends], ] end From 6d2986017e908b0f4fb88baca0902203e5beb177 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 18 Mar 2024 09:24:59 -0400 Subject: [PATCH 229/954] Remove unused `active_nav_class` helper method (#29617) --- app/helpers/application_helper.rb | 4 ---- spec/helpers/application_helper_spec.rb | 24 ------------------------ 2 files changed, 28 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 18c9663275..7dc7d60808 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -28,10 +28,6 @@ module ApplicationHelper number_to_human(number, **options) end - def active_nav_class(*paths) - paths.any? { |path| current_page?(path) } ? 'active' : '' - end - def open_registrations? Setting.registrations_mode == 'open' end diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 6fc6b3c087..9330eb0dae 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -3,30 +3,6 @@ require 'rails_helper' describe ApplicationHelper do - describe 'active_nav_class' do - it 'returns active when on the current page' do - allow(helper).to receive(:current_page?).and_return(true) - - result = helper.active_nav_class('/test') - expect(result).to eq 'active' - end - - it 'returns active when on a current page' do - allow(helper).to receive(:current_page?).with('/foo').and_return(false) - allow(helper).to receive(:current_page?).with('/test').and_return(true) - - result = helper.active_nav_class('/foo', '/test') - expect(result).to eq 'active' - end - - it 'returns empty string when not on current page' do - allow(helper).to receive(:current_page?).and_return(false) - - result = helper.active_nav_class('/test') - expect(result).to eq '' - end - end - describe 'body_classes' do context 'with a body class string from a controller' do before { helper.extend controller_helpers } From 4ce714adea8636f477f3f77aabf525a75c262358 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 15:09:18 +0100 Subject: [PATCH 230/954] Update dependency irb to v1.12.0 (#29519) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index e3239f3411..9de472091c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -351,7 +351,7 @@ GEM terminal-table (>= 1.5.1) idn-ruby (0.1.5) io-console (0.7.2) - irb (1.11.2) + irb (1.12.0) rdoc reline (>= 0.4.2) jmespath (1.6.2) @@ -607,7 +607,7 @@ GEM redlock (1.3.2) redis (>= 3.0.0, < 6.0) regexp_parser (2.9.0) - reline (0.4.2) + reline (0.4.3) io-console (~> 0.5) request_store (1.5.1) rack (>= 1.4) From 39839baec378eb2b9bcd709fd8d7784e81e1674a Mon Sep 17 00:00:00 2001 From: Jeong Arm Date: Tue, 19 Mar 2024 17:18:14 +0900 Subject: [PATCH 231/954] Fix mute for 30 days (#29640) --- app/javascript/mastodon/features/ui/components/mute_modal.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/ui/components/mute_modal.jsx b/app/javascript/mastodon/features/ui/components/mute_modal.jsx index e9dc1a7c2e..df466cfac6 100644 --- a/app/javascript/mastodon/features/ui/components/mute_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/mute_modal.jsx @@ -118,7 +118,7 @@ export const MuteModal = ({ accountId, acct }) => { - +
From cf08a438e7ce7981c209b0faa54a32c5bbe40930 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 19 Mar 2024 09:20:53 +0100 Subject: [PATCH 232/954] Add badge on account card in report moderation interface when account is already suspended (#29592) --- app/javascript/styles/mastodon/admin.scss | 13 +++++++++++++ app/views/admin/reports/_header_card.html.haml | 6 ++++++ config/locales/en.yml | 3 +++ 3 files changed, 22 insertions(+) diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 60e3cc19dd..fadd77d13d 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -1380,6 +1380,19 @@ a.sparkline { .account-card { border-radius: 4px; border: 1px solid lighten($ui-base-color, 8%); + position: relative; + + &__warning-badge { + position: absolute; + padding: 4px 10px; + top: 10px; + inset-inline-start: 10px; + border-radius: 4px; + background: + url('../images/warning-stripes.svg') repeat-y left, + url('../images/warning-stripes.svg') repeat-y right, + var(--background-color); + } &__permalink { color: inherit; diff --git a/app/views/admin/reports/_header_card.html.haml b/app/views/admin/reports/_header_card.html.haml index 6fd8b4ecc8..e90e3f9c90 100644 --- a/app/views/admin/reports/_header_card.html.haml +++ b/app/views/admin/reports/_header_card.html.haml @@ -1,5 +1,11 @@ .report-header__card .account-card + - if report.target_account.suspended? + .account-card__warning-badge + - if report.target_account.suspension_origin_local? + = t('admin.reports.already_suspended_badges.local') + - else + = t('admin.reports.already_suspended_badges.remote') .account-card__header = image_tag report.target_account.header.url, alt: '' .account-card__title diff --git a/config/locales/en.yml b/config/locales/en.yml index b6f9689ac4..6fc81ca5fb 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -597,6 +597,9 @@ en: actions_description_html: Decide which action to take to resolve this report. If you take a punitive action against the reported account, an e-mail notification will be sent to them, except when the Spam category is selected. actions_description_remote_html: Decide which action to take to resolve this report. This will only affect how your server communicates with this remote account and handle its content. add_to_report: Add more to report + already_suspended_badges: + local: Already suspended on this server + remote: Already suspended on their server are_you_sure: Are you sure? assign_to_self: Assign to me assigned: Assigned moderator From 72e1162eb37de1659c4253a5bb99ed28c9fb707c Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 19 Mar 2024 04:22:46 -0400 Subject: [PATCH 233/954] Flatten `olm` section of context helper extension map (#29638) --- app/helpers/context_helper.rb | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/app/helpers/context_helper.rb b/app/helpers/context_helper.rb index 945ef9b91a..2d7a4f98fd 100644 --- a/app/helpers/context_helper.rb +++ b/app/helpers/context_helper.rb @@ -24,12 +24,21 @@ module ContextHelper memorial: { 'toot' => 'http://joinmastodon.org/ns#', 'memorial' => 'toot:memorial' }, voters_count: { 'toot' => 'http://joinmastodon.org/ns#', 'votersCount' => 'toot:votersCount' }, olm: { - 'toot' => 'http://joinmastodon.org/ns#', 'Device' => 'toot:Device', 'Ed25519Signature' => 'toot:Ed25519Signature', 'Ed25519Key' => 'toot:Ed25519Key', 'Curve25519Key' => 'toot:Curve25519Key', 'EncryptedMessage' => 'toot:EncryptedMessage', 'publicKeyBase64' => 'toot:publicKeyBase64', 'deviceId' => 'toot:deviceId', + 'toot' => 'http://joinmastodon.org/ns#', + 'Device' => 'toot:Device', + 'Ed25519Signature' => 'toot:Ed25519Signature', + 'Ed25519Key' => 'toot:Ed25519Key', + 'Curve25519Key' => 'toot:Curve25519Key', + 'EncryptedMessage' => 'toot:EncryptedMessage', + 'publicKeyBase64' => 'toot:publicKeyBase64', + 'deviceId' => 'toot:deviceId', 'claim' => { '@type' => '@id', '@id' => 'toot:claim' }, 'fingerprintKey' => { '@type' => '@id', '@id' => 'toot:fingerprintKey' }, 'identityKey' => { '@type' => '@id', '@id' => 'toot:identityKey' }, 'devices' => { '@type' => '@id', '@id' => 'toot:devices' }, - 'messageFranking' => 'toot:messageFranking', 'messageType' => 'toot:messageType', 'cipherText' => 'toot:cipherText' + 'messageFranking' => 'toot:messageFranking', + 'messageType' => 'toot:messageType', + 'cipherText' => 'toot:cipherText', }, suspended: { 'toot' => 'http://joinmastodon.org/ns#', 'suspended' => 'toot:suspended' }, }.freeze From 4e61bce4e988c8e47f4627c5cfcdb2767b1cec17 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 Mar 2024 09:36:52 +0100 Subject: [PATCH 234/954] New Crowdin Translations (automated) (#29641) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/bg.json | 1 + app/javascript/mastodon/locales/de.json | 4 +-- app/javascript/mastodon/locales/gl.json | 39 ++++++++++++++++++++++ app/javascript/mastodon/locales/ia.json | 4 +++ app/javascript/mastodon/locales/ne.json | 2 ++ app/javascript/mastodon/locales/zh-TW.json | 2 +- config/locales/gl.yml | 3 ++ config/locales/vi.yml | 2 ++ 8 files changed, 54 insertions(+), 3 deletions(-) diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index adc974bee8..d692925d15 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -514,6 +514,7 @@ "notifications.policy.filter_not_followers_title": "Хора, които не ви следват", "notifications.policy.filter_not_following_hint": "Докато не ги одобрите ръчно", "notifications.policy.filter_not_following_title": "Хора, които не следвате", + "notifications.policy.filter_private_mentions_hint": "Филтрирано, освен ако е отговор към ваше собствено споменаване или ако следвате подателя", "notifications.policy.filter_private_mentions_title": "Непоискани частни споменавания", "notifications.policy.title": "Да се филтрират известия от…", "notifications_permission_banner.enable": "Включване на известията на работния плот", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 412ef31b07..cb03e7ba3d 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -697,7 +697,7 @@ "status.edited_x_times": "{count, plural, one {{count}-mal} other {{count}-mal}} bearbeitet", "status.embed": "Beitrag per iFrame einbetten", "status.favourite": "Favorisieren", - "status.favourites": "{count, plural, one {Favorit} other {Favoriten}}", + "status.favourites": "{count, plural, one {Mal favorisiert} other {Mal favorisiert}}", "status.filter": "Beitrag filtern", "status.filtered": "Gefiltert", "status.hide": "Beitrag ausblenden", @@ -718,7 +718,7 @@ "status.reblog": "Teilen", "status.reblog_private": "Mit der ursprünglichen Zielgruppe teilen", "status.reblogged_by": "{name} teilte", - "status.reblogs": "{count, plural, one {geteilt} other {geteilt}}", + "status.reblogs": "{count, plural, one {Mal geteilt} other {Mal geteilt}}", "status.reblogs.empty": "Diesen Beitrag hat bisher noch niemand geteilt. Sobald es jemand tut, wird das Profil hier erscheinen.", "status.redraft": "Löschen und neu erstellen", "status.remove_bookmark": "Lesezeichen entfernen", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index d5726062a3..57882196f3 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -89,6 +89,14 @@ "announcement.announcement": "Anuncio", "attachments_list.unprocessed": "(sen procesar)", "audio.hide": "Agochar audio", + "block_modal.remote_users_caveat": "Ímoslle pedir ao servidor {domain} que respecte a túa decisión. Emporiso, non hai garantía de que atenda a petición xa que os servidores xestionan os bloqueos de formas diferentes. As publicacións públicas poderían aínda ser visibles para usuarias que non iniciaron sesión.", + "block_modal.show_less": "Mostrar menos", + "block_modal.show_more": "Mostrar máis", + "block_modal.they_cant_mention": "Non te pode seguir nin mencionar.", + "block_modal.they_cant_see_posts": "Non pode ver as túas publicacións nin ti as de ela.", + "block_modal.they_will_know": "Pode ver que a bloqueaches.", + "block_modal.title": "Bloquear usuaria?", + "block_modal.you_wont_see_mentions": "Non verás publicacións que a mencionen.", "boost_modal.combo": "Preme {combo} para ignorar isto na seguinte vez", "bundle_column_error.copy_stacktrace": "Copiar informe do erro", "bundle_column_error.error.body": "Non se puido mostrar a páxina solicitada. Podería deberse a un problema no código, ou incompatiblidade co navegador.", @@ -169,6 +177,7 @@ "confirmations.delete_list.message": "Tes a certeza de querer eliminar de xeito permanente esta listaxe?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tes cambios sen gardar para a vista previa ou descrición do multimedia, descartamos os cambios?", + "confirmations.domain_block.confirm": "Bloquear servidor", "confirmations.domain_block.message": "Tes a certeza de querer bloquear todo de {domain}? Na meirande parte dos casos uns bloqueos ou silenciados específicos son suficientes. Non verás máis o contido deste dominio en ningunha cronoloxía pública ou nas túas notificacións. As túas seguidoras deste dominio serán eliminadas.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Ao editar sobrescribirás a mensaxe que estás a compor. Tes a certeza de que queres continuar?", @@ -200,6 +209,27 @@ "dismissable_banner.explore_statuses": "Estas son as publicacións da web social que hoxe están gañando popularidade. As publicacións con máis promocións e favorecemento teñen puntuación máis alta.", "dismissable_banner.explore_tags": "Estes cancelos están gañando popularidade entre as persoas deste servidor e noutros servidores da rede descentralizada.", "dismissable_banner.public_timeline": "Estas son as publicacións públicas máis recentes das persoas que as usuarias de {domain} están a seguir.", + "domain_block_modal.block": "Bloquear servidor", + "domain_block_modal.block_account_instead": "Prefiro bloquear a @{name}", + "domain_block_modal.they_can_interact_with_old_posts": "As persoas deste servidor poden interactuar coas túas publicacións antigas.", + "domain_block_modal.they_cant_follow": "Ninguén deste servidor pode seguirte.", + "domain_block_modal.they_wont_know": "Non saberá que a bloqueaches.", + "domain_block_modal.title": "Bloquear dominio?", + "domain_block_modal.you_will_lose_followers": "Vanse eliminar todas as túas seguidoras deste servidor.", + "domain_block_modal.you_wont_see_posts": "Non verás publicacións ou notificación das usuarias neste servidor.", + "domain_pill.activitypub_lets_connect": "Permíteche conectar e interactuar con persoas non só de Mastodon, se non tamén con outras apps sociais.", + "domain_pill.activitypub_like_language": "ActivityPub é algo así como o idioma que Mastodon fala con outras redes sociais.", + "domain_pill.server": "Servidor", + "domain_pill.their_handle": "O seu alcume:", + "domain_pill.their_server": "O seu fogar dixital, onde están as súas publicacións.", + "domain_pill.their_username": "O seu identificador único no seu servidor. É posible atopar usuarias co mesmo nome de usuaria en diferentes servidores.", + "domain_pill.username": "Nome de usuaria", + "domain_pill.whats_in_a_handle": "Que é o alcume?", + "domain_pill.who_they_are": "O alcume dinos quen é esa persoa e onde está, para que poidas interactuar con ela en toda a web social de .", + "domain_pill.who_you_are": "Como o teu alcume informa de quen es e onde estás, as persoas poden interactuar contigo desde toda a web social de .", + "domain_pill.your_handle": "O teu alcume:", + "domain_pill.your_server": "O teu fogar dixital, onde están as túas publicacións. Non é do teu agrado? Podes cambiar de servidor cando queiras levando as túas seguidoras contigo.", + "domain_pill.your_username": "O teu identificador único neste servidor. É posible que atopes usuarias co mesmo nome de usuaria en outros servidores.", "embed.instructions": "Engade esta publicación ó teu sitio web copiando o seguinte código.", "embed.preview": "Así será mostrado:", "emoji_button.activity": "Actividade", @@ -397,6 +427,15 @@ "loading_indicator.label": "Estase a cargar…", "media_gallery.toggle_visible": "Agochar {number, plural, one {imaxe} other {imaxes}}", "moved_to_account_banner.text": "A túa conta {disabledAccount} está actualmente desactivada porque movéchela a {movedToAccount}.", + "mute_modal.hide_from_notifications": "Ocultar nas notificacións", + "mute_modal.hide_options": "Opcións ao ocultar", + "mute_modal.indefinite": "Ata que as reactive", + "mute_modal.show_options": "Mostrar opcións", + "mute_modal.they_can_mention_and_follow": "Pódete mencionar e seguirte, pero non o verás.", + "mute_modal.they_wont_know": "Non saberá que a acalaches.", + "mute_modal.title": "Acalar usuaria?", + "mute_modal.you_wont_see_mentions": "Non verás as publicacións que a mencionen.", + "mute_modal.you_wont_see_posts": "Seguirá podendo ler as túas publicacións, pero non verás as súas.", "navigation_bar.about": "Acerca de", "navigation_bar.advanced_interface": "Abrir coa interface web avanzada", "navigation_bar.blocks": "Usuarias bloqueadas", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 7418b213e7..e587dbc52c 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -3,7 +3,10 @@ "about.contact": "Contacto:", "about.disclaimer": "Mastodon es software libere, de codice aperte, e un marca de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Ration non disponibile", + "about.domain_blocks.preamble": "Mastodon generalmente permitte vider contento ab e interacter con usatores ab ulle altere servitor in le fediverso. Iste es le exceptiones que ha essite facite in iste servitor particular.", + "about.domain_blocks.silenced.explanation": "Generalmente non videras perfiles e contento de iste servitor, a minus que tu expressemente lo cerca o opta pro lo per sequer.", "about.domain_blocks.silenced.title": "Limitate", + "about.domain_blocks.suspended.explanation": "Nulle data de iste servitor essera processate, immagazinate o scambiate, faciente qualcunque interaction o communication con usatores de iste servitor impossibile.", "about.domain_blocks.suspended.title": "Suspendite", "about.not_available": "Iste information non faceva disponibile in iste servitor.", "about.rules": "Regulas del servitor", @@ -71,6 +74,7 @@ "alert.unexpected.message": "Ocurreva un error inexpectate.", "announcement.announcement": "Annuncio", "audio.hide": "Celar audio", + "bundle_column_error.error.title": "Oh, non!", "bundle_column_error.network.title": "Error de rete", "bundle_column_error.retry": "Tentar novemente", "bundle_column_error.return": "Retornar al initio", diff --git a/app/javascript/mastodon/locales/ne.json b/app/javascript/mastodon/locales/ne.json index aef23c8566..500261a34b 100644 --- a/app/javascript/mastodon/locales/ne.json +++ b/app/javascript/mastodon/locales/ne.json @@ -54,6 +54,8 @@ "block_modal.remote_users_caveat": "हामी सर्भर {domain} लाई तपाईंको निर्णयको सम्मान गर्न सोध्नेछौं। तर, हामी अनुपालनको ग्यारेन्टी दिन सक्दैनौं किनभने केही सर्भरहरूले ब्लकहरू फरक रूपमा ह्यान्डल गर्न सक्छन्। सार्वजनिक पोस्टहरू लग इन नभएका प्रयोगकर्ताहरूले देख्न सक्छन्।", "block_modal.show_less": "कम देखाउनुहोस्", "block_modal.show_more": "थप देखाउनुहोस्", + "bundle_column_error.copy_stacktrace": "त्रुटि रिपोर्ट प्रतिलिपि गर्नुहोस्", + "bundle_column_error.network.title": "नेटवर्क त्रुटि", "bundle_column_error.retry": "पुन: प्रयास गर्नुहोस्", "bundle_modal_error.close": "बन्द गर्नुहोस्", "bundle_modal_error.message": "यो कम्पोनेन्ट लोड गर्दा केही गडबड भयो।", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 71272213a8..30313d92f4 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -89,7 +89,7 @@ "announcement.announcement": "公告", "attachments_list.unprocessed": "(未經處理)", "audio.hide": "隱藏音訊", - "block_modal.remote_users_caveat": "我們會要求 {domain} 伺服器尊重您的決定。然而,我們無法保證所有伺服器都會遵守,某些伺服器可能以不同方式處理封鎖。未登入之使用者仍可能看到您的公開嘟文。", + "block_modal.remote_users_caveat": "我們會要求 {domain} 伺服器尊重您的決定。然而,我們無法保證所有伺服器皆會遵守,某些伺服器可能以不同方式處理封鎖。未登入之使用者仍可能看見您的公開嘟文。", "block_modal.show_less": "減少顯示", "block_modal.show_more": "顯示更多", "block_modal.they_cant_mention": "他們無法提及或跟隨您。", diff --git a/config/locales/gl.yml b/config/locales/gl.yml index dc4a62f701..57249d2ca9 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1865,6 +1865,9 @@ gl: follows_subtitle: Sigue estas contas populares follows_title: A quen seguir follows_view_more: Ver máis persoas para seguir + hashtags_recent_count: + one: "%{people} persoa nos últimos 2 días" + other: "%{people} persoas nos últimos 2 días" hashtags_subtitle: Descubre os temas en voga nos últimos 2 días hashtags_title: Cancelos en voga hashtags_view_more: Ver máis cancelos en voga diff --git a/config/locales/vi.yml b/config/locales/vi.yml index bb3bd27b50..b9efeee46e 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1833,6 +1833,8 @@ vi: follows_subtitle: Theo dõi những người thú vị follows_title: Gợi ý theo dõi follows_view_more: Xem thêm những người khác + hashtags_recent_count: + other: "%{people} người dùng trong 2 ngày qua" hashtags_subtitle: Khám phá xu hướng 2 ngày qua hashtags_title: Hashtag xu hướng hashtags_view_more: Xem thêm hashtag xu hướng From 6c68c3c0ce610a7d816249e2f8139863c3129047 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 19 Mar 2024 05:03:15 -0400 Subject: [PATCH 235/954] Introduce `inline_svg` gem, minimal usage, prep for material design icons (#29612) --- Gemfile | 1 + Gemfile.lock | 4 ++++ app/helpers/application_helper.rb | 2 +- app/javascript/images/check.svg | 4 ++++ config/initializers/propshaft.rb | 3 +++ 5 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 app/javascript/images/check.svg create mode 100644 config/initializers/propshaft.rb diff --git a/Gemfile b/Gemfile index d3bfeb4487..3a1ff81d43 100644 --- a/Gemfile +++ b/Gemfile @@ -59,6 +59,7 @@ gem 'http', '~> 5.1' gem 'http_accept_language', '~> 2.1' gem 'httplog', '~> 1.6.2' gem 'idn-ruby', require: 'idn' +gem 'inline_svg' gem 'kaminari', '~> 1.2' gem 'link_header', '~> 0.0' gem 'mime-types', '~> 3.5.0', require: 'mime/types/columnar' diff --git a/Gemfile.lock b/Gemfile.lock index 9de472091c..9c5bb940bc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -350,6 +350,9 @@ GEM rainbow (>= 2.2.2, < 4.0) terminal-table (>= 1.5.1) idn-ruby (0.1.5) + inline_svg (1.9.0) + activesupport (>= 3.0) + nokogiri (>= 1.6) io-console (0.7.2) irb (1.12.0) rdoc @@ -865,6 +868,7 @@ DEPENDENCIES httplog (~> 1.6.2) i18n-tasks (~> 1.0) idn-ruby + inline_svg irb (~> 1.8) json-ld json-ld-preloaded (~> 3.2) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 7dc7d60808..668afe7fde 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -114,7 +114,7 @@ module ApplicationHelper end def check_icon - content_tag(:svg, tag.path('fill-rule': 'evenodd', 'clip-rule': 'evenodd', d: 'M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z'), xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 20 20', fill: 'currentColor') + inline_svg_tag 'check.svg' end def visibility_icon(status) diff --git a/app/javascript/images/check.svg b/app/javascript/images/check.svg new file mode 100644 index 0000000000..8a0ebe878d --- /dev/null +++ b/app/javascript/images/check.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/config/initializers/propshaft.rb b/config/initializers/propshaft.rb new file mode 100644 index 0000000000..6cf368d5b7 --- /dev/null +++ b/config/initializers/propshaft.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +Rails.application.config.assets.paths << Rails.root.join('app', 'javascript', 'images') From caee5e4d6a35c925e6a73933d85e4f14b5b36d8d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 Mar 2024 10:11:38 +0100 Subject: [PATCH 236/954] Update dependency core-js to v3.36.1 (#29642) 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 dd80cc8430..d5e53d23f2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5900,9 +5900,9 @@ __metadata: linkType: hard "core-js@npm:^3.30.2": - version: 3.36.0 - resolution: "core-js@npm:3.36.0" - checksum: 10c0/62dcb41ba79ead581e4c5b2740ae18bfe6ee230e853893736d16edb01b580574d8645ff6c5513d1c75d59620f8451aee45c119d3c4f5ebc66cff5f003a816864 + version: 3.36.1 + resolution: "core-js@npm:3.36.1" + checksum: 10c0/4f0ad2464535d809ba659226feca15bff14b9b5452518bddff8d81b9c94b0227b3027d9838f22f1dce664958acb4107b935cc0037695ae545edc2a303bca98bf languageName: node linkType: hard From 42cdd0c095de63c8e2e1655e6338217b7a24b7a3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 Mar 2024 14:00:39 +0100 Subject: [PATCH 237/954] Update babel monorepo to v7.24.1 (#29645) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 1000 ++++++++++++++++++++++++++--------------------------- 1 file changed, 500 insertions(+), 500 deletions(-) diff --git a/yarn.lock b/yarn.lock index d5e53d23f2..8d504c719a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -42,55 +42,55 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/code-frame@npm:7.23.5" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/code-frame@npm:7.24.1" dependencies: - "@babel/highlight": "npm:^7.23.4" - chalk: "npm:^2.4.2" - checksum: 10c0/a10e843595ddd9f97faa99917414813c06214f4d9205294013e20c70fbdf4f943760da37dec1d998bf3e6fc20fa2918a47c0e987a7e458663feb7698063ad7c6 + "@babel/highlight": "npm:^7.24.1" + picocolors: "npm:^1.0.0" + checksum: 10c0/c92f4244538089c95f0322c5e8f6c2287529a576ae9ab254366a073c8720ecb537e7009d5d79a6a5698d3b658b298fc77691c05608cafbe4957cab03033ada15 languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/compat-data@npm:7.23.5" - checksum: 10c0/081278ed46131a890ad566a59c61600a5f9557bd8ee5e535890c8548192532ea92590742fd74bd9db83d74c669ef8a04a7e1c85cdea27f960233e3b83c3a957c +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.5, @babel/compat-data@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/compat-data@npm:7.24.1" + checksum: 10c0/8a1935450345c326b14ea632174696566ef9b353bd0d6fb682456c0774342eeee7654877ced410f24a731d386fdcbf980b75083fc764964d6f816b65792af2f5 languageName: node linkType: hard "@babel/core@npm:^7.10.4, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.1": - version: 7.24.0 - resolution: "@babel/core@npm:7.24.0" + version: 7.24.1 + resolution: "@babel/core@npm:7.24.1" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.23.5" - "@babel/generator": "npm:^7.23.6" + "@babel/code-frame": "npm:^7.24.1" + "@babel/generator": "npm:^7.24.1" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.24.0" - "@babel/parser": "npm:^7.24.0" + "@babel/helpers": "npm:^7.24.1" + "@babel/parser": "npm:^7.24.1" "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.1" "@babel/types": "npm:^7.24.0" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/bb37cbf0bdfd676b246af0a3d9a7932d10573f2d45114fdda02a71889e35530ce13d8930177e78b065d6734b8d45a4fbf7c77f223b1d44b4a28cfe5fefee93ed + checksum: 10c0/b085b0bc65c225f20b9d5f7b05c8b127c005a73c355d4a7480f099de5d6757abafa7f60786eb95e6d098a6b5c34618e7b0950d60ef55139db04d8767d410e0a9 languageName: node linkType: hard -"@babel/generator@npm:^7.23.6, @babel/generator@npm:^7.7.2": - version: 7.23.6 - resolution: "@babel/generator@npm:7.23.6" +"@babel/generator@npm:^7.24.1, @babel/generator@npm:^7.7.2": + version: 7.24.1 + resolution: "@babel/generator@npm:7.24.1" dependencies: - "@babel/types": "npm:^7.23.6" - "@jridgewell/gen-mapping": "npm:^0.3.2" - "@jridgewell/trace-mapping": "npm:^0.3.17" + "@babel/types": "npm:^7.24.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^2.5.1" - checksum: 10c0/53540e905cd10db05d9aee0a5304e36927f455ce66f95d1253bb8a179f286b88fa7062ea0db354c566fe27f8bb96567566084ffd259f8feaae1de5eccc8afbda + checksum: 10c0/f0eea7497657cdf68cfb4b7d181588e1498eefd1f303d73b0d8ca9b21a6db27136a6f5beb8f988b6bdcd4249870826080950450fd310951de42ecf36df274881 languageName: node linkType: hard @@ -122,7 +122,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": version: 7.23.6 resolution: "@babel/helper-compilation-targets@npm:7.23.6" dependencies: @@ -135,22 +135,22 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-create-class-features-plugin@npm:7.22.15" +"@babel/helper-create-class-features-plugin@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/helper-create-class-features-plugin@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-environment-visitor": "npm:^7.22.5" - "@babel/helper-function-name": "npm:^7.22.5" - "@babel/helper-member-expression-to-functions": "npm:^7.22.15" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-member-expression-to-functions": "npm:^7.23.0" "@babel/helper-optimise-call-expression": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.9" + "@babel/helper-replace-supers": "npm:^7.24.1" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" "@babel/helper-split-export-declaration": "npm:^7.22.6" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/2ae5759fe8845fda99b34f2ba6cd0794fc860213d14c93a87aa9180960252bce621157a79c373b7fbb423b25a55fb0e20eae0d5f8e4ad5ef22dc70e7c2af3805 + checksum: 10c0/45372890634c37deefc81f44b7d958fe210f7da7d8a2239c9849c6041a56536f74bf3aa2d115bc06d5680d0dc49c1303f74a045d76ae0dd1592c7d5c0c268ebc languageName: node linkType: hard @@ -167,9 +167,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.5.0": - version: 0.5.0 - resolution: "@babel/helper-define-polyfill-provider@npm:0.5.0" +"@babel/helper-define-polyfill-provider@npm:^0.6.1": + version: 0.6.1 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.1" dependencies: "@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -178,11 +178,11 @@ __metadata: resolve: "npm:^1.14.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/2b053b96a0c604a7e0f5c7d13a8a55f4451d938f7af42bd40f62a87df15e6c87a0b1dbd893a0f0bb51077b54dc3ba00a58b166531a5940ad286ab685dd8979ec + checksum: 10c0/210e1c8ac118f7c5a0ef5b42c4267c3db2f59b1ebc666a275d442b86896de4a66ef93539d702870f172f9749cd44c89f53056a5b17e619c3142b12ed4e4e6aae languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.22.20, @babel/helper-environment-visitor@npm:^7.22.5": +"@babel/helper-environment-visitor@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-environment-visitor@npm:7.22.20" checksum: 10c0/e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94 @@ -208,7 +208,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.22.15": +"@babel/helper-member-expression-to-functions@npm:^7.23.0": version: 7.23.0 resolution: "@babel/helper-member-expression-to-functions@npm:7.23.0" dependencies: @@ -217,12 +217,12 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.0.0-beta.49, @babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-module-imports@npm:7.22.15" +"@babel/helper-module-imports@npm:^7.0.0-beta.49, @babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/helper-module-imports@npm:7.24.1" dependencies: - "@babel/types": "npm:^7.22.15" - checksum: 10c0/4e0d7fc36d02c1b8c8b3006dfbfeedf7a367d3334a04934255de5128115ea0bafdeb3e5736a2559917f0653e4e437400d54542da0468e08d3cbc86d3bbfa8f30 + "@babel/types": "npm:^7.24.0" + checksum: 10c0/9242a9af73e7eb3fe106d7e55c157149f7f38df6494980744e99fc608103c2ee20726df9596fae722c57ae89c9c304200673b733c3c1c5312385ff26ebd2a4fa languageName: node linkType: hard @@ -270,16 +270,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.22.20, @babel/helper-replace-supers@npm:^7.22.9": - version: 7.22.20 - resolution: "@babel/helper-replace-supers@npm:7.22.20" +"@babel/helper-replace-supers@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/helper-replace-supers@npm:7.24.1" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-member-expression-to-functions": "npm:^7.22.15" + "@babel/helper-member-expression-to-functions": "npm:^7.23.0" "@babel/helper-optimise-call-expression": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/6b0858811ad46873817c90c805015d63300e003c5a85c147a17d9845fa2558a02047c3cc1f07767af59014b2dd0fa75b503e5bc36e917f360e9b67bb6f1e79f4 + checksum: 10c0/d39a3df7892b7c3c0e307fb229646168a9bd35e26a72080c2530729322600e8cff5f738f44a14860a2358faffa741b6a6a0d6749f113387b03ddbfa0ec10e1a0 languageName: node linkType: hard @@ -324,7 +324,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.23.5": +"@babel/helper-validator-option@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helper-validator-option@npm:7.23.5" checksum: 10c0/af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94 @@ -342,70 +342,71 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/helpers@npm:7.24.0" +"@babel/helpers@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/helpers@npm:7.24.1" dependencies: "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.1" "@babel/types": "npm:^7.24.0" - checksum: 10c0/dd27c9f11c1c5244ef312fae37636f2fcc69c541c46508017b846c4cf680af059f1922ce84e3f778f123a70d027ded75c96070ee8e906f3bc52dc26dc43df608 + checksum: 10c0/b3445860ae749fc664682b291f092285e949114e8336784ae29f88eb4c176279b01cc6740005a017a0389ae4b4e928d5bbbc01de7da7e400c972e3d6f792063a languageName: node linkType: hard -"@babel/highlight@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/highlight@npm:7.23.4" +"@babel/highlight@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/highlight@npm:7.24.1" dependencies: "@babel/helper-validator-identifier": "npm:^7.22.20" chalk: "npm:^2.4.2" js-tokens: "npm:^4.0.0" - checksum: 10c0/fbff9fcb2f5539289c3c097d130e852afd10d89a3a08ac0b5ebebbc055cc84a4bcc3dcfed463d488cde12dd0902ef1858279e31d7349b2e8cee43913744bda33 + picocolors: "npm:^1.0.0" + checksum: 10c0/39520f655101245efd44a6e5997e73e2b977f8e2011897022ec81fa5b0366dbfef5313bdebadbd08186f52b7e9c21b38ba265cc78caa0c6a8c894461e7a70430 languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/parser@npm:7.24.0" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/parser@npm:7.24.1" bin: parser: ./bin/babel-parser.js - checksum: 10c0/77593d0b9de9906823c4d653bb6cda1c7593837598516330f655f70cba6224a37def7dbe5b4dad0038482d407d8d209eb8be5f48ca9a13357d769f829c5adb8e + checksum: 10c0/d2a8b99aa5f33182b69d5569367403a40e7c027ae3b03a1f81fd8ac9b06ceb85b31f6ee4267fb90726dc2ac99909c6bdaa9cf16c379efab73d8dfe85cee32c50 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/356a4e9fc52d7ca761ce6857fc58e2295c2785d22565760e6a5680be86c6e5883ab86e0ba25ef572882c01713d3a31ae6cfa3e3222cdb95e6026671dab1fa415 + checksum: 10c0/d4e592e6fc4878654243d2e7b51ea86471b868a8cb09de29e73b65d2b64159990c6c198fd7c9c2af2e38b1cddf70206243792853c47384a84f829dada152f605 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.23.3" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.3" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.13.0 - checksum: 10c0/a8785f099d55ca71ed89815e0f3a636a80c16031f80934cfec17c928d096ee0798964733320c8b145ef36ba429c5e19d5107b06231e0ab6777cfb0f01adfdc23 + checksum: 10c0/351c36e45795a7890d610ab9041a52f4078a59429f6e74c281984aa44149a10d43e82b3a8172c703c0d5679471e165d1c02b6d2e45a677958ee301b89403f202 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.7" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.1" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/355746e21ad7f43e4f4daef54cfe2ef461ecd19446b2afedd53c39df1bf9aa2eeeeaabee2279b1321de89a97c9360e4f76e9ba950fee50ff1676c25f6929d625 + checksum: 10c0/d7dd5a59a54635a3152895dcaa68f3370bb09d1f9906c1e72232ff759159e6be48de4a598a993c986997280a2dc29922a48aaa98020f16439f3f57ad72788354 languageName: node linkType: hard @@ -484,25 +485,25 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.23.3" +"@babel/plugin-syntax-import-assertions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7db8b59f75667bada2293353bb66b9d5651a673b22c72f47da9f5c46e719142481601b745f9822212fd7522f92e26e8576af37116f85dae1b5e5967f80d0faab + checksum: 10c0/72f0340d73e037f0702c61670054e0af66ece7282c5c2f4ba8de059390fee502de282defdf15959cd9f71aa18dc5c5e4e7a0fde317799a0600c6c4e0a656d82b languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.23.3" +"@babel/plugin-syntax-import-attributes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/99b40d33d79205a8e04bb5dea56fd72906ffc317513b20ca7319e7683e18fce8ea2eea5e9171056f92b979dc0ab1e31b2cb5171177a5ba61e05b54fe7850a606 + checksum: 10c0/309634e3335777aee902552b2cf244c4a8050213cc878b3fb9d70ad8cbbff325dc46ac5e5791836ff477ea373b27832238205f6ceaff81f7ea7c4c7e8fbb13bb languageName: node linkType: hard @@ -528,14 +529,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:7, @babel/plugin-syntax-jsx@npm:^7.22.5, @babel/plugin-syntax-jsx@npm:^7.23.3, @babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.23.3 - resolution: "@babel/plugin-syntax-jsx@npm:7.23.3" +"@babel/plugin-syntax-jsx@npm:7, @babel/plugin-syntax-jsx@npm:^7.23.3, @babel/plugin-syntax-jsx@npm:^7.24.1, @babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.24.1 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/563bb7599b868773f1c7c1d441ecc9bc53aeb7832775da36752c926fc402a1fa5421505b39e724f71eb217c13e4b93117e081cac39723b0e11dac4c897f33c3e + checksum: 10c0/6cec76fbfe6ca81c9345c2904d8d9a8a0df222f9269f0962ed6eb2eb8f3f10c2f15e993d1ef09dbaf97726bf1792b5851cf5bd9a769f966a19448df6be95d19a languageName: node linkType: hard @@ -627,14 +628,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.23.3, @babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.23.3 - resolution: "@babel/plugin-syntax-typescript@npm:7.23.3" +"@babel/plugin-syntax-typescript@npm:^7.24.1, @babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.24.1 + resolution: "@babel/plugin-syntax-typescript@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4d6e9cdb9d0bfb9bd9b220fc951d937fce2ca69135ec121153572cebe81d86abc9a489208d6b69ee5f10cadcaeffa10d0425340a5029e40e14a6025021b90948 + checksum: 10c0/7a81e277dcfe3138847e8e5944e02a42ff3c2e864aea6f33fd9b70d1556d12b0e70f0d56cc1985d353c91bcbf8fe163e6cc17418da21129b7f7f1d8b9ac00c93 languageName: node linkType: hard @@ -650,310 +651,310 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" +"@babel/plugin-transform-arrow-functions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/b128315c058f5728d29b0b78723659b11de88247ea4d0388f0b935cddf60a80c40b9067acf45cbbe055bd796928faef152a09d9e4a0695465aca4394d9f109ca + checksum: 10c0/f44bfacf087dc21b422bab99f4e9344ee7b695b05c947dacae66de05c723ab9d91800be7edc1fa016185e8c819f3aca2b4a5f66d8a4d1e47d9bad80b8fa55b8e languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.9" +"@babel/plugin-transform-async-generator-functions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.1" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-remap-async-to-generator": "npm:^7.22.20" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4ff75f9ce500e1de8c0236fa5122e6475a477d19cb9a4c2ae8651e78e717ebb2e2cecfeca69d420def779deaec78b945843b9ffd15f02ecd7de5072030b4469b + checksum: 10c0/c207cb6b3b7dcb5cd9b22ce5a063493ec7534a21375cb987ad079eee6cc5cae573bd3c97af91fbf0ee47cae1d3f8632c4387885aeab0eedece5652dc4e6b9f1c languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" +"@babel/plugin-transform-async-to-generator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.1" dependencies: - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-module-imports": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-remap-async-to-generator": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/da3ffd413eef02a8e2cfee3e0bb0d5fc0fcb795c187bc14a5a8e8874cdbdc43bbf00089c587412d7752d97efc5967c3c18ff5398e3017b9a14a06126f017e7e9 + checksum: 10c0/3731ba8e83cbea1ab22905031f25b3aeb0b97c6467360a2cc685352f16e7c786417d8883bc747f5a0beff32266bdb12a05b6292e7b8b75967087200a7bc012c4 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" +"@babel/plugin-transform-block-scoped-functions@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/82c12a11277528184a979163de7189ceb00129f60dd930b0d5313454310bf71205f302fb2bf0430247161c8a22aaa9fb9eec1459f9f7468206422c191978fd59 + checksum: 10c0/6fbaa85f5204f34845dfc0bebf62fdd3ac5a286241c85651e59d426001e7a1785ac501f154e093e0b8ee49e1f51e3f8b06575a5ae8d4a9406d43e4816bf18c37 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" +"@babel/plugin-transform-block-scoping@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-block-scoping@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/83006804dddf980ab1bcd6d67bc381e24b58c776507c34f990468f820d0da71dba3697355ca4856532fa2eeb2a1e3e73c780f03760b5507a511cbedb0308e276 + checksum: 10c0/1a230ad95d9672626831e22df9b4838901681fa11d44c3811d71ca64ea53f5e87de2abef865f70fe62657053278d9034cc4ea3bab0fd3300bdf9e73b3f85f97a languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-class-properties@npm:7.23.3" +"@babel/plugin-transform-class-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-class-properties@npm:7.24.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/bca30d576f539eef216494b56d610f1a64aa9375de4134bc021d9660f1fa735b1d7cc413029f22abc0b7cb737e3a57935c8ae9d8bd1730921ccb1deebce51bfd + checksum: 10c0/00dff042ac9df4ae67b5ef98b1137cc72e0a24e6d911dc200540a8cb1f00b4cff367a922aeb22da17da662079f0abcd46ee1c5f4cdf37ceebf6ff1639bb9af27 languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-class-static-block@npm:7.23.4" +"@babel/plugin-transform-class-static-block@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-class-static-block@npm:7.24.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10c0/fdca96640ef29d8641a7f8de106f65f18871b38cc01c0f7b696d2b49c76b77816b30a812c08e759d06dd10b4d9b3af6b5e4ac22a2017a88c4077972224b77ab0 + checksum: 10c0/3095d02b7932890b82346d42200a89a56b6ca7d25a69a94242ab5b1772f18138b8e639358dd70d23add2df8b0d1640e1e13729c2c275ecce550cbe89048ba85f languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.23.8": - version: 7.23.8 - resolution: "@babel/plugin-transform-classes@npm:7.23.8" +"@babel/plugin-transform-classes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-classes@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-replace-supers": "npm:^7.24.1" "@babel/helper-split-export-declaration": "npm:^7.22.6" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/227ac5166501e04d9e7fbd5eda6869b084ffa4af6830ac12544ac6ea14953ca00eb1762b0df9349c0f6c8d2a799385910f558066cd0fb85b9ca437b1131a6043 + checksum: 10c0/586a95826be4d68056fa23d8e6c34353ce2ea59bf3ca8cf62bc784e60964d492d76e1b48760c43fd486ffb65a79d3fed9a4f91289e4f526f88c3b6acc0dfb00e languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" +"@babel/plugin-transform-computed-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-computed-properties@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/template": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/template": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3ca8a006f8e652b58c21ecb84df1d01a73f0a96b1d216fd09a890b235dd90cb966b152b603b88f7e850ae238644b1636ce5c30b7c029c0934b43383932372e4a + checksum: 10c0/8292c508b656b7722e2c2ca0f6f31339852e3ed2b9b80f6e068a4010e961b431ca109ecd467fc906283f4b1574c1e7b1cb68d35a4dea12079d386c15ff7e0eac languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" +"@babel/plugin-transform-destructuring@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/717e9a62c1b0c93c507f87b4eaf839ec08d3c3147f14d74ae240d8749488d9762a8b3950132be620a069bde70f4b3e4ee9867b226c973fcc40f3cdec975cde71 + checksum: 10c0/a08e706a9274a699abc3093f38c72d4a5354eac11c44572cc9ea049915b6e03255744297069fd94fcce82380725c5d6b1b11b9a84c0081aa3aa6fc2fdab98ef6 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" +"@babel/plugin-transform-dotall-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6c89286d1277c2a63802a453c797c87c1203f89e4c25115f7b6620f5fce15d8c8d37af613222f6aa497aa98773577a6ec8752e79e13d59bc5429270677ea010b + checksum: 10c0/758def705ec5a87ef910280dc2df5d2fda59dc5d4771c1725c7aed0988ae5b79e29aeb48109120301a3e1c6c03dfac84700469de06f38ca92c96834e09eadf5d languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" +"@babel/plugin-transform-duplicate-keys@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7e2640e4e6adccd5e7b0615b6e9239d7c98363e21c52086ea13759dfa11cf7159b255fc5331c2de435639ea8eb6acefae115ae0d797a3d19d12587652f8052a5 + checksum: 10c0/41072f57f83a6c2b15f3ee0b6779cdca105ff3d98061efe92ac02d6c7b90fdb6e7e293b8a4d5b9c690d9ae5d3ae73e6bde4596dc4d8c66526a0e5e1abc73c88c languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.23.4" +"@babel/plugin-transform-dynamic-import@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/19ae4a4a2ca86d35224734c41c48b2aa6a13139f3cfa1cbd18c0e65e461de8b65687dec7e52b7a72bb49db04465394c776aa1b13a2af5dc975b2a0cde3dcab67 + checksum: 10c0/7e2834780e9b5251ef341854043a89c91473b83c335358620ca721554877e64e416aeb3288a35f03e825c4958e07d5d00ead08c4490fadc276a21fe151d812f1 languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" +"@babel/plugin-transform-exponentiation-operator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.1" dependencies: "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5c33ee6a1bdc52fcdf0807f445b27e3fbdce33008531885e65a699762327565fffbcfde8395be7f21bcb22d582e425eddae45650c986462bb84ba68f43687516 + checksum: 10c0/f0fc4c5a9add25fd6bf23dabe6752e9b7c0a2b2554933dddfd16601245a2ba332b647951079c782bf3b94c6330e3638b9b4e0227f469a7c1c707446ba0eba6c7 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.23.4" +"@babel/plugin-transform-export-namespace-from@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/38bf04f851e36240bbe83ace4169da626524f4107bfb91f05b4ad93a5fb6a36d5b3d30b8883c1ba575ccfc1bac7938e90ca2e3cb227f7b3f4a9424beec6fd4a7 + checksum: 10c0/510bb23b2423d5fbffef69b356e4050929c21a7627e8194b1506dd935c7d9cbbd696c9ae9d7c3bcd7e6e7b69561b0b290c2d72d446327b40fc20ce40bbca6712 languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/plugin-transform-for-of@npm:7.23.6" +"@babel/plugin-transform-for-of@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-for-of@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/46681b6ab10f3ca2d961f50d4096b62ab5d551e1adad84e64be1ee23e72eb2f26a1e30e617e853c74f1349fffe4af68d33921a128543b6f24b6d46c09a3e2aec + checksum: 10c0/e4bc92b1f334246e62d4bde079938df940794db564742034f6597f2e38bd426e11ae8c5670448e15dd6e45c462f2a9ab3fa87259bddf7c08553ffd9457fc2b2c languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-function-name@npm:7.23.3" +"@babel/plugin-transform-function-name@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-function-name@npm:7.24.1" dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.15" + "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/89cb9747802118048115cf92a8f310752f02030549b26f008904990cbdc86c3d4a68e07ca3b5c46de8a46ed4df2cb576ac222c74c56de67253d2a3ddc2956083 + checksum: 10c0/65c1735ec3b5e43db9b5aebf3c16171c04b3050c92396b9e22dda0d2aaf51f43fdcf147f70a40678fd9a4ee2272a5acec4826e9c21bcf968762f4c184897ad75 languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-json-strings@npm:7.23.4" +"@babel/plugin-transform-json-strings@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-json-strings@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/39e82223992a9ad857722ae051291935403852ad24b0dd64c645ca1c10517b6bf9822377d88643fed8b3e61a4e3f7e5ae41cf90eb07c40a786505d47d5970e54 + checksum: 10c0/13d9b6a3c31ab4be853b3d49d8d1171f9bd8198562fd75da8f31e7de31398e1cfa6eb1d073bed93c9746e4f9c47a53b20f8f4c255ece3f88c90852ad3181dc2d languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-literals@npm:7.23.3" +"@babel/plugin-transform-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8292106b106201464c2bfdd5c014fe6a9ca1c0256eb0a8031deb20081e21906fe68b156186f77d993c23eeab6d8d6f5f66e8895eec7ed97ce6de5dbcafbcd7f4 + checksum: 10c0/a27cc7d565ee57b5a2bf136fa889c5c2f5988545ae7b3b2c83a7afe5dd37dfac80dca88b1c633c65851ce6af7d2095c04c01228657ce0198f918e64b5ccd01fa languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.23.4" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/87b034dd13143904e405887e6125d76c27902563486efc66b7d9a9d8f9406b76c6ac42d7b37224014af5783d7edb465db0cdecd659fa3227baad0b3a6a35deff + checksum: 10c0/98a2e0843ddfe51443c1bfcf08ba40ad8856fd4f8e397b392a5390a54f257c8c1b9a99d8ffc0fc7e8c55cce45e2cd9c2795a4450303f48f501bcbd662de44554 languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" +"@babel/plugin-transform-member-expression-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/687f24f3ec60b627fef6e87b9e2770df77f76727b9d5f54fa4c84a495bb24eb4a20f1a6240fa22d339d45aac5eaeb1b39882e941bfd00cf498f9c53478d1ec88 + checksum: 10c0/2af731d02aa4c757ef80c46df42264128cbe45bfd15e1812d1a595265b690a44ad036041c406a73411733540e1c4256d8174705ae6b8cfaf757fc175613993fd languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" +"@babel/plugin-transform-modules-amd@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-amd@npm:7.24.1" dependencies: "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/9f7ec036f7cfc588833a4dd117a44813b64aa4c1fd5bfb6c78f60198c1d290938213090c93a46f97a68a2490fad909e21a82b2472e95da74d108c125df21c8d5 + checksum: 10c0/71fd04e5e7026e6e52701214b1e9f7508ba371b757e5075fbb938a79235ed66a54ce65f89bb92b59159e9f03f01b392e6c4de6d255b948bec975a90cfd6809ef languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.3" +"@babel/plugin-transform-modules-commonjs@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.1" dependencies: "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-simple-access": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5c8840c5c9ecba39367ae17c973ed13dbc43234147b77ae780eec65010e2a9993c5d717721b23e8179f7cf49decdd325c509b241d69cfbf92aa647a1d8d5a37d + checksum: 10c0/efb3ea2047604a7eb44a9289311ebb29842fe6510ff8b66a77a60440448c65e1312a60dc48191ed98246bdbd163b5b6f3348a0669bcc0e3809e69c7c776b20fa languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.9" +"@babel/plugin-transform-modules-systemjs@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.1" dependencies: "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-validator-identifier": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/1926631fe9d87c0c53427a3420ad49da62d53320d0016b6afab64e5417a672aa5bdff3ea1d24746ffa1e43319c28a80f5d8cef0ad214760d399c293b5850500f + checksum: 10c0/38145f8abe8a4ce2b41adabe5d65eb7bd54a139dc58e2885fec975eb5cf247bd938c1dd9f09145c46dbe57d25dd0ef7f00a020e5eb0cbe8195b2065d51e2d93d languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" +"@babel/plugin-transform-modules-umd@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-modules-umd@npm:7.24.1" dependencies: "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f0d2f890a15b4367d0d8f160bed7062bdb145c728c24e9bfbc1211c7925aae5df72a88df3832c92dd2011927edfed4da1b1249e4c78402e893509316c0c2caa6 + checksum: 10c0/14c90c58562b54e17fe4a8ded3f627f9a993648f8378ef00cb2f6c34532032b83290d2ad54c7fff4f0c2cd49091bda780f8cc28926ec4b77a6c2141105a2e699 languageName: node linkType: hard @@ -969,138 +970,137 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-new-target@npm:7.23.3" +"@babel/plugin-transform-new-target@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-new-target@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f489b9e1f17b42b2ba6312d58351e757cb23a8409f64f2bb6af4c09d015359588a5d68943b20756f141d0931a94431c782f3ed1225228a930a04b07be0c31b04 + checksum: 10c0/c4cabe628163855f175a8799eb73d692b6f1dc347aae5022af0c253f80c92edb962e48ddccc98b691eff3d5d8e53c9a8f10894c33ba4cebc2e2f8f8fe554fb7a languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.3, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.23.4" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.3, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/bce490d22da5c87ff27fffaff6ad5a4d4979b8d7b72e30857f191e9c1e1824ba73bb8d7081166289369e388f94f0ce5383a593b1fc84d09464a062c75f824b0b + checksum: 10c0/c8532951506fb031287280cebeef10aa714f8a7cea2b62a13c805f0e0af945ba77a7c87e4bbbe4c37fe973e0e5d5e649cfac7f0374f57efc54cdf9656362a392 languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.23.4" +"@babel/plugin-transform-numeric-separator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e34902da4f5588dc4812c92cb1f6a5e3e3647baf7b4623e30942f551bf1297621abec4e322ebfa50b320c987c0f34d9eb4355b3d289961d9035e2126e3119c12 + checksum: 10c0/15e2b83292e586fb4f5b4b4021d4821a806ca6de2b77d5ad6c4e07aa7afa23704e31b4d683dac041afc69ac51b2461b96e8c98e46311cc1faba54c73f235044f languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.0" +"@babel/plugin-transform-object-rest-spread@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.1" dependencies: - "@babel/compat-data": "npm:^7.23.5" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.23.3" + "@babel/plugin-transform-parameters": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/02fe8b99ee6329e68b97b1b1b5410e50c6c20470e73dcd1d287c6ddb5623c654dce82327b2a3f6710ee3b512fe4950e43ab81d0bbc33d771f0cad3bc3cef87c6 + checksum: 10c0/e301f1a66b63bafc2bce885305cc88ab30ec875b5e2c7933fb7f9cbf0d954685aa10334ffcecf147ba19d6a1d7ffab37baf4ce871849d395941c56fdb3060f73 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-object-super@npm:7.23.3" +"@babel/plugin-transform-object-super@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-object-super@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-replace-supers": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a6856fd8c0afbe5b3318c344d4d201d009f4051e2f6ff6237ff2660593e93c5997a58772b13d639077c3e29ced3440247b29c496cd77b13af1e7559a70009775 + checksum: 10c0/d30e6b9e59a707efd7ed524fc0a8deeea046011a6990250f2e9280516683138e2d13d9c52daf41d78407bdab0378aef7478326f2a15305b773d851cb6e106157 languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.23.4" +"@babel/plugin-transform-optional-catch-binding@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4ef61812af0e4928485e28301226ce61139a8b8cea9e9a919215ebec4891b9fea2eb7a83dc3090e2679b7d7b2c8653da601fbc297d2addc54a908b315173991e + checksum: 10c0/68408b9ef772d9aa5dccf166c86dc4d2505990ce93e03dcfc65c73fb95c2511248e009ba9ccf5b96405fb85de1c16ad8291016b1cc5689ee4becb1e3050e0ae7 languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.23.3, @babel/plugin-transform-optional-chaining@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.4" +"@babel/plugin-transform-optional-chaining@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/305b773c29ad61255b0e83ec1e92b2f7af6aa58be4cba1e3852bddaa14f7d2afd7b4438f41c28b179d6faac7eb8d4fb5530a17920294f25d459b8f84406bfbfb + checksum: 10c0/b4688795229c9e9ce978eccf979fe515eb4e8d864d2dcd696baa937c8db13e3d46cff664a3cd6119dfe60e261f5d359b10c6783effab7cc91d75d03ad7f43d05 languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-parameters@npm:7.23.3" +"@babel/plugin-transform-parameters@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-parameters@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a8d4cbe0f6ba68d158f5b4215c63004fc37a1fdc539036eb388a9792017c8496ea970a1932ccb929308f61e53dc56676ed01d8df6f42bc0a85c7fd5ba82482b7 + checksum: 10c0/eee8d2f72d3ee0876dc8d85f949f4adf34685cfe36c814ebc20c96315f3891a53d43c764d636b939e34d55e6a6a4af9aa57ed0d7f9439eb5771a07277c669e55 languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-private-methods@npm:7.23.3" +"@babel/plugin-transform-private-methods@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-private-methods@npm:7.24.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/745a655edcd111b7f91882b921671ca0613079760d8c9befe336b8a9bc4ce6bb49c0c08941831c950afb1b225b4b2d3eaac8842e732db095b04db38efd8c34f4 + checksum: 10c0/d8e18587d2a8b71a795da5e8841b0e64f1525a99ad73ea8b9caa331bc271d69646e2e1e749fd634321f3df9d126070208ddac22a27ccf070566b2efb74fecd99 languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.23.4" +"@babel/plugin-transform-private-property-in-object@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8d31b28f24204b4d13514cd3a8f3033abf575b1a6039759ddd6e1d82dd33ba7281f9bc85c9f38072a665d69bfa26dc40737eefaf9d397b024654a483d2357bf5 + checksum: 10c0/33d2b9737de7667d7a1b704eef99bfecc6736157d9ea28c2e09010d5f25e33ff841c41d89a4430c5d47f4eb3384e24770fa0ec79600e1e38d6d16e2f9333b4b5 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" +"@babel/plugin-transform-property-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-property-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/b2549f23f90cf276c2e3058c2225c3711c2ad1c417e336d3391199445a9776dd791b83be47b2b9a7ae374b40652d74b822387e31fa5267a37bf49c122e1a9747 + checksum: 10c0/3bf3e01f7bb8215a8b6d0081b6f86fea23e3a4543b619e059a264ede028bc58cdfb0acb2c43271271915a74917effa547bc280ac636a9901fa9f2fb45623f87e languageName: node linkType: hard @@ -1115,26 +1115,26 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-react-display-name@npm:7.23.3" +"@babel/plugin-transform-react-display-name@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-react-display-name@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3aed142af7bd1aed1df2bdad91ed33ba1cdd5c3c67ce6eafba821ff72f129162a197ffb55f1eb1775af276abd5545934489a8257fef6c6665ddf253a4f39a939 + checksum: 10c0/adf1a3cb0df8134533a558a9072a67e34127fd489dfe431c3348a86dd41f3e74861d5d5134bbb68f61a9cdb3f7e79b2acea1346be94ce4d3328a64e5a9e09be1 languageName: node linkType: hard "@babel/plugin-transform-react-inline-elements@npm:^7.21.0": - version: 7.23.3 - resolution: "@babel/plugin-transform-react-inline-elements@npm:7.23.3" + version: 7.24.1 + resolution: "@babel/plugin-transform-react-inline-elements@npm:7.24.1" dependencies: "@babel/helper-builder-react-jsx": "npm:^7.22.10" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/138f7769b30f65d339588155affe677c68fde3cdaa060a2dc73152cc8c941c246d4b2ae73c8f1d9ddf1055e587fcb7379c155d49daec086ed50557f2117c1d50 + checksum: 10c0/83fc6afaebbe82a5b14936f00b6d1ffce1a3d908ac749d5daa43f724d32c98b50807ffc3ce2492c1aa49870189507b751993a4a079b9c3226c9b8aab783d08b6 languageName: node linkType: hard @@ -1149,208 +1149,208 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": - version: 7.22.15 - resolution: "@babel/plugin-transform-react-jsx@npm:7.22.15" +"@babel/plugin-transform-react-jsx@npm:^7.22.5, @babel/plugin-transform-react-jsx@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-react-jsx@npm:7.23.4" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" "@babel/helper-module-imports": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-jsx": "npm:^7.22.5" - "@babel/types": "npm:^7.22.15" + "@babel/plugin-syntax-jsx": "npm:^7.23.3" + "@babel/types": "npm:^7.23.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/db37491e3eea5530521e177380312f308f01f806866fa0ce08d48fc5a8c9eaf9a954f778fa1ff477248afb72e916eb66ab3d35254bb6a8979f8b8e74a0fd8873 + checksum: 10c0/8851b3adc515cd91bdb06ff3a23a0f81f0069cfef79dfb3fa744da4b7a82e3555ccb6324c4fa71ecf22508db13b9ff6a0ed96675f95fc87903b9fc6afb699580 languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.23.3" +"@babel/plugin-transform-react-pure-annotations@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/76287adeab656fb7f39243e5ab6a8c60069cf69fffeebd1566457d56cb2f966366a23bd755d3e369f4d0437459e3b76243df370caa7d7d2287a8560b66c53ca2 + checksum: 10c0/9eb3056fcaadd63d404fd5652b2a3f693bc4758ba753fee5b5c580c7a64346eeeb94e5a4f77a99c76f3cf06d1f1ad6c227647cd0b1219efe3d00cafa5a6e7b2a languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" +"@babel/plugin-transform-regenerator@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-regenerator@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" regenerator-transform: "npm:^0.15.2" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3b0e989ae5db78894ee300b24e07fbcec490c39ab48629c519377581cf94e90308f4ddc10a8914edc9f403e2d3ac7a7ae0ae09003629d852da03e2ba846299c6 + checksum: 10c0/0a333585d7c0b38d31cc549d0f3cf7c396d1d50b6588a307dc58325505ddd4f5446188bc536c4779431b396251801b3f32d6d8e87db8274bc84e8c41950737f7 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" +"@babel/plugin-transform-reserved-words@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-reserved-words@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4e6d61f6c9757592661cfbd2c39c4f61551557b98cb5f0995ef10f5540f67e18dde8a42b09716d58943b6e4b7ef5c9bcf19902839e7328a4d49149e0fecdbfcd + checksum: 10c0/936d6e73cafb2cbb495f6817c6f8463288dbc9ab3c44684b931ebc1ece24f0d55dfabc1a75ba1de5b48843d0fef448dcfdbecb8485e4014f8f41d0d1440c536f languageName: node linkType: hard "@babel/plugin-transform-runtime@npm:^7.22.4": - version: 7.24.0 - resolution: "@babel/plugin-transform-runtime@npm:7.24.0" + version: 7.24.1 + resolution: "@babel/plugin-transform-runtime@npm:7.24.1" dependencies: - "@babel/helper-module-imports": "npm:^7.22.15" + "@babel/helper-module-imports": "npm:^7.24.1" "@babel/helper-plugin-utils": "npm:^7.24.0" - babel-plugin-polyfill-corejs2: "npm:^0.4.8" - babel-plugin-polyfill-corejs3: "npm:^0.9.0" - babel-plugin-polyfill-regenerator: "npm:^0.5.5" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.1" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a632e0c6f4b1be21955646ba4f6e4af323daaa6ab68ce39f92f5186d444402e920b33cabd40759c36f72d8c36f256a35ea03060e407ca69bcf373fdcb450aa42 + checksum: 10c0/54e4dbc7aa6fd6c338c657108418f10301e88bbc4c00675f901d529d3bbf578e6a438076bc57c1efdb433853dea1d7c1a6ebaa18f936debc1fd9e25f7553c33a languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" +"@babel/plugin-transform-shorthand-properties@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/c423c66fec0b6503f50561741754c84366ef9e9818442c8881fbaa90cc363fd137084b9431cdc00ed2f1fd8c8a1a5982c4a7e1f2af3769db4caf2ac7ea55d4f0 + checksum: 10c0/8273347621183aada3cf1f3019d8d5f29467ba13a75b72cb405bc7f23b7e05fd85f4edb1e4d9f0103153dddb61826a42dc24d466480d707f8932c1923a4c25fa languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-spread@npm:7.23.3" +"@babel/plugin-transform-spread@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-spread@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a348e4ae47e4ceeceb760506ec7bf835ccc18a2cf70ec74ebfbe41bc172fa2412b05b7d1b86836f8aee375e41a04ff20486074778d0e2d19d668b33dc52e9dbb + checksum: 10c0/50a0302e344546d57e5c9f4dea575f88e084352eeac4e9a3e238c41739eef2df1daf4a7ebbb3ccb7acd3447f6a5ce9938405f98bf5f5583deceb8257f5a673c9 languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" +"@babel/plugin-transform-sticky-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/cd15c407906b41e4b924ea151e455c11274dba050771ee7154ad88a1a274140ac5e84efc8d08c4379f2f0cec8a09e4a0a3b2a3a954ba6a67d9fb35df1c714c56 + checksum: 10c0/786fe2ae11ef9046b9fa95677935abe495031eebf1274ad03f2054a20adea7b9dbd00336ac0b143f7924bc562e5e09793f6e8613607674b97e067d4838ccc4a0 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" +"@babel/plugin-transform-template-literals@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-template-literals@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/9b5f43788b9ffcb8f2b445a16b1aa40fcf23cb0446a4649445f098ec6b4cb751f243a535da623d59fefe48f4c40552f5621187a61811779076bab26863e3373d + checksum: 10c0/f73bcda5488eb81c6e7a876498d9e6b72be32fca5a4d9db9053491a2d1300cd27b889b463fd2558f3cd5826a85ed00f61d81b234aa55cb5a0abf1b6fa1bd5026 languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" +"@babel/plugin-transform-typeof-symbol@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/50e81d84c6059878be2a0e41e0d790cab10882cfb8fa85e8c2665ccb0b3cd7233f49197f17427bc7c1b36c80e07076640ecf1b641888d78b9cb91bc16478d84a + checksum: 10c0/d392f549bfd13414f59feecdf3fb286f266a3eb9107a9de818e57907bda56eed08d1f6f8e314d09bf99252df026a7fd4d5df839acd45078a777abcebaa9a8593 languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-typescript@npm:7.23.3" +"@babel/plugin-transform-typescript@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-typescript@npm:7.24.1" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-typescript": "npm:^7.23.3" + "@babel/helper-create-class-features-plugin": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/plugin-syntax-typescript": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a3c738efcf491ceb1eee646f57c44990ee0c80465527b88fcfa0b7602688c4ff8c165a4c5b62caf05d968b095212018fd30a02879c12d37c657081f57b31fb26 + checksum: 10c0/9abce423ed2d3cb9398b09e3ed9efea661e92bd32e919f5c7942ac4bad4c5fd23a1d575bb7444d8c92261b68fb626552e0d9eea960372b6b6f54c2c9699a2649 languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" +"@babel/plugin-transform-unicode-escapes@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f1ed54742dc982666f471df5d087cfda9c6dbf7842bec2d0f7893ed359b142a38c0210358f297ab5c7a3e11ec0dfb0e523de2e2edf48b62f257aaadd5f068866 + checksum: 10c0/67a72a1ed99639de6a93aead35b1993cb3f0eb178a8991fcef48732c38c9f0279c85bbe1e2e2477b85afea873e738ff0955a35057635ce67bc149038e2d8a28e languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-property-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/dca5702d43fac70351623a12e4dfa454fd028a67498888522b644fd1a02534fabd440106897e886ebcc6ce6a39c58094ca29953b6f51bc67372aa8845a5ae49f + checksum: 10c0/d9d9752df7d51bf9357c0bf3762fe16b8c841fca9ecf4409a16f15ccc34be06e8e71abfaee1251b7d451227e70e6b873b36f86b090efdb20f6f7de5fdb6c7a05 languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/df824dcca2f6e731f61d69103e87d5dd974d8a04e46e28684a4ba935ae633d876bded09b8db890fd72d0caf7b9638e2672b753671783613cc78d472951e2df8c + checksum: 10c0/6046ab38e5d14ed97dbb921bd79ac1d7ad9d3286da44a48930e980b16896db2df21e093563ec3c916a630dc346639bf47c5924a33902a06fe3bbb5cdc7ef5f2f languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.1" dependencies: "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/30fe1d29af8395a867d40a63a250ca89072033d9bc7d4587eeebeaf4ad7f776aab83064321bfdb1d09d7e29a1d392852361f4f60a353f0f4d1a3b435dcbf256b + checksum: 10c0/b6c1f6b90afeeddf97e5713f72575787fcb7179be7b4c961869bfbc66915f66540dc49da93e4369da15596bd44b896d1eb8a50f5e1fd907abd7a1a625901006b languageName: node linkType: hard "@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.22.4": - version: 7.24.0 - resolution: "@babel/preset-env@npm:7.24.0" + version: 7.24.1 + resolution: "@babel/preset-env@npm:7.24.1" dependencies: - "@babel/compat-data": "npm:^7.23.5" + "@babel/compat-data": "npm:^7.24.1" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-plugin-utils": "npm:^7.24.0" "@babel/helper-validator-option": "npm:^7.23.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.23.3" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.23.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.1" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-class-properties": "npm:^7.12.13" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.23.3" - "@babel/plugin-syntax-import-attributes": "npm:^7.23.3" + "@babel/plugin-syntax-import-assertions": "npm:^7.24.1" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.1" "@babel/plugin-syntax-import-meta": "npm:^7.10.4" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" @@ -1362,63 +1362,63 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.23.3" - "@babel/plugin-transform-async-generator-functions": "npm:^7.23.9" - "@babel/plugin-transform-async-to-generator": "npm:^7.23.3" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.23.3" - "@babel/plugin-transform-block-scoping": "npm:^7.23.4" - "@babel/plugin-transform-class-properties": "npm:^7.23.3" - "@babel/plugin-transform-class-static-block": "npm:^7.23.4" - "@babel/plugin-transform-classes": "npm:^7.23.8" - "@babel/plugin-transform-computed-properties": "npm:^7.23.3" - "@babel/plugin-transform-destructuring": "npm:^7.23.3" - "@babel/plugin-transform-dotall-regex": "npm:^7.23.3" - "@babel/plugin-transform-duplicate-keys": "npm:^7.23.3" - "@babel/plugin-transform-dynamic-import": "npm:^7.23.4" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.23.3" - "@babel/plugin-transform-export-namespace-from": "npm:^7.23.4" - "@babel/plugin-transform-for-of": "npm:^7.23.6" - "@babel/plugin-transform-function-name": "npm:^7.23.3" - "@babel/plugin-transform-json-strings": "npm:^7.23.4" - "@babel/plugin-transform-literals": "npm:^7.23.3" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.23.4" - "@babel/plugin-transform-member-expression-literals": "npm:^7.23.3" - "@babel/plugin-transform-modules-amd": "npm:^7.23.3" - "@babel/plugin-transform-modules-commonjs": "npm:^7.23.3" - "@babel/plugin-transform-modules-systemjs": "npm:^7.23.9" - "@babel/plugin-transform-modules-umd": "npm:^7.23.3" + "@babel/plugin-transform-arrow-functions": "npm:^7.24.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.24.1" + "@babel/plugin-transform-async-to-generator": "npm:^7.24.1" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.1" + "@babel/plugin-transform-block-scoping": "npm:^7.24.1" + "@babel/plugin-transform-class-properties": "npm:^7.24.1" + "@babel/plugin-transform-class-static-block": "npm:^7.24.1" + "@babel/plugin-transform-classes": "npm:^7.24.1" + "@babel/plugin-transform-computed-properties": "npm:^7.24.1" + "@babel/plugin-transform-destructuring": "npm:^7.24.1" + "@babel/plugin-transform-dotall-regex": "npm:^7.24.1" + "@babel/plugin-transform-duplicate-keys": "npm:^7.24.1" + "@babel/plugin-transform-dynamic-import": "npm:^7.24.1" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.1" + "@babel/plugin-transform-export-namespace-from": "npm:^7.24.1" + "@babel/plugin-transform-for-of": "npm:^7.24.1" + "@babel/plugin-transform-function-name": "npm:^7.24.1" + "@babel/plugin-transform-json-strings": "npm:^7.24.1" + "@babel/plugin-transform-literals": "npm:^7.24.1" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.1" + "@babel/plugin-transform-member-expression-literals": "npm:^7.24.1" + "@babel/plugin-transform-modules-amd": "npm:^7.24.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1" + "@babel/plugin-transform-modules-systemjs": "npm:^7.24.1" + "@babel/plugin-transform-modules-umd": "npm:^7.24.1" "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.22.5" - "@babel/plugin-transform-new-target": "npm:^7.23.3" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.23.4" - "@babel/plugin-transform-numeric-separator": "npm:^7.23.4" - "@babel/plugin-transform-object-rest-spread": "npm:^7.24.0" - "@babel/plugin-transform-object-super": "npm:^7.23.3" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.23.4" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.4" - "@babel/plugin-transform-parameters": "npm:^7.23.3" - "@babel/plugin-transform-private-methods": "npm:^7.23.3" - "@babel/plugin-transform-private-property-in-object": "npm:^7.23.4" - "@babel/plugin-transform-property-literals": "npm:^7.23.3" - "@babel/plugin-transform-regenerator": "npm:^7.23.3" - "@babel/plugin-transform-reserved-words": "npm:^7.23.3" - "@babel/plugin-transform-shorthand-properties": "npm:^7.23.3" - "@babel/plugin-transform-spread": "npm:^7.23.3" - "@babel/plugin-transform-sticky-regex": "npm:^7.23.3" - "@babel/plugin-transform-template-literals": "npm:^7.23.3" - "@babel/plugin-transform-typeof-symbol": "npm:^7.23.3" - "@babel/plugin-transform-unicode-escapes": "npm:^7.23.3" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.23.3" - "@babel/plugin-transform-unicode-regex": "npm:^7.23.3" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.23.3" + "@babel/plugin-transform-new-target": "npm:^7.24.1" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.1" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.1" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.1" + "@babel/plugin-transform-object-super": "npm:^7.24.1" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.1" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" + "@babel/plugin-transform-parameters": "npm:^7.24.1" + "@babel/plugin-transform-private-methods": "npm:^7.24.1" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.1" + "@babel/plugin-transform-property-literals": "npm:^7.24.1" + "@babel/plugin-transform-regenerator": "npm:^7.24.1" + "@babel/plugin-transform-reserved-words": "npm:^7.24.1" + "@babel/plugin-transform-shorthand-properties": "npm:^7.24.1" + "@babel/plugin-transform-spread": "npm:^7.24.1" + "@babel/plugin-transform-sticky-regex": "npm:^7.24.1" + "@babel/plugin-transform-template-literals": "npm:^7.24.1" + "@babel/plugin-transform-typeof-symbol": "npm:^7.24.1" + "@babel/plugin-transform-unicode-escapes": "npm:^7.24.1" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.1" + "@babel/plugin-transform-unicode-regex": "npm:^7.24.1" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.1" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.8" - babel-plugin-polyfill-corejs3: "npm:^0.9.0" - babel-plugin-polyfill-regenerator: "npm:^0.5.5" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.1" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" core-js-compat: "npm:^3.31.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/cb5098bb860aede8418f204d7a693108d7c318edbb227f9842ac6aa71f2154ea1737846994af9bcd0c0b716cd73904f69f09bef635a9679465ec3558144beb4f + checksum: 10c0/c9fd96ed8561ac3f8d2e490face5b763ea05a7908770a52fe2ffa0e72581c5cd8ea5c016a85f47775fc3584c6d748eea62044c19ae3f4edf11ffc1e1e9c8bffd languageName: node linkType: hard @@ -1436,33 +1436,33 @@ __metadata: linkType: hard "@babel/preset-react@npm:^7.12.5, @babel/preset-react@npm:^7.22.3": - version: 7.23.3 - resolution: "@babel/preset-react@npm:7.23.3" + version: 7.24.1 + resolution: "@babel/preset-react@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-transform-react-display-name": "npm:^7.23.3" - "@babel/plugin-transform-react-jsx": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-validator-option": "npm:^7.23.5" + "@babel/plugin-transform-react-display-name": "npm:^7.24.1" + "@babel/plugin-transform-react-jsx": "npm:^7.23.4" "@babel/plugin-transform-react-jsx-development": "npm:^7.22.5" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.23.3" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/cecb2493e09fd4ffa5effcef1d06e968386b1bfe077a99834f7e8ef249208274fca62fe5a6b3986ef1c1c3900b2eb409adb528ae1b73dba31397b16f9262e83c + checksum: 10c0/a842abc5a024ed68a0ce4c1244607d40165cb6f8cf1817ebda282e470f20302d81c6a61cb41c1a31aa6c4e99ce93df4dd9e998a8ded1417c25d7480f0e14103a languageName: node linkType: hard "@babel/preset-typescript@npm:^7.21.5": - version: 7.23.3 - resolution: "@babel/preset-typescript@npm:7.23.3" + version: 7.24.1 + resolution: "@babel/preset-typescript@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-syntax-jsx": "npm:^7.23.3" - "@babel/plugin-transform-modules-commonjs": "npm:^7.23.3" - "@babel/plugin-transform-typescript": "npm:^7.23.3" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-validator-option": "npm:^7.23.5" + "@babel/plugin-syntax-jsx": "npm:^7.24.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1" + "@babel/plugin-transform-typescript": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e72b654c7f0f08b35d7e1c0e3a59c0c13037f295c425760b8b148aa7dde01e6ddd982efc525710f997a1494fafdd55cb525738c016609e7e4d703d02014152b7 + checksum: 10c0/0033dc6fbc898ed0d8017c83a2dd5e095c82909e2f83e48cf9f305e3e9287148758c179ad90f27912cf98ca68bfec3643c57c70c0ca34d3a6c50dc8243aef406 languageName: node linkType: hard @@ -1483,11 +1483,11 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": - version: 7.24.0 - resolution: "@babel/runtime@npm:7.24.0" + version: 7.24.1 + resolution: "@babel/runtime@npm:7.24.1" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/3495eed727bf4a4f84c35bb51ab53317ae38f4bbc3b1d0a8303751f9dfa0ce6f5fb2afced72b76c3dd0d8bb2ccb84787559a4dee9886291a36b26f02f0f759b4 + checksum: 10c0/500c6a99ddd84f37c7bc5dbc84777af47b1372b20e879941670451d55484faf18a673c5ebee9ca2b0f36208a729417873b35b1b92e76f811620f6adf7b8cb0f1 languageName: node linkType: hard @@ -1502,25 +1502,25 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:7, @babel/traverse@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/traverse@npm:7.24.0" +"@babel/traverse@npm:7, @babel/traverse@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/traverse@npm:7.24.1" dependencies: - "@babel/code-frame": "npm:^7.23.5" - "@babel/generator": "npm:^7.23.6" + "@babel/code-frame": "npm:^7.24.1" + "@babel/generator": "npm:^7.24.1" "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-function-name": "npm:^7.23.0" "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.24.0" + "@babel/parser": "npm:^7.24.1" "@babel/types": "npm:^7.24.0" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/55ffd2b0ce0fbd0a09051edc4def4fb1e96f35e0b100c0dc2a7429df569971ae312c290e980e423471f350961705698a257c7eea8c8304918024cc26f02468ba + checksum: 10c0/c087b918f6823776537ba246136c70e7ce0719fc05361ebcbfd16f4e6f2f6f1f8f4f9167f1d9b675f27d12074839605189cc9d689de20b89a85e7c140f23daab languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.24.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.4, @babel/types@npm:^7.24.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.24.0 resolution: "@babel/types@npm:7.24.0" dependencies: @@ -2231,14 +2231,14 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" dependencies: - "@jridgewell/set-array": "npm:^1.0.1" + "@jridgewell/set-array": "npm:^1.2.1" "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 10c0/376fc11cf5a967318ba3ddd9d8e91be528eab6af66810a713c49b0c3f8dc67e9949452c51c38ab1b19aa618fb5e8594da5a249977e26b1e7fea1ee5a1fcacc74 + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb languageName: node linkType: hard @@ -2249,10 +2249,10 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 10c0/bc7ab4c4c00470de4e7562ecac3c0c84f53e7ee8a711e546d67c47da7febe7c45cd67d4d84ee3c9b2c05ae8e872656cdded8a707a283d30bd54fbc65aef821ab +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 languageName: node linkType: hard @@ -2273,13 +2273,13 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.20 - resolution: "@jridgewell/trace-mapping@npm:0.3.20" +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/0ea0b2675cf513ec44dc25605616a3c9b808b9832e74b5b63c44260d66b58558bba65764f81928fc1033ead911f8718dca1134049c3e7a93937faf436671df31 + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 languageName: node linkType: hard @@ -4789,39 +4789,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.8": - version: 0.4.8 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.8" +"babel-plugin-polyfill-corejs2@npm:^0.4.10": + version: 0.4.10 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.10" dependencies: "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.5.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/843e7528de0e03a31a6f3837896a95f75b0b24b0294a077246282372279e974400b0bdd82399e8f9cbfe42c87ed56540fd71c33eafb7c8e8b9adac546ecc5fe5 + checksum: 10c0/910bfb1d809cae49cf43348f9b1e4a5e4c895aa25686fdd2ff8af7b7a996b88ad39597707905d097e08d4e70e14340ac935082ef4e035e77f68741f813f2a80d languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.9.0": - version: 0.9.0 - resolution: "babel-plugin-polyfill-corejs3@npm:0.9.0" +"babel-plugin-polyfill-corejs3@npm:^0.10.1": + version: 0.10.1 + resolution: "babel-plugin-polyfill-corejs3@npm:0.10.1" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.5.0" - core-js-compat: "npm:^3.34.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.1" + core-js-compat: "npm:^3.36.0" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/b857010736c5e42e20b683973dae862448a42082fcc95b3ef188305a6864a4f94b5cbd568e49e4cd7172c6b2eace7bc403c3ba0984fbe5479474ade01126d559 + checksum: 10c0/54ad0b2d2eb44ae8cc20485ef3be6097e262e02ee76003f39734af5e421743dcff478bfc3cc8fef7cda298e1b507c618ff161c47672fd1ae598df0a2ca48b4e1 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.5": - version: 0.5.5 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.5" +"babel-plugin-polyfill-regenerator@npm:^0.6.1": + version: 0.6.1 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.1" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.5.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/2aab692582082d54e0df9f9373dca1b223e65b4e7e96440160f27ed8803d417a1fa08da550f08aa3820d2010329ca91b68e2b6e9bd7aed51c93d46dfe79629bb + checksum: 10c0/0b55a35a75a261f62477d8d0f0c4a8e3b66f109323ce301d7de6898e168c41224de3bc26a92f48f2c7fcc19dfd1fc60fe71098bfd4f804a0463ff78586892403 languageName: node linkType: hard @@ -5883,12 +5883,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.34.0": - version: 3.35.1 - resolution: "core-js-compat@npm:3.35.1" +"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.36.0": + version: 3.36.1 + resolution: "core-js-compat@npm:3.36.1" dependencies: - browserslist: "npm:^4.22.2" - checksum: 10c0/c3b872e1f9703aa9554cce816207d85730da4703f1776c540b4da11bbbef6d9a1e6041625b5c1f58d2ada3d05f4a2b92897b7de5315c5ecd5d33d50dec86cca7 + browserslist: "npm:^4.23.0" + checksum: 10c0/70fba18a4095cd8ac04e5ba8cee251e328935859cf2851c1f67770068ea9f9fe71accb1b7de17cd3c9a28d304a4c41712bd9aa895110ebb6e3be71b666b029d1 languageName: node linkType: hard From bd06963c165b376a11d90f632e1988d5890c970f Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 19 Mar 2024 14:39:30 +0100 Subject: [PATCH 238/954] Slightly increase font weight of favorite/boost numbers in detailed statuses (#29648) --- 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 8b7e5f5e84..71f9e0d9d0 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1688,6 +1688,7 @@ body > [data-popper-placement] { .animated-number { color: $secondary-text-color; + font-weight: 500; } } From bc6f9befde4e08426127730acebdc13064e1eeb6 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 19 Mar 2024 14:40:16 +0100 Subject: [PATCH 239/954] =?UTF-8?q?Change=20=E2=80=9CNotifications?= =?UTF-8?q?=E2=80=9D=20settings=20page=20to=20=E2=80=9CE-mail=20notificati?= =?UTF-8?q?ons=E2=80=9D=20(#29646)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/locales/en.yml | 2 +- config/navigation.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 6fc81ca5fb..f45175e3fd 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1656,7 +1656,7 @@ en: import: Import import_and_export: Import and export migrate: Account migration - notifications: Notifications + notifications: E-mail notifications preferences: Preferences profile: Public profile relationships: Follows and followers diff --git a/config/navigation.rb b/config/navigation.rb index 1e7acf3b9c..734e5294b5 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -12,7 +12,7 @@ SimpleNavigation::Configuration.run do |navigation| n.item :preferences, safe_join([fa_icon('cog fw'), t('settings.preferences')]), settings_preferences_path, if: -> { current_user.functional? && !self_destruct } do |s| s.item :appearance, safe_join([fa_icon('desktop fw'), t('settings.appearance')]), settings_preferences_appearance_path - s.item :notifications, safe_join([fa_icon('bell fw'), t('settings.notifications')]), settings_preferences_notifications_path + s.item :notifications, safe_join([fa_icon('envelope fw'), t('settings.notifications')]), settings_preferences_notifications_path s.item :other, safe_join([fa_icon('cog fw'), t('preferences.other')]), settings_preferences_other_path end From d7ab5655efde24fd73f9ad4cd6c763852a7004f8 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 19 Mar 2024 10:17:18 -0400 Subject: [PATCH 240/954] Replace `render_symbol` method with `inline_svg_tag` usage (#29647) --- app/helpers/branding_helper.rb | 11 ----------- app/views/layouts/application.html.haml | 4 ++-- app/views/layouts/embedded.html.haml | 2 +- 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/app/helpers/branding_helper.rb b/app/helpers/branding_helper.rb index 2b9c233c23..f72d6df5d9 100644 --- a/app/helpers/branding_helper.rb +++ b/app/helpers/branding_helper.rb @@ -21,15 +21,4 @@ module BrandingHelper def render_logo image_pack_tag('logo.svg', alt: 'Mastodon', class: 'logo logo--icon') end - - def render_symbol(version = :icon) - path = case version - when :icon - 'logo-symbol-icon.svg' - when :wordmark - 'logo-symbol-wordmark.svg' - end - - render(file: Rails.root.join('app', 'javascript', 'images', path)).html_safe # rubocop:disable Rails/OutputSafety - end end diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index c721073670..449657f8ca 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -44,5 +44,5 @@ = content_for?(:content) ? yield(:content) : yield .logo-resources{ 'tabindex' => '-1', 'inert' => true, 'aria-hidden' => true } - = render_symbol :icon - = render_symbol :wordmark + = inline_svg_tag 'logo-symbol-icon.svg' + = inline_svg_tag 'logo-symbol-wordmark.svg' diff --git a/app/views/layouts/embedded.html.haml b/app/views/layouts/embedded.html.haml index d8aa522d80..54d4ba7157 100644 --- a/app/views/layouts/embedded.html.haml +++ b/app/views/layouts/embedded.html.haml @@ -21,4 +21,4 @@ = yield .logo-resources{ 'tabindex' => '-1', 'inert' => true, 'aria-hidden' => true } - = render_symbol :icon + = inline_svg_tag 'logo-symbol-icon.svg' From 62e266fbd6231bd8083df774a93e88155d3f0bd9 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 19 Mar 2024 11:39:14 -0400 Subject: [PATCH 241/954] Add `BrowserDetection` model concern (#29513) --- app/models/concerns/browser_detection.rb | 27 ++++++++++++++++++++++++ app/models/login_activity.rb | 14 ++---------- app/models/session_activation.rb | 19 ++--------------- 3 files changed, 31 insertions(+), 29 deletions(-) create mode 100644 app/models/concerns/browser_detection.rb diff --git a/app/models/concerns/browser_detection.rb b/app/models/concerns/browser_detection.rb new file mode 100644 index 0000000000..d42d0a5c99 --- /dev/null +++ b/app/models/concerns/browser_detection.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module BrowserDetection + extend ActiveSupport::Concern + + included do + before_save :assign_user_agent + end + + def detection + @detection ||= Browser.new(user_agent) + end + + def browser + detection.id + end + + def platform + detection.platform.id + end + + private + + def assign_user_agent + self.user_agent ||= '' + end +end diff --git a/app/models/login_activity.rb b/app/models/login_activity.rb index 654dd623ad..240d571c0e 100644 --- a/app/models/login_activity.rb +++ b/app/models/login_activity.rb @@ -16,21 +16,11 @@ # class LoginActivity < ApplicationRecord + include BrowserDetection + enum :authentication_method, { password: 'password', otp: 'otp', webauthn: 'webauthn', sign_in_token: 'sign_in_token', omniauth: 'omniauth' } belongs_to :user validates :authentication_method, inclusion: { in: authentication_methods.keys } - - def detection - @detection ||= Browser.new(user_agent) - end - - def browser - detection.id - end - - def platform - detection.platform.id - end end diff --git a/app/models/session_activation.rb b/app/models/session_activation.rb index c67180d3ba..d0a77daf0a 100644 --- a/app/models/session_activation.rb +++ b/app/models/session_activation.rb @@ -16,6 +16,8 @@ # class SessionActivation < ApplicationRecord + include BrowserDetection + belongs_to :user, inverse_of: :session_activations belongs_to :access_token, class_name: 'Doorkeeper::AccessToken', dependent: :destroy, optional: true belongs_to :web_push_subscription, class_name: 'Web::PushSubscription', dependent: :destroy, optional: true @@ -24,19 +26,6 @@ class SessionActivation < ApplicationRecord to: :access_token, allow_nil: true - def detection - @detection ||= Browser.new(user_agent) - end - - def browser - detection.id - end - - def platform - detection.platform.id - end - - before_save :assign_user_agent before_create :assign_access_token class << self @@ -67,10 +56,6 @@ class SessionActivation < ApplicationRecord private - def assign_user_agent - self.user_agent = '' if user_agent.nil? - end - def assign_access_token self.access_token = Doorkeeper::AccessToken.create!(access_token_attributes) end From ffc5be4820ed7bad4656489f096230dd7965140b Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 19 Mar 2024 16:39:26 +0100 Subject: [PATCH 242/954] =?UTF-8?q?Change=20filtered=20icon=20from=20?= =?UTF-8?q?=E2=80=9Carchive=E2=80=9D=20to=20=E2=80=9Cinventory=202?= =?UTF-8?q?=E2=80=9D=20(#29652)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/filtered_notifications_banner.jsx | 5 ++--- app/javascript/mastodon/features/notifications/request.jsx | 4 ++-- app/javascript/mastodon/features/notifications/requests.jsx | 4 ++-- app/javascript/material-icons/400-24px/archive-fill.svg | 1 - app/javascript/material-icons/400-24px/archive.svg | 1 - app/javascript/material-icons/400-24px/inventory_2-fill.svg | 1 + app/javascript/material-icons/400-24px/inventory_2.svg | 1 + 7 files changed, 8 insertions(+), 9 deletions(-) delete mode 100644 app/javascript/material-icons/400-24px/archive-fill.svg delete mode 100644 app/javascript/material-icons/400-24px/archive.svg create mode 100644 app/javascript/material-icons/400-24px/inventory_2-fill.svg create mode 100644 app/javascript/material-icons/400-24px/inventory_2.svg diff --git a/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx b/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx index bf9467bd63..adf58afbf0 100644 --- a/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx +++ b/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx @@ -6,8 +6,7 @@ import { Link } from 'react-router-dom'; import { useDispatch, useSelector } from 'react-redux'; - -import ArchiveIcon from '@/material-icons/400-24px/archive.svg?react'; +import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react'; import { fetchNotificationPolicy } from 'mastodon/actions/notifications'; import { Icon } from 'mastodon/components/icon'; import { toCappedNumber } from 'mastodon/utils/numbers'; @@ -34,7 +33,7 @@ export const FilteredNotificationsBanner = () => { return ( - +
diff --git a/app/javascript/mastodon/features/notifications/request.jsx b/app/javascript/mastodon/features/notifications/request.jsx index d1f4498440..09bef3beab 100644 --- a/app/javascript/mastodon/features/notifications/request.jsx +++ b/app/javascript/mastodon/features/notifications/request.jsx @@ -7,8 +7,8 @@ import { Helmet } from 'react-helmet'; import { useSelector, useDispatch } from 'react-redux'; -import ArchiveIcon from '@/material-icons/400-24px/archive.svg?react'; import DoneIcon from '@/material-icons/400-24px/done.svg?react'; +import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react'; import VolumeOffIcon from '@/material-icons/400-24px/volume_off.svg?react'; import { fetchNotificationRequest, fetchNotificationsForRequest, expandNotificationsForRequest, acceptNotificationRequest, dismissNotificationRequest } from 'mastodon/actions/notifications'; import Column from 'mastodon/components/column'; @@ -94,7 +94,7 @@ export const NotificationRequest = ({ multiColumn, params: { id } }) => { { \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/archive.svg b/app/javascript/material-icons/400-24px/archive.svg deleted file mode 100644 index 6b72fca4ee..0000000000 --- a/app/javascript/material-icons/400-24px/archive.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/inventory_2-fill.svg b/app/javascript/material-icons/400-24px/inventory_2-fill.svg new file mode 100644 index 0000000000..10ec85da04 --- /dev/null +++ b/app/javascript/material-icons/400-24px/inventory_2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/inventory_2.svg b/app/javascript/material-icons/400-24px/inventory_2.svg new file mode 100644 index 0000000000..d00fb1a632 --- /dev/null +++ b/app/javascript/material-icons/400-24px/inventory_2.svg @@ -0,0 +1 @@ + \ No newline at end of file From 4c84891453378ca9db03657ec42f96684223e85c Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 19 Mar 2024 12:11:10 -0400 Subject: [PATCH 243/954] Pull out full `li` element into admin/status_edits/status_edit partial (#29499) --- .../admin/status_edits/_status_edit.html.haml | 48 +++++++++++-------- app/views/admin/statuses/show.html.haml | 13 +---- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/app/views/admin/status_edits/_status_edit.html.haml b/app/views/admin/status_edits/_status_edit.html.haml index 19a0e063da..7254777213 100644 --- a/app/views/admin/status_edits/_status_edit.html.haml +++ b/app/views/admin/status_edits/_status_edit.html.haml @@ -1,20 +1,30 @@ -.status - .status__content>< - - if status_edit.spoiler_text.blank? - = prerender_custom_emojis(status_content_format(status_edit), status_edit.emojis) - - else - %details< - %summary>< - %strong> Content warning: #{prerender_custom_emojis(h(status_edit.spoiler_text), status_edit.emojis)} - = prerender_custom_emojis(status_content_format(status_edit), status_edit.emojis) - - - unless status_edit.ordered_media_attachments.empty? - = render partial: 'admin/reports/media_attachments', locals: { status: status_edit } - - .detailed-status__meta - %time.formatted{ datetime: status_edit.created_at.iso8601, title: l(status_edit.created_at) }= l(status_edit.created_at) - - - if status_edit.sensitive? +%li + .history__entry + %h5 + - if status_edit_iteration.first? + = t('admin.statuses.original_status') + - else + = t('admin.statuses.status_changed') · - = fa_icon('eye-slash fw') - = t('stream_entries.sensitive_content') + %time.formatted{ datetime: status_edit.created_at.iso8601, title: l(status_edit.created_at) }= l(status_edit.created_at) + + .status + .status__content>< + - if status_edit.spoiler_text.blank? + = prerender_custom_emojis(status_content_format(status_edit), status_edit.emojis) + - else + %details< + %summary>< + %strong> Content warning: #{prerender_custom_emojis(h(status_edit.spoiler_text), status_edit.emojis)} + = prerender_custom_emojis(status_content_format(status_edit), status_edit.emojis) + + - unless status_edit.ordered_media_attachments.empty? + = render partial: 'admin/reports/media_attachments', locals: { status: status_edit } + + .detailed-status__meta + %time.formatted{ datetime: status_edit.created_at.iso8601, title: l(status_edit.created_at) }= l(status_edit.created_at) + + - if status_edit.sensitive? + · + = fa_icon('eye-slash fw') + = t('stream_entries.sensitive_content') diff --git a/app/views/admin/statuses/show.html.haml b/app/views/admin/statuses/show.html.haml index 0e88624def..9cadde2870 100644 --- a/app/views/admin/statuses/show.html.haml +++ b/app/views/admin/statuses/show.html.haml @@ -47,15 +47,4 @@ %h3= t('admin.statuses.history') %ol.history - - batched_ordered_status_edits.with_index do |status_edit, i| - %li - .history__entry - %h5 - - if i.zero? - = t('admin.statuses.original_status') - - else - = t('admin.statuses.status_changed') - · - %time.formatted{ datetime: status_edit.created_at.iso8601, title: l(status_edit.created_at) }= l(status_edit.created_at) - - = render status_edit + = render partial: 'admin/status_edits/status_edit', collection: batched_ordered_status_edits From 5f1380415fc3bc8abe38c5077cb30b6f2ff60f58 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Mar 2024 09:19:08 +0100 Subject: [PATCH 244/954] Update dependency postcss to v8.4.37 (#29656) 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 8d504c719a..bb2722fba0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13042,13 +13042,13 @@ __metadata: linkType: hard "postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.33": - version: 8.4.36 - resolution: "postcss@npm:8.4.36" + version: 8.4.37 + resolution: "postcss@npm:8.4.37" dependencies: nanoid: "npm:^3.3.7" picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.1.0" - checksum: 10c0/e7c834e31d8f4e8dfd0a427df36fdc7bdc58a16e373551618e2c3ac172019eb816b24f1b4709311ebcade8d3ba31b2d75522d28ef45ecbbeb11eb01f265579fb + source-map-js: "npm:^1.2.0" + checksum: 10c0/0b5730ad0ccbceaf0faaa4a283a144adefd23254f17dbdd63be5e0b37193c7df58003f88742c04c3ae6fd60d1a5158b331a4ce926797fb21e94833ae83c6bf69 languageName: node linkType: hard @@ -14989,10 +14989,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.1.0": - version: 1.1.0 - resolution: "source-map-js@npm:1.1.0" - checksum: 10c0/d1f016efe4fcf67fd92e36da0670f2889b13a36cc453329758336450e811c61164376eb451b453b4dd4e89a760f841b0a014942d54f240af31a791829bc0e336 +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.0": + version: 1.2.0 + resolution: "source-map-js@npm:1.2.0" + checksum: 10c0/7e5f896ac10a3a50fe2898e5009c58ff0dc102dcb056ed27a354623a0ece8954d4b2649e1a1b2b52ef2e161d26f8859c7710350930751640e71e374fe2d321a4 languageName: node linkType: hard From 6c0b1a41a1b3ef15288a29ac2d486a822c4cbd14 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 20 Mar 2024 09:39:42 +0100 Subject: [PATCH 245/954] New Crowdin Translations (automated) (#29657) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/fo.json | 2 +- app/javascript/mastodon/locales/hu.json | 22 ++++++------ app/javascript/mastodon/locales/ko.json | 9 +++-- app/javascript/mastodon/locales/nn.json | 28 +++++++++++++++- app/javascript/mastodon/locales/pt-PT.json | 39 ++++++++++++++++++++++ app/javascript/mastodon/locales/ry.json | 8 +++++ app/javascript/mastodon/locales/sk.json | 14 ++++++++ config/locales/an.yml | 1 - config/locales/ar.yml | 1 - config/locales/ast.yml | 1 - config/locales/be.yml | 1 - config/locales/bg.yml | 5 ++- config/locales/ca.yml | 5 ++- config/locales/ckb.yml | 1 - config/locales/co.yml | 1 - config/locales/cs.yml | 1 - config/locales/cy.yml | 1 - config/locales/da.yml | 5 ++- config/locales/de.yml | 5 ++- config/locales/el.yml | 1 - config/locales/en-GB.yml | 1 - config/locales/eo.yml | 1 - config/locales/es-AR.yml | 2 +- config/locales/es-MX.yml | 8 ++++- config/locales/es.yml | 2 +- config/locales/et.yml | 1 - config/locales/eu.yml | 5 ++- config/locales/fa.yml | 1 - config/locales/fi.yml | 5 ++- config/locales/fo.yml | 9 +++-- config/locales/fr-CA.yml | 1 - config/locales/fr.yml | 1 - config/locales/fy.yml | 1 - config/locales/ga.yml | 1 - config/locales/gd.yml | 1 - config/locales/gl.yml | 5 ++- config/locales/he.yml | 4 ++- config/locales/hr.yml | 1 - config/locales/hu.yml | 5 ++- config/locales/hy.yml | 1 - config/locales/id.yml | 1 - config/locales/ie.yml | 1 - config/locales/io.yml | 1 - config/locales/is.yml | 4 ++- config/locales/it.yml | 5 ++- config/locales/ja.yml | 1 - config/locales/ka.yml | 1 - config/locales/kab.yml | 1 - config/locales/kk.yml | 1 - config/locales/ko.yml | 7 +++- config/locales/ku.yml | 1 - config/locales/lad.yml | 4 ++- config/locales/lt.yml | 4 ++- config/locales/lv.yml | 1 - config/locales/ml.yml | 2 -- config/locales/ms.yml | 1 - config/locales/my.yml | 1 - config/locales/nl.yml | 5 ++- config/locales/nn.yml | 24 ++++++++----- config/locales/no.yml | 1 - config/locales/oc.yml | 1 - config/locales/pl.yml | 5 ++- config/locales/pt-BR.yml | 1 - config/locales/pt-PT.yml | 8 ++++- config/locales/ru.yml | 1 - config/locales/sc.yml | 1 - config/locales/sco.yml | 1 - config/locales/si.yml | 1 - config/locales/simple_form.nn.yml | 2 +- config/locales/sk.yml | 8 ++++- config/locales/sl.yml | 5 ++- config/locales/sq.yml | 5 ++- config/locales/sr-Latn.yml | 1 - config/locales/sr.yml | 1 - config/locales/sv.yml | 2 +- config/locales/th.yml | 5 ++- config/locales/tr.yml | 5 ++- config/locales/tt.yml | 1 - config/locales/uk.yml | 5 ++- config/locales/vi.yml | 1 - config/locales/zgh.yml | 1 - config/locales/zh-CN.yml | 5 ++- config/locales/zh-HK.yml | 1 - config/locales/zh-TW.yml | 5 ++- 84 files changed, 243 insertions(+), 103 deletions(-) diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index c3e3f8cc1a..27c0c8548f 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -7,7 +7,7 @@ "about.domain_blocks.silenced.explanation": "Yvirhøvur, so sært tú ikki vangar og innihald frá hesum ambætaranum, uttan so at tú skilliga leitar hesi upp ella velur tey við at fylgja teimum.", "about.domain_blocks.silenced.title": "Avmarkað", "about.domain_blocks.suspended.explanation": "Ongar dátur frá hesum ambætara verða viðgjørd, goymd ella deild, tað ger, at samskifti við aðrar ambætarar er iki møguligt.", - "about.domain_blocks.suspended.title": "Koyrdur frá", + "about.domain_blocks.suspended.title": "Gjørt óvirkið", "about.not_available": "Hetta er ikki tøkt á føroyska servaranum enn.", "about.powered_by": "Miðfirra almennur miðil koyrandi á {mastodon}", "about.rules": "Ambætarareglur", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index c13c8dc220..38e46399d3 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -92,11 +92,11 @@ "block_modal.remote_users_caveat": "Arra kérjük a {domain} kiszolgálót, hogy tartsa tiszteletben a döntésedet. Ugyanakkor az együttműködés nem garantált, mivel néhány kiszolgáló másképp kezelheti a letiltásokat. A nyilvános bejegyzések a be nem jelentkezett felhasználók számára továbbra is látszódhatnak.", "block_modal.show_less": "Kevesebb mutatása", "block_modal.show_more": "Több mutatása", - "block_modal.they_cant_mention": "Nem említhetnek meg vagy követhetnek téged.", - "block_modal.they_cant_see_posts": "Nem láthatják a bejegyzéseidet, és te sem fogod látni az övékét.", - "block_modal.they_will_know": "Láthatják, hogy le vannak tiltva.", + "block_modal.they_cant_mention": "Nem említhet meg és nem követhet téged.", + "block_modal.they_cant_see_posts": "Nem láthatja a bejegyzéseidet, és te sem fogod látni az övéit.", + "block_modal.they_will_know": "Láthatja, hogy le van tiltva.", "block_modal.title": "Letiltsuk a felhasználót?", - "block_modal.you_wont_see_mentions": "Nem látsz majd őket említő bejegyzéseket.", + "block_modal.you_wont_see_mentions": "Nem látsz majd őt említő bejegyzéseket.", "boost_modal.combo": "Hogy átugord ezt következő alkalommal, használd {combo}", "bundle_column_error.copy_stacktrace": "Hibajelentés másolása", "bundle_column_error.error.body": "A kért lap nem jeleníthető meg. Ez lehet, hogy kódhiba, vagy böngészőkompatibitási hiba.", @@ -176,7 +176,7 @@ "confirmations.delete_list.confirm": "Törlés", "confirmations.delete_list.message": "Biztos, hogy véglegesen törölni szeretnéd ezt a listát?", "confirmations.discard_edit_media.confirm": "Elvetés", - "confirmations.discard_edit_media.message": "Elmentetlen változtatásaid vannak a média leírásában vagy előnézetében. Eldobjuk őket?", + "confirmations.discard_edit_media.message": "Mentetlen változtatásaid vannak a média leírásában vagy előnézetében, mindenképp elveted?", "confirmations.domain_block.confirm": "Kiszolgáló letiltása", "confirmations.domain_block.message": "Biztos, hogy le szeretnéd tiltani a teljes {domain} domaint? A legtöbb esetben néhány célzott tiltás vagy némítás elegendő, és kívánatosabb megoldás. Semmilyen tartalmat nem fogsz látni ebből a domainből se az idővonalakon, se az értesítésekben. Az ebben a domainben lévő követőidet is eltávolítjuk.", "confirmations.edit.confirm": "Szerkesztés", @@ -213,7 +213,7 @@ "domain_block_modal.block_account_instead": "Helyette @{name} letiltása", "domain_block_modal.they_can_interact_with_old_posts": "Az ezen a kiszolgálón lévő emberek interaktálhatnak a régi bejegyzéseiddel.", "domain_block_modal.they_cant_follow": "Erről a kiszolgálóról senki sem követhet.", - "domain_block_modal.they_wont_know": "Nem fogják tudni, hogy letiltották őket.", + "domain_block_modal.they_wont_know": "Nem fogja tudni, hogy letiltották.", "domain_block_modal.title": "Letiltsuk a domaint?", "domain_block_modal.you_will_lose_followers": "Az ezen a kiszolgálón lévő összes követődet törölni fogjuk.", "domain_block_modal.you_wont_see_posts": "Nem látsz majd bejegyzéseket vagy értesítéseket ennek a kiszolgálónak a felhasználóitól.", @@ -350,7 +350,7 @@ "home.pending_critical_update.title": "Kritikus biztonsági frissítés érhető el!", "home.show_announcements": "Közlemények megjelenítése", "interaction_modal.description.favourite": "Egy Mastodon fiókkal kedvencnek jelölheted ezt a bejegyzést, tudatva a szerzővel, hogy értékeled és elteszed későbbre.", - "interaction_modal.description.follow": "Egy Mastodon fiókkal bekövetheted {name} fiókot, hogy lásd a bejegyzéseit a saját hírfolyamodban.", + "interaction_modal.description.follow": "Egy Mastodon-fiókkal követheted {name} fiókját, hogy lásd a bejegyzéseit a kezdőlapodon.", "interaction_modal.description.reblog": "Egy Mastodon fiókkal megtolhatod ezt a bejegyzést, hogy megoszd a saját követőiddel.", "interaction_modal.description.reply": "Egy Mastodon fiókkal válaszolhatsz erre a bejegyzésre.", "interaction_modal.login.action": "Vigyen haza", @@ -431,11 +431,11 @@ "mute_modal.hide_options": "Beállítások elrejtése", "mute_modal.indefinite": "Amíg nem oldom fel a némítást", "mute_modal.show_options": "Beállítások megjelenítése", - "mute_modal.they_can_mention_and_follow": "Megemlíthetnek vagy követhetnek téged, de nem fogod őket látni.", - "mute_modal.they_wont_know": "Nem fogják tudni, hogy lenémították őket.", + "mute_modal.they_can_mention_and_follow": "Megemlíthet vagy követhet téged, de te nem fogod ezeket látni.", + "mute_modal.they_wont_know": "Nem fogja tudni, hogy lenémítottad.", "mute_modal.title": "Elnémítsuk a felhasználót?", - "mute_modal.you_wont_see_mentions": "Nem látsz majd őket említő bejegyzéseket.", - "mute_modal.you_wont_see_posts": "Továbbra is látni fogják a bejegyzéseidet, de te nem fogod látni az övékét.", + "mute_modal.you_wont_see_mentions": "Nem látsz majd őt említő bejegyzéseket.", + "mute_modal.you_wont_see_posts": "Továbbra is látni fogja a bejegyzéseidet, de te nem fogod látni az övéit.", "navigation_bar.about": "Névjegy", "navigation_bar.advanced_interface": "Megnyitás a speciális webes felületben", "navigation_bar.blocks": "Letiltott felhasználók", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 5fd28cfd81..96407b0020 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -221,10 +221,15 @@ "domain_pill.activitypub_like_language": "액티비티펍은 마스토돈이 다른 소셜 네트워크와 대화할 때 쓰는 언어 같은 것입니다.", "domain_pill.server": "서버", "domain_pill.their_handle": "그의 핸들:", + "domain_pill.their_server": "그의 게시물이 살고 있는 디지털 거처입니다.", + "domain_pill.their_username": "그의 서버에서 유일한 식별자입니다. 다른 서버에서 같은 사용자명을 가진 사용자를 찾을 수도 있습니다.", "domain_pill.username": "사용자명", "domain_pill.whats_in_a_handle": "핸들엔 무엇이 담겨 있나요?", + "domain_pill.who_they_are": "핸들은 어디에 있는 누구인지를 나타내기 때문에 들의 소셜 웹을 넘나들며 사람들과 상호작용 할 수 있습니다.", "domain_pill.who_you_are": "내 핸들은 내가 어디에 있는 누군지 나타내기 때문에 사람들은 을 통해 소셜 웹을 넘나들며 나와 상호작용 할 수 있습니다.", "domain_pill.your_handle": "내 핸들:", + "domain_pill.your_server": "내 게시물들이 살고 있는 나의 디지털 거처입니다. 마음에 들지 않나요? 팔로워를 데리고 언제든지 다른 서버로 거처를 옮길 수도 있습니다.", + "domain_pill.your_username": "이 서버에서 유일한 내 식별자입니다. 다른 서버에서 같은 사용자명을 가진 사용자를 찾을 수도 있습니다.", "embed.instructions": "아래의 코드를 복사하여 대화를 원하는 곳으로 공유하세요.", "embed.preview": "이렇게 표시됩니다:", "emoji_button.activity": "활동", @@ -507,11 +512,11 @@ "notifications.policy.filter_new_accounts_title": "새 계정", "notifications.policy.filter_not_followers_hint": "나를 팔로우 한 지 {days, plural, other {# 일}}이 되지 않은 사람들을 포함", "notifications.policy.filter_not_followers_title": "나를 팔로우하지 않는 사람들", - "notifications.policy.filter_not_following_hint": "내가 수동으로 승인하기 전까지", + "notifications.policy.filter_not_following_hint": "내가 수동으로 승인하지 않는 한", "notifications.policy.filter_not_following_title": "내가 팔로우하지 않는 사람들", "notifications.policy.filter_private_mentions_hint": "내가 한 멘션에 단 답글이거나 내가 발신자를 팔로우 한 것이 아닌 이상 걸러집니다", "notifications.policy.filter_private_mentions_title": "청하지 않은 개인적인 멘션", - "notifications.policy.title": "알림을 거를 사람들…", + "notifications.policy.title": "알림을 제외할 조건들…", "notifications_permission_banner.enable": "데스크탑 알림 활성화", "notifications_permission_banner.how_to_control": "마스토돈이 열려 있지 않을 때에도 알림을 받으려면, 데스크탑 알림을 활성화 하세요. 당신은 어떤 종류의 반응이 데스크탑 알림을 발생할 지를 {icon} 버튼을 통해 세세하게 설정할 수 있습니다.", "notifications_permission_banner.title": "아무것도 놓치지 마세요", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index a218cadf8d..aa20207a76 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -92,6 +92,11 @@ "block_modal.remote_users_caveat": "Vi vil be tenaren {domain} om å respektere di avgjerd. Det kan ikkje garanterast at det vert etterfølgd, sidan nokre tenarar kan handtere blokkering ulikt. Offentlege innlegg kan framleis vere synlege for ikkje-innlogga brukarar.", "block_modal.show_less": "Vis mindre", "block_modal.show_more": "Vis meir", + "block_modal.they_cant_mention": "Dei kan ikkje nemna eller fylgja deg.", + "block_modal.they_cant_see_posts": "Dei kan ikkje sjå innlegga dine, og du vil ikkje sjå deira.", + "block_modal.they_will_know": "Dei kan sjå at dei er blokkerte.", + "block_modal.title": "Blokker brukaren?", + "block_modal.you_wont_see_mentions": "Du ser ikkje innlegg som nemner dei.", "boost_modal.combo": "Du kan trykkja {combo} for å hoppa over dette neste gong", "bundle_column_error.copy_stacktrace": "Kopier feilrapport", "bundle_column_error.error.body": "Den etterspurde sida kan ikke hentast fram. Det kan skuldast ein feil i koden vår eller eit kompatibilitetsproblem.", @@ -172,6 +177,7 @@ "confirmations.delete_list.message": "Er du sikker på at du vil sletta denne lista for alltid?", "confirmations.discard_edit_media.confirm": "Forkast", "confirmations.discard_edit_media.message": "Du har ulagra endringar i mediaskildringa eller førehandsvisinga. Vil du forkasta dei likevel?", + "confirmations.domain_block.confirm": "Blokker tenaren", "confirmations.domain_block.message": "Er du heilt, heilt sikker på at du vil skjula heile {domain}? I dei fleste tilfelle er det godt nok og føretrekt med nokre få målretta blokkeringar eller målbindingar. Du kjem ikkje til å sjå innhald frå domenet i fødererte tidsliner eller i varsla dine. Fylgjarane dine frå domenet vert fjerna.", "confirmations.edit.confirm": "Rediger", "confirmations.edit.message": "Å redigera no vil overskriva den meldinga du er i ferd med å skriva. Er du sikker på at du vil halda fram?", @@ -203,6 +209,14 @@ "dismissable_banner.explore_statuses": "Dette er innlegg frå det desentraliserte nettverket som er i støytet i dag. Nye statusar som er mykje framheva og merkte som favorittar er rangert høgare.", "dismissable_banner.explore_tags": "Desse emneknaggane er populære blant folk på denne tenaren og andre tenarar i det desentraliserte nettverket nett no.", "dismissable_banner.public_timeline": "Dette er dei nyaste offentlege innlegga frå menneske på det sosiale nettet som folk på {domain} følgjer.", + "domain_block_modal.block": "Blokker tenaren", + "domain_block_modal.block_account_instead": "Blokker @{name} i staden", + "domain_block_modal.they_can_interact_with_old_posts": "Folk på denne tenaren kan samhandla med dei gamle innlegga dine.", + "domain_block_modal.they_cant_follow": "Ingen på denne tenaren kan fylgja deg.", + "domain_block_modal.they_wont_know": "Dei veit ikkje at dei er blokkerte.", + "domain_block_modal.title": "Blokker domenet?", + "domain_block_modal.you_will_lose_followers": "Alle fylgjarane dine frå denne tenaren blir fjerna.", + "domain_block_modal.you_wont_see_posts": "Du vil ikkje sjå innlegg eller varslingar frå brukarar på denne tenaren.", "domain_pill.activitypub_lets_connect": "Den lar deg kople til og samhandle med folk ikkje berre på Mastodon, men òg på tvers av forskjellige sosiale appar.", "domain_pill.activitypub_like_language": "ActivityPub er som språket Mastodon snakkar med andre sosiale nettverk.", "domain_pill.server": "Tenar", @@ -234,7 +248,7 @@ "emoji_button.symbols": "Symbol", "emoji_button.travel": "Reise & stader", "empty_column.account_hides_collections": "Denne brukaren har valt å ikkje gjere denne informasjonen tilgjengeleg", - "empty_column.account_suspended": "Kontoen er suspendert", + "empty_column.account_suspended": "Kontoen er utestengd", "empty_column.account_timeline": "Ingen tut her!", "empty_column.account_unavailable": "Profil ikkje tilgjengeleg", "empty_column.blocks": "Du har ikkje blokkert nokon enno.", @@ -413,6 +427,15 @@ "loading_indicator.label": "Lastar…", "media_gallery.toggle_visible": "{number, plural, one {Skjul bilete} other {Skjul bilete}}", "moved_to_account_banner.text": "Kontoen din, {disabledAccount} er for tida deaktivert fordi du har flytta til {movedToAccount}.", + "mute_modal.hide_from_notifications": "Ikkje vis varslingar", + "mute_modal.hide_options": "Gøym val", + "mute_modal.indefinite": "Til eg avdempar dei", + "mute_modal.show_options": "Vis val", + "mute_modal.they_can_mention_and_follow": "Dei kan nemna og fylgja deg, men du vil ikkje sjå dei.", + "mute_modal.they_wont_know": "Dei veit ikkje at dei er dempa.", + "mute_modal.title": "Demp brukaren?", + "mute_modal.you_wont_see_mentions": "Du vil ikkje sjå innlegg som nemner dei.", + "mute_modal.you_wont_see_posts": "Dei kan framleis sjå innlegga dine, men du vil ikkje sjå deira.", "navigation_bar.about": "Om", "navigation_bar.advanced_interface": "Opne i avansert nettgrensesnitt", "navigation_bar.blocks": "Blokkerte brukarar", @@ -670,9 +693,11 @@ "status.direct": "Nevn @{name} privat", "status.direct_indicator": "Privat omtale", "status.edit": "Rediger", + "status.edited": "Sist endra {date}", "status.edited_x_times": "Redigert {count, plural, one {{count} gong} other {{count} gonger}}", "status.embed": "Bygg inn", "status.favourite": "Favoritt", + "status.favourites": "{count, plural, one {favoritt} other {favorittar}}", "status.filter": "Filtrer dette innlegget", "status.filtered": "Filtrert", "status.hide": "Skjul innlegget", @@ -693,6 +718,7 @@ "status.reblog": "Framhev", "status.reblog_private": "Framhev til dei originale mottakarane", "status.reblogged_by": "{name} framheva", + "status.reblogs": "{count, plural, one {framheving} other {framhevingar}}", "status.reblogs.empty": "Ingen har framheva dette tutet enno. Om nokon gjer, så dukkar det opp her.", "status.redraft": "Slett & skriv på nytt", "status.remove_bookmark": "Fjern bokmerke", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index b1145f64d5..d4b37ffe6d 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -89,6 +89,14 @@ "announcement.announcement": "Anúncio", "attachments_list.unprocessed": "(não processado)", "audio.hide": "Ocultar áudio", + "block_modal.remote_users_caveat": "Vamos pedir ao servidor {domain} para respeitar a sua decisão. No entanto, não é garantido o seu cumprimento, uma vez que alguns servidores podem tratar os bloqueios de forma diferente. As mensagens públicas podem continuar a ser visíveis para utilizadores não autenticados.", + "block_modal.show_less": "Mostrar menos", + "block_modal.show_more": "Mostrar mais", + "block_modal.they_cant_mention": "Eles não o podem mencionar ou seguir.", + "block_modal.they_cant_see_posts": "Eles não podem ver as suas publicações e você não verá as deles.", + "block_modal.they_will_know": "Eles podem ver que estão bloqueados.", + "block_modal.title": "Bloquear utilizador?", + "block_modal.you_wont_see_mentions": "Não verá publicações que os mencionem.", "boost_modal.combo": "Pode clicar {combo} para não voltar a ver", "bundle_column_error.copy_stacktrace": "Copiar relatório de erros", "bundle_column_error.error.body": "A página solicitada não pôde ser sintetizada. Isto pode ser devido a uma falha no nosso código ou a um problema de compatibilidade com o navegador.", @@ -169,6 +177,7 @@ "confirmations.delete_list.message": "Tens a certeza de que deseja eliminar permanentemente esta lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tem alterações por guardar na descrição ou pré-visualização do conteúdo. Descartar mesmo assim?", + "confirmations.domain_block.confirm": "Bloquear servidor", "confirmations.domain_block.message": "De certeza que queres bloquear completamente o domínio {domain}? Na maioria dos casos, silenciar ou bloquear alguns utilizadores é suficiente e é o recomendado. Não irás ver conteúdo daquele domínio em cronologia alguma nem nas tuas notificações. Os teus seguidores daquele domínio serão removidos.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar agora irá sobrescrever a mensagem que está a compor. Tem a certeza de que deseja continuar?", @@ -200,6 +209,27 @@ "dismissable_banner.explore_statuses": "Estas são publicações de toda a rede social que estão a ganhar popularidade atualmente. As mensagens mais recentes com mais partilhas e favoritos obtêm uma classificação mais elevada.", "dismissable_banner.explore_tags": "Estas #etiquetas estão presentemente a ganhar atenção entre as pessoas neste e noutros servidores da rede descentralizada.", "dismissable_banner.public_timeline": "Estas são as publicações públicas mais recentes de pessoas na rede social que as pessoas em {domain} seguem.", + "domain_block_modal.block": "Bloquear servidor", + "domain_block_modal.block_account_instead": "Bloquear @{name} em alternativa", + "domain_block_modal.they_can_interact_with_old_posts": "As pessoas deste servidor podem interagir com as suas publicações antigas.", + "domain_block_modal.they_cant_follow": "Ninguém deste servidor pode segui-lo.", + "domain_block_modal.they_wont_know": "Eles não saberão que foram bloqueados.", + "domain_block_modal.title": "Bloquear domínio?", + "domain_block_modal.you_will_lose_followers": "Todos os seus seguidores deste servidor serão removidos.", + "domain_block_modal.you_wont_see_posts": "Não verá publicações ou notificações de utilizadores neste servidor.", + "domain_pill.activitypub_lets_connect": "Permite-lhe conectar e interagir com pessoas não só no Mastodon, mas também em diferentes aplicações sociais.", + "domain_pill.activitypub_like_language": "O ActivityPub é como a linguagem que o Mastodon fala com outras redes sociais.", + "domain_pill.server": "Servidor", + "domain_pill.their_handle": "O seu identificador:", + "domain_pill.their_server": "A sua casa digital, onde se encontram todas as suas publicações.", + "domain_pill.their_username": "O seu identificador único no seu servidor. É possível encontrar utilizadores com o mesmo nome de utilizador em diferentes servidores.", + "domain_pill.username": "Nome de utilizador", + "domain_pill.whats_in_a_handle": "Em que consiste um identificador?", + "domain_pill.who_they_are": "Uma vez que os identificadores dizem quem é alguém e onde está, pode interagir com as pessoas através da rede social de .", + "domain_pill.who_you_are": "Uma vez que o seu identificador indica quem é e onde está, as pessoas podem interagir consigo através da rede social de .", + "domain_pill.your_handle": "O seu identificador:", + "domain_pill.your_server": "A sua casa digital, onde se encontram todas as suas publicações. Não gosta deste? Mude de servidor a qualquer momento e leve também os seus seguidores.", + "domain_pill.your_username": "O seu identificador único neste servidor. É possível encontrar utilizadores com o mesmo nome de utilizador em diferentes servidores.", "embed.instructions": "Incorpore esta publicação no seu site copiando o código abaixo.", "embed.preview": "Podes ver aqui como irá ficar:", "emoji_button.activity": "Actividade", @@ -397,6 +427,15 @@ "loading_indicator.label": "A carregar…", "media_gallery.toggle_visible": "Alternar visibilidade", "moved_to_account_banner.text": "A sua conta {disabledAccount} está, no momento, desativada, porque você migrou para {movedToAccount}.", + "mute_modal.hide_from_notifications": "Ocultar das notificações", + "mute_modal.hide_options": "Ocultar opções", + "mute_modal.indefinite": "Até que eu os tire do silêncio", + "mute_modal.show_options": "Mostrar opções", + "mute_modal.they_can_mention_and_follow": "Eles podem mencioná-lo e segui-lo, mas você não os verá.", + "mute_modal.they_wont_know": "Eles não saberão que foram silenciados.", + "mute_modal.title": "Silenciar utilizador?", + "mute_modal.you_wont_see_mentions": "Não verá publicações que os mencionem.", + "mute_modal.you_wont_see_posts": "Eles podem continuar a ver as suas publicações, mas você não verá as deles.", "navigation_bar.about": "Sobre", "navigation_bar.advanced_interface": "Abrir na interface web avançada", "navigation_bar.blocks": "Utilizadores bloqueados", diff --git a/app/javascript/mastodon/locales/ry.json b/app/javascript/mastodon/locales/ry.json index de3d619171..62772f4f22 100644 --- a/app/javascript/mastodon/locales/ry.json +++ b/app/javascript/mastodon/locales/ry.json @@ -6,6 +6,8 @@ "about.domain_blocks.silenced.title": "Обмежено", "about.domain_blocks.suspended.explanation": "Ниякі податкы из сього сервера не будут уброблені, усокочені ци поміняні, што чинит невозможнов хоть-яку інтеракцію ци зязок из хосновачами из сього сервера.", "about.domain_blocks.suspended.title": "Заблоковано", + "about.not_available": "Ися інформація не была доступна на сюм сервері.", + "about.powered_by": "Децентралізована медіа основана на {mastodon}", "about.rules": "Правила сервера", "account.account_note_header": "Примітка", "account.add_or_remove_from_list": "Дати авадь забрати из исписа", @@ -16,18 +18,24 @@ "account.block_short": "Заблоковати", "account.blocked": "Заблоковано", "account.browse_more_on_origin_server": "Позирайте бульше на ориґіналнум профілю", + "account.cancel_follow_request": "Удмінити пудписку", "account.copy": "Зкопіровати удкликованя на профіл", + "account.disable_notifications": "Бульше не сповіщати ми коли {name} пише", "account.domain_blocked": "Домен заблокованый", "account.edit_profile": "Управити профіл", + "account.enable_notifications": "Уповістити ня, кой {name} пише", "account.endorse": "Указовати на профілови", "account.featured_tags.last_status_at": "Датум послідньої публикації {date}", "account.featured_tags.last_status_never": "Ниє публикацій", + "account.featured_tags.title": "Ублюблені гештеґы {name}", "account.follow": "Пудписати ся", + "account.follow_back": "Пудписати ся тоже", "account.followers": "Пудписникы", "account.followers.empty": "У сього хосновача раз ниє пудписникув.", "account.following": "Слідуєте", "account.follows.empty": "Сись хосновач щи никого не слідує.", "account.go_to_profile": "Перейти на профіл", + "account.joined_short": "Датум прикапчованя", "account.languages": "Поміняти убрані языкы", "account.link_verified_on": "Властность сього удкликованя было звірено {date}", "account.media": "Медіа", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 8c9238bb9e..c2b1cede94 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -89,6 +89,9 @@ "announcement.announcement": "Oznámenie", "attachments_list.unprocessed": "(nespracované)", "audio.hide": "Skryť zvuk", + "block_modal.show_less": "Zobraziť menej", + "block_modal.show_more": "Zobraziť viac", + "block_modal.title": "Blokovať užívateľa?", "boost_modal.combo": "Nabudúce môžete preskočiť stlačením {combo}", "bundle_column_error.copy_stacktrace": "Kopírovať chybovú hlášku", "bundle_column_error.error.body": "Požadovanú stránku nebolo možné vykresliť. Môže to byť spôsobené chybou v našom kóde alebo problémom s kompatibilitou prehliadača.", @@ -169,6 +172,7 @@ "confirmations.delete_list.message": "Určite chcete tento zoznam trvalo vymazať?", "confirmations.discard_edit_media.confirm": "Zahodiť", "confirmations.discard_edit_media.message": "Máte neuložené zmeny v popise alebo náhľade média, zahodiť ich aj tak?", + "confirmations.domain_block.confirm": "Blokovať server", "confirmations.domain_block.message": "Určite chcete blokovať celú doménu {domain}? Vo väčšine prípadov stačí blokovať alebo ignorovať pár konkrétnych účtov, čo aj odporúčame. Obsah z tejto domény neuvidíte v žiadnej verejnej časovej osi ani v upozorneniach. Vaši sledujúci pochádzajúci z tejto domény budú odstránení.", "confirmations.edit.confirm": "Upraviť", "confirmations.edit.message": "Úpravou prepíšete príspevok, ktorý máte rozpísaný. Určite chcete pokračovať?", @@ -200,6 +204,10 @@ "dismissable_banner.explore_statuses": "Toto sú príspevky z celej sociálnej siete, ktoré sú dnes populárne. Novšie príspevky s viacerými ohviezdičkovaniami a zdieľaniami sú radené vyššie.", "dismissable_banner.explore_tags": "Toto sú hashtagy zo sociálnej siete, ktoré sú dnes populárne. Novšie hashtagy používané viacerými ľuďmi sú radené vyššie.", "dismissable_banner.public_timeline": "Toto sú najnovšie verejné príspevky od účtov na sociálnej sieti, ktoré sú sledované účtami z {domain}.", + "domain_block_modal.block": "Blokovať server", + "domain_block_modal.title": "Blokovať doménu?", + "domain_pill.server": "Server", + "domain_pill.username": "Používateľské meno", "embed.instructions": "Tento príspevok môžete pridať na svoju webovú stránku použitím tohto kódu.", "embed.preview": "Takto bude vyzerať:", "emoji_button.activity": "Aktivita", @@ -267,6 +275,7 @@ "filter_modal.select_filter.title": "Filtrovanie tohto príspevku", "filter_modal.title.status": "Filtrovanie príspevku", "filtered_notifications_banner.pending_requests": "Oboznámenia od {count, plural, =0 {nikoho} one {jedného človeka} other {# ľudí}} čo môžeš poznať", + "filtered_notifications_banner.title": "Filtrované oznámenia", "firehose.all": "Všetko", "firehose.local": "Tento server", "firehose.remote": "Ostatné servery", @@ -395,6 +404,9 @@ "loading_indicator.label": "Načítavanie…", "media_gallery.toggle_visible": "{number, plural, one {Skryť obrázok} other {Skryť obrázky}}", "moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálne deaktivovaný, pretože ste sa presunuli na {movedToAccount}.", + "mute_modal.hide_options": "Skryť možnosti", + "mute_modal.show_options": "Zobraziť možnosti", + "mute_modal.title": "Stíšiť užívateľa?", "navigation_bar.about": "O tomto serveri", "navigation_bar.advanced_interface": "Otvoriť v pokročilom webovom rozhraní", "navigation_bar.blocks": "Blokované účty", @@ -433,6 +445,7 @@ "notification.status": "{name} uverejňuje niečo nové", "notification.update": "{name} upravuje príspevok", "notification_requests.accept": "Prijať", + "notification_requests.dismiss": "Zamietnuť", "notification_requests.notifications_from": "Oboznámenia od {name}", "notification_requests.title": "Filtrované oboznámenia", "notifications.clear": "Vyčistiť upozornenia", @@ -469,6 +482,7 @@ "notifications.policy.filter_new_accounts_title": "Nové účty", "notifications.policy.filter_not_followers_title": "Ľudia, ktorí ťa nenasledujú", "notifications.policy.filter_not_following_title": "Ľudia, ktorých nenasleduješ", + "notifications.policy.title": "Filtrovať oznámenia od…", "notifications_permission_banner.enable": "Povoliť upozornenia na ploche", "notifications_permission_banner.how_to_control": "Ak chcete dostávať upozornenia, keď Mastodon nie je otvorený, povoľte upozornenia na ploche. Po ich zapnutí môžete presne kontrolovať, ktoré typy interakcií generujú upozornenia na ploche, a to prostredníctvom tlačidla {icon} vyššie.", "notifications_permission_banner.title": "Nenechajte si nič ujsť", diff --git a/config/locales/an.yml b/config/locales/an.yml index 5ac57f4238..068a20187d 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -1423,7 +1423,6 @@ an: import: Importar import_and_export: Importar y exportar migrate: Migración de cuenta - notifications: Notificacions preferences: Preferencias profile: Perfil relationships: Seguindo y seguidores diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 5b932f525c..b0579c6f3f 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -1751,7 +1751,6 @@ ar: import: استيراد import_and_export: استيراد وتصدير migrate: تهجير الحساب - notifications: الإخطارات preferences: التفضيلات profile: الملف التعريفي relationships: المتابِعون والمتابَعون diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 9b9d5510c0..816858d4a0 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -801,7 +801,6 @@ ast: import: Importación import_and_export: Importación ya esportación migrate: Migración de la cuenta - notifications: Avisos preferences: Preferencies profile: Perfil públicu relationships: Perfiles que sigues ya te siguen diff --git a/config/locales/be.yml b/config/locales/be.yml index d04409ca9a..0bdc3bb554 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1704,7 +1704,6 @@ be: import: Імпарт import_and_export: Імпарт і экспарт migrate: Перамяшчэнне ўліковага запісу - notifications: Апавяшчэнні preferences: Налады profile: Профіль relationships: Падпіскі і падпісчыкі diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 3f05bfa0c0..feb4e74533 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -597,6 +597,9 @@ bg: actions_description_html: Решете какво действие може да се предприеме, за да бъде отхвърлен докладът. Ако предприемете наказателно действие срещу докладвания акаунт, към него ще бъде изпратено известие по имейл, освен ако Спам категорията не е била избрана. actions_description_remote_html: Преценете с какво действие да решите този доклад. Това ще има ефекет върху това как вашият сървър комуникира с този отдалечен акаунт и се справя с неговото съдържание. add_to_report: Добавяне на още към доклада + already_suspended_badges: + local: Вече е спряно на този сървър + remote: Вече е спряно на сървъра им are_you_sure: Сигурни ли сте? assign_to_self: Назначаване на мен assigned: Назначен модератор @@ -1652,7 +1655,7 @@ bg: import: Импортиране import_and_export: Импортиране и експортиране migrate: Миграция на акаунта - notifications: Известия + notifications: Известия по имейла preferences: Предпочитания profile: Профил relationships: Последвания и последователи diff --git a/config/locales/ca.yml b/config/locales/ca.yml index dedf69d7b2..2523db0eb0 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -597,6 +597,9 @@ ca: actions_description_html: Decideix quina acció a prendre per a resoldre aquest informe. Si prens un acció punitiva contra el compte denunciat, se li enviarà una notificació per correu electrònic, excepte quan se selecciona la categoria Spam. actions_description_remote_html: Decideix quina acció prendre per a resoldre aquest informe. Això només afectarà com el teu servidor es comunica amb aquest compte remot i en gestiona el contingut. add_to_report: Afegir més al informe + already_suspended_badges: + local: Ja és suspès en aquest servidor + remote: Ja és suspès al seu servidor are_you_sure: Segur? assign_to_self: Assigna'm assigned: Moderador assignat @@ -1652,7 +1655,7 @@ ca: import: Importació import_and_export: Importació i exportació migrate: Migració del compte - notifications: Notificacions + notifications: Notificacions per correu electrònic preferences: Preferències profile: Perfil relationships: Seguits i seguidors diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index c1f280a24c..dfa035eca8 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -942,7 +942,6 @@ ckb: import: هاوردن import_and_export: هاوردەکردن و ناردن migrate: گواستنەوەی هەژمارە - notifications: ئاگادارییەکان preferences: پەسەندەکان profile: پرۆفایل relationships: شوێنکەوتوو و شوێنکەوتوان diff --git a/config/locales/co.yml b/config/locales/co.yml index 13c8b74313..7d8abcd112 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -926,7 +926,6 @@ co: import: Impurtazione import_and_export: Impurtazione è spurtazione migrate: Migrazione di u contu - notifications: Nutificazione preferences: Priferenze profile: Prufile relationships: Abbunamenti è abbunati diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 7e4e380541..b44b01beee 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1704,7 +1704,6 @@ cs: import: Import import_and_export: Import a export migrate: Přesun účtu - notifications: Oznámení preferences: Předvolby profile: Profil relationships: Sledovaní a sledující diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 067d939deb..93d249cb50 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1756,7 +1756,6 @@ cy: import: Mewnforio import_and_export: Mewnforio ac allforio migrate: Mudo cyfrif - notifications: Hysbysiadau preferences: Dewisiadau profile: Proffil cyhoeddus relationships: Yn dilyn a dilynwyr diff --git a/config/locales/da.yml b/config/locales/da.yml index fcb600d7b9..eda22d5b9c 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -597,6 +597,9 @@ da: actions_description_html: Afgør, hvilke foranstaltning, der skal træffes for at løse denne anmeldelse. Træffes en straffende foranstaltning mod den anmeldte konto, fremsendes en e-mailnotifikation, undtagen når kategorien Spam er valgt. actions_description_remote_html: Fastslå en nødvendig handling mhp. at løse denne anmeldelse. Dette vil kun påvirke din servers kommunikation med, og indholdshåndtering for, fjernkontoen. add_to_report: Føj mere til anmeldelse + already_suspended_badges: + local: Allerede suspenderet på denne server + remote: Allerede suspenderet på vedkommendes server are_you_sure: Sikker? assign_to_self: Tildel til mig assigned: Tildelt moderator @@ -1652,7 +1655,7 @@ da: import: Import import_and_export: Import og eksport migrate: Kontomigrering - notifications: Notifikationer + notifications: E-mailnotifikationer preferences: Præferencer profile: Offentlig profil relationships: Følger og følgere diff --git a/config/locales/de.yml b/config/locales/de.yml index 84f10d8e08..62e62c2c0b 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -597,6 +597,9 @@ de: actions_description_html: Entscheide, welche Maßnahmen du zum Klären dieser Meldung ergreifen möchtest. Wenn du eine Strafmaßnahme gegen das gemeldete Konto ergreifst, wird eine E-Mail-Benachrichtigung an dieses gesendet, außer wenn die Spam-Kategorie ausgewählt ist. actions_description_remote_html: Entscheide, welche Maßnahmen du zum Klären dieser Meldung ergreifen möchtest. Dies wirkt sich lediglich darauf aus, wie dein Server mit diesem externen Konto kommuniziert und dessen Inhalt handhabt. add_to_report: Meldung ergänzen + already_suspended_badges: + local: Auf diesem Server bereits gesperrt + remote: Auf dem anderen Server bereits gesperrt are_you_sure: Bist du dir sicher? assign_to_self: Mir zuweisen assigned: Zugewiesene*r Moderator*in @@ -1652,7 +1655,7 @@ de: import: Importieren import_and_export: Importieren und exportieren migrate: Kontoumzug - notifications: Benachrichtigungen + notifications: E-Mail-Benachrichtigungen preferences: Einstellungen profile: Öffentliches Profil relationships: Follower und Folge ich diff --git a/config/locales/el.yml b/config/locales/el.yml index d3d91abc2b..2e7ac87463 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -1524,7 +1524,6 @@ el: import: Εισαγωγή import_and_export: Εισαγωγή και εξαγωγή migrate: Μετακόμιση λογαριασμού - notifications: Ειδοποιήσεις preferences: Προτιμήσεις profile: Προφίλ relationships: Ακολουθείς και σε ακολουθούν diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index b5d92541df..a2f84b0932 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -1647,7 +1647,6 @@ en-GB: import: Import import_and_export: Import and export migrate: Account migration - notifications: Notifications preferences: Preferences profile: Profile relationships: Follows and followers diff --git a/config/locales/eo.yml b/config/locales/eo.yml index cb5654b4c7..d59eadd528 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1579,7 +1579,6 @@ eo: import: Enporti import_and_export: Importi kaj eksporti migrate: Konta migrado - notifications: Sciigoj preferences: Preferoj profile: Profilo relationships: Sekvatoj kaj sekvantoj diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index aae437b954..6332911107 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1652,7 +1652,7 @@ es-AR: import: Importar import_and_export: Importación y exportación migrate: Migración de la cuenta - notifications: Notificaciones + notifications: Notificaciones por correo electrónico preferences: Configuración profile: Perfil público relationships: Seguimientos diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index e7e1a4ff88..24b4af7ecd 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -597,6 +597,9 @@ es-MX: actions_description_html: Decide qué medidas tomar para resolver esta denuncia. Si tomas una acción punitiva contra la cuenta denunciada, se le enviará a dicha cuenta una notificación por correo electrónico, excepto cuando se seleccione la categoría Spam. actions_description_remote_html: Decide qué medidas tomar para resolver este reporte. Esto solo afectará a la forma en que tu servidor se comunica con esta cuenta remota y gestiona su contenido. add_to_report: Añadir más al reporte + already_suspended_badges: + local: Ya suspendido en este servidor + remote: Ya suspendido en su servidor are_you_sure: "¿Estás seguro?" assign_to_self: Asignármela a mí assigned: Moderador asignado @@ -1652,7 +1655,7 @@ es-MX: import: Importar import_and_export: Importar y exportar migrate: Migración de cuenta - notifications: Notificaciones + notifications: Notificaciones por correo electrónico preferences: Preferencias profile: Perfil relationships: Siguiendo y seguidores @@ -1865,6 +1868,9 @@ es-MX: follows_subtitle: Seguir cuentas conocidas follows_title: A quién seguir follows_view_more: Ver más personas para seguir + hashtags_recent_count: + one: "%{people} personas en los últimos 2 días" + other: "%{people} personas en los últimos 2 días" hashtags_subtitle: Explora las tendencias de los últimos 2 días hashtags_title: Etiquetas en tendencia hashtags_view_more: Ver más etiquetas en tendencia diff --git a/config/locales/es.yml b/config/locales/es.yml index 24822116ca..2f7877afed 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1652,7 +1652,7 @@ es: import: Importar import_and_export: Importar y exportar migrate: Migración de cuenta - notifications: Notificaciones + notifications: Notificaciones por correo electrónico preferences: Preferencias profile: Perfil relationships: Siguiendo y seguidores diff --git a/config/locales/et.yml b/config/locales/et.yml index 80e3d3ef68..889ddfcff1 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -1652,7 +1652,6 @@ et: import: Impordi import_and_export: Import / eksport migrate: Konto kolimine - notifications: Teated preferences: Eelistused profile: Profiil relationships: Jälgitud ja jälgijad diff --git a/config/locales/eu.yml b/config/locales/eu.yml index ac641ab454..4238e71c84 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -599,6 +599,9 @@ eu: actions_description_html: Erabaki txosten hau konpontzeko ze ekintza hartu. Salatutako kontuaren aurka zigor ekintza bat hartzen baduzu, eposta jakinarazpen bat bidaliko zaie, Spam kategoria hautatzean ezik. actions_description_remote_html: Hautatu txosten honi konponbidea aurkitzeko zein neurri hartu. Hau soilik zure zerbitzaria urruneko kontu honekin nola komunikatu eta bere edukia nola maneiatzeko da. add_to_report: Gehitu gehiago txostenera + already_suspended_badges: + local: Dagoeneko kanporatu da zerbitzari honetatik + remote: Dagoeneko kanporatu da bere zerbitzaritik are_you_sure: Ziur zaude? assign_to_self: Esleitu niri assigned: Esleitutako moderatzailea @@ -1656,7 +1659,7 @@ eu: import: Inportazioa import_and_export: Inportatu eta esportatu migrate: Kontuaren migrazioa - notifications: Jakinarazpenak + notifications: Posta bidezko jakinarazpenak preferences: Hobespenak profile: Profila relationships: Jarraitutakoak eta jarraitzaileak diff --git a/config/locales/fa.yml b/config/locales/fa.yml index df9b926276..d93d2e7d5f 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -1416,7 +1416,6 @@ fa: import: درون‌ریزی import_and_export: درون‌ریزی و برون‌بری migrate: انتقال حساب - notifications: آگاهی‌ها preferences: ترجیحات profile: نمایه relationships: پیگیری‌ها و پیگیران diff --git a/config/locales/fi.yml b/config/locales/fi.yml index a92ad4ecb6..0ba5931e5a 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -597,6 +597,9 @@ fi: actions_description_html: Päätä, mihin toimiin ryhdyt tämän raportin ratkaisemiseksi. Jos ryhdyt rangaistustoimeen ilmoitettua tiliä kohtaan, hänelle lähetetään sähköposti-ilmoitus, paitsi jos Roskaposti-luokka on valittuna. actions_description_remote_html: Päätä, mihin toimiin ryhdyt tämän raportin ratkaisemiseksi. Tämä vaikuttaa vain siihen, miten palvelimesi kommunikoi tämän etätilin kanssa ja käsittelee sen sisältöä. add_to_report: Lisää raporttiin + already_suspended_badges: + local: Jäädytetty jo tällä palvelimella + remote: Jäädytetty jo tällä palvelimella are_you_sure: Oletko varma? assign_to_self: Ota tehtäväksi assigned: Määritetty valvoja @@ -1652,7 +1655,7 @@ fi: import: Tuo import_and_export: Tuonti ja vienti migrate: Tilin muutto muualle - notifications: Ilmoitukset + notifications: Sähköposti-ilmoitukset preferences: Ominaisuudet profile: Julkinen profiili relationships: Seuratut ja seuraajat diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 45633d85b3..49d206bbb9 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -94,7 +94,7 @@ fo: disabled: Óvirkið pending: Í bíðistøðu silenced: Avmarkað - suspended: Avbrotin + suspended: Gjørt óvirkin title: Umsjón moderation_notes: Umsjónarviðmerkingar most_recent_activity: Feskasta virksemi @@ -150,7 +150,7 @@ fo: strikes: Eldri fráboðanir subscribe: Tekna hald suspend: Fyribils ikki í gildi - suspended: Ikki í gildi + suspended: Gjørt óvirkin suspension_irreversible: Dáturnar á hesu kontu er endaliga sletttaðar. Tú kann seta hana í gildi, men dáturnar fáast ikki aftur. suspension_reversible_hint_html: Kontan er sett úr gildi og dáturnar verða endaliga strikaðar tann %{date}. Inntil tá kann kontan endurskapast uttan fylgjur. Ynskir tú at strika allar dátur hjá kontuni beinan vegin, so kanst tú gera tað niðanfyri. title: Kontur @@ -597,6 +597,9 @@ fo: actions_description_html: Ger av hvør atgerð skal takast fyri at avgreiða hesa meldingina. Revsitiltøk móti meldaðu kontuni føra við sær, at ein teldupostfráboðan verður send teimum, undantikið tá Ruskpostur verður valdur. actions_description_remote_html: Tak avgerð um hvat skal gerast fyri at avgreiða hesa rapporteringina. Hetta fer einans at ávirka, hvussu tín ambætari samskiftir við hesa fjarkontuna og hvussu hann handfer tilfar frá henni. add_to_report: Legg meira afturat meldingini + already_suspended_badges: + local: Longu gjørt óvirkin á hesum ambætaranum + remote: Longu gjørt óvirkin á teirra ambætara are_you_sure: Er tú vís/ur? assign_to_self: Tilluta mær assigned: Tilnevnt umsjónarfólk @@ -1652,7 +1655,7 @@ fo: import: Innflyt import_and_export: Innflyt og útflyt migrate: Flyting av kontu - notifications: Fráboðanir + notifications: Teldupostfráboðanir preferences: Stillingar profile: Vangi relationships: Fylging og fylgjarar diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 2ed482770c..fa69e36cc0 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -1652,7 +1652,6 @@ fr-CA: import: Import de données import_and_export: Import et export migrate: Migration de compte - notifications: Notifications preferences: Préférences profile: Profil relationships: Abonnements et abonné·e·s diff --git a/config/locales/fr.yml b/config/locales/fr.yml index ae012c1531..2045760655 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1652,7 +1652,6 @@ fr: import: Import de données import_and_export: Import et export migrate: Migration de compte - notifications: Notifications preferences: Préférences profile: Profil relationships: Abonnements et abonné·e·s diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 742b2903a0..1d62f7c6af 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -1647,7 +1647,6 @@ fy: import: Ymportearje import_and_export: Ymportearje en eksportearje migrate: Accountmigraasje - notifications: Meldingen preferences: Ynstellingen profile: Profyl relationships: Folgers en folgjenden diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 5c61898ef5..a3ad293e5b 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -461,7 +461,6 @@ ga: development: Forbairt edit_profile: Cuir an phróifíl in eagar import: Iompórtáil - notifications: Fógraí preferences: Sainroghanna pearsanta profile: Próifíl webauthn_authentication: Eochracha slándála diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 79bbbea0f5..381a0a8b40 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -1704,7 +1704,6 @@ gd: import: Ion-phortadh import_and_export: Ion-phortadh ⁊ às-phortadh migrate: Imrich cunntais - notifications: Brathan preferences: Roghainnean profile: Pròifil phoblach relationships: Dàimhean leantainn diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 57249d2ca9..7fbba21b27 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -597,6 +597,9 @@ gl: actions_description_html: Decide que acción tomar respecto desta denuncia. Se tomas accións punitivas contra a conta denunciada, enviaráselles un email coa notificación, excepto se está seleccionada a categoría Spam. actions_description_remote_html: Decide a acción a tomar para resolver a denuncia. Isto só lle afecta ao xeito en que o teu servidor se comunica con esta conta remota e xestiona o seu contido. add_to_report: Engadir máis á denuncia + already_suspended_badges: + local: Xa está suspendida neste servidor + remote: Xa está suspendida no seu servidor are_you_sure: Tes certeza? assign_to_self: Asignarme assigned: Moderador asignado @@ -1652,7 +1655,7 @@ gl: import: Importar import_and_export: Importar e exportar migrate: Migrar conta - notifications: Notificacións + notifications: Notificacións por correo preferences: Preferencias profile: Perfil relationships: Seguindo e seguidoras diff --git a/config/locales/he.yml b/config/locales/he.yml index 1388a71632..2dfb98a2d8 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -621,6 +621,9 @@ he: actions_description_html: בחר/י איזו פעולה לבצע על מנת לפתור את הדו"ח. אם תופעל פעולת ענישה כנגד החשבון המדווח, הודעת דוא"ל תשלח אליהם, אלא אם נבחרה קטגוריית הספאם. actions_description_remote_html: בחרו איזו פעולה לבצע כדי לפתור את הדיווח שהוגש. פעולה זו תשפיע רק על התקשורת מול השרת שלך עם החשבון המרוחק ותוכנו. add_to_report: הוספת פרטים לדיווח + already_suspended_badges: + local: כבר הודח בשרת זה + remote: כבר הודח בשרת שלו are_you_sure: 100% על בטוח? assign_to_self: הקצה אלי assigned: מנחה מוקצה @@ -1704,7 +1707,6 @@ he: import: יבוא import_and_export: יבוא ויצוא migrate: הגירת חשבון - notifications: התראות preferences: העדפות profile: פרופיל relationships: נעקבים ועוקבים diff --git a/config/locales/hr.yml b/config/locales/hr.yml index c5020f6f9f..4ea818b301 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -211,7 +211,6 @@ hr: featured_tags: Istaknuti hashtagovi import: Uvezi import_and_export: Uvezi i izvezi - notifications: Obavijesti preferences: Postavke profile: Profil statuses_cleanup: Automatsko brisanje postova diff --git a/config/locales/hu.yml b/config/locales/hu.yml index f09f7e4285..7b0e72cfcd 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -597,6 +597,9 @@ hu: actions_description_html: Döntsd el, mit csináljunk, hogy megoldjuk ezt a bejelentést. Ha valamilyen büntető intézkedést hozol a bejelentett fiók ellen, küldünk neki egy figyelmeztetést e-mail-ben, kivéve ha a Spam kategóriát választod. actions_description_remote_html: Döntsd el, mit tegyünk a bejelentés lezárásának érdekében. Ez csak azt befolyásolja, hogy a saját kiszolgálód hogyan kommunikál ezzel a távoli fiókkal és hogyan kezeli annak tartalmait. add_to_report: Továbbiak hozzáadása a bejelentéshez + already_suspended_badges: + local: Már felfüggesztették ezen a szerveren + remote: Már felfüggesztették a kiszolgálóján are_you_sure: Biztos vagy benne? assign_to_self: Magamhoz rendelés assigned: Hozzárendelt moderátor @@ -1652,7 +1655,7 @@ hu: import: Importálás import_and_export: Import és export migrate: Fiók átirányítása - notifications: Értesítések + notifications: E-mail értesítések preferences: Beállítások profile: Profil relationships: Követések és követők diff --git a/config/locales/hy.yml b/config/locales/hy.yml index 9d596dd834..5042e3f7f0 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -778,7 +778,6 @@ hy: import: Ներմուծել import_and_export: Ներմուծել և արտահանել migrate: Հաշուի տեղափոխում - notifications: Ծանուցումներ preferences: Կարգավորումներ profile: Հաշիւ relationships: Հետեւումներ և հետեւորդներ diff --git a/config/locales/id.yml b/config/locales/id.yml index d1c04ad1d4..bee282fa83 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -1389,7 +1389,6 @@ id: import: Impor import_and_export: Impor dan ekspor migrate: Pemindahan akun - notifications: Notifikasi preferences: Pilihan profile: Profil relationships: Ikuti dan pengikut diff --git a/config/locales/ie.yml b/config/locales/ie.yml index 7a0ae6292e..6763a8038a 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -1652,7 +1652,6 @@ ie: import: Importar import_and_export: Importation e exportation migrate: Migration de conto - notifications: Notificationes preferences: Preferenties profile: Public profil relationships: Sequetes e sequitores diff --git a/config/locales/io.yml b/config/locales/io.yml index 4561a43e8e..ed0d0d6345 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -1621,7 +1621,6 @@ io: import: Importacar import_and_export: Importaco e exportaco migrate: Kontomigro - notifications: Avizi preferences: Preferi profile: Profilo relationships: Sequati e sequanti diff --git a/config/locales/is.yml b/config/locales/is.yml index d7a3f8e2cc..710b35fce9 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -597,6 +597,9 @@ is: actions_description_html: Ákveddu til hvaða aðgerða eigi að taka til að leysa þessa kæru. Ef þú ákveður að refsa kærða notandaaðgangnum, verður viðkomandi send tilkynning í tölvupósti, nema ef flokkurinn Ruslpóstur sé valinn. actions_description_remote_html: Ákveddu til hvaða aðgerða eigi að taka til að leysa þessa kæru. Þetta mun aðeins hafa áhrif á hvernig netþjónninn þinn meðhöndlar þennan fjartengda aðgang og efnið á honum. add_to_report: Bæta fleiru í kæru + already_suspended_badges: + local: Þegar frystur á þessum netþjóni + remote: Þegar frystur á hinum netþjóninum are_you_sure: Ertu viss? assign_to_self: Úthluta mér assigned: Úthlutaður umsjónarmaður @@ -1656,7 +1659,6 @@ is: import: Flytja inn import_and_export: Inn- og útflutningur migrate: Yfirfærsla notandaaðgangs - notifications: Tilkynningar preferences: Kjörstillingar profile: Notandasnið relationships: Fylgist með og fylgjendur diff --git a/config/locales/it.yml b/config/locales/it.yml index 6e7f9a7ce1..16a42b0760 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -597,6 +597,9 @@ it: actions_description_html: Decidete quali azioni intraprendere per risolvere la segnalazione. Se si intraprende un'azione punitiva contro l'account segnalato, gli sarà inviata una notifica via e-mail, tranne quando è selezionata la categoria Spam. actions_description_remote_html: Decide quali azioni intraprendere per risolvere la relazione. Questo influenzerà solo come il tuo server comunica con questo account remoto e ne gestisce il contenuto. add_to_report: Aggiungi altro al report + already_suspended_badges: + local: Già sospeso su questo server + remote: Già sospeso sul loro server are_you_sure: Sei sicuro? assign_to_self: Assegna a me assigned: Moderatore assegnato @@ -1654,7 +1657,7 @@ it: import: Importa import_and_export: Importa ed esporta migrate: Migrazione dell'account - notifications: Notifiche + notifications: Notifiche e-mail preferences: Preferenze profile: Profilo relationships: Follows e followers diff --git a/config/locales/ja.yml b/config/locales/ja.yml index f5e874f98d..19b2e94db0 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1626,7 +1626,6 @@ ja: import: データのインポート import_and_export: インポート・エクスポート migrate: アカウントの引っ越し - notifications: 通知 preferences: ユーザー設定 profile: プロフィール relationships: フォロー・フォロワー diff --git a/config/locales/ka.yml b/config/locales/ka.yml index 74b8634600..c92fd98a7c 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -419,7 +419,6 @@ ka: export: მონაცემის ექსპორტი import: იმპორტი migrate: ანგარიშის მიგრაცია - notifications: შეტყობინებები preferences: პრეფერენციები two_factor_authentication: მეორე-ფაქტორის აუტენტიფიკაცია statuses: diff --git a/config/locales/kab.yml b/config/locales/kab.yml index 566ba0dee1..4ba608c9f9 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -784,7 +784,6 @@ kab: import: Kter import_and_export: Taktert d usifeḍ migrate: Tunigin n umiḍan - notifications: Ilɣa preferences: Imenyafen profile: Ameɣnu relationships: Imeḍfaṛen akked wid i teṭṭafaṛeḍ diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 1dcbce97eb..f08d8ead1a 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -643,7 +643,6 @@ kk: import: Импорт import_and_export: Импорт/экспорт migrate: Аккаунт көшіру - notifications: Ескертпелер preferences: Баптаулар profile: Профиль relationships: Жазылымдар және оқырмандар diff --git a/config/locales/ko.yml b/config/locales/ko.yml index c4dcb5687b..82472788dc 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -587,6 +587,9 @@ ko: actions_description_html: 이 신고를 해결하기 위해 취해야 할 조치를 지정해주세요. 신고된 계정에 대해 처벌 조치를 취하면, 스팸 카테고리가 선택된 경우를 제외하고 해당 계정으로 이메일 알림이 전송됩니다. actions_description_remote_html: 이 신고를 해결하기 위해 실행할 행동을 결정하세요. 이 결정은 이 원격 계정과 그 콘텐츠를 다루는 방식에 대해 이 서버에서만 영향을 끼칩니다 add_to_report: 신고에 더 추가하기 + already_suspended_badges: + local: 이 서버에서 이미 정지되었습니다 + remote: 저 서버에서 이미 정지되었습니다 are_you_sure: 확실합니까? assign_to_self: 나에게 할당하기 assigned: 할당된 중재자 @@ -1628,7 +1631,7 @@ ko: import: 데이터 가져오기 import_and_export: 가져오기 & 내보내기 migrate: 계정 이동 - notifications: 알림 + notifications: 이메일 알림 preferences: 환경설정 profile: 공개 프로필 relationships: 팔로잉과 팔로워 @@ -1823,8 +1826,10 @@ ko: feature_action: 더 알아보기 feature_audience: 마스토돈은 중개자 없이 청중을 관리할 수 있는 특별한 가능성을 제공합니다. 자체 인프라에 배포된 마스토돈을 사용하면 온라인에 있는 다른 마스토돈 서버에도 팔로우하거나 팔로우할 수 있으며, 본인 외에는 누구의 통제도 받지 않습니다. feature_audience_title: 신뢰 있는 청중 구축 + feature_control: 내가 홈 피드에서 무엇을 보고 싶은지는 내가 제일 잘 압니다. 알고리즘이나 시간을 낭비하게 만드는 광고는 없습니다. 계정 하나로 다른 마스토돈 서버에 있는 누구나 팔로우 하여 그들의 게시물을 시간순으로 받아보고 인터넷의 한 구석을 좀 더 나답게 만들어 보세요. feature_control_title: 내 타임라인에 대해 통제권을 유지하세요 feature_creativity: 마스토돈은 오디오, 비디오, 사진, 접근성 설명(alt), 투표, 콘텐츠 주의 (블라인드), 움직이는 아바타, 커스텀 이모티콘, 썸네일 자르기, 그리고 더 많은 것들을 당신이 온라인에서 당신을 더 잘 드러낼 수 있도록 돕기위해 지원합니다. 당신이 그림이나 음악을 올리던, 팟캐스트 같은것을 진행하던 마스토돈이 함께합니다. + feature_creativity_title: 독보적인 창의성 feature_moderation: 마스토돈은 의사 결정권을 사용자에게 돌려줍니다. 각 서버는 기업 소셜 미디어처럼 하향식이 아닌 로컬에서 시행되는 자체 규칙과 규정을 만들 수 있어 다양한 그룹의 요구에 가장 유연하게 대응할 수 있습니다. 동의하는 규칙이 있는 서버에 가입하거나 직접 서버를 호스팅하세요. feature_moderation_title: 올바른 중재 follow_action: 팔로우 diff --git a/config/locales/ku.yml b/config/locales/ku.yml index f8d9cd80d4..74dcd6f8f3 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -1417,7 +1417,6 @@ ku: import: Têxistin import_and_export: Têxistin û derxistin migrate: Barkirina ajimêrê - notifications: Agahdarî preferences: Hilbijarte profile: Profîl relationships: Şopandin û şopîner diff --git a/config/locales/lad.yml b/config/locales/lad.yml index c0ab028b9c..0f04ce8928 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -597,6 +597,9 @@ lad: actions_description_html: Dechide kualas mizuras tomar para rezolver esta denunsia. Si tomas una aksion punitiva kontra el kuento denunsiada, se le embiara a dicho kuento un avizo por posta elektronika, ekseptado kuando se eskoja la kategoria Spam. actions_description_remote_html: Dechide ke fazer para rezolver este raporto. Esto solo va afektar komo tu sirvidor komunike kon este kuento remoto i ke faze kon su kontenido. add_to_report: Adjusta mas al raporto + already_suspended_badges: + local: Ya suspendido en este sirvidor + remote: Ya suspendido en sus sirvidor are_you_sure: Estas siguro? assign_to_self: Asinyamela a mi assigned: Moderador asinyado @@ -1652,7 +1655,6 @@ lad: import: Importo import_and_export: Importo i eksporto migrate: Migrasyon de kuento - notifications: Avizos preferences: Preferensyas profile: Profil publiko relationships: Segidos i suivantes diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 610b4437c8..44b5443fc8 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -466,6 +466,9 @@ lt: destroyed_msg: Skundo žinutė sekmingai ištrinta! reports: action_taken_by: Veiksmo ėmėsi + already_suspended_badges: + local: Jau sustabdytas šiame serveryje + remote: Jau sustabdytas jų serveryje are_you_sure: Ar esi įsitikinęs (-usi)? assign_to_self: Paskirti man assigned: Paskirtas moderatorius @@ -755,7 +758,6 @@ lt: featured_tags: Rodomi saitažodžiai(#) import: Importuoti migrate: Paskyros migracija - notifications: Pranešimai preferences: Preferencijos two_factor_authentication: Dviejų veiksnių autentikacija statuses: diff --git a/config/locales/lv.yml b/config/locales/lv.yml index bd2500a912..481cd94f78 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -1667,7 +1667,6 @@ lv: import: Imports import_and_export: Imports un eksports migrate: Konta migrācija - notifications: Paziņojumi preferences: Iestatījumi profile: Profils relationships: Sekojamie un sekotāji diff --git a/config/locales/ml.yml b/config/locales/ml.yml index 5f8de52987..883a400318 100644 --- a/config/locales/ml.yml +++ b/config/locales/ml.yml @@ -87,5 +87,3 @@ ml: subject: "%{name} ഇപ്പോൾ നിങ്ങളെ പിന്തുടരുന്നു" relationships: following: പിന്തുടരുന്നു - settings: - notifications: അറിയിപ്പുകൾ diff --git a/config/locales/ms.yml b/config/locales/ms.yml index bfd6591ddb..f39c26a5c1 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -1595,7 +1595,6 @@ ms: import: Import import_and_export: Import dan eksport migrate: Penghijrahan akaun - notifications: Pemberitahuan preferences: Keutamaan profile: Profil relationships: Ikutan dan pengikut diff --git a/config/locales/my.yml b/config/locales/my.yml index 6898db877c..4ac9ecdd45 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -1594,7 +1594,6 @@ my: import: ထည့်သွင်းခြင်း import_and_export: ထည့်သွင်းခြင်းနှင့် ထုတ်ယူခြင်း migrate: အကောင့်ပြောင်းရွှေ့ခြင်း - notifications: အသိပေးချက်များ preferences: သတ်မှတ်ချက်များ profile: ပရိုဖိုင် relationships: စောင့်ကြည့်သူများနှင့် စောင့်ကြည့်စာရင်း diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 3b4c586dc5..561a0f0af8 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -597,6 +597,9 @@ nl: actions_description_html: Beslis welke maatregel moet worden genomen om deze rapportage op te lossen. Wanneer je een (straf)maatregel tegen het gerapporteerde account neemt, krijgt het account een e-mailmelding, behalve wanneer de spam-categorie is gekozen. actions_description_remote_html: Beslis welke actie moet worden ondernomen om deze rapportage op te lossen. Dit is alleen van invloed op hoe jouw server met dit externe account communiceert en de inhoud ervan beheert. add_to_report: Meer aan de rapportage toevoegen + already_suspended_badges: + local: Al geschorst op deze server + remote: Al geschorst op hun server are_you_sure: Weet je het zeker? assign_to_self: Aan mij toewijzen assigned: Toegewezen moderator @@ -1652,7 +1655,7 @@ nl: import: Importeren import_and_export: Importeren en exporteren migrate: Accountmigratie - notifications: Meldingen + notifications: E-mailmeldingen preferences: Voorkeuren profile: Openbaar profiel relationships: Volgers en gevolgde accounts diff --git a/config/locales/nn.yml b/config/locales/nn.yml index f53b67d098..983dd01421 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -152,7 +152,7 @@ nn: suspend: Utvis og slett kontodata for godt suspended: Utvist suspension_irreversible: Data frå denne kontoen har blitt ikkje-reverserbart sletta. Du kan oppheve suspenderinga av kontoen for å bruke den, men det vil ikkje gjenopprette alle data den tidligare har hatt. - suspension_reversible_hint_html: Kontoen har blitt suspendert, og data vil bli fullstendig fjerna den %{date}. Fram til då kan kontoen gjenopprettes uten negative effekter. Om du ynskjer å fjerne kontodata no, kan du gjere det nedanfor. + suspension_reversible_hint_html: Kontoen har vorte stengd, og data vil bli fullstendig fjerna den %{date}. Fram til då kandu gjenoppretta kontoen utan negative konsekvensar. Om du ynskjer å fjerna kontodata no, kan du gjera det nedanfor. title: Kontoar unblock_email: Avblokker e-postadresse unblocked_email_msg: Avblokkerte %{username} si e-postadresse @@ -221,7 +221,7 @@ nn: unblock_email_account: Avblokker e-postadresse unsensitive_account: Angr tving ømtolig konto unsilence_account: Angre avgrensing av konto - unsuspend_account: Opphev suspensjonen av kontoen + unsuspend_account: Opphev utestenginga av kontoen update_announcement: Oppdater kunngjøringen update_custom_emoji: Oppdater tilpassa emoji update_domain_block: Oppdater domene-sperring @@ -385,9 +385,9 @@ nn: add_new: Lag ny confirm_suspension: cancel: Avbryt - confirm: Suspender + confirm: Utvis permanent_action: Å oppheve suspensjonen vil ikkje gjenopprette data eller koplingar. - preamble_html: Du er i ferd med å suspendera %{domain} inkludert underdomener. + preamble_html: Du er i ferd med å utestenga %{domain} inkludert underdomene. remove_all_data: Dette vil fjerna alt innhald, media og profildata for kontoar som tilhøyrer dette domenet frå din tenar. stop_communication: Tenaren din vil slutta å kommunisera med desse tenarane. title: Stadfest domeneblokkering for %{domain} @@ -492,7 +492,7 @@ nn: reject_media: Avvis media reject_reports: Avvis rapporter silence: Begrens - suspend: Suspender + suspend: Utvis policy: Vilkår reason: Offentlig årsak title: Retningslinjer for innhold @@ -597,6 +597,9 @@ nn: actions_description_html: Avgjer kva som skal gjerast med denne rapporteringa. Dersom du utfører straffetiltak mot den rapporterte kontoen, vil dei motta ein e-post – så sant du ikkje har valt kategorien Spam. actions_description_remote_html: Avgjer kva du vil gjera for å løysa denne rapporten. Dette påverkar berre korleis tenaren din kommuniserer med kontoen på ein annan tenar, og korleis tenaren din handterer innhald derifrå. add_to_report: Legg til i rapporten + already_suspended_badges: + local: Allereie utestengd på denne tenaren + remote: Allereie utestengd på tenaren deira are_you_sure: Er du sikker? assign_to_self: Tilegn til meg assigned: Tilsett moderator @@ -979,7 +982,7 @@ nn: none: en advarsel sensitive: å merke kontoen sin som følsom silence: for å begrense deres konto - suspend: for å suspendere kontoen deres + suspend: for å stenga kontoen deira body: "%{target} ankar på ei modereringsavgjerd av %{action_taken_by} den %{date}, som var %{type}. Dei skreiv:" next_steps: Du kan godkjenna anken for å endra modereringsavgjerda, eller du kan oversjå anken. subject: "%{username} ankar ei modereringsavgjer på %{instance}" @@ -1189,7 +1192,7 @@ nn: none: Advarsel sensitive: Markering av konto som ømtolig silence: Begrensning av konto - suspend: Suspensjon av konto + suspend: Utestenging av konto your_appeal_approved: Din klage har blitt godkjent your_appeal_pending: Du har levert en klage your_appeal_rejected: Din klage har blitt avvist @@ -1652,7 +1655,7 @@ nn: import: Hent inn import_and_export: Importer og eksporter migrate: Kontoflytting - notifications: Varsel + notifications: E-postvarslingar preferences: Innstillingar profile: Profil relationships: Fylgjar og fylgjarar @@ -1820,7 +1823,7 @@ nn: mark_statuses_as_sensitive: Nokre av innlegga dine har vorte markerte som ømtolige av moderatorane ved %{instance}. Dette tyder at folk må trykkje på mediane i innlegga for å førehandsvise dei. Du kan markera media som ømtolig sjølv når du legg ut nye innlegg. sensitive: Frå no av vil alle dine opplasta mediefiler bli markert som ømtolig og skjult bak ei klikk-åtvaring. silence: Medan kontoen din er avgrensa, vil berre folk som allereie fylgjer deg sjå dine tutar på denne tenaren, og du kan bli ekskludert fra diverse offentlige oppføringer. Andre kan framleis fylgje deg manuelt. - suspend: Du kan ikkje lenger bruke kontoen din, og profilen og andre data er ikkje lenger tilgjengelege. Du kan framleis logge inn for å be om ein sikkerheitskopi av data før dei blir fullstendig sletta om omtrent 30 dagar, men vi beheld nokre grunnleggjande data for å forhindre deg å omgå suspenderinga. + suspend: Du kan ikkje lenger bruka kontoen din, og profilen og andre data er ikkje lenger tilgjengelege. Du kan framleis logga inn for å be om ein sikkerheitskopi av data før dei blir fullstendig sletta om omtrent 30 dagar, men me vil lagra nokre grunnleggjande data for å syta for at du ikkje omgår utestenginga. reason: 'Årsak:' statuses: 'Innlegg sitert:' subject: @@ -1865,6 +1868,9 @@ nn: follows_subtitle: Fylg kjende folk follows_title: Kven du kan fylgja follows_view_more: Sjå fleire du kan fylgja + hashtags_recent_count: + one: "%{people} person dei siste to dagane" + other: "%{people} personar dei siste to dagane" hashtags_subtitle: Sjå kva som har vore populært dei siste to dagane hashtags_title: Populære emneknaggar hashtags_view_more: Sjå fleire populære emneknaggar diff --git a/config/locales/no.yml b/config/locales/no.yml index 4cdf2ca82a..c71dffc636 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -1649,7 +1649,6 @@ import: Importér import_and_export: Importer og eksporter migrate: Kontomigrering - notifications: Varslinger preferences: Innstillinger profile: Profil relationships: Følginger og følgere diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 569f76715b..0a653ea46c 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -832,7 +832,6 @@ oc: import: Importar de donadas import_and_export: Import e export migrate: Migracion de compte - notifications: Notificacions preferences: Preferéncias profile: Perfil relationships: Abonaments e seguidors diff --git a/config/locales/pl.yml b/config/locales/pl.yml index e43f9a6050..1dc1482e20 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -621,6 +621,9 @@ pl: actions_description_html: Zdecyduj, jakie działania należy podjąć, aby rozstrzygnąć niniejsze zgłoszenie. Jeśli podejmiesz działania karne przeciwko zgłoszonemu kontowi, zostanie do nich wysłane powiadomienie e-mail, chyba że wybrano kategorię Spam. actions_description_remote_html: Zdecyduj, jakie działanie należy podjąć, aby rozwiązać to zgłoszenie. Będzie to miało wpływ jedynie na sposób, w jaki Twój serwer komunikuje się z tym kontem zdalnym i obsługuje jego zawartość. add_to_report: Dodaj więcej do zgłoszenia + already_suspended_badges: + local: Już zawieszono na tym serwerze + remote: Już zawieszono na ich serwerze are_you_sure: Czy na pewno? assign_to_self: Przypisz do siebie assigned: Przypisany moderator @@ -1704,7 +1707,7 @@ pl: import: Importowanie danych import_and_export: Import i eksport migrate: Migracja konta - notifications: Powiadomienia + notifications: Powiadomienia e-mail preferences: Preferencje profile: Profil relationships: Obserwowani i obserwujący diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 194de9a3eb..78a20aed02 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -1652,7 +1652,6 @@ pt-BR: import: Importar import_and_export: Importar e exportar migrate: Migração de conta - notifications: Notificações preferences: Preferências profile: Perfil relationships: Seguindo e seguidores diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 57a698e1d1..9dde61ff06 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -597,6 +597,9 @@ pt-PT: actions_description_html: Decida a ação a tomar para resolver esta denúncia. Se decidir por uma ação punitiva contra a conta denunciada, um e-mail de notificação será enviado, excetuando quando selecionada a categoria Spam. actions_description_remote_html: Decida quais as medidas a tomar para resolver esta denúncia. Isso apenas afetará como o seu servido comunica com esta conta remota e gere o seu conteúdo. add_to_report: Adicionar mais à denúncia + already_suspended_badges: + local: Já suspenso neste servidor + remote: Já suspenso no servidor deles are_you_sure: Tem a certeza? assign_to_self: Atribuída a mim assigned: Atribuída ao moderador @@ -1652,7 +1655,7 @@ pt-PT: import: Importar import_and_export: Importar e exportar migrate: Migração de conta - notifications: Notificações + notifications: Notificações por e-mail preferences: Preferências profile: Perfil relationships: Seguindo e seguidores @@ -1865,6 +1868,9 @@ pt-PT: follows_subtitle: Siga contas bem conhecidas follows_title: Quem seguir follows_view_more: Veja mais pessoas para seguir + hashtags_recent_count: + one: "%{people} pessoa nos últimos 2 dias" + other: "%{people} pessoas nos últimos 2 dias" hashtags_subtitle: Explore o que está em tendência desde os últimos 2 dias hashtags_title: Trending hashtags hashtags_view_more: Ver mais hashtags em alta diff --git a/config/locales/ru.yml b/config/locales/ru.yml index d2c4609700..05ea31ff81 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1699,7 +1699,6 @@ ru: import: Импорт import_and_export: Импорт и экспорт migrate: Миграция учётной записи - notifications: Уведомления preferences: Настройки profile: Профиль relationships: Подписки и подписчики diff --git a/config/locales/sc.yml b/config/locales/sc.yml index e51ac84eac..01c355794d 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -985,7 +985,6 @@ sc: import: Importatzione import_and_export: Importatzione e esportatzione migrate: Tràmuda de contu - notifications: Notìficas preferences: Preferèntzias profile: Profilu relationships: Gente chi sighis e sighiduras diff --git a/config/locales/sco.yml b/config/locales/sco.yml index 8382dec76e..2a7b1e3e70 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -1407,7 +1407,6 @@ sco: import: Import import_and_export: Import an export migrate: Accoont flittin - notifications: Notes preferences: Preferences profile: Profile relationships: Follaes and follaers diff --git a/config/locales/si.yml b/config/locales/si.yml index e0be7ff8e9..f5e65fda8d 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -1274,7 +1274,6 @@ si: import: ආයාතය import_and_export: ආයාත හා නිර්යාත migrate: ගිණුම් සංක්‍රමණය - notifications: දැනුම්දීම් preferences: අභිප්‍රේත profile: ප්‍රසිද්ධ පැතිකඩ relationships: අනුගමන හා අනුගාමික diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index 72525619c7..1edf185c0a 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -165,7 +165,7 @@ nn: none: Gjer inkje sensitive: Ømtolig silence: Togn - suspend: Utvis og slett kontodata for godt + suspend: Utvis warning_preset_id: Bruk åtvaringsoppsett announcement: all_day: Heildagshending diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 1d8866645c..6b59677910 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -198,11 +198,14 @@ sk: destroy_ip_block: Vymaž IP pravidlo destroy_status: Vymaž príspevok destroy_unavailable_domain: Vymaž nedostupnú doménu + destroy_user_role: Zničiť rolu disable_2fa_user: Vypni dvoj-faktorové overovanie disable_custom_emoji: Vypni vlastné emotikony + disable_sign_in_token_auth_user: Zakázať používateľom overovanie e-mailovým tokenom disable_user: Deaktivuj užívateľa enable_custom_emoji: Povoľ vlastné emotikony enable_user: Povoľ užívateľa + memorialize_account: Zmena na „in memoriam“ promote_user: Povýš užívateľskú rolu reject_appeal: Zamietni námietku reject_user: Zamietni užívateľa @@ -447,10 +450,13 @@ sk: instance_statuses_measure: uložené príspevky delivery: all: Všetko + clear: Vymazať chyby doručovania failing: Zlyhávajúce + restart: Reštartovať doručovanie stop: Zastav doručenie unavailable: Nedostupné delivery_available: Je v dosahu doručovania + delivery_error_days: Dni chybného doručovania empty: Nenájdené žiadne domény. moderation: all: Všetky @@ -1188,7 +1194,7 @@ sk: import: Importuj import_and_export: Import a export migrate: Presuň účet - notifications: Oboznámenia + notifications: Emailové upozornenia preferences: Voľby profile: Profil relationships: Sledovania a následovatelia diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 3f2b65b76a..9498ca7898 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -621,6 +621,9 @@ sl: actions_description_html: Odločite se, katere ukrepe boste sprejeli za rešitev te prijave. Če sprejmete kazenski ukrep proti prijavljenemu računu, mu bo poslano e-poštno obvestilo, razen če je izbrana kategorija Neželena pošta. actions_description_remote_html: Odločite se za dejanje, ki bo odločilo o tej prijavi. To bo vplivalo le na to, kako vaš strežnik komunicira s tem oddaljenim računom in obravnava njegovo vsebino. add_to_report: Dodaj več v prijavo + already_suspended_badges: + local: Že suspendiran na tem strežniku + remote: Že suspendiran na njihovem strežniku are_you_sure: Ali ste prepričani? assign_to_self: Dodeli meni assigned: Dodeljen moderator @@ -1704,7 +1707,7 @@ sl: import: Uvozi import_and_export: Uvoz in izvoz migrate: Selitev računa - notifications: Obvestila + notifications: Obvestila po e-pošti preferences: Nastavitve profile: Profil relationships: Sledenja in sledilci diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 759f995470..ce2c8b0f99 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -596,6 +596,9 @@ sq: actions_description_html: Vendosni cili veprim të kryhet për të zgjidhur këtë raportim. Nëse ndërmerrni një veprim ndëshkues kundër llogarisë së raportuar, atyre do t’u dërgohet një njoftim me email, hiq rastin kur përzgjidhet kategoria I padëshiruar. actions_description_remote_html: Vendosni cili veprim të ndërmerret për zgjidhjen e këtij raportimi. Kjo do të prekë vetëm mënyrën se si shërbyesi juaj komunikon me këtë llogari të largët dhe se si e trajtojnë lëndën e saj. add_to_report: Shtoni më tepër te raportimi + already_suspended_badges: + local: Tashmë i pezulluar në këtë shërbyes + remote: Tashmë i pezulluar në shërbyesin e vet are_you_sure: A jeni i sigurt? assign_to_self: Caktojani vetes assigned: Iu caktua moderator @@ -1648,7 +1651,7 @@ sq: import: Importo import_and_export: Importim dhe eksportim migrate: Migrim llogarie - notifications: Njoftime + notifications: Njoftime me email preferences: Parapëlqime profile: Profil relationships: Ndjekje dhe ndjekës diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 74a5e0b1c0..4f10fe8649 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -1678,7 +1678,6 @@ sr-Latn: import: Uvoz import_and_export: Uvoz i izvoz migrate: Prebacivanje naloga - notifications: Obaveštenja preferences: Podešavanja profile: Javni profil relationships: Praćenja i pratioci diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 9e7dd9c35c..382f196bd0 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -1678,7 +1678,6 @@ sr: import: Увоз import_and_export: Увоз и извоз migrate: Пребацивање налога - notifications: Обавештења preferences: Подешавања profile: Јавни профил relationships: Праћења и пратиоци diff --git a/config/locales/sv.yml b/config/locales/sv.yml index d282d92222..855fa765f5 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -1652,7 +1652,7 @@ sv: import: Importera import_and_export: Import och export migrate: Kontoflytt - notifications: Aviseringar + notifications: E-postaviseringar preferences: Inställningar profile: Profil relationships: Följer och följare diff --git a/config/locales/th.yml b/config/locales/th.yml index 67d2b94793..558552362f 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -585,6 +585,9 @@ th: actions_description_html: ตัดสินใจว่าการกระทำใดที่จะใช้เพื่อแก้ปัญหารายงานนี้ หากคุณใช้การกระทำที่เป็นการลงโทษต่อบัญชีที่รายงาน จะส่งการแจ้งเตือนอีเมลถึงเขา ยกเว้นเมื่อมีการเลือกหมวดหมู่ สแปม actions_description_remote_html: ตัดสินใจว่าการกระทำใดที่จะใช้เพื่อแก้ปัญหารายงานนี้ นี่จะมีผลต่อวิธีที่เซิร์ฟเวอร์ ของคุณ สื่อสารกับบัญชีระยะไกลนี้และจัดการเนื้อหาของบัญชีเท่านั้น add_to_report: เพิ่มข้อมูลเพิ่มเติมไปยังรายงาน + already_suspended_badges: + local: ระงับในเซิร์ฟเวอร์นี้อยู่แล้ว + remote: ระงับในเซิร์ฟเวอร์ของเขาอยู่แล้ว are_you_sure: คุณแน่ใจหรือไม่? assign_to_self: มอบหมายให้ฉัน assigned: ผู้กลั่นกรองที่ได้รับมอบหมาย @@ -1626,7 +1629,7 @@ th: import: การนำเข้า import_and_export: การนำเข้าและการส่งออก migrate: การโยกย้ายบัญชี - notifications: การแจ้งเตือน + notifications: การแจ้งเตือนทางอีเมล preferences: การกำหนดลักษณะ profile: โปรไฟล์สาธารณะ relationships: การติดตามและผู้ติดตาม diff --git a/config/locales/tr.yml b/config/locales/tr.yml index a942e5b394..bdf002333d 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -597,6 +597,9 @@ tr: actions_description_html: Bu bildirimi çözmek için ne yapılması gerektiğine karar verin. Bildirilen hesap için ceza işlemi yaparsanız, İstenmeyen kategorisi seçilmemişse, onlara bir e-posta duyurusu gönderilecektir. actions_description_remote_html: Bu bildirimi çözmek için hangi eylemi yapmak istediğinize karar verin. Bu yalnızca sizin sunucunuzun bu uzak hesapla nasıl etkileşeğini ve içeriğiyle ne yapacağını etkiler. add_to_report: Bildirime daha fazlasını ekle + already_suspended_badges: + local: Bu sunucuda zaten askıya alınmış + remote: Sunucularında zaten askıya alınmış are_you_sure: Emin misiniz? assign_to_self: Bana ata assigned: Denetleyici atandı @@ -1652,7 +1655,7 @@ tr: import: İçe aktar import_and_export: İçe ve dışa aktar migrate: Hesap taşıma - notifications: Bildirimler + notifications: E-posta bildirimleri preferences: Tercihler profile: Profil relationships: Takip edilenler ve takipçiler diff --git a/config/locales/tt.yml b/config/locales/tt.yml index 845b33a021..c1a22a4ca8 100644 --- a/config/locales/tt.yml +++ b/config/locales/tt.yml @@ -511,7 +511,6 @@ tt: development: Ясаучылар өчен edit_profile: Профильне үзгәртү import: Импортлау - notifications: Искәртүләр preferences: Caylaw profile: Профиль two_factor_authentication: Ике-факторлы авторизация diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 9c343489eb..21ddeb5117 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -621,6 +621,9 @@ uk: actions_description_html: Визначте, які дії слід вжити для розв'язання цієї скарги. Якщо ви оберете каральні дії проти зареєстрованого облікового запису, про них буде надіслано сповіщення електронним листом, крім випадків, коли вибрано категорію Спам. actions_description_remote_html: Визначте, які дії слід вжити для розв'язання цього звіту. Це вплине тільки на те, як ваш сервер з'єднується з цим віддаленим обліковим записом і обробляє його вміст. add_to_report: Додати ще подробиць до скарги + already_suspended_badges: + local: Вже призупинено на цьому сервері + remote: Уже призупинено на їх сервері are_you_sure: Ви впевнені? assign_to_self: Призначити мені assigned: Призначений модератор @@ -1704,7 +1707,7 @@ uk: import: Імпорт import_and_export: Імпорт та експорт migrate: Міграція облікового запису - notifications: Сповіщення + notifications: E-mail сповіщення preferences: Налаштування profile: Загальнодоступний профіль relationships: Підписки та підписники diff --git a/config/locales/vi.yml b/config/locales/vi.yml index b9efeee46e..fc4ec80482 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1626,7 +1626,6 @@ vi: import: Nhập dữ liệu import_and_export: Dữ liệu migrate: Chuyển tài khoản sang máy chủ khác - notifications: Thông báo preferences: Chung profile: Hồ sơ relationships: Quan hệ diff --git a/config/locales/zgh.yml b/config/locales/zgh.yml index 1db573369a..180fcf2f16 100644 --- a/config/locales/zgh.yml +++ b/config/locales/zgh.yml @@ -110,5 +110,4 @@ zgh: account_settings: ⵜⵉⵙⵖⴰⵍ ⵏ ⵓⵎⵉⴹⴰⵏ back: ⴰⵖⵓⵍ ⵖⵔ ⵎⴰⵙⵜⵓⴷⵓⵏ edit_profile: ⵙⵏⴼⵍ ⵉⴼⵔⵙ - notifications: ⵜⵉⵏⵖⵎⵉⵙⵉⵏ profile: ⵉⴼⵔⵙ diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 2d1d82b306..29f9badb80 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -585,6 +585,9 @@ zh-CN: actions_description_html: 决定采取何种措施处理此举报。如果对被举报账号采取惩罚性措施,将向其发送一封电子邮件通知。但若选中垃圾信息类别则不会发送通知。 actions_description_remote_html: 决定采取何种行动来解决此举报。 这只会影响您的服务器如何与该远程帐户的通信并处理其内容。 add_to_report: 增加更多举报内容 + already_suspended_badges: + local: 已经在此服务器上暂停 + remote: 已在其所属服务器被封禁 are_you_sure: 你确定吗? assign_to_self: 接管 assigned: 已接管的监察员 @@ -1626,7 +1629,7 @@ zh-CN: import: 导入 import_and_export: 导入和导出 migrate: 账户迁移 - notifications: 通知 + notifications: 电子邮件通知 preferences: 首选项 profile: 个人资料 relationships: 关注管理 diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 0bb362eadf..2a0f802a1f 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1626,7 +1626,6 @@ zh-HK: import: 匯入 import_and_export: 匯入及匯出 migrate: 帳戶遷移 - notifications: 通知 preferences: 偏好設定 profile: 個人資料 relationships: 關注及追隨者 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 4c450f3c1b..b78c7d3319 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -585,6 +585,9 @@ zh-TW: actions_description_html: 決定應對此報告採取何種行動。若您對檢舉之帳號採取懲罰措施,則將對他們發送 e-mail 通知,如非選擇了 垃圾郵件 類別。 actions_description_remote_html: 決定將對此檢舉報告採取何種動作。這將僅作用於您的伺服器與此遠端帳號及其內容之通訊行為。 add_to_report: 加入更多至報告 + already_suspended_badges: + local: 已自此伺服器停權 + remote: 已自該伺服器停權 are_you_sure: 您確定嗎? assign_to_self: 指派給自己 assigned: 指派站務 @@ -1628,7 +1631,7 @@ zh-TW: import: 匯入 import_and_export: 匯入及匯出 migrate: 帳號搬遷 - notifications: 通知 + notifications: 電子郵件通知 preferences: 偏好設定 profile: 個人檔案 relationships: 跟隨中與跟隨者 From a583317df62acced3cea1f102e5c7981ff1bdbea Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 20 Mar 2024 12:06:44 +0100 Subject: [PATCH 246/954] Fix icon and styling in browser notifications banner (#29658) --- .../notifications/components/column_settings.jsx | 14 ++++++++------ .../components/notifications_permission_banner.jsx | 4 ++-- .../material-icons/400-20px/settings-fill.svg | 1 + .../material-icons/400-20px/settings.svg | 1 + app/javascript/styles/mastodon/components.scss | 6 ++++++ 5 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 app/javascript/material-icons/400-20px/settings-fill.svg create mode 100644 app/javascript/material-icons/400-20px/settings.svg diff --git a/app/javascript/mastodon/features/notifications/components/column_settings.jsx b/app/javascript/mastodon/features/notifications/components/column_settings.jsx index 2a9425b82b..caa1b757a4 100644 --- a/app/javascript/mastodon/features/notifications/components/column_settings.jsx +++ b/app/javascript/mastodon/features/notifications/components/column_settings.jsx @@ -68,16 +68,18 @@ export default class ColumnSettings extends PureComponent { )} - {alertsEnabled && browserSupport && browserPermission === 'default' && ( - - - - )} -
+ {alertsEnabled && browserSupport && browserPermission === 'default' && ( +
+ + + +
+ )} +

diff --git a/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.jsx b/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.jsx index 1cdf5b5dfe..276bcbebad 100644 --- a/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.jsx +++ b/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.jsx @@ -5,8 +5,8 @@ import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { connect } from 'react-redux'; +import SettingsIcon from '@/material-icons/400-20px/settings.svg?react'; import CloseIcon from '@/material-icons/400-24px/close.svg?react'; -import TuneIcon from '@/material-icons/400-24px/tune.svg?react'; import { requestBrowserPermission } from 'mastodon/actions/notifications'; import { changeSetting } from 'mastodon/actions/settings'; import { Button } from 'mastodon/components/button'; @@ -42,7 +42,7 @@ class NotificationsPermissionBanner extends PureComponent {

-

}} />

+

}} />

); diff --git a/app/javascript/material-icons/400-20px/settings-fill.svg b/app/javascript/material-icons/400-20px/settings-fill.svg new file mode 100644 index 0000000000..f5de77821d --- /dev/null +++ b/app/javascript/material-icons/400-20px/settings-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-20px/settings.svg b/app/javascript/material-icons/400-20px/settings.svg new file mode 100644 index 0000000000..472569ab6a --- /dev/null +++ b/app/javascript/material-icons/400-20px/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 71f9e0d9d0..ff3b72158c 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -8581,6 +8581,12 @@ noscript { color: $darker-text-color; margin-bottom: 15px; text-align: center; + + .icon { + width: 20px; + height: 20px; + vertical-align: middle; + } } } From e36e7ea2432104d2e72ab71f1aa5d2d4ca5ad3c8 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 20 Mar 2024 12:06:50 +0100 Subject: [PATCH 247/954] Fix emoji picker dropdown background and borders (#29653) --- app/javascript/styles/mastodon/components.scss | 5 +++++ app/javascript/styles/mastodon/emoji_picker.scss | 15 --------------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index ff3b72158c..c2a968aec3 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -4848,6 +4848,11 @@ a.status-card { position: relative; margin-top: 5px; z-index: 2; + background: var(--dropdown-background-color); + backdrop-filter: var(--background-filter); + border: 1px solid var(--dropdown-border-color); + box-shadow: var(--dropdown-shadow); + border-radius: 5px; .emoji-mart-scroll { transition: opacity 200ms ease; diff --git a/app/javascript/styles/mastodon/emoji_picker.scss b/app/javascript/styles/mastodon/emoji_picker.scss index fec0c10ddb..14ce6a14b5 100644 --- a/app/javascript/styles/mastodon/emoji_picker.scss +++ b/app/javascript/styles/mastodon/emoji_picker.scss @@ -14,21 +14,9 @@ } .emoji-mart-bar { - border: 0 solid var(--dropdown-border-color); - &:first-child { - border-bottom-width: 1px; - border-top-left-radius: 5px; - border-top-right-radius: 5px; background: var(--dropdown-border-color); } - - &:last-child { - border-top-width: 1px; - border-bottom-left-radius: 5px; - border-bottom-right-radius: 5px; - display: none; - } } .emoji-mart-anchors { @@ -94,7 +82,6 @@ height: 270px; max-height: 35vh; padding: 0 6px 6px; - background: var(--dropdown-background-color); will-change: transform; &::-webkit-scrollbar-track:hover, @@ -106,7 +93,6 @@ .emoji-mart-search { padding: 10px; padding-inline-end: 45px; - background: var(--dropdown-background-color); position: relative; input { @@ -195,7 +181,6 @@ width: 100%; font-weight: 500; padding: 5px 6px; - background: var(--dropdown-background-color); } } From 94f7ae192b8df4f0a8846249016268f914b730bb Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 20 Mar 2024 12:07:02 +0100 Subject: [PATCH 248/954] Fix emoji picker placement on limited-height viewports (#29651) --- .../compose/components/emoji_picker_dropdown.jsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx index acc3fd0ce5..43795d030f 100644 --- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx +++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx @@ -330,6 +330,7 @@ class EmojiPickerDropdown extends PureComponent { state = { active: false, loading: false, + placement: 'bottom', }; setRef = (c) => { @@ -381,10 +382,14 @@ class EmojiPickerDropdown extends PureComponent { return this.target; }; + handleOverlayEnter = (state) => { + this.setState({ placement: state.placement }); + }; + render () { const { intl, onPickEmoji, onSkinTone, skinTone, frequentlyUsedEmojis } = this.props; const title = intl.formatMessage(messages.emoji); - const { active, loading } = this.state; + const { active, loading, placement } = this.state; return (
@@ -397,7 +402,7 @@ class EmojiPickerDropdown extends PureComponent { inverted /> - + {({ props, placement })=> (
From a68dd889feac16cda51a82c3c5ba8a8c82c0a2c8 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 20 Mar 2024 12:07:10 +0100 Subject: [PATCH 249/954] Add back support for old browsers (#29654) --- .browserslistrc | 4 +- package.json | 1 + postcss.config.js | 1 + yarn.lock | 855 +++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 858 insertions(+), 3 deletions(-) diff --git a/.browserslistrc b/.browserslistrc index 54dd3aaf34..0376af4bcc 100644 --- a/.browserslistrc +++ b/.browserslistrc @@ -1,7 +1,9 @@ [production] defaults -not IE 11 +> 0.2% +ios >= 15.6 not dead +not OperaMini all [development] supports es6-module diff --git a/package.json b/package.json index a42767580e..ed59a68a41 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,7 @@ "path-complete-extname": "^1.0.0", "postcss": "^8.4.24", "postcss-loader": "^4.3.0", + "postcss-preset-env": "^9.5.2", "prop-types": "^15.8.1", "punycode": "^2.3.0", "react": "^18.2.0", diff --git a/postcss.config.js b/postcss.config.js index 5d58d74e34..b6ea8130b5 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,5 +1,6 @@ module.exports = ({ env }) => ({ plugins: [ + 'postcss-preset-env', 'autoprefixer', env === 'production' ? 'cssnano' : '', ], diff --git a/yarn.lock b/yarn.lock index bb2722fba0..1e37fcc029 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1538,6 +1538,46 @@ __metadata: languageName: node linkType: hard +"@csstools/cascade-layer-name-parser@npm:^1.0.9": + version: 1.0.9 + resolution: "@csstools/cascade-layer-name-parser@npm:1.0.9" + peerDependencies: + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + checksum: 10c0/f6e28c7cdeca44711288400cf20de9ebc4db71eafa39ca9a6b3e9f5d3295ba636dd986aac9fcb9e6171c84d436712d68ced923504d78d5fda0601c880eb352fe + languageName: node + linkType: hard + +"@csstools/color-helpers@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/color-helpers@npm:4.0.0" + checksum: 10c0/fc78871253f8c92789ed64a0e5555bd2873c2b62a49c30baced88487561fe09fe897b0d16fcf7bf2a94f78ff37530773a4395ce5efc016810c094041b5bbcd42 + languageName: node + linkType: hard + +"@csstools/css-calc@npm:^1.2.0": + version: 1.2.0 + resolution: "@csstools/css-calc@npm:1.2.0" + peerDependencies: + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + checksum: 10c0/ef12dc08ccdb9903e5cb24d81b469080b94c79123415f62f707196a85c53420b7729be608930314c7a9404f50c832fe5256f647c0567d1c825079cb77f6a8719 + languageName: node + linkType: hard + +"@csstools/css-color-parser@npm:^1.6.2": + version: 1.6.2 + resolution: "@csstools/css-color-parser@npm:1.6.2" + dependencies: + "@csstools/color-helpers": "npm:^4.0.0" + "@csstools/css-calc": "npm:^1.2.0" + peerDependencies: + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + checksum: 10c0/f587482fd7a40b6bd4cc790771245477d82203ba08f8f85981908680423476b9733c71fb4f1ba655f4dfb77907b4dfbb654dd7ba89e9edf0ba5229c26830ee8f + languageName: node + linkType: hard + "@csstools/css-parser-algorithms@npm:^2.5.0": version: 2.5.0 resolution: "@csstools/css-parser-algorithms@npm:2.5.0" @@ -1547,6 +1587,15 @@ __metadata: languageName: node linkType: hard +"@csstools/css-parser-algorithms@npm:^2.6.1": + version: 2.6.1 + resolution: "@csstools/css-parser-algorithms@npm:2.6.1" + peerDependencies: + "@csstools/css-tokenizer": ^2.2.4 + checksum: 10c0/2c60377c4ffc96bbeb962cab19c09fccbcc834785928747219ed3bd916a34e52977393935d1d36501403f3f95ff59d358dd741d1dddcdaf9564ab36d73926aa6 + languageName: node + linkType: hard + "@csstools/css-tokenizer@npm:^2.2.3": version: 2.2.3 resolution: "@csstools/css-tokenizer@npm:2.2.3" @@ -1554,6 +1603,13 @@ __metadata: languageName: node linkType: hard +"@csstools/css-tokenizer@npm:^2.2.4": + version: 2.2.4 + resolution: "@csstools/css-tokenizer@npm:2.2.4" + checksum: 10c0/23997db5874514f4b951ebd215e1e6cc8baf03adf9a35fc6fd028b84cb52aa2dc053860722108c09859a9b37b455f62b84181fe15539cd37797ea699b9ff85f0 + languageName: node + linkType: hard + "@csstools/media-query-list-parser@npm:^2.1.7": version: 2.1.7 resolution: "@csstools/media-query-list-parser@npm:2.1.7" @@ -1564,6 +1620,382 @@ __metadata: languageName: node linkType: hard +"@csstools/media-query-list-parser@npm:^2.1.9": + version: 2.1.9 + resolution: "@csstools/media-query-list-parser@npm:2.1.9" + peerDependencies: + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + checksum: 10c0/602e9b5631928c078e670018df20b959bfb8e42ea11024d5218f1604e5ef94e070a74934a919ccbff3713e506d99096057947fa0c2e4768939f7b22479553534 + languageName: node + linkType: hard + +"@csstools/postcss-cascade-layers@npm:^4.0.3": + version: 4.0.3 + resolution: "@csstools/postcss-cascade-layers@npm:4.0.3" + dependencies: + "@csstools/selector-specificity": "npm:^3.0.2" + postcss-selector-parser: "npm:^6.0.13" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/63f29af21eed000130f6f1268c00188a52eafbdeccc6acf5aa46507e499259631aa89f928b01b4698c41f3f68703db4c6e363c0e6f64b04b20c7e6452a5b259a + languageName: node + linkType: hard + +"@csstools/postcss-color-function@npm:^3.0.12": + version: 3.0.12 + resolution: "@csstools/postcss-color-function@npm:3.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^1.6.2" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/postcss-progressive-custom-properties": "npm:^3.1.1" + "@csstools/utilities": "npm:^1.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/a270aef93e98efb2b184b84a5de8acc28b10aed229807d1e5b5cf43309b281782895322ec98c0c9486b306ec68915e06689d6959c13ea2ab37fbb773ecd02335 + languageName: node + linkType: hard + +"@csstools/postcss-color-mix-function@npm:^2.0.12": + version: 2.0.12 + resolution: "@csstools/postcss-color-mix-function@npm:2.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^1.6.2" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/postcss-progressive-custom-properties": "npm:^3.1.1" + "@csstools/utilities": "npm:^1.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/42c7d48eeb1c1e49265505b560b9e034861254c62c5f78d89538255decab67d70f89bf81b269b208aa2103e9f48a51a33bb009eb17774f07c0459929d97f7056 + languageName: node + linkType: hard + +"@csstools/postcss-exponential-functions@npm:^1.0.5": + version: 1.0.5 + resolution: "@csstools/postcss-exponential-functions@npm:1.0.5" + dependencies: + "@csstools/css-calc": "npm:^1.2.0" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/45e18ca9025597da29cbef214cef39fcabef1e169bbb1f5c015de5f677e2927a1c3b8ae18558d815701e8d3e64db1043412a222af35036c92c25011a0e1e027d + languageName: node + linkType: hard + +"@csstools/postcss-font-format-keywords@npm:^3.0.2": + version: 3.0.2 + resolution: "@csstools/postcss-font-format-keywords@npm:3.0.2" + dependencies: + "@csstools/utilities": "npm:^1.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/1b9bf031ce1a00fef1fae0b1ad614eddc6bb4c036ecad47e065c99063ba3d2f6ab8e47f9db02a6fbe8b75b0e02a075a7a80480d4296918970ba9e8d36f07a523 + languageName: node + linkType: hard + +"@csstools/postcss-gamut-mapping@npm:^1.0.5": + version: 1.0.5 + resolution: "@csstools/postcss-gamut-mapping@npm:1.0.5" + dependencies: + "@csstools/css-color-parser": "npm:^1.6.2" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/33e2185ae8f8a229476bd5a60c0523aef8cb4de552a6c532514b9d87bff579f36fb7640dd14c9ea56906996d43f4d5ab969a4f704e1b8a94f7802beb3df31d08 + languageName: node + linkType: hard + +"@csstools/postcss-gradients-interpolation-method@npm:^4.0.13": + version: 4.0.13 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:4.0.13" + dependencies: + "@csstools/css-color-parser": "npm:^1.6.2" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/postcss-progressive-custom-properties": "npm:^3.1.1" + "@csstools/utilities": "npm:^1.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/af7c2d9c8e2249ea4cc50c9ef1b5ad75b1ed062020f1a8906ba9baf3143c4e2638b8b2189d7552838558e7b9a8a1ee9aa0baa076f5deabb23c1dc90fd78d7eab + languageName: node + linkType: hard + +"@csstools/postcss-hwb-function@npm:^3.0.11": + version: 3.0.11 + resolution: "@csstools/postcss-hwb-function@npm:3.0.11" + dependencies: + "@csstools/css-color-parser": "npm:^1.6.2" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/postcss-progressive-custom-properties": "npm:^3.1.1" + "@csstools/utilities": "npm:^1.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/d779617ef97ff22a125fbdd65f01dd3dd5bc607dbe7f3b02ae808d2fcccb1d5022b7f8e66e64283f7f9c52b6997bf0dc649566c734f0e3e4f3ba3c66a3b564a8 + languageName: node + linkType: hard + +"@csstools/postcss-ic-unit@npm:^3.0.5": + version: 3.0.5 + resolution: "@csstools/postcss-ic-unit@npm:3.0.5" + dependencies: + "@csstools/postcss-progressive-custom-properties": "npm:^3.1.1" + "@csstools/utilities": "npm:^1.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/bf21b74e1bdff425481724a36385f1ebe7c8aea6cccfcf6715cad58449d2d19419342e94d33d6626ec09bed8d4ab6e391b8eebaa3bda721e7f41e5c64c485f2a + languageName: node + linkType: hard + +"@csstools/postcss-initial@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-initial@npm:1.0.1" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/5d21c7c611d90a4b6758ba5be5e38d8d9eea9499c62797c4f5e01fbc9ccc2c68daf1c201850efe70ffa4ff9e979e7dea80b854b8793768550879562881aa6f9f + languageName: node + linkType: hard + +"@csstools/postcss-is-pseudo-class@npm:^4.0.5": + version: 4.0.5 + resolution: "@csstools/postcss-is-pseudo-class@npm:4.0.5" + dependencies: + "@csstools/selector-specificity": "npm:^3.0.2" + postcss-selector-parser: "npm:^6.0.13" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/5f35d5474957be30f54b89cf46b818390754af8094c4d9a083a79d579ccd817452bb7e2cfef8951c664d4c6ba381d8d45cd89f49339a42941f947ccb032f9d45 + languageName: node + linkType: hard + +"@csstools/postcss-light-dark-function@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-light-dark-function@npm:1.0.1" + dependencies: + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/postcss-progressive-custom-properties": "npm:^3.1.1" + "@csstools/utilities": "npm:^1.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/538e809b473b91245cb79418949c4a27c0e82b0ea357f9c93b054e07d3194857e53979693226be9448904a7d9d4ad4732ad34183db82927bb172fe6cab1e53a8 + languageName: node + linkType: hard + +"@csstools/postcss-logical-float-and-clear@npm:^2.0.1": + version: 2.0.1 + resolution: "@csstools/postcss-logical-float-and-clear@npm:2.0.1" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/92d9184bf8a159753a5872463dcfde580abd9b935e2a59f7ebe601cd14d9871f2f9f4dc18d8bbe251e7d8a3e446e302d9d99bf408d9cabbd9a6323825f5e833d + languageName: node + linkType: hard + +"@csstools/postcss-logical-overflow@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-logical-overflow@npm:1.0.1" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/a8f5b1fdaf4ce7b1665407dac2f2e0c0ea11195e6873cfc714d9cd206489170fd91fc172b337330baf60191206f60579e235264f0dc7fee750ccd27ffe02c163 + languageName: node + linkType: hard + +"@csstools/postcss-logical-overscroll-behavior@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-logical-overscroll-behavior@npm:1.0.1" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/9485502bd9235276525351818d6cc11544ac1b270bb4f527f3fac32fe98ac66269366c34cdb8f61920b10ff9aac5824935004a5927490a5febca77eb41226604 + languageName: node + linkType: hard + +"@csstools/postcss-logical-resize@npm:^2.0.1": + version: 2.0.1 + resolution: "@csstools/postcss-logical-resize@npm:2.0.1" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/18f7e19ea465a15b334d8231b9ed98b630c74a6c2a6c52884437b852065f7b55bb1282cdbbdc1136aade479e996605b01799ab0ab771e2c47fd78d966ed33162 + languageName: node + linkType: hard + +"@csstools/postcss-logical-viewport-units@npm:^2.0.7": + version: 2.0.7 + resolution: "@csstools/postcss-logical-viewport-units@npm:2.0.7" + dependencies: + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/utilities": "npm:^1.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/9493f5395ccfe88d0d0740e54f77f0c844afc79b164068fdd907aed75004b4252ba9423dea22194ad98114dd1a2e77c14e307604305d926425251d4ab3013949 + languageName: node + linkType: hard + +"@csstools/postcss-media-minmax@npm:^1.1.4": + version: 1.1.4 + resolution: "@csstools/postcss-media-minmax@npm:1.1.4" + dependencies: + "@csstools/css-calc": "npm:^1.2.0" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/media-query-list-parser": "npm:^2.1.9" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/620bb85065195c72cf9c0abe9af822f9feeaf919b53bfd47ec09f75b644cb544bd967b09278c48f829348808b34c552718c1aa3eb5342e2dec983e22eb63b0a0 + languageName: node + linkType: hard + +"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^2.0.7": + version: 2.0.7 + resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:2.0.7" + dependencies: + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/media-query-list-parser": "npm:^2.1.9" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/d5d52a744f9a9466d86a506aab430811778dfa681d3f52f5486ee9b686390919eaae9ad356b84bc782d263227f35913ef68d9a6c3eefcfc38d8ffaccc9b94de0 + languageName: node + linkType: hard + +"@csstools/postcss-nested-calc@npm:^3.0.2": + version: 3.0.2 + resolution: "@csstools/postcss-nested-calc@npm:3.0.2" + dependencies: + "@csstools/utilities": "npm:^1.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/3e24cf641170f9090f0dce088f6dae09ed9a0f38af1bdaa369ecc791a94cce54d7a02a0634f661a97fae24e04f1601c21d753593de018c80ad4236d36144b975 + languageName: node + linkType: hard + +"@csstools/postcss-normalize-display-values@npm:^3.0.2": + version: 3.0.2 + resolution: "@csstools/postcss-normalize-display-values@npm:3.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/a20e2f4c213a5ec6e004c2ba76b543d3288a39aae21b3198b06a57df0d2c7916111d2cd70dcb0e8c6ca1cf1b01751e88fd2fe9abbc070e1efab1a4e54dcdbbbe + languageName: node + linkType: hard + +"@csstools/postcss-oklab-function@npm:^3.0.12": + version: 3.0.12 + resolution: "@csstools/postcss-oklab-function@npm:3.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^1.6.2" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/postcss-progressive-custom-properties": "npm:^3.1.1" + "@csstools/utilities": "npm:^1.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/1454f57c756bdc882a523b50634823a0c31d7adc35330e13c80f9573c287f2a4ab30bbce48e0e8788dfe5a293d55113db2205373523b202a8828b9088e55e51c + languageName: node + linkType: hard + +"@csstools/postcss-progressive-custom-properties@npm:^3.1.1": + version: 3.1.1 + resolution: "@csstools/postcss-progressive-custom-properties@npm:3.1.1" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/9303296c8285a8154d2ee22d5a1330c94c5f361d277a1fd27172e868e3511619a6876538beacae0c9e925a9d1e81a32438d405526170faa84cad0c2d2159fdd2 + languageName: node + linkType: hard + +"@csstools/postcss-relative-color-syntax@npm:^2.0.12": + version: 2.0.12 + resolution: "@csstools/postcss-relative-color-syntax@npm:2.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^1.6.2" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/postcss-progressive-custom-properties": "npm:^3.1.1" + "@csstools/utilities": "npm:^1.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/e12a59b89372fbc5cc460cfeceeea2ddc8b7a8f5639a767dbd6c7ff799bf740ac5dd7ae6797703f74efeadd696801042bff8770117cf5ed70646dcc598637334 + languageName: node + linkType: hard + +"@csstools/postcss-scope-pseudo-class@npm:^3.0.1": + version: 3.0.1 + resolution: "@csstools/postcss-scope-pseudo-class@npm:3.0.1" + dependencies: + postcss-selector-parser: "npm:^6.0.13" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/489c5469951277b810754ba02e9f6c42196e03f2203b908181a81747bf1dcaa7b194c8c0f5c7dcb6b7276d08f2573a71bd7df4f2251c034ef1b92968c7070285 + languageName: node + linkType: hard + +"@csstools/postcss-stepped-value-functions@npm:^3.0.6": + version: 3.0.6 + resolution: "@csstools/postcss-stepped-value-functions@npm:3.0.6" + dependencies: + "@csstools/css-calc": "npm:^1.2.0" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/a198aedc4fffe88909c92bfaa36031e6803e739a2578ba4a81c01b9f1525e6a6876d6ffacbbe21701298598dcade8b2ac8423d8ab0fc5d9f4ba86ed60f53cbca + languageName: node + linkType: hard + +"@csstools/postcss-text-decoration-shorthand@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/postcss-text-decoration-shorthand@npm:3.0.4" + dependencies: + "@csstools/color-helpers": "npm:^4.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/2e17535bbeed8ca5f095e6aecfb552004c1920597f16146fe6ec773b46af95f9e0e3cf77181d4216a23528de8e042bd85f82df1562447f52e7687ed8628f0adc + languageName: node + linkType: hard + +"@csstools/postcss-trigonometric-functions@npm:^3.0.6": + version: 3.0.6 + resolution: "@csstools/postcss-trigonometric-functions@npm:3.0.6" + dependencies: + "@csstools/css-calc": "npm:^1.2.0" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/4b484af853d9eb59a4a4b1c063fcf48e2658bb2d6930dfab1d79e676986534687e6440b8cdcd2731ddcb7726537f4ed484208a2b80ef2c9359053762ba35e5e7 + languageName: node + linkType: hard + +"@csstools/postcss-unset-value@npm:^3.0.1": + version: 3.0.1 + resolution: "@csstools/postcss-unset-value@npm:3.0.1" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/5032c3125eada0a3a77d0867644cf994e28b789aaa40e990e7eebcdf5a9ed9f36b30e0904827044cea39849c9a9a19c90e82d3ca655550d82a7530872b3b6ff8 + languageName: node + linkType: hard + +"@csstools/selector-resolve-nested@npm:^1.1.0": + version: 1.1.0 + resolution: "@csstools/selector-resolve-nested@npm:1.1.0" + peerDependencies: + postcss-selector-parser: ^6.0.13 + checksum: 10c0/3a53b14e048d48b8900c1cf30442ab5eec1a1087c74ce41459c4dcd42ad7d363c9327890ba7aed25288d09c206d9565178bae126b25cdc3e1170a1d55e763c77 + languageName: node + linkType: hard + "@csstools/selector-specificity@npm:^3.0.1": version: 3.0.1 resolution: "@csstools/selector-specificity@npm:3.0.1" @@ -1573,6 +2005,24 @@ __metadata: languageName: node linkType: hard +"@csstools/selector-specificity@npm:^3.0.2": + version: 3.0.2 + resolution: "@csstools/selector-specificity@npm:3.0.2" + peerDependencies: + postcss-selector-parser: ^6.0.13 + checksum: 10c0/d0c7dae2f1e9536e3e17f00467320a704f3208c76283c29c57fd69d4b83dcf6d062f492ed687c5ffd5f47fada9f0657c2efc89ea18fd4b038f757669553e0095 + languageName: node + linkType: hard + +"@csstools/utilities@npm:^1.0.0": + version: 1.0.0 + resolution: "@csstools/utilities@npm:1.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/2ac10895e0a1f9e1fc9c092197c8595a09f632552791af91219f38c55bb39083fb44b74a6a7de9112492cf24a2fe66d20c955a2b4aff041d5c017d87bbebc0f2 + languageName: node + linkType: hard + "@discoveryjs/json-ext@npm:0.5.7": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" @@ -2388,6 +2838,7 @@ __metadata: path-complete-extname: "npm:^1.0.0" postcss: "npm:^8.4.24" postcss-loader: "npm:^4.3.0" + postcss-preset-env: "npm:^9.5.2" prettier: "npm:^3.0.0" prop-types: "npm:^15.8.1" punycode: "npm:^2.3.0" @@ -4622,7 +5073,7 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:^10.4.14": +"autoprefixer@npm:^10.4.14, autoprefixer@npm:^10.4.18": version: 10.4.18 resolution: "autoprefixer@npm:10.4.18" dependencies: @@ -5160,7 +5611,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.22.2, browserslist@npm:^4.23.0": +"browserslist@npm:^4.0.0, browserslist@npm:^4.22.2, browserslist@npm:^4.22.3, browserslist@npm:^4.23.0": version: 4.23.0 resolution: "browserslist@npm:4.23.0" dependencies: @@ -6069,6 +6520,17 @@ __metadata: languageName: node linkType: hard +"css-blank-pseudo@npm:^6.0.1": + version: 6.0.1 + resolution: "css-blank-pseudo@npm:6.0.1" + dependencies: + postcss-selector-parser: "npm:^6.0.13" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/04f2dc1c39a429cb4958b60a9d00b03e29a78e3e55fe111b3a0660b7c6c478455d5907eda7c7a495cf72dbe83ae3c80b409e0468ca1ba5ccef992e69a8f49df8 + languageName: node + linkType: hard + "css-declaration-sorter@npm:^7.1.1": version: 7.1.1 resolution: "css-declaration-sorter@npm:7.1.1" @@ -6085,6 +6547,19 @@ __metadata: languageName: node linkType: hard +"css-has-pseudo@npm:^6.0.2": + version: 6.0.2 + resolution: "css-has-pseudo@npm:6.0.2" + dependencies: + "@csstools/selector-specificity": "npm:^3.0.2" + postcss-selector-parser: "npm:^6.0.13" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/96f9a6a4f31e11797e583d458535e11fa513b3f1f430ab566964a2f0792eaaa543213598b0a509516f07464234348ab11d56448b6d0c0c8a36988e0c86cf4ca1 + languageName: node + linkType: hard + "css-loader@npm:^5.2.7": version: 5.2.7 resolution: "css-loader@npm:5.2.7" @@ -6105,6 +6580,15 @@ __metadata: languageName: node linkType: hard +"css-prefers-color-scheme@npm:^9.0.1": + version: 9.0.1 + resolution: "css-prefers-color-scheme@npm:9.0.1" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/b94da00d84c4ebb56eb8fce96d4fdb20d2e622a7cd8cd6d7b87d1d2b718a55ce88bccc9d871771bfe77c5107de06132ba87190e3656f049e45f19f652d50136c + languageName: node + linkType: hard + "css-select-base-adapter@npm:^0.1.1": version: 0.1.1 resolution: "css-select-base-adapter@npm:0.1.1" @@ -6198,6 +6682,13 @@ __metadata: languageName: node linkType: hard +"cssdb@npm:^7.11.1": + version: 7.11.2 + resolution: "cssdb@npm:7.11.2" + checksum: 10c0/5cd8dfee703dfbd7b7a8c3a93d65d26007ec1cd9692379b5868a0ceedf23b88e28d4b98f1cb9a4161f8b01e4a229e08ba9603fb94b756a3df6e07c423fff5b5d + languageName: node + linkType: hard + "cssesc@npm:^3.0.0": version: 3.0.0 resolution: "cssesc@npm:3.0.0" @@ -12628,6 +13119,17 @@ __metadata: languageName: node linkType: hard +"postcss-attribute-case-insensitive@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-attribute-case-insensitive@npm:6.0.3" + dependencies: + postcss-selector-parser: "npm:^6.0.13" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/6161a625356db17ea23daa50797e23fa830a15629fa45e7438b5ac72a389f81ba51088503c5893a941d34d287857882867199584c5f03bf7762258c74570f456 + languageName: node + linkType: hard + "postcss-calc@npm:^9.0.1": version: 9.0.1 resolution: "postcss-calc@npm:9.0.1" @@ -12640,6 +13142,56 @@ __metadata: languageName: node linkType: hard +"postcss-clamp@npm:^4.1.0": + version: 4.1.0 + resolution: "postcss-clamp@npm:4.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.6 + checksum: 10c0/701261026b38a4c27b3c3711635fac96005f36d3270adb76dbdb1eebc950fc841db45283ee66068a7121565592e9d7967d5534e15b6e4dd266afcabf9eafa905 + languageName: node + linkType: hard + +"postcss-color-functional-notation@npm:^6.0.7": + version: 6.0.7 + resolution: "postcss-color-functional-notation@npm:6.0.7" + dependencies: + "@csstools/css-color-parser": "npm:^1.6.2" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/postcss-progressive-custom-properties": "npm:^3.1.1" + "@csstools/utilities": "npm:^1.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/bd3c1831e885f395205d503bf4b24f462dc9f4af74be11c5b0ad7b09eb150b2d3f8b2c727ab9e67c474ff05baa8e8e3c950880ffe2085ed39794d308c0297667 + languageName: node + linkType: hard + +"postcss-color-hex-alpha@npm:^9.0.4": + version: 9.0.4 + resolution: "postcss-color-hex-alpha@npm:9.0.4" + dependencies: + "@csstools/utilities": "npm:^1.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/57b5cfe17e0b659d5444f267c485462b8b25f6ab087b810c7dd44662af4828e1e8f9c4a9169b8635a4755509ca7c0f3463c2e96444764c4e6ff9f4036aad05e5 + languageName: node + linkType: hard + +"postcss-color-rebeccapurple@npm:^9.0.3": + version: 9.0.3 + resolution: "postcss-color-rebeccapurple@npm:9.0.3" + dependencies: + "@csstools/utilities": "npm:^1.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/ab36d29df23dd475a2a540101427640ef9c7936bbf941816e8582caea05feced26c65f795a849e2ad17469cee6682d1bbccd2f8ab0da07fe91efcc0649568038 + languageName: node + linkType: hard + "postcss-colormin@npm:^6.1.0": version: 6.1.0 resolution: "postcss-colormin@npm:6.1.0" @@ -12666,6 +13218,60 @@ __metadata: languageName: node linkType: hard +"postcss-custom-media@npm:^10.0.4": + version: 10.0.4 + resolution: "postcss-custom-media@npm:10.0.4" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^1.0.9" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/media-query-list-parser": "npm:^2.1.9" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/2384a40f0e38abe92fbfc707000b264e4bdfe65bd0086ab18c6aab71049198f9dd1431bc4f9bbf68f7cca86b4ff0da352bac4a6ecd04e3671b7ddf6ed6ec3d04 + languageName: node + linkType: hard + +"postcss-custom-properties@npm:^13.3.6": + version: 13.3.6 + resolution: "postcss-custom-properties@npm:13.3.6" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^1.0.9" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/utilities": "npm:^1.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/faa3b692966314a6dfcba93e74d91f20f2484ea328f88c809b1d0daa8ecc0d8d5125e06d1d7c18b5455ac30cb3501c7069b6e56e5efac61523a6ed75c3d73a30 + languageName: node + linkType: hard + +"postcss-custom-selectors@npm:^7.1.8": + version: 7.1.8 + resolution: "postcss-custom-selectors@npm:7.1.8" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^1.0.9" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + postcss-selector-parser: "npm:^6.0.13" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/6a7d8248342177a222821531ea3b4008764362e4f7e8f7f2d5767e5880c37ffa39ac5adced2c686baeb9c1f4ed4c283fcc8a8d30ef3b4fc5f63d4ef9a691285e + languageName: node + linkType: hard + +"postcss-dir-pseudo-class@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-dir-pseudo-class@npm:8.0.1" + dependencies: + postcss-selector-parser: "npm:^6.0.13" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/8c096e096b09e4041818bd2edf5581b5172375621f5eeca013633166ea100ab98e71bf60fccd92fa20cfa7b55c57598605a1655c6bcbe54a80728a7d4e36859e + languageName: node + linkType: hard + "postcss-discard-comments@npm:^6.0.2": version: 6.0.2 resolution: "postcss-discard-comments@npm:6.0.2" @@ -12702,6 +13308,86 @@ __metadata: languageName: node linkType: hard +"postcss-double-position-gradients@npm:^5.0.5": + version: 5.0.5 + resolution: "postcss-double-position-gradients@npm:5.0.5" + dependencies: + "@csstools/postcss-progressive-custom-properties": "npm:^3.1.1" + "@csstools/utilities": "npm:^1.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/02c22ca055ceca1ecc3c6888eab5c84769c9df37f59855f0ff9e9faaedcb4acf6818e927bff18bd57df161045f775ecca4142b13f968332419976c556a769995 + languageName: node + linkType: hard + +"postcss-focus-visible@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-focus-visible@npm:9.0.1" + dependencies: + postcss-selector-parser: "npm:^6.0.13" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/b8eb14ef51df62969559a7b2b4a4b6313a802fc2de225de293ad484ed6528833fc6bb7574aad5fabe7eeb27e8cd62663c2d547b25ff058d31c06d3d066abd904 + languageName: node + linkType: hard + +"postcss-focus-within@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-focus-within@npm:8.0.1" + dependencies: + postcss-selector-parser: "npm:^6.0.13" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/cb0380d89f3b9313345dbea65c78c7ad16a6e6ab2ba9e90451d5b14f05ee691a0cdf458376368061327182e031644da21eee7e6e9ae508d195f083e0a20c0502 + languageName: node + linkType: hard + +"postcss-font-variant@npm:^5.0.0": + version: 5.0.0 + resolution: "postcss-font-variant@npm:5.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/ccc96460cf6a52b5439c26c9a5ea0589882e46161e3c2331d4353de7574448f5feef667d1a68f7f39b9fe3ee75d85957383ae82bbfcf87c3162c7345df4a444e + languageName: node + linkType: hard + +"postcss-gap-properties@npm:^5.0.1": + version: 5.0.1 + resolution: "postcss-gap-properties@npm:5.0.1" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/3b28c38819add37a2fc7decd7e3bdda1cab1de861af228abfb3e4310d87786eff4572a693bec6cea1c435bcd3dd0bb58bc9a58f1dde3a1c7def9feaf800762b8 + languageName: node + linkType: hard + +"postcss-image-set-function@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-image-set-function@npm:6.0.3" + dependencies: + "@csstools/utilities": "npm:^1.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/b35ce25aeca95f7abc5e5820f2398588150f5be02209054d714e870ae2fa01a8482fd10600fe1f847add898c39690275a60a5999f83f6bed6c66be9b0444b704 + languageName: node + linkType: hard + +"postcss-lab-function@npm:^6.0.12": + version: 6.0.12 + resolution: "postcss-lab-function@npm:6.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^1.6.2" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/postcss-progressive-custom-properties": "npm:^3.1.1" + "@csstools/utilities": "npm:^1.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/1c96c19d0487346445749777df2af7cc828f3e3c4e8a435cac250d03c14efb0d14ee994ac58d966ed07f8f07aa297f0e3311248b78ba1e816bb18386e435a83c + languageName: node + linkType: hard + "postcss-loader@npm:^4.3.0": version: 4.3.0 resolution: "postcss-loader@npm:4.3.0" @@ -12718,6 +13404,17 @@ __metadata: languageName: node linkType: hard +"postcss-logical@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-logical@npm:7.0.1" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/66a06b5d3cb31181dd76c80286addd219205066a4a8c216076869fc54769ee0011cdaa8063e1b2c19c114cdc5ad12a2e2e8b730f6971960dc77d55f25f290223 + languageName: node + linkType: hard + "postcss-media-query-parser@npm:^0.2.3": version: 0.2.3 resolution: "postcss-media-query-parser@npm:0.2.3" @@ -12843,6 +13540,19 @@ __metadata: languageName: node linkType: hard +"postcss-nesting@npm:^12.1.0": + version: 12.1.0 + resolution: "postcss-nesting@npm:12.1.0" + dependencies: + "@csstools/selector-resolve-nested": "npm:^1.1.0" + "@csstools/selector-specificity": "npm:^3.0.2" + postcss-selector-parser: "npm:^6.0.13" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/87902723214ec33a81520f51cce1e52f52c02272f2b7838d3aaa795e226104bf4809ef9dad8840f43852c1f229afb5f480ab1f20c7677bd021cf57739b625871 + languageName: node + linkType: hard + "postcss-normalize-charset@npm:^6.0.2": version: 6.0.2 resolution: "postcss-normalize-charset@npm:6.0.2" @@ -12941,6 +13651,15 @@ __metadata: languageName: node linkType: hard +"postcss-opacity-percentage@npm:^2.0.0": + version: 2.0.0 + resolution: "postcss-opacity-percentage@npm:2.0.0" + peerDependencies: + postcss: ^8.2 + checksum: 10c0/f031f3281060c4c0ede8f9a5832f65a3d8c2a1896ff324c41de42016e092635f0e0abee07545b01db93dc430a9741674a1d09c377c6c01cd8c2f4be65f889161 + languageName: node + linkType: hard + "postcss-ordered-values@npm:^6.0.2": version: 6.0.2 resolution: "postcss-ordered-values@npm:6.0.2" @@ -12953,6 +13672,118 @@ __metadata: languageName: node linkType: hard +"postcss-overflow-shorthand@npm:^5.0.1": + version: 5.0.1 + resolution: "postcss-overflow-shorthand@npm:5.0.1" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/328407adffae084c096b3ea2c03037f0083a0000cae744872bb1168fdd317eef12bb049cdfef749343c3ed65b4275dc6eefe577d99cbc78e3617cb36d07e8717 + languageName: node + linkType: hard + +"postcss-page-break@npm:^3.0.4": + version: 3.0.4 + resolution: "postcss-page-break@npm:3.0.4" + peerDependencies: + postcss: ^8 + checksum: 10c0/eaaf4d8922b35f2acd637eb059f7e2510b24d65eb8f31424799dd5a98447b6ef010b41880c26e78f818e00f842295638ec75f89d5d489067f53e3dd3db74a00f + languageName: node + linkType: hard + +"postcss-place@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-place@npm:9.0.1" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/d0fb5b0416fd15d5ac7da5fcc1829b9b78c5a90caba5bd045052c6ac0467910cbbeb2fff6c5257190affa656be27168c94ff339f86c0b7df54f9bea04bcadba7 + languageName: node + linkType: hard + +"postcss-preset-env@npm:^9.5.2": + version: 9.5.2 + resolution: "postcss-preset-env@npm:9.5.2" + dependencies: + "@csstools/postcss-cascade-layers": "npm:^4.0.3" + "@csstools/postcss-color-function": "npm:^3.0.12" + "@csstools/postcss-color-mix-function": "npm:^2.0.12" + "@csstools/postcss-exponential-functions": "npm:^1.0.5" + "@csstools/postcss-font-format-keywords": "npm:^3.0.2" + "@csstools/postcss-gamut-mapping": "npm:^1.0.5" + "@csstools/postcss-gradients-interpolation-method": "npm:^4.0.13" + "@csstools/postcss-hwb-function": "npm:^3.0.11" + "@csstools/postcss-ic-unit": "npm:^3.0.5" + "@csstools/postcss-initial": "npm:^1.0.1" + "@csstools/postcss-is-pseudo-class": "npm:^4.0.5" + "@csstools/postcss-light-dark-function": "npm:^1.0.1" + "@csstools/postcss-logical-float-and-clear": "npm:^2.0.1" + "@csstools/postcss-logical-overflow": "npm:^1.0.1" + "@csstools/postcss-logical-overscroll-behavior": "npm:^1.0.1" + "@csstools/postcss-logical-resize": "npm:^2.0.1" + "@csstools/postcss-logical-viewport-units": "npm:^2.0.7" + "@csstools/postcss-media-minmax": "npm:^1.1.4" + "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^2.0.7" + "@csstools/postcss-nested-calc": "npm:^3.0.2" + "@csstools/postcss-normalize-display-values": "npm:^3.0.2" + "@csstools/postcss-oklab-function": "npm:^3.0.12" + "@csstools/postcss-progressive-custom-properties": "npm:^3.1.1" + "@csstools/postcss-relative-color-syntax": "npm:^2.0.12" + "@csstools/postcss-scope-pseudo-class": "npm:^3.0.1" + "@csstools/postcss-stepped-value-functions": "npm:^3.0.6" + "@csstools/postcss-text-decoration-shorthand": "npm:^3.0.4" + "@csstools/postcss-trigonometric-functions": "npm:^3.0.6" + "@csstools/postcss-unset-value": "npm:^3.0.1" + autoprefixer: "npm:^10.4.18" + browserslist: "npm:^4.22.3" + css-blank-pseudo: "npm:^6.0.1" + css-has-pseudo: "npm:^6.0.2" + css-prefers-color-scheme: "npm:^9.0.1" + cssdb: "npm:^7.11.1" + postcss-attribute-case-insensitive: "npm:^6.0.3" + postcss-clamp: "npm:^4.1.0" + postcss-color-functional-notation: "npm:^6.0.7" + postcss-color-hex-alpha: "npm:^9.0.4" + postcss-color-rebeccapurple: "npm:^9.0.3" + postcss-custom-media: "npm:^10.0.4" + postcss-custom-properties: "npm:^13.3.6" + postcss-custom-selectors: "npm:^7.1.8" + postcss-dir-pseudo-class: "npm:^8.0.1" + postcss-double-position-gradients: "npm:^5.0.5" + postcss-focus-visible: "npm:^9.0.1" + postcss-focus-within: "npm:^8.0.1" + postcss-font-variant: "npm:^5.0.0" + postcss-gap-properties: "npm:^5.0.1" + postcss-image-set-function: "npm:^6.0.3" + postcss-lab-function: "npm:^6.0.12" + postcss-logical: "npm:^7.0.1" + postcss-nesting: "npm:^12.1.0" + postcss-opacity-percentage: "npm:^2.0.0" + postcss-overflow-shorthand: "npm:^5.0.1" + postcss-page-break: "npm:^3.0.4" + postcss-place: "npm:^9.0.1" + postcss-pseudo-class-any-link: "npm:^9.0.1" + postcss-replace-overflow-wrap: "npm:^4.0.0" + postcss-selector-not: "npm:^7.0.2" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/40f94472f2d940cbf1df9974bea29a76ada4c1285b97e7104c0cdf001fcafd0a1f5966822250df0d659ec0ea51e577a1ab78c9f5f8a5683ea9897efe043515c1 + languageName: node + linkType: hard + +"postcss-pseudo-class-any-link@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-pseudo-class-any-link@npm:9.0.1" + dependencies: + postcss-selector-parser: "npm:^6.0.13" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/2d33f486af442a0ee095b7b8875701ed3f54ea3f80d2c4d1c1b35d105088b569c847e1c71fde2adf6cefb4920e8fb7d057ff1ad56e62c65892c7b68e26213b98 + languageName: node + linkType: hard + "postcss-reduce-initial@npm:^6.1.0": version: 6.1.0 resolution: "postcss-reduce-initial@npm:6.1.0" @@ -12976,6 +13807,15 @@ __metadata: languageName: node linkType: hard +"postcss-replace-overflow-wrap@npm:^4.0.0": + version: 4.0.0 + resolution: "postcss-replace-overflow-wrap@npm:4.0.0" + peerDependencies: + postcss: ^8.0.3 + checksum: 10c0/451361b714528cd3632951256ef073769cde725a46cda642a6864f666fb144921fa55e614aec1bcf5946f37d6ffdcca3b932b76f3d997c07b076e8db152b128d + languageName: node + linkType: hard + "postcss-resolve-nested-selector@npm:^0.1.1": version: 0.1.1 resolution: "postcss-resolve-nested-selector@npm:0.1.1" @@ -13001,6 +13841,17 @@ __metadata: languageName: node linkType: hard +"postcss-selector-not@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-selector-not@npm:7.0.2" + dependencies: + postcss-selector-parser: "npm:^6.0.13" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/624b6e516d37d43406ff1414b3413fe7a5dc34eccadd6a6082fe7df13c5c2fab3e244af33ff0916f9be0a4f7db91d1c22102f5166d7a6e6595e7c00e11e20281 + languageName: node + linkType: hard + "postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.15, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": version: 6.0.15 resolution: "postcss-selector-parser@npm:6.0.15" From 50fd94f481cf23a81662140afe99df2fbf1149be Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 20 Mar 2024 12:20:23 +0100 Subject: [PATCH 250/954] Fix blockquote color in reply indicator (#29659) --- app/javascript/styles/mastodon/rich_text.scss | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/javascript/styles/mastodon/rich_text.scss b/app/javascript/styles/mastodon/rich_text.scss index c77c23bc40..c57db26e03 100644 --- a/app/javascript/styles/mastodon/rich_text.scss +++ b/app/javascript/styles/mastodon/rich_text.scss @@ -1,5 +1,6 @@ .status__content__text, .e-content, +.edit-indicator__content, .reply-indicator__content { pre, blockquote { @@ -55,10 +56,3 @@ list-style-type: decimal; } } - -.reply-indicator__content { - blockquote { - border-left-color: $inverted-text-color; - color: $inverted-text-color; - } -} From 3211e960ac793b1b9431a7eea40b385272f1a2a6 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 20 Mar 2024 14:31:31 +0100 Subject: [PATCH 251/954] =?UTF-8?q?Fix=20=E2=80=9CExplore=E2=80=9D=20icon?= =?UTF-8?q?=20in=20navigation=20bar=20not=20being=20filled=20when=20select?= =?UTF-8?q?ed=20(#29649)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mastodon/features/ui/components/navigation_panel.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx index f2b40af72b..14a1933436 100644 --- a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx +++ b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx @@ -11,6 +11,7 @@ import { useSelector, useDispatch } from 'react-redux'; import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; import BookmarksActiveIcon from '@/material-icons/400-24px/bookmarks-fill.svg?react'; import BookmarksIcon from '@/material-icons/400-24px/bookmarks.svg?react'; +import ExploreActiveIcon from '@/material-icons/400-24px/explore-fill.svg?react'; import ExploreIcon from '@/material-icons/400-24px/explore.svg?react'; import HomeActiveIcon from '@/material-icons/400-24px/home-fill.svg?react'; import HomeIcon from '@/material-icons/400-24px/home.svg?react'; @@ -145,7 +146,7 @@ class NavigationPanel extends Component { )} {trendsEnabled ? ( - + ) : ( )} From 0a33be39c14f896ad36ff27fb0f19c41fa17fdfe Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 20 Mar 2024 09:45:34 -0400 Subject: [PATCH 252/954] Reduce `LineLength` for `react_admin_component` helpers (#29650) --- .haml-lint.yml | 2 + app/views/admin/dashboard/index.html.haml | 77 ++++++++++++++++--- .../confirm_suspension.html.haml | 3 +- app/views/admin/instances/show.html.haml | 61 +++++++++++++-- app/views/admin/reports/show.html.haml | 6 +- app/views/admin/tags/show.html.haml | 40 ++++++++-- 6 files changed, 162 insertions(+), 27 deletions(-) diff --git a/.haml-lint.yml b/.haml-lint.yml index 8cfcaec8d9..b94eb8b0df 100644 --- a/.haml-lint.yml +++ b/.haml-lint.yml @@ -14,3 +14,5 @@ linters: enabled: true LineLength: max: 320 + ViewLength: + max: 200 # Override default value of 100 inherited from rubocop diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 3597152e09..8a80992785 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -16,19 +16,43 @@ .dashboard .dashboard__item - = react_admin_component :counter, measure: 'new_users', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.new_users'), href: admin_accounts_path(origin: 'local') + = react_admin_component :counter, + end_at: @time_period.last, + href: admin_accounts_path(origin: 'local'), + label: t('admin.dashboard.new_users'), + measure: 'new_users', + start_at: @time_period.first .dashboard__item - = react_admin_component :counter, measure: 'active_users', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.active_users'), href: admin_accounts_path(origin: 'local') + = react_admin_component :counter, + end_at: @time_period.last, + href: admin_accounts_path(origin: 'local'), + label: t('admin.dashboard.active_users'), + measure: 'active_users', + start_at: @time_period.first .dashboard__item - = react_admin_component :counter, measure: 'interactions', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.interactions') + = react_admin_component :counter, + end_at: @time_period.last, + label: t('admin.dashboard.interactions'), + measure: 'interactions', + start_at: @time_period.first .dashboard__item - = react_admin_component :counter, measure: 'opened_reports', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.opened_reports'), href: admin_reports_path + = react_admin_component :counter, + end_at: @time_period.last, + href: admin_reports_path, + label: t('admin.dashboard.opened_reports'), + measure: 'opened_reports', + start_at: @time_period.first .dashboard__item - = react_admin_component :counter, measure: 'resolved_reports', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.resolved_reports'), href: admin_reports_path(resolved: '1') + = react_admin_component :counter, + end_at: @time_period.last, + href: admin_reports_path(resolved: '1'), + label: t('admin.dashboard.resolved_reports'), + measure: 'resolved_reports', + start_at: @time_period.first .dashboard__item = link_to admin_reports_path, class: 'dashboard__quick-access' do @@ -47,22 +71,51 @@ %span= t('admin.dashboard.pending_appeals_html', count: @pending_appeals_count) = fa_icon 'chevron-right fw' .dashboard__item - = react_admin_component :dimension, dimension: 'sources', start_at: @time_period.first, end_at: @time_period.last, limit: 8, label: t('admin.dashboard.sources') + = react_admin_component :dimension, + dimension: 'sources', + end_at: @time_period.last, + label: t('admin.dashboard.sources'), + limit: 8, + start_at: @time_period.first .dashboard__item - = react_admin_component :dimension, dimension: 'languages', start_at: @time_period.first, end_at: @time_period.last, limit: 8, label: t('admin.dashboard.top_languages') + = react_admin_component :dimension, + dimension: 'languages', + end_at: @time_period.last, + label: t('admin.dashboard.top_languages'), + limit: 8, + start_at: @time_period.first .dashboard__item - = react_admin_component :dimension, dimension: 'servers', start_at: @time_period.first, end_at: @time_period.last, limit: 8, label: t('admin.dashboard.top_servers') + = react_admin_component :dimension, + dimension: 'servers', + end_at: @time_period.last, + label: t('admin.dashboard.top_servers'), + limit: 8, + start_at: @time_period.first .dashboard__item.dashboard__item--span-double-column - = react_admin_component :retention, start_at: @time_period.last - 6.months, end_at: @time_period.last, frequency: 'month' + = react_admin_component :retention, + end_at: @time_period.last, + frequency: 'month', + start_at: @time_period.last - 6.months .dashboard__item.dashboard__item--span-double-row - = react_admin_component :trends, limit: 7 + = react_admin_component :trends, + limit: 7 .dashboard__item - = react_admin_component :dimension, dimension: 'software_versions', start_at: @time_period.first, end_at: @time_period.last, limit: 4, label: t('admin.dashboard.software') + = react_admin_component :dimension, + dimension: 'software_versions', + end_at: @time_period.last, + label: t('admin.dashboard.software'), + limit: 4, + start_at: @time_period.first .dashboard__item - = react_admin_component :dimension, dimension: 'space_usage', start_at: @time_period.first, end_at: @time_period.last, limit: 3, label: t('admin.dashboard.space') + = react_admin_component :dimension, + dimension: 'space_usage', + end_at: @time_period.last, + label: t('admin.dashboard.space'), + limit: 3, + start_at: @time_period.first diff --git a/app/views/admin/domain_blocks/confirm_suspension.html.haml b/app/views/admin/domain_blocks/confirm_suspension.html.haml index a5df8ba3f3..4c4f92d710 100644 --- a/app/views/admin/domain_blocks/confirm_suspension.html.haml +++ b/app/views/admin/domain_blocks/confirm_suspension.html.haml @@ -14,7 +14,8 @@ %hr.spacer - = react_admin_component :impact_report, domain: @domain_block.domain + = react_admin_component :impact_report, + domain: @domain_block.domain .actions = link_to t('.cancel'), admin_instances_path, class: 'button button-tertiary' diff --git a/app/views/admin/instances/show.html.haml b/app/views/admin/instances/show.html.haml index 5f2664df76..5bf4e899f3 100644 --- a/app/views/admin/instances/show.html.haml +++ b/app/views/admin/instances/show.html.haml @@ -14,21 +14,66 @@ .dashboard .dashboard__item - = react_admin_component :counter, measure: 'instance_accounts', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_accounts_measure'), href: admin_accounts_path(origin: 'remote', by_domain: @instance.domain) + = react_admin_component :counter, + end_at: @time_period.last, + href: admin_accounts_path(origin: 'remote', by_domain: @instance.domain), + label: t('admin.instances.dashboard.instance_accounts_measure'), + measure: 'instance_accounts', + params: { domain: @instance.domain }, + start_at: @time_period.first .dashboard__item - = react_admin_component :counter, measure: 'instance_statuses', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_statuses_measure') + = react_admin_component :counter, + end_at: @time_period.last, + label: t('admin.instances.dashboard.instance_statuses_measure'), + measure: 'instance_statuses', + params: { domain: @instance.domain }, + start_at: @time_period.first .dashboard__item - = react_admin_component :counter, measure: 'instance_media_attachments', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_media_attachments_measure') + = react_admin_component :counter, + end_at: @time_period.last, + label: t('admin.instances.dashboard.instance_media_attachments_measure'), + measure: 'instance_media_attachments', + params: { domain: @instance.domain }, + start_at: @time_period.first .dashboard__item - = react_admin_component :counter, measure: 'instance_follows', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_follows_measure') + = react_admin_component :counter, + end_at: @time_period.last, + label: t('admin.instances.dashboard.instance_follows_measure'), + measure: 'instance_follows', + params: { domain: @instance.domain }, + start_at: @time_period.first .dashboard__item - = react_admin_component :counter, measure: 'instance_followers', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_followers_measure') + = react_admin_component :counter, + end_at: @time_period.last, + label: t('admin.instances.dashboard.instance_followers_measure'), + measure: 'instance_followers', + params: { domain: @instance.domain }, + start_at: @time_period.first .dashboard__item - = react_admin_component :counter, measure: 'instance_reports', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_reports_measure'), href: admin_reports_path(by_target_domain: @instance.domain) + = react_admin_component :counter, + end_at: @time_period.last, + href: admin_reports_path(by_target_domain: @instance.domain), + label: t('admin.instances.dashboard.instance_reports_measure'), + measure: 'instance_reports', + params: { domain: @instance.domain }, + start_at: @time_period.first .dashboard__item - = react_admin_component :dimension, dimension: 'instance_accounts', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, limit: 8, label: t('admin.instances.dashboard.instance_accounts_dimension') + = react_admin_component :dimension, + dimension: 'instance_accounts', + end_at: @time_period.last, + label: t('admin.instances.dashboard.instance_accounts_dimension'), + limit: 8, + params: { domain: @instance.domain }, + start_at: @time_period.first .dashboard__item - = react_admin_component :dimension, dimension: 'instance_languages', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, limit: 8, label: t('admin.instances.dashboard.instance_languages_dimension') + = react_admin_component :dimension, + dimension: 'instance_languages', + end_at: @time_period.last, + label: t('admin.instances.dashboard.instance_languages_dimension'), + limit: 8, + params: { domain: @instance.domain }, + start_at: @time_period.first + - else %p = t('admin.instances.unknown_instance') diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml index e20dd38c4f..e37fa2590a 100644 --- a/app/views/admin/reports/show.html.haml +++ b/app/views/admin/reports/show.html.haml @@ -20,7 +20,11 @@ %p= t 'admin.reports.category_description_html' -= react_admin_component :report_reason_selector, id: @report.id, category: @report.category, rule_ids: @report.rule_ids&.map(&:to_s), disabled: @report.action_taken? += react_admin_component :report_reason_selector, + category: @report.category, + disabled: @report.action_taken?, + id: @report.id, + rule_ids: @report.rule_ids&.map(&:to_s) - if @report.comment.present? = render 'admin/reports/comment', report: @report diff --git a/app/views/admin/tags/show.html.haml b/app/views/admin/tags/show.html.haml index e4c985c19e..2e4424bec6 100644 --- a/app/views/admin/tags/show.html.haml +++ b/app/views/admin/tags/show.html.haml @@ -9,15 +9,45 @@ .dashboard .dashboard__item - = react_admin_component :counter, measure: 'tag_accounts', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, label: t('admin.trends.tags.dashboard.tag_accounts_measure'), href: tag_url(@tag), target: '_blank', rel: 'noopener noreferrer' + = react_admin_component :counter, + end_at: @time_period.last, + href: tag_url(@tag), + label: t('admin.trends.tags.dashboard.tag_accounts_measure'), + measure: 'tag_accounts', + params: { id: @tag.id }, + rel: 'noopener noreferrer', + start_at: @time_period.first, + target: '_blank' .dashboard__item - = react_admin_component :counter, measure: 'tag_uses', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, label: t('admin.trends.tags.dashboard.tag_uses_measure') + = react_admin_component :counter, + end_at: @time_period.last, + label: t('admin.trends.tags.dashboard.tag_uses_measure'), + measure: 'tag_uses', + params: { id: @tag.id }, + start_at: @time_period.first .dashboard__item - = react_admin_component :counter, measure: 'tag_servers', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, label: t('admin.trends.tags.dashboard.tag_servers_measure') + = react_admin_component :counter, + end_at: @time_period.last, + label: t('admin.trends.tags.dashboard.tag_servers_measure'), + measure: 'tag_servers', + params: { id: @tag.id }, + start_at: @time_period.first .dashboard__item - = react_admin_component :dimension, dimension: 'tag_servers', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, limit: 8, label: t('admin.trends.tags.dashboard.tag_servers_dimension') + = react_admin_component :dimension, + dimension: 'tag_servers', + end_at: @time_period.last, + label: t('admin.trends.tags.dashboard.tag_servers_dimension'), + limit: 8, + params: { id: @tag.id }, + start_at: @time_period.first .dashboard__item - = react_admin_component :dimension, dimension: 'tag_languages', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, limit: 8, label: t('admin.trends.tags.dashboard.tag_languages_dimension') + = react_admin_component :dimension, + dimension: 'tag_languages', + end_at: @time_period.last, + label: t('admin.trends.tags.dashboard.tag_languages_dimension'), + limit: 8, + params: { id: @tag.id }, + start_at: @time_period.first .dashboard__item = link_to admin_tag_path(@tag.id), class: ['dashboard__quick-access', @tag.usable? ? 'positive' : 'negative'] do - if @tag.usable? From 8a1423a47425dd67615e94bdfd13d64b53676da4 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 20 Mar 2024 15:38:00 +0100 Subject: [PATCH 253/954] Allow unblocking email addresses from any matching account (#29305) --- app/controllers/admin/accounts_controller.rb | 2 +- app/models/canonical_email_block.rb | 1 + app/views/admin/accounts/show.html.haml | 2 +- spec/fabricators/canonical_email_block_fabricator.rb | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb index 9beb8fde6b..d3be7817ff 100644 --- a/app/controllers/admin/accounts_controller.rb +++ b/app/controllers/admin/accounts_controller.rb @@ -128,7 +128,7 @@ module Admin def unblock_email authorize @account, :unblock_email? - CanonicalEmailBlock.where(reference_account: @account).delete_all + CanonicalEmailBlock.matching_account(@account).delete_all log_action :unblock_email, @account diff --git a/app/models/canonical_email_block.rb b/app/models/canonical_email_block.rb index d09df6f5e2..c05eb9801d 100644 --- a/app/models/canonical_email_block.rb +++ b/app/models/canonical_email_block.rb @@ -20,6 +20,7 @@ class CanonicalEmailBlock < ApplicationRecord validates :canonical_email_hash, presence: true, uniqueness: true scope :matching_email, ->(email) { where(canonical_email_hash: email_to_canonical_email_hash(email)) } + scope :matching_account, ->(account) { matching_email(account&.user_email).or(where(reference_account: account)) } def to_log_human_identifier canonical_email_hash diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml index da2f2055d0..d380d807a3 100644 --- a/app/views/admin/accounts/show.html.haml +++ b/app/views/admin/accounts/show.html.haml @@ -30,7 +30,7 @@ = render 'admin/accounts/counters', account: @account - if @account.local? && @account.user.nil? - = link_to t('admin.accounts.unblock_email'), unblock_email_admin_account_path(@account.id), method: :post, class: 'button' if can?(:unblock_email, @account) && CanonicalEmailBlock.exists?(reference_account_id: @account.id) + = link_to t('admin.accounts.unblock_email'), unblock_email_admin_account_path(@account.id), method: :post, class: 'button' if can?(:unblock_email, @account) && CanonicalEmailBlock.matching_account(@account).exists? - else .table-wrapper %table.table.inline-table diff --git a/spec/fabricators/canonical_email_block_fabricator.rb b/spec/fabricators/canonical_email_block_fabricator.rb index 1ef53ff4a4..2f979df794 100644 --- a/spec/fabricators/canonical_email_block_fabricator.rb +++ b/spec/fabricators/canonical_email_block_fabricator.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true Fabricator(:canonical_email_block) do - email { sequence(:email) { |i| "#{i}#{Faker::Internet.email}" } } + email { |attrs| attrs[:reference_account] ? attrs[:reference_account].user_email : sequence(:email) { |i| "#{i}#{Faker::Internet.email}" } } reference_account { Fabricate.build(:account) } end From 44bf7b812894f9c8d67cbfbb1a23b0091aa601c5 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 20 Mar 2024 16:37:21 +0100 Subject: [PATCH 254/954] Add notifications of severed relationships (#27511) --- .../severed_relationships_controller.rb | 61 +++++++++++++++++++ .../notifications/components/notification.jsx | 29 +++++++++ .../relationships_severance_event.jsx | 61 +++++++++++++++++++ app/javascript/mastodon/locales/en.json | 8 +++ .../mastodon/reducers/notifications.js | 1 + .../material-icons/400-24px/link_off-fill.svg | 1 + .../material-icons/400-24px/link_off.svg | 1 + .../account_relationship_severance_event.rb | 27 ++++++++ app/models/concerns/account/interactions.rb | 5 ++ app/models/concerns/account/merging.rb | 12 ++++ app/models/notification.rb | 9 +++ app/models/relationship_severance_event.rb | 56 +++++++++++++++++ app/models/severed_relationship.rb | 40 ++++++++++++ ...relationship_severance_event_serializer.rb | 9 +++ .../rest/notification_serializer.rb | 5 ++ ...after_block_domain_from_account_service.rb | 23 +++++-- app/services/block_domain_service.rb | 19 +++++- app/services/delete_account_service.rb | 22 +++++++ app/services/notify_service.rb | 4 +- app/services/purge_domain_service.rb | 24 ++++++-- app/services/suspend_account_service.rb | 18 ++++++ .../severed_relationships/index.html.haml | 34 +++++++++++ config/locales/en.yml | 12 ++++ config/navigation.rb | 6 +- config/routes.rb | 8 +++ ...44_create_relationship_severance_events.rb | 15 +++++ ...0312105620_create_severed_relationships.rb | 27 ++++++++ ...e_account_relationship_severance_events.rb | 14 +++++ db/schema.rb | 41 ++++++++++++- lib/mastodon/cli/maintenance.rb | 17 +++++- ...relationship_severance_event_fabricator.rb | 6 ++ ...relationship_severance_event_fabricator.rb | 6 ++ .../severed_relationship_fabricator.rb | 8 +++ .../relationship_severance_event_spec.rb | 49 +++++++++++++++ spec/models/severed_relationship_spec.rb | 45 ++++++++++++++ spec/requests/severed_relationships_spec.rb | 23 +++++++ ..._block_domain_from_account_service_spec.rb | 31 +++++++--- spec/services/block_domain_service_spec.rb | 49 ++++++--------- spec/services/suspend_account_service_spec.rb | 9 ++- 39 files changed, 781 insertions(+), 54 deletions(-) create mode 100644 app/controllers/severed_relationships_controller.rb create mode 100644 app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx create mode 100644 app/javascript/material-icons/400-24px/link_off-fill.svg create mode 100644 app/javascript/material-icons/400-24px/link_off.svg create mode 100644 app/models/account_relationship_severance_event.rb create mode 100644 app/models/relationship_severance_event.rb create mode 100644 app/models/severed_relationship.rb create mode 100644 app/serializers/rest/account_relationship_severance_event_serializer.rb create mode 100644 app/views/severed_relationships/index.html.haml create mode 100644 db/migrate/20240312100644_create_relationship_severance_events.rb create mode 100644 db/migrate/20240312105620_create_severed_relationships.rb create mode 100644 db/migrate/20240320140159_create_account_relationship_severance_events.rb create mode 100644 spec/fabricators/account_relationship_severance_event_fabricator.rb create mode 100644 spec/fabricators/relationship_severance_event_fabricator.rb create mode 100644 spec/fabricators/severed_relationship_fabricator.rb create mode 100644 spec/models/relationship_severance_event_spec.rb create mode 100644 spec/models/severed_relationship_spec.rb create mode 100644 spec/requests/severed_relationships_spec.rb diff --git a/app/controllers/severed_relationships_controller.rb b/app/controllers/severed_relationships_controller.rb new file mode 100644 index 0000000000..8994fff0ac --- /dev/null +++ b/app/controllers/severed_relationships_controller.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +class SeveredRelationshipsController < ApplicationController + layout 'admin' + + before_action :authenticate_user! + before_action :set_body_classes + before_action :set_cache_headers + + before_action :set_event, only: [:following, :followers] + + def index + @events = AccountRelationshipSeveranceEvent.where(account: current_account) + end + + def following + respond_to do |format| + format.csv { send_data following_data, filename: "following-#{@event.target_name}-#{@event.created_at.to_date.iso8601}.csv" } + end + end + + def followers + respond_to do |format| + format.csv { send_data followers_data, filename: "followers-#{@event.target_name}-#{@event.created_at.to_date.iso8601}.csv" } + end + end + + private + + def set_event + @event = AccountRelationshipSeveranceEvent.find(params[:id]) + end + + def following_data + CSV.generate(headers: ['Account address', 'Show boosts', 'Notify on new posts', 'Languages'], write_headers: true) do |csv| + @event.severed_relationships.active.where(local_account: current_account).includes(:remote_account).reorder(id: :desc).each do |follow| + csv << [acct(follow.target_account), follow.show_reblogs, follow.notify, follow.languages&.join(', ')] + end + end + end + + def followers_data + CSV.generate(headers: ['Account address'], write_headers: true) do |csv| + @event.severed_relationships.passive.where(local_account: current_account).includes(:remote_account).reorder(id: :desc).each do |follow| + csv << [acct(follow.account)] + end + end + end + + def acct(account) + account.local? ? account.local_username_and_domain : account.acct + end + + def set_body_classes + @body_classes = 'admin' + end + + def set_cache_headers + response.cache_control.replace(private: true, no_store: true) + end +end diff --git a/app/javascript/mastodon/features/notifications/components/notification.jsx b/app/javascript/mastodon/features/notifications/components/notification.jsx index d7101f8384..1af1eb78d9 100644 --- a/app/javascript/mastodon/features/notifications/components/notification.jsx +++ b/app/javascript/mastodon/features/notifications/components/notification.jsx @@ -14,6 +14,7 @@ import EditIcon from '@/material-icons/400-24px/edit.svg?react'; import FlagIcon from '@/material-icons/400-24px/flag-fill.svg?react'; import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react'; import InsertChartIcon from '@/material-icons/400-24px/insert_chart.svg?react'; +import LinkOffIcon from '@/material-icons/400-24px/link_off.svg?react'; import PersonIcon from '@/material-icons/400-24px/person-fill.svg?react'; import PersonAddIcon from '@/material-icons/400-24px/person_add-fill.svg?react'; import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; @@ -26,6 +27,7 @@ import { WithRouterPropTypes } from 'mastodon/utils/react_router'; import FollowRequestContainer from '../containers/follow_request_container'; +import RelationshipsSeveranceEvent from './relationships_severance_event'; import Report from './report'; const messages = defineMessages({ @@ -36,6 +38,7 @@ const messages = defineMessages({ reblog: { id: 'notification.reblog', defaultMessage: '{name} boosted your status' }, status: { id: 'notification.status', defaultMessage: '{name} just posted' }, update: { id: 'notification.update', defaultMessage: '{name} edited a post' }, + severedRelationships: { id: 'notification.severed_relationships', defaultMessage: 'Relationships with {name} severed' }, adminSignUp: { id: 'notification.admin.sign_up', defaultMessage: '{name} signed up' }, adminReport: { id: 'notification.admin.report', defaultMessage: '{name} reported {target}' }, }); @@ -358,6 +361,30 @@ class Notification extends ImmutablePureComponent { ); } + renderRelationshipsSevered (notification) { + const { intl, unread } = this.props; + + if (!notification.get('event')) { + return null; + } + + return ( + +
+
+ + + + + +
+ + +
+
+ ); + } + renderAdminSignUp (notification, account, link) { const { intl, unread } = this.props; @@ -429,6 +456,8 @@ class Notification extends ImmutablePureComponent { return this.renderUpdate(notification, link); case 'poll': return this.renderPoll(notification, account); + case 'severed_relationships': + return this.renderRelationshipsSevered(notification); case 'admin.sign_up': return this.renderAdminSignUp(notification, account, link); case 'admin.report': diff --git a/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx b/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx new file mode 100644 index 0000000000..12bc5f130d --- /dev/null +++ b/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx @@ -0,0 +1,61 @@ +import PropTypes from 'prop-types'; + +import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; + +import ImmutablePropTypes from 'react-immutable-proptypes'; + +import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; + +// This needs to be kept in sync with app/models/relationship_severance_event.rb +const messages = defineMessages({ + account_suspension: { id: 'relationship_severance_notification.types.account_suspension', defaultMessage: 'Account has been suspended' }, + domain_block: { id: 'relationship_severance_notification.types.domain_block', defaultMessage: 'Domain has been suspended' }, + user_domain_block: { id: 'relationship_severance_notification.types.user_domain_block', defaultMessage: 'You blocked this domain' }, +}); + +const RelationshipsSeveranceEvent = ({ event, hidden }) => { + const intl = useIntl(); + + if (hidden || !event) { + return null; + } + + return ( +
+
+
+ + {' · '} + { event.get('purged') ? ( + + ) : ( + + )} +
+ {intl.formatMessage(messages[event.get('type')])} +
+ +
+ + + +
+
+
+ ); + +}; + +RelationshipsSeveranceEvent.propTypes = { + event: ImmutablePropTypes.map.isRequired, + hidden: PropTypes.bool, +}; + +export default RelationshipsSeveranceEvent; diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 376dfb7e4b..ca69853366 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -471,6 +471,8 @@ "notification.own_poll": "Your poll has ended", "notification.poll": "A poll you have voted in has ended", "notification.reblog": "{name} boosted your post", + "notification.severedRelationships": "Relationships with {name} severed", + "notification.severed_relationships": "Relationships with {name} severed", "notification.status": "{name} just posted", "notification.update": "{name} edited a post", "notification_requests.accept": "Accept", @@ -587,6 +589,12 @@ "refresh": "Refresh", "regeneration_indicator.label": "Loading…", "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "relationship_severance_notification.purged_data": "purged by administrators", + "relationship_severance_notification.relationships": "{count, plural, one {# relationship} other {# relationships}}", + "relationship_severance_notification.types.account_suspension": "Account has been suspended", + "relationship_severance_notification.types.domain_block": "Domain has been suspended", + "relationship_severance_notification.types.user_domain_block": "You blocked this domain", + "relationship_severance_notification.view": "View", "relative_time.days": "{number}d", "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago", "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago", diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js index b1c80b3d4f..bc85936439 100644 --- a/app/javascript/mastodon/reducers/notifications.js +++ b/app/javascript/mastodon/reducers/notifications.js @@ -55,6 +55,7 @@ export const notificationToMap = notification => ImmutableMap({ created_at: notification.created_at, status: notification.status ? notification.status.id : null, report: notification.report ? fromJS(notification.report) : null, + event: notification.event ? fromJS(notification.event) : null, }); const normalizeNotification = (state, notification, usePendingItems) => { diff --git a/app/javascript/material-icons/400-24px/link_off-fill.svg b/app/javascript/material-icons/400-24px/link_off-fill.svg new file mode 100644 index 0000000000..618e775347 --- /dev/null +++ b/app/javascript/material-icons/400-24px/link_off-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/link_off.svg b/app/javascript/material-icons/400-24px/link_off.svg new file mode 100644 index 0000000000..618e775347 --- /dev/null +++ b/app/javascript/material-icons/400-24px/link_off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/models/account_relationship_severance_event.rb b/app/models/account_relationship_severance_event.rb new file mode 100644 index 0000000000..0cf3fb117d --- /dev/null +++ b/app/models/account_relationship_severance_event.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +# +# == Schema Information +# +# Table name: account_relationship_severance_events +# +# id :bigint(8) not null, primary key +# account_id :bigint(8) not null +# relationship_severance_event_id :bigint(8) not null +# created_at :datetime not null +# updated_at :datetime not null +# +class AccountRelationshipSeveranceEvent < ApplicationRecord + belongs_to :account + belongs_to :relationship_severance_event + + delegate :severed_relationships, :type, :target_name, :purged, to: :relationship_severance_event, prefix: false + + before_create :set_relationships_count! + + private + + def set_relationships_count! + self.relationships_count = severed_relationships.where(local_account: account).count + end +end diff --git a/app/models/concerns/account/interactions.rb b/app/models/concerns/account/interactions.rb index 85363febfb..a32697b66e 100644 --- a/app/models/concerns/account/interactions.rb +++ b/app/models/concerns/account/interactions.rb @@ -83,6 +83,11 @@ module Account::Interactions has_many :following, -> { order('follows.id desc') }, through: :active_relationships, source: :target_account has_many :followers, -> { order('follows.id desc') }, through: :passive_relationships, source: :account + with_options class_name: 'SeveredRelationship', dependent: :destroy do + has_many :severed_relationships, foreign_key: 'local_account_id', inverse_of: :local_account + has_many :remote_severed_relationships, foreign_key: 'remote_account_id', inverse_of: :remote_account + end + # Account notes has_many :account_notes, dependent: :destroy diff --git a/app/models/concerns/account/merging.rb b/app/models/concerns/account/merging.rb index 960ee1819f..ebc57a1221 100644 --- a/app/models/concerns/account/merging.rb +++ b/app/models/concerns/account/merging.rb @@ -48,6 +48,18 @@ module Account::Merging record.update_attribute(:account_warning_id, id) end + SeveredRelationship.where(local_account_id: other_account.id).reorder(nil).find_each do |record| + record.update_attribute(:local_account_id, id) + rescue ActiveRecord::RecordNotUnique + next + end + + SeveredRelationship.where(remote_account_id: other_account.id).reorder(nil).find_each do |record| + record.update_attribute(:remote_account_id, id) + rescue ActiveRecord::RecordNotUnique + next + end + # Some follow relationships have moved, so the cache is stale Rails.cache.delete_matched("followers_hash:#{id}:*") Rails.cache.delete_matched("relationships:#{id}:*") diff --git a/app/models/notification.rb b/app/models/notification.rb index 861a154369..8ee7e77258 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -54,6 +54,9 @@ class Notification < ApplicationRecord update: { filterable: false, }.freeze, + severed_relationships: { + filterable: false, + }.freeze, 'admin.sign_up': { filterable: false, }.freeze, @@ -86,6 +89,7 @@ class Notification < ApplicationRecord belongs_to :favourite, inverse_of: :notification belongs_to :poll, inverse_of: false belongs_to :report, inverse_of: false + belongs_to :relationship_severance_event, inverse_of: false end validates :type, inclusion: { in: TYPES } @@ -182,6 +186,11 @@ class Notification < ApplicationRecord self.from_account_id = activity&.status&.account_id when 'Account' self.from_account_id = activity&.id + when 'AccountRelationshipSeveranceEvent' + # These do not really have an originating account, but this is mandatory + # in the data model, and the recipient's account will by definition + # always exist + self.from_account_id = account_id end end diff --git a/app/models/relationship_severance_event.rb b/app/models/relationship_severance_event.rb new file mode 100644 index 0000000000..d9775150e8 --- /dev/null +++ b/app/models/relationship_severance_event.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: relationship_severance_events +# +# id :bigint(8) not null, primary key +# type :integer not null +# target_name :string not null +# purged :boolean default(FALSE), not null +# created_at :datetime not null +# updated_at :datetime not null +# +class RelationshipSeveranceEvent < ApplicationRecord + self.inheritance_column = nil + + has_many :severed_relationships, inverse_of: :relationship_severance_event, dependent: :delete_all + + enum type: { + domain_block: 0, + user_domain_block: 1, + account_suspension: 2, + } + + scope :about_local_account, ->(account) { where(id: SeveredRelationship.about_local_account(account).select(:relationship_severance_event_id)) } + + def import_from_active_follows!(follows) + import_from_follows!(follows, true) + end + + def import_from_passive_follows!(follows) + import_from_follows!(follows, false) + end + + def affected_local_accounts + Account.where(id: severed_relationships.select(:local_account_id)) + end + + private + + def import_from_follows!(follows, active) + SeveredRelationship.insert_all( + follows.pluck(:account_id, :target_account_id, :show_reblogs, :notify, :languages).map do |account_id, target_account_id, show_reblogs, notify, languages| + { + local_account_id: active ? account_id : target_account_id, + remote_account_id: active ? target_account_id : account_id, + show_reblogs: show_reblogs, + notify: notify, + languages: languages, + relationship_severance_event_id: id, + direction: active ? :active : :passive, + } + end + ) + end +end diff --git a/app/models/severed_relationship.rb b/app/models/severed_relationship.rb new file mode 100644 index 0000000000..00a913f7fc --- /dev/null +++ b/app/models/severed_relationship.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: severed_relationships +# +# id :bigint(8) not null, primary key +# relationship_severance_event_id :bigint(8) not null +# local_account_id :bigint(8) not null +# remote_account_id :bigint(8) not null +# direction :integer not null +# show_reblogs :boolean +# notify :boolean +# languages :string is an Array +# created_at :datetime not null +# updated_at :datetime not null +# +class SeveredRelationship < ApplicationRecord + belongs_to :relationship_severance_event + belongs_to :local_account, class_name: 'Account' + belongs_to :remote_account, class_name: 'Account' + + enum direction: { + passive: 0, # analogous to `local_account.passive_relationships` + active: 1, # analogous to `local_account.active_relationships` + } + + scope :about_local_account, ->(account) { where(local_account: account) } + + scope :active, -> { where(direction: :active) } + scope :passive, -> { where(direction: :passive) } + + def account + active? ? local_account : remote_account + end + + def target_account + active? ? remote_account : local_account + end +end diff --git a/app/serializers/rest/account_relationship_severance_event_serializer.rb b/app/serializers/rest/account_relationship_severance_event_serializer.rb new file mode 100644 index 0000000000..2578e3a20f --- /dev/null +++ b/app/serializers/rest/account_relationship_severance_event_serializer.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class REST::AccountRelationshipSeveranceEventSerializer < ActiveModel::Serializer + attributes :id, :type, :purged, :target_name, :created_at + + def id + object.id.to_s + end +end diff --git a/app/serializers/rest/notification_serializer.rb b/app/serializers/rest/notification_serializer.rb index 137fc53dda..d7b88b7c37 100644 --- a/app/serializers/rest/notification_serializer.rb +++ b/app/serializers/rest/notification_serializer.rb @@ -6,6 +6,7 @@ class REST::NotificationSerializer < ActiveModel::Serializer belongs_to :from_account, key: :account, serializer: REST::AccountSerializer belongs_to :target_status, key: :status, if: :status_type?, serializer: REST::StatusSerializer belongs_to :report, if: :report_type?, serializer: REST::ReportSerializer + belongs_to :relationship_severance_event, key: :event, if: :relationship_severance_event?, serializer: REST::AccountRelationshipSeveranceEventSerializer def id object.id.to_s @@ -18,4 +19,8 @@ class REST::NotificationSerializer < ActiveModel::Serializer def report_type? object.type == :'admin.report' end + + def relationship_severance_event? + object.type == :severed_relationships + end end diff --git a/app/services/after_block_domain_from_account_service.rb b/app/services/after_block_domain_from_account_service.rb index 89d007c1cd..adb17845cc 100644 --- a/app/services/after_block_domain_from_account_service.rb +++ b/app/services/after_block_domain_from_account_service.rb @@ -9,18 +9,21 @@ class AfterBlockDomainFromAccountService < BaseService def call(account, domain) @account = account @domain = domain + @domain_block_event = nil clear_notifications! remove_follows! reject_existing_followers! reject_pending_follow_requests! + notify_of_severed_relationships! end private def remove_follows! - @account.active_relationships.where(target_account: Account.where(domain: @domain)).includes(:target_account).reorder(nil).find_each do |follow| - UnfollowService.new.call(@account, follow.target_account) + @account.active_relationships.where(target_account: Account.where(domain: @domain)).includes(:target_account).reorder(nil).in_batches do |follows| + domain_block_event.import_from_active_follows!(follows) + follows.each { |follow| UnfollowService.new.call(@account, follow.target_account) } end end @@ -29,8 +32,9 @@ class AfterBlockDomainFromAccountService < BaseService end def reject_existing_followers! - @account.passive_relationships.where(account: Account.where(domain: @domain)).includes(:account).reorder(nil).find_each do |follow| - reject_follow!(follow) + @account.passive_relationships.where(account: Account.where(domain: @domain)).includes(:account).reorder(nil).in_batches do |follows| + domain_block_event.import_from_passive_follows!(follows) + follows.each { |follow| reject_follow!(follow) } end end @@ -47,4 +51,15 @@ class AfterBlockDomainFromAccountService < BaseService ActivityPub::DeliveryWorker.perform_async(Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer)), @account.id, follow.account.inbox_url) end + + def notify_of_severed_relationships! + return if @domain_block_event.nil? + + event = AccountRelationshipSeveranceEvent.create!(account: @account, relationship_severance_event: @domain_block_event) + LocalNotificationWorker.perform_async(@account.id, event.id, 'AccountRelationshipSeveranceEvent', 'severed_relationships') + end + + def domain_block_event + @domain_block_event ||= RelationshipSeveranceEvent.create!(type: :user_domain_block, target_name: @domain) + end end diff --git a/app/services/block_domain_service.rb b/app/services/block_domain_service.rb index 76cc36ff6b..00d020d2b3 100644 --- a/app/services/block_domain_service.rb +++ b/app/services/block_domain_service.rb @@ -5,8 +5,11 @@ class BlockDomainService < BaseService def call(domain_block, update = false) @domain_block = domain_block + @domain_block_event = nil + process_domain_block! process_retroactive_updates! if update + notify_of_severed_relationships! end private @@ -37,7 +40,17 @@ class BlockDomainService < BaseService blocked_domain_accounts.without_suspended.in_batches.update_all(suspended_at: @domain_block.created_at, suspension_origin: :local) blocked_domain_accounts.where(suspended_at: @domain_block.created_at).reorder(nil).find_each do |account| - DeleteAccountService.new.call(account, reserve_username: true, suspended_at: @domain_block.created_at) + DeleteAccountService.new.call(account, reserve_username: true, suspended_at: @domain_block.created_at, relationship_severance_event: domain_block_event) + end + end + + def notify_of_severed_relationships! + return if @domain_block_event.nil? + + # TODO: check how efficient that query is, also check `push_bulk`/`perform_bulk` + @domain_block_event.affected_local_accounts.reorder(nil).find_each do |account| + event = AccountRelationshipSeveranceEvent.create!(account: account, relationship_severance_event: @domain_block_event) + LocalNotificationWorker.perform_async(account.id, event.id, 'AccountRelationshipSeveranceEvent', 'severed_relationships') end end @@ -45,6 +58,10 @@ class BlockDomainService < BaseService domain_block.domain end + def domain_block_event + @domain_block_event ||= RelationshipSeveranceEvent.create!(type: :domain_block, target_name: blocked_domain) + end + def blocked_domain_accounts Account.by_domain_and_subdomains(blocked_domain) end diff --git a/app/services/delete_account_service.rb b/app/services/delete_account_service.rb index 7c7cb97df2..bdfe0e7167 100644 --- a/app/services/delete_account_service.rb +++ b/app/services/delete_account_service.rb @@ -58,6 +58,8 @@ class DeleteAccountService < BaseService reports targeted_moderation_notes targeted_reports + severed_relationships + remote_severed_relationships ).freeze # Suspend or remove an account and remove as much of its data @@ -72,6 +74,7 @@ class DeleteAccountService < BaseService # @option [Boolean] :skip_side_effects Side effects are ActivityPub and streaming API payloads # @option [Boolean] :skip_activitypub Skip sending ActivityPub payloads. Implied by :skip_side_effects # @option [Time] :suspended_at Only applicable when :reserve_username is true + # @option [RelationshipSeveranceEvent] :relationship_severance_event Event used to record severed relationships not initiated by the user def call(account, **options) @account = account @options = { reserve_username: true, reserve_email: true }.merge(options) @@ -84,6 +87,7 @@ class DeleteAccountService < BaseService @options[:skip_activitypub] = true if @options[:skip_side_effects] + record_severed_relationships! distribute_activities! purge_content! fulfill_deletion_request! @@ -266,6 +270,20 @@ class DeleteAccountService < BaseService end end + def record_severed_relationships! + return if relationship_severance_event.nil? + + @account.active_relationships.in_batches do |follows| + # NOTE: these follows are passive with regards to the local accounts + relationship_severance_event.import_from_passive_follows!(follows) + end + + @account.passive_relationships.in_batches do |follows| + # NOTE: these follows are active with regards to the local accounts + relationship_severance_event.import_from_active_follows!(follows) + end + end + def delete_actor_json @delete_actor_json ||= Oj.dump(serialize_payload(@account, ActivityPub::DeleteActorSerializer, signer: @account, always_sign: true)) end @@ -305,4 +323,8 @@ class DeleteAccountService < BaseService def skip_activitypub? @options[:skip_activitypub] end + + def relationship_severance_event + @options[:relationship_severance_event] + end end diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index f3d16f1be7..c83e4c017f 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -9,6 +9,8 @@ class NotifyService < BaseService update poll status + # TODO: this probably warrants an email notification + severed_relationships ).freeze class DismissCondition @@ -20,7 +22,7 @@ class NotifyService < BaseService def dismiss? blocked = @recipient.unavailable? - blocked ||= from_self? && @notification.type != :poll + blocked ||= from_self? && @notification.type != :poll && @notification.type != :severed_relationships return blocked if message? && from_staff? diff --git a/app/services/purge_domain_service.rb b/app/services/purge_domain_service.rb index 9df81f13e6..ca0f0d441f 100644 --- a/app/services/purge_domain_service.rb +++ b/app/services/purge_domain_service.rb @@ -2,10 +2,26 @@ class PurgeDomainService < BaseService def call(domain) - Account.remote.where(domain: domain).reorder(nil).find_each do |account| - DeleteAccountService.new.call(account, reserve_username: false, skip_side_effects: true) - end - CustomEmoji.remote.where(domain: domain).reorder(nil).find_each(&:destroy) + @domain = domain + + purge_relationship_severance_events! + purge_accounts! + purge_emojis! + Instance.refresh end + + def purge_relationship_severance_events! + RelationshipSeveranceEvent.where(type: [:domain_block, :user_domain_block], target_name: @domain).in_batches.update_all(purged: true) + end + + def purge_accounts! + Account.remote.where(domain: @domain).reorder(nil).find_each do |account| + DeleteAccountService.new.call(account, reserve_username: false, skip_side_effects: true) + end + end + + def purge_emojis! + CustomEmoji.remote.where(domain: @domain).reorder(nil).find_each(&:destroy) + end end diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb index 8d5446f1a8..86c4ff6416 100644 --- a/app/services/suspend_account_service.rb +++ b/app/services/suspend_account_service.rb @@ -8,6 +8,7 @@ class SuspendAccountService < BaseService def call(account) return unless account.suspended? + @relationship_severance_event = nil @account = account reject_remote_follows! @@ -15,6 +16,7 @@ class SuspendAccountService < BaseService unmerge_from_home_timelines! unmerge_from_list_timelines! privatize_media_attachments! + notify_of_severed_relationships! end private @@ -36,6 +38,8 @@ class SuspendAccountService < BaseService [Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer)), follow.target_account_id, @account.inbox_url] end + relationship_severance_event.import_from_passive_follows!(follows) + follows.each(&:destroy) end end @@ -101,7 +105,21 @@ class SuspendAccountService < BaseService end end + def notify_of_severed_relationships! + return if @relationship_severance_event.nil? + + # TODO: check how efficient that query is, also check `push_bulk`/`perform_bulk` + @relationship_severance_event.affected_local_accounts.reorder(nil).find_each do |account| + event = AccountRelationshipSeveranceEvent.create!(account: account, relationship_severance_event: @relationship_severance_event) + LocalNotificationWorker.perform_async(account.id, event.id, 'AccountRelationshipSeveranceEvent', 'severed_relationships') + end + end + def signed_activity_json @signed_activity_json ||= Oj.dump(serialize_payload(@account, ActivityPub::UpdateSerializer, signer: @account)) end + + def relationship_severance_event + @relationship_severance_event ||= RelationshipSeveranceEvent.create!(type: :account_suspension, target_name: @account.acct) + end end diff --git a/app/views/severed_relationships/index.html.haml b/app/views/severed_relationships/index.html.haml new file mode 100644 index 0000000000..97bef87929 --- /dev/null +++ b/app/views/severed_relationships/index.html.haml @@ -0,0 +1,34 @@ +- content_for :page_title do + = t('settings.severed_relationships') + +%p.muted-hint= t('severed_relationships.preamble') + +- unless @events.empty? + .table-wrapper + %table.table + %thead + %tr + %th= t('exports.archive_takeout.date') + %th= t('severed_relationships.type') + %th= t('severed_relationships.lost_follows') + %th= t('severed_relationships.lost_followers') + %tbody + - @events.each do |event| + %tr + %td= l event.created_at + %td= t("severed_relationships.event_type.#{event.type}", target_name: event.target_name) + - if event.purged? + %td{ rowspan: 2 }= t('severed_relationships.purged') + - else + %td + - count = event.severed_relationships.active.where(local_account: current_account).count + - if count.zero? + = t('generic.none') + - else + = table_link_to 'download', t('severed_relationships.download', count: count), following_severed_relationship_path(event, format: :csv) + %td + - count = event.severed_relationships.passive.where(local_account: current_account).count + - if count.zero? + = t('generic.none') + - else + = table_link_to 'download', t('severed_relationships.download', count: count), followers_severed_relationship_path(event, format: :csv) diff --git a/config/locales/en.yml b/config/locales/en.yml index f45175e3fd..823e720ea7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1660,10 +1660,22 @@ en: preferences: Preferences profile: Public profile relationships: Follows and followers + severed_relationships: Severed relationships statuses_cleanup: Automated post deletion strikes: Moderation strikes two_factor_authentication: Two-factor Auth webauthn_authentication: Security keys + severed_relationships: + download: Download (%{count}) + event_type: + account_suspension: Account suspension (%{target_name}) + domain_block: Server suspension (%{target_name}) + user_domain_block: You blocked %{target_name} + lost_followers: Lost followers + lost_follows: Lost follows + preamble: You may lose follows and followers when you block a domain or when your moderators decide to suspend a remote server. When that happens, you will be able to download lists of severed relationships, to be inspected and possibly imported on another server. + purged: Information about this server has been purged by your server's administrators. + type: Event statuses: attached: audio: diff --git a/config/navigation.rb b/config/navigation.rb index 734e5294b5..791025d526 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -16,7 +16,11 @@ SimpleNavigation::Configuration.run do |navigation| s.item :other, safe_join([fa_icon('cog fw'), t('preferences.other')]), settings_preferences_other_path end - n.item :relationships, safe_join([fa_icon('users fw'), t('settings.relationships')]), relationships_path, if: -> { current_user.functional? && !self_destruct } + n.item :relationships, safe_join([fa_icon('users fw'), t('settings.relationships')]), relationships_path, if: -> { current_user.functional? && !self_destruct } do |s| + s.item :current, safe_join([fa_icon('users fw'), t('settings.relationships')]), relationships_path + s.item :severed_relationships, safe_join([fa_icon('unlink fw'), t('settings.severed_relationships')]), severed_relationships_path + end + n.item :filters, safe_join([fa_icon('filter fw'), t('filters.index.title')]), filters_path, highlights_on: %r{/filters}, if: -> { current_user.functional? && !self_destruct } n.item :statuses_cleanup, safe_join([fa_icon('history fw'), t('settings.statuses_cleanup')]), statuses_cleanup_path, if: -> { current_user.functional_or_moved? && !self_destruct } diff --git a/config/routes.rb b/config/routes.rb index 55f2de6a14..d032b5110f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -189,6 +189,14 @@ Rails.application.routes.draw do end resource :relationships, only: [:show, :update] + resources :severed_relationships, only: [:index] do + member do + constraints(format: :csv) do + get :followers + get :following + end + end + end resource :statuses_cleanup, controller: :statuses_cleanup, only: [:show, :update] get '/media_proxy/:id/(*any)', to: 'media_proxy#show', as: :media_proxy, format: false diff --git a/db/migrate/20240312100644_create_relationship_severance_events.rb b/db/migrate/20240312100644_create_relationship_severance_events.rb new file mode 100644 index 0000000000..8c55fe330f --- /dev/null +++ b/db/migrate/20240312100644_create_relationship_severance_events.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class CreateRelationshipSeveranceEvents < ActiveRecord::Migration[7.0] + def change + create_table :relationship_severance_events do |t| + t.integer :type, null: false + t.string :target_name, null: false + t.boolean :purged, null: false, default: false + + t.timestamps + + t.index [:type, :target_name] + end + end +end diff --git a/db/migrate/20240312105620_create_severed_relationships.rb b/db/migrate/20240312105620_create_severed_relationships.rb new file mode 100644 index 0000000000..1ed911cd55 --- /dev/null +++ b/db/migrate/20240312105620_create_severed_relationships.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +class CreateSeveredRelationships < ActiveRecord::Migration[7.0] + def change + create_table :severed_relationships do |t| + # No need to have an index on this foreign key as it is covered by `index_severed_relationships_on_unique_tuples` + t.references :relationship_severance_event, null: false, foreign_key: { on_delete: :cascade }, index: false + + # No need to have an index on this foregin key as it is covered by `index_severed_relationships_on_local_account_and_event` + t.references :local_account, null: false, foreign_key: { to_table: :accounts, on_delete: :cascade }, index: false + t.references :remote_account, null: false, foreign_key: { to_table: :accounts, on_delete: :cascade } + + # Used to describe whether `local_account` is the active (follower) or passive (followed) part of the relationship + t.integer :direction, null: false + + # Those attributes are carried over from the `follows` table + t.boolean :show_reblogs + t.boolean :notify + t.string :languages, array: true + + t.timestamps + + t.index [:relationship_severance_event_id, :local_account_id, :direction, :remote_account_id], name: 'index_severed_relationships_on_unique_tuples', unique: true + t.index [:local_account_id, :relationship_severance_event_id], name: 'index_severed_relationships_on_local_account_and_event' + end + end +end diff --git a/db/migrate/20240320140159_create_account_relationship_severance_events.rb b/db/migrate/20240320140159_create_account_relationship_severance_events.rb new file mode 100644 index 0000000000..160ef76213 --- /dev/null +++ b/db/migrate/20240320140159_create_account_relationship_severance_events.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +class CreateAccountRelationshipSeveranceEvents < ActiveRecord::Migration[7.1] + def change + create_table :account_relationship_severance_events do |t| + t.belongs_to :account, foreign_key: { on_delete: :cascade }, null: false, index: { unique: true } + t.belongs_to :relationship_severance_event, foreign_key: { on_delete: :cascade }, null: false, index: { unique: true } + + t.integer :relationships_count, default: 0, null: false + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index b98253a6c1..1e1d99f26b 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_03_10_123453) do +ActiveRecord::Schema[7.1].define(version: 2024_03_20_140159) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -90,6 +90,16 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_10_123453) do t.index ["target_account_id"], name: "index_account_pins_on_target_account_id" end + create_table "account_relationship_severance_events", force: :cascade do |t| + t.bigint "account_id", null: false + t.bigint "relationship_severance_event_id", null: false + t.integer "relationships_count", default: 0, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["account_id"], name: "index_account_relationship_severance_events_on_account_id", unique: true + t.index ["relationship_severance_event_id"], name: "idx_on_relationship_severance_event_id_403f53e707", unique: true + end + create_table "account_stats", force: :cascade do |t| t.bigint "account_id", null: false t.bigint "statuses_count", default: 0, null: false @@ -871,6 +881,15 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_10_123453) do t.string "url" end + create_table "relationship_severance_events", force: :cascade do |t| + t.integer "type", null: false + t.string "target_name", null: false + t.boolean "purged", default: false, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["type", "target_name"], name: "index_relationship_severance_events_on_type_and_target_name" + end + create_table "relays", force: :cascade do |t| t.string "inbox_url", default: "", null: false t.string "follow_activity_id" @@ -950,6 +969,21 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_10_123453) do t.index ["thing_type", "thing_id", "var"], name: "index_settings_on_thing_type_and_thing_id_and_var", unique: true end + create_table "severed_relationships", force: :cascade do |t| + t.bigint "relationship_severance_event_id", null: false + t.bigint "local_account_id", null: false + t.bigint "remote_account_id", null: false + t.integer "direction", null: false + t.boolean "show_reblogs" + t.boolean "notify" + t.string "languages", array: true + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["local_account_id", "relationship_severance_event_id"], name: "index_severed_relationships_on_local_account_and_event" + t.index ["relationship_severance_event_id", "local_account_id", "direction", "remote_account_id"], name: "index_severed_relationships_on_unique_tuples", unique: true + t.index ["remote_account_id"], name: "index_severed_relationships_on_remote_account_id" + end + create_table "site_uploads", force: :cascade do |t| t.string "var", default: "", null: false t.string "file_file_name" @@ -1228,6 +1262,8 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_10_123453) do add_foreign_key "account_notes", "accounts", on_delete: :cascade add_foreign_key "account_pins", "accounts", column: "target_account_id", on_delete: :cascade add_foreign_key "account_pins", "accounts", on_delete: :cascade + add_foreign_key "account_relationship_severance_events", "accounts", on_delete: :cascade + add_foreign_key "account_relationship_severance_events", "relationship_severance_events", on_delete: :cascade add_foreign_key "account_stats", "accounts", on_delete: :cascade add_foreign_key "account_statuses_cleanup_policies", "accounts", on_delete: :cascade add_foreign_key "account_warnings", "accounts", column: "target_account_id", on_delete: :cascade @@ -1320,6 +1356,9 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_10_123453) do add_foreign_key "scheduled_statuses", "accounts", on_delete: :cascade add_foreign_key "session_activations", "oauth_access_tokens", column: "access_token_id", name: "fk_957e5bda89", on_delete: :cascade add_foreign_key "session_activations", "users", name: "fk_e5fda67334", on_delete: :cascade + add_foreign_key "severed_relationships", "accounts", column: "local_account_id", on_delete: :cascade + add_foreign_key "severed_relationships", "accounts", column: "remote_account_id", on_delete: :cascade + add_foreign_key "severed_relationships", "relationship_severance_events", on_delete: :cascade add_foreign_key "status_edits", "accounts", on_delete: :nullify add_foreign_key "status_edits", "statuses", on_delete: :cascade add_foreign_key "status_pins", "accounts", name: "fk_d4cb435b62", on_delete: :cascade diff --git a/lib/mastodon/cli/maintenance.rb b/lib/mastodon/cli/maintenance.rb index 9f234e3860..e6a346ae26 100644 --- a/lib/mastodon/cli/maintenance.rb +++ b/lib/mastodon/cli/maintenance.rb @@ -5,7 +5,7 @@ require_relative 'base' module Mastodon::CLI class Maintenance < Base MIN_SUPPORTED_VERSION = 2019_10_01_213028 - MAX_SUPPORTED_VERSION = 2023_09_07_150100 + MAX_SUPPORTED_VERSION = 2023_10_23_105620 # Stubs to enjoy ActiveRecord queries while not depending on a particular # version of the code/database @@ -39,6 +39,7 @@ module Mastodon::CLI class Webhook < ApplicationRecord; end class BulkImport < ApplicationRecord; end class SoftwareUpdate < ApplicationRecord; end + class SeveredRelationship < ApplicationRecord; end class DomainBlock < ApplicationRecord enum severity: { silence: 0, suspend: 1, noop: 2 } @@ -129,6 +130,20 @@ module Mastodon::CLI record.update_attribute(:account_warning_id, id) end end + + if ActiveRecord::Base.connection.table_exists?(:severed_relationships) + SeveredRelationship.where(local_account_id: other_account.id).reorder(nil).find_each do |record| + record.update_attribute(:local_account_id, id) + rescue ActiveRecord::RecordNotUnique + next + end + + SeveredRelationship.where(remote_account_id: other_account.id).reorder(nil).find_each do |record| + record.update_attribute(:remote_account_id, id) + rescue ActiveRecord::RecordNotUnique + next + end + end end end diff --git a/spec/fabricators/account_relationship_severance_event_fabricator.rb b/spec/fabricators/account_relationship_severance_event_fabricator.rb new file mode 100644 index 0000000000..5580d52092 --- /dev/null +++ b/spec/fabricators/account_relationship_severance_event_fabricator.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +Fabricator(:account_relationship_severance_event) do + account + relationship_severance_event +end diff --git a/spec/fabricators/relationship_severance_event_fabricator.rb b/spec/fabricators/relationship_severance_event_fabricator.rb new file mode 100644 index 0000000000..7fec14e9f2 --- /dev/null +++ b/spec/fabricators/relationship_severance_event_fabricator.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +Fabricator(:relationship_severance_event) do + type { :domain_block } + target_name { 'example.com' } +end diff --git a/spec/fabricators/severed_relationship_fabricator.rb b/spec/fabricators/severed_relationship_fabricator.rb new file mode 100644 index 0000000000..6600b72cdf --- /dev/null +++ b/spec/fabricators/severed_relationship_fabricator.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +Fabricator(:severed_relationship) do + local_account { Fabricate.build(:account) } + remote_account { Fabricate.build(:account) } + relationship_severance_event { Fabricate.build(:relationship_severance_event) } + direction { :active } +end diff --git a/spec/models/relationship_severance_event_spec.rb b/spec/models/relationship_severance_event_spec.rb new file mode 100644 index 0000000000..93c0f1a26d --- /dev/null +++ b/spec/models/relationship_severance_event_spec.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe RelationshipSeveranceEvent do + let(:local_account) { Fabricate(:account) } + let(:remote_account) { Fabricate(:account, domain: 'example.com') } + let(:event) { Fabricate(:relationship_severance_event) } + + describe '#import_from_active_follows!' do + before do + local_account.follow!(remote_account) + end + + it 'imports the follow relationships with the expected direction' do + event.import_from_active_follows!(local_account.active_relationships) + + relationships = event.severed_relationships.to_a + expect(relationships.size).to eq 1 + expect(relationships[0].account).to eq local_account + expect(relationships[0].target_account).to eq remote_account + end + end + + describe '#import_from_passive_follows!' do + before do + remote_account.follow!(local_account) + end + + it 'imports the follow relationships with the expected direction' do + event.import_from_passive_follows!(local_account.passive_relationships) + + relationships = event.severed_relationships.to_a + expect(relationships.size).to eq 1 + expect(relationships[0].account).to eq remote_account + expect(relationships[0].target_account).to eq local_account + end + end + + describe '#affected_local_accounts' do + before do + event.severed_relationships.create!(local_account: local_account, remote_account: remote_account, direction: :active) + end + + it 'correctly lists local accounts' do + expect(event.affected_local_accounts.to_a).to contain_exactly(local_account) + end + end +end diff --git a/spec/models/severed_relationship_spec.rb b/spec/models/severed_relationship_spec.rb new file mode 100644 index 0000000000..0f922d7983 --- /dev/null +++ b/spec/models/severed_relationship_spec.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe SeveredRelationship do + let(:local_account) { Fabricate(:account) } + let(:remote_account) { Fabricate(:account, domain: 'example.com') } + let(:event) { Fabricate(:relationship_severance_event) } + + describe '#account' do + context 'when the local account is the follower' do + let(:severed_relationship) { Fabricate(:severed_relationship, relationship_severance_event: event, local_account: local_account, remote_account: remote_account, direction: :active) } + + it 'returns the local account' do + expect(severed_relationship.account).to eq local_account + end + end + + context 'when the local account is being followed' do + let(:severed_relationship) { Fabricate(:severed_relationship, relationship_severance_event: event, local_account: local_account, remote_account: remote_account, direction: :passive) } + + it 'returns the remote account' do + expect(severed_relationship.account).to eq remote_account + end + end + end + + describe '#target_account' do + context 'when the local account is the follower' do + let(:severed_relationship) { Fabricate(:severed_relationship, relationship_severance_event: event, local_account: local_account, remote_account: remote_account, direction: :active) } + + it 'returns the remote account' do + expect(severed_relationship.target_account).to eq remote_account + end + end + + context 'when the local account is being followed' do + let(:severed_relationship) { Fabricate(:severed_relationship, relationship_severance_event: event, local_account: local_account, remote_account: remote_account, direction: :passive) } + + it 'returns the local account' do + expect(severed_relationship.target_account).to eq local_account + end + end + end +end diff --git a/spec/requests/severed_relationships_spec.rb b/spec/requests/severed_relationships_spec.rb new file mode 100644 index 0000000000..4063026d79 --- /dev/null +++ b/spec/requests/severed_relationships_spec.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'Severed relationships page' do + include RoutingHelper + + describe 'GET severed_relationships#index' do + let(:user) { Fabricate(:user) } + + before do + sign_in user + + Fabricate(:severed_relationship, local_account: user.account) + end + + it 'returns http success' do + get severed_relationships_path + + expect(response).to have_http_status(200) + end + end +end diff --git a/spec/services/after_block_domain_from_account_service_spec.rb b/spec/services/after_block_domain_from_account_service_spec.rb index 2fce424b1a..12e780357d 100644 --- a/spec/services/after_block_domain_from_account_service_spec.rb +++ b/spec/services/after_block_domain_from_account_service_spec.rb @@ -5,22 +5,33 @@ require 'rails_helper' RSpec.describe AfterBlockDomainFromAccountService do subject { described_class.new } - let!(:wolf) { Fabricate(:account, username: 'wolf', domain: 'evil.org', inbox_url: 'https://evil.org/inbox', protocol: :activitypub) } - let!(:alice) { Fabricate(:account, username: 'alice') } + let(:wolf) { Fabricate(:account, username: 'wolf', domain: 'evil.org', inbox_url: 'https://evil.org/wolf/inbox', protocol: :activitypub) } + let(:dog) { Fabricate(:account, username: 'dog', domain: 'evil.org', inbox_url: 'https://evil.org/dog/inbox', protocol: :activitypub) } + let(:alice) { Fabricate(:account, username: 'alice') } before do - allow(ActivityPub::DeliveryWorker).to receive(:perform_async) + wolf.follow!(alice) + alice.follow!(dog) end - it 'purge followers from blocked domain' do - wolf.follow!(alice) + around do |example| + Sidekiq::Testing.fake! do + example.run + end + end + + it 'purges followers from blocked domain, sends them Reject->Follow, and records severed relationships', :aggregate_failures do subject.call(alice, 'evil.org') + expect(wolf.following?(alice)).to be false - end + expect(ActivityPub::DeliveryWorker.jobs.pluck('args')).to contain_exactly( + [a_string_including('"type":"Reject"'), alice.id, wolf.inbox_url], + [a_string_including('"type":"Undo"'), alice.id, dog.inbox_url] + ) - it 'sends Reject->Follow to followers from blocked domain' do - wolf.follow!(alice) - subject.call(alice, 'evil.org') - expect(ActivityPub::DeliveryWorker).to have_received(:perform_async).once + severed_relationships = alice.severed_relationships.to_a + expect(severed_relationships.count).to eq 2 + expect(severed_relationships[0].relationship_severance_event).to eq severed_relationships[1].relationship_severance_event + expect(severed_relationships.map { |rel| [rel.account, rel.target_account] }).to contain_exactly([wolf, alice], [alice, dog]) end end diff --git a/spec/services/block_domain_service_spec.rb b/spec/services/block_domain_service_spec.rb index 0f278293a8..26f80eaf62 100644 --- a/spec/services/block_domain_service_spec.rb +++ b/spec/services/block_domain_service_spec.rb @@ -5,6 +5,8 @@ require 'rails_helper' RSpec.describe BlockDomainService do subject { described_class.new } + let(:local_account) { Fabricate(:account) } + let(:bystander) { Fabricate(:account, domain: 'evil.org') } let!(:bad_account) { Fabricate(:account, username: 'badguy666', domain: 'evil.org') } let!(:bad_status_plain) { Fabricate(:status, account: bad_account, text: 'You suck') } let!(:bad_status_with_attachment) { Fabricate(:status, account: bad_account, text: 'Hahaha') } @@ -13,62 +15,51 @@ RSpec.describe BlockDomainService do describe 'for a suspension' do before do + local_account.follow!(bad_account) + bystander.follow!(local_account) + end + + it 'creates a domain block, suspends remote accounts with appropriate suspension date, records severed relationships', :aggregate_failures do subject.call(DomainBlock.create!(domain: 'evil.org', severity: :suspend)) - end - it 'creates a domain block' do expect(DomainBlock.blocked?('evil.org')).to be true - end - it 'removes remote accounts from that domain' do + # Suspends account with appropriate suspension date expect(bad_account.reload.suspended?).to be true - end - - it 'records suspension date appropriately' do expect(bad_account.reload.suspended_at).to eq DomainBlock.find_by(domain: 'evil.org').created_at - end - it 'keeps already-banned accounts banned' do + # Keep already-suspended account without updating the suspension date expect(already_banned_account.reload.suspended?).to be true - end - - it 'does not overwrite suspension date of already-banned accounts' do expect(already_banned_account.reload.suspended_at).to_not eq DomainBlock.find_by(domain: 'evil.org').created_at - end - it 'removes the remote accounts\'s statuses and media attachments' do + # Removes content expect { bad_status_plain.reload }.to raise_exception ActiveRecord::RecordNotFound expect { bad_status_with_attachment.reload }.to raise_exception ActiveRecord::RecordNotFound expect { bad_attachment.reload }.to raise_exception ActiveRecord::RecordNotFound + + # Records severed relationships + severed_relationships = local_account.severed_relationships.to_a + expect(severed_relationships.count).to eq 2 + expect(severed_relationships[0].relationship_severance_event).to eq severed_relationships[1].relationship_severance_event + expect(severed_relationships.map { |rel| [rel.account, rel.target_account] }).to contain_exactly([bystander, local_account], [local_account, bad_account]) end end describe 'for a silence with reject media' do - before do + it 'does not mark the domain as blocked, but silences accounts with an appropriate silencing date, clears media', :aggregate_failures, :sidekiq_inline do subject.call(DomainBlock.create!(domain: 'evil.org', severity: :silence, reject_media: true)) - end - it 'does not create a domain block' do expect(DomainBlock.blocked?('evil.org')).to be false - end - it 'silences remote accounts from that domain' do + # Silences account with appropriate silecing date expect(bad_account.reload.silenced?).to be true - end - - it 'records suspension date appropriately' do expect(bad_account.reload.silenced_at).to eq DomainBlock.find_by(domain: 'evil.org').created_at - end - it 'keeps already-banned accounts banned' do + # Keeps already-silenced accounts without updating the silecing date expect(already_banned_account.reload.silenced?).to be true - end - - it 'does not overwrite suspension date of already-banned accounts' do expect(already_banned_account.reload.silenced_at).to_not eq DomainBlock.find_by(domain: 'evil.org').created_at - end - it 'leaves the domains status and attachments, but clears media', :sidekiq_inline do + # Leaves posts but clears media expect { bad_status_plain.reload }.to_not raise_error expect { bad_status_with_attachment.reload }.to_not raise_error expect { bad_attachment.reload }.to_not raise_error diff --git a/spec/services/suspend_account_service_spec.rb b/spec/services/suspend_account_service_spec.rb index d62f7ef0d6..74ef8f60e2 100644 --- a/spec/services/suspend_account_service_spec.rb +++ b/spec/services/suspend_account_service_spec.rb @@ -59,7 +59,7 @@ RSpec.describe SuspendAccountService, :sidekiq_inline do remote_follower.follow!(account) end - it 'sends an update actor to followers and reporters' do + it 'sends an Update actor activity to followers and reporters' do subject expect(a_request(:post, remote_follower.inbox_url).with { |req| match_update_actor_request(req, account) }).to have_been_made.once expect(a_request(:post, remote_reporter.inbox_url).with { |req| match_update_actor_request(req, account) }).to have_been_made.once @@ -85,9 +85,14 @@ RSpec.describe SuspendAccountService, :sidekiq_inline do account.follow!(local_followee) end - it 'sends a reject follow' do + it 'sends a Reject Follow activity, and records severed relationships', :aggregate_failures do subject + expect(a_request(:post, account.inbox_url).with { |req| match_reject_follow_request(req, account, local_followee) }).to have_been_made.once + + severed_relationships = local_followee.severed_relationships.to_a + expect(severed_relationships.count).to eq 1 + expect(severed_relationships.map { |rel| [rel.account, rel.target_account] }).to contain_exactly([account, local_followee]) end end end From 27a6fa7b0e7605d0f88540d23fe19d34e3b23b79 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Mar 2024 16:44:36 +0100 Subject: [PATCH 255/954] Update dependency cssnano to v6.1.1 (#29661) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 135 ++++++++++++++++++++---------------------------------- 1 file changed, 50 insertions(+), 85 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1e37fcc029..20e40c4b52 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1578,16 +1578,7 @@ __metadata: languageName: node linkType: hard -"@csstools/css-parser-algorithms@npm:^2.5.0": - version: 2.5.0 - resolution: "@csstools/css-parser-algorithms@npm:2.5.0" - peerDependencies: - "@csstools/css-tokenizer": ^2.2.3 - checksum: 10c0/31b4a523d956e204af9842183678cca5a88ad76551d54dcb6083f8a6f2dfd8fdec6c09bca5410842af54b90997308bebee7593c17dbc1a4e951453b54bd3f024 - languageName: node - linkType: hard - -"@csstools/css-parser-algorithms@npm:^2.6.1": +"@csstools/css-parser-algorithms@npm:^2.5.0, @csstools/css-parser-algorithms@npm:^2.6.1": version: 2.6.1 resolution: "@csstools/css-parser-algorithms@npm:2.6.1" peerDependencies: @@ -1596,31 +1587,14 @@ __metadata: languageName: node linkType: hard -"@csstools/css-tokenizer@npm:^2.2.3": - version: 2.2.3 - resolution: "@csstools/css-tokenizer@npm:2.2.3" - checksum: 10c0/557266ec52e8b36c19008a5bbd7151effba085cdd6d68270c01afebf914981caac698eda754b2a530a8a9947a3dd70e3f3a39a5e037c4170bb2a055a92754acb - languageName: node - linkType: hard - -"@csstools/css-tokenizer@npm:^2.2.4": +"@csstools/css-tokenizer@npm:^2.2.3, @csstools/css-tokenizer@npm:^2.2.4": version: 2.2.4 resolution: "@csstools/css-tokenizer@npm:2.2.4" checksum: 10c0/23997db5874514f4b951ebd215e1e6cc8baf03adf9a35fc6fd028b84cb52aa2dc053860722108c09859a9b37b455f62b84181fe15539cd37797ea699b9ff85f0 languageName: node linkType: hard -"@csstools/media-query-list-parser@npm:^2.1.7": - version: 2.1.7 - resolution: "@csstools/media-query-list-parser@npm:2.1.7" - peerDependencies: - "@csstools/css-parser-algorithms": ^2.5.0 - "@csstools/css-tokenizer": ^2.2.3 - checksum: 10c0/433aef06b00f1d402fd24074a1919b8e2de94245a3b780da6466c8cc9e0f3cc93d2db930f0fce36c7d6908cd50b626cd61e803d3f62dddad79eeb742858028ef - languageName: node - linkType: hard - -"@csstools/media-query-list-parser@npm:^2.1.9": +"@csstools/media-query-list-parser@npm:^2.1.7, @csstools/media-query-list-parser@npm:^2.1.9": version: 2.1.9 resolution: "@csstools/media-query-list-parser@npm:2.1.9" peerDependencies: @@ -1996,16 +1970,7 @@ __metadata: languageName: node linkType: hard -"@csstools/selector-specificity@npm:^3.0.1": - version: 3.0.1 - resolution: "@csstools/selector-specificity@npm:3.0.1" - peerDependencies: - postcss-selector-parser: ^6.0.13 - checksum: 10c0/4280f494726d5e38de74e28dee2ff74ec86244560dff4edeec3ddff3ac73c774c19535bd1bb70cad77949bfb359cf87e977d0ec3264591e3b7260342a20dd84f - languageName: node - linkType: hard - -"@csstools/selector-specificity@npm:^3.0.2": +"@csstools/selector-specificity@npm:^3.0.1, @csstools/selector-specificity@npm:^3.0.2": version: 3.0.2 resolution: "@csstools/selector-specificity@npm:3.0.2" peerDependencies: @@ -6698,9 +6663,9 @@ __metadata: languageName: node linkType: hard -"cssnano-preset-default@npm:^6.1.0": - version: 6.1.0 - resolution: "cssnano-preset-default@npm:6.1.0" +"cssnano-preset-default@npm:^6.1.1": + version: 6.1.1 + resolution: "cssnano-preset-default@npm:6.1.1" dependencies: browserslist: "npm:^4.23.0" css-declaration-sorter: "npm:^7.1.1" @@ -6712,12 +6677,12 @@ __metadata: postcss-discard-duplicates: "npm:^6.0.3" postcss-discard-empty: "npm:^6.0.3" postcss-discard-overridden: "npm:^6.0.2" - postcss-merge-longhand: "npm:^6.0.4" - postcss-merge-rules: "npm:^6.1.0" - postcss-minify-font-values: "npm:^6.0.3" + postcss-merge-longhand: "npm:^6.0.5" + postcss-merge-rules: "npm:^6.1.1" + postcss-minify-font-values: "npm:^6.1.0" postcss-minify-gradients: "npm:^6.0.3" postcss-minify-params: "npm:^6.1.0" - postcss-minify-selectors: "npm:^6.0.3" + postcss-minify-selectors: "npm:^6.0.4" postcss-normalize-charset: "npm:^6.0.2" postcss-normalize-display-values: "npm:^6.0.2" postcss-normalize-positions: "npm:^6.0.2" @@ -6731,10 +6696,10 @@ __metadata: postcss-reduce-initial: "npm:^6.1.0" postcss-reduce-transforms: "npm:^6.0.2" postcss-svgo: "npm:^6.0.3" - postcss-unique-selectors: "npm:^6.0.3" + postcss-unique-selectors: "npm:^6.0.4" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/47b7026b66b80a03f043929f825f48a13ed3a4086a6f335f25312c77fe73977a74cf718a486f91d9513b652e7d34312394380141c3bf6b8c8027ebc96710b6f6 + checksum: 10c0/dc5927c8538778f859b781dc1fb10f0082cd7b3afdba30e835e472dbf51724d4f18e5170587761150142284a371d6c9d2c3b51d29826c08d2b9dd86a929597ee languageName: node linkType: hard @@ -6748,14 +6713,14 @@ __metadata: linkType: hard "cssnano@npm:^6.0.1": - version: 6.1.0 - resolution: "cssnano@npm:6.1.0" + version: 6.1.1 + resolution: "cssnano@npm:6.1.1" dependencies: - cssnano-preset-default: "npm:^6.1.0" + cssnano-preset-default: "npm:^6.1.1" lilconfig: "npm:^3.1.1" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/ffe0d8c9110cce01692f51d21ae2fe6d319f2329989d28ef0dddb67a6fba2780c525f00682f0788bdbba380f37893d27ee870b3e99fb97c1fb8edccbd68a1d92 + checksum: 10c0/2db52c2f5e314f05efec8977de392886ef0e7e08568ac45446f2303218180e317cee64c6c0c6d2c1d70a7f339fcead75384e09e187b88ccacd7f9fd51919fdf1 languageName: node linkType: hard @@ -13422,40 +13387,40 @@ __metadata: languageName: node linkType: hard -"postcss-merge-longhand@npm:^6.0.4": - version: 6.0.4 - resolution: "postcss-merge-longhand@npm:6.0.4" +"postcss-merge-longhand@npm:^6.0.5": + version: 6.0.5 + resolution: "postcss-merge-longhand@npm:6.0.5" dependencies: postcss-value-parser: "npm:^4.2.0" - stylehacks: "npm:^6.1.0" + stylehacks: "npm:^6.1.1" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/6c05cfe60d86cb0b6f40abe4649e1c0c21cf416fbf17aa15f04c315fcef4887827db5ef2593eca27b2b14127f5338ab179b147940c22315b5a9bcb0bdbbfa768 + checksum: 10c0/5a223a7f698c05ab42e9997108a7ff27ea1e0c33a11a353d65a04fc89c3b5b750b9e749550d76b6406329117a055adfc79dde7fee48dca5c8e167a2854ae3fea languageName: node linkType: hard -"postcss-merge-rules@npm:^6.1.0": - version: 6.1.0 - resolution: "postcss-merge-rules@npm:6.1.0" +"postcss-merge-rules@npm:^6.1.1": + version: 6.1.1 + resolution: "postcss-merge-rules@npm:6.1.1" dependencies: browserslist: "npm:^4.23.0" caniuse-api: "npm:^3.0.0" cssnano-utils: "npm:^4.0.2" - postcss-selector-parser: "npm:^6.0.15" + postcss-selector-parser: "npm:^6.0.16" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/3ce76c87e29003fe46fbeba64348ed61d50d8966cfd56ec59b70b6fbf2e2ea8866b8399eec09e036fc636c84207ba12037a1dbc1374fd313a885511947699cad + checksum: 10c0/6d8952dbb19b1e59bf5affe0871fa1be6515103466857cff5af879d6cf619659f8642ec7a931cabb7cdbd393d8c1e91748bf70bee70fa3edea010d4e25786d04 languageName: node linkType: hard -"postcss-minify-font-values@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-minify-font-values@npm:6.0.3" +"postcss-minify-font-values@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-minify-font-values@npm:6.1.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/c1ae31099e3ae79169405d3d46cd49cff35c70c63d1f36f24b16fcce43999c130db396e1fde071a375bd5b4853b14058111034a8da278a3a31f9ca12e091116e + checksum: 10c0/0d6567170c22a7db42096b5eac298f041614890fbe01759a9fa5ccda432f2bb09efd399d92c11bf6675ae13ccd259db4602fad3c358317dee421df5f7ab0a003 languageName: node linkType: hard @@ -13485,14 +13450,14 @@ __metadata: languageName: node linkType: hard -"postcss-minify-selectors@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-minify-selectors@npm:6.0.3" +"postcss-minify-selectors@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-minify-selectors@npm:6.0.4" dependencies: - postcss-selector-parser: "npm:^6.0.15" + postcss-selector-parser: "npm:^6.0.16" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/6abc83edf3fd746979ef709182fd613a764c5c2f68ae20aaa1b38940153a1078c0b270d657fe3bcfe6cda44b61f5af762fe9b31b8b62f63b897bfc2d2bc02b88 + checksum: 10c0/695ec2e1e3a7812b0cabe1105d0ed491760be3d8e9433914fb5af1fc30a84e6dc24089cd31b7e300de620b8e7adf806526c1acf8dd14077a7d1d2820c60a327c languageName: node linkType: hard @@ -13852,13 +13817,13 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.15, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": - version: 6.0.15 - resolution: "postcss-selector-parser@npm:6.0.15" +"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.15, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": + version: 6.0.16 + resolution: "postcss-selector-parser@npm:6.0.16" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10c0/48b425d6cef497bcf6b7d136f6fd95cfca43026955e07ec9290d3c15457de3a862dbf251dd36f42c07a0d5b5ab6f31e41acefeff02528995a989b955505e440b + checksum: 10c0/0e11657cb3181aaf9ff67c2e59427c4df496b4a1b6a17063fae579813f80af79d444bf38f82eeb8b15b4679653fd3089e66ef0283f9aab01874d885e6cf1d2cf languageName: node linkType: hard @@ -13874,14 +13839,14 @@ __metadata: languageName: node linkType: hard -"postcss-unique-selectors@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-unique-selectors@npm:6.0.3" +"postcss-unique-selectors@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-unique-selectors@npm:6.0.4" dependencies: - postcss-selector-parser: "npm:^6.0.15" + postcss-selector-parser: "npm:^6.0.16" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/884c5da4c3bfdacf6a61bb3bd23d212e61d2b3e99ba5099d4d646d18970d2c72d8f6bd8f2ab244ee68d7214e576dc3fd9004fc946ff872e745a965da29f7b18b + checksum: 10c0/bfb99d8a7c675c93f2e65c9d9d563477bfd46fdce9e2727d42d57982b31ccbaaf944e8034bfbefe48b3119e77fba7eb1b181c19b91cb3a5448058fa66a7c9ae9 languageName: node linkType: hard @@ -16382,15 +16347,15 @@ __metadata: languageName: node linkType: hard -"stylehacks@npm:^6.1.0": - version: 6.1.0 - resolution: "stylehacks@npm:6.1.0" +"stylehacks@npm:^6.1.1": + version: 6.1.1 + resolution: "stylehacks@npm:6.1.1" dependencies: browserslist: "npm:^4.23.0" - postcss-selector-parser: "npm:^6.0.15" + postcss-selector-parser: "npm:^6.0.16" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/0e9624d2b12d00d5593e3ef9ef8ed1f4c2029087b4862567cfab9ea3d3fc21efeb9aa00251c13defdfff4481abff8d6e0c48e3e27fac967c959acc7dcb0d5b67 + checksum: 10c0/2dd2bccfd8311ff71492e63a7b8b86c3d7b1fff55d4ba5a2357aff97743e633d351cdc2f5ae3c0057637d00dab4ef5fc5b218a1b370e4585a41df22b5a5128be languageName: node linkType: hard From 99c9db5f670344dac6e1c2271b466c071f195c46 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:48:24 +0000 Subject: [PATCH 256/954] Update babel monorepo to v7.24.3 (#29660) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 72 +++++++++++++++++++++++++++---------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/yarn.lock b/yarn.lock index 20e40c4b52..4336dcb977 100644 --- a/yarn.lock +++ b/yarn.lock @@ -42,13 +42,13 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/code-frame@npm:7.24.1" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.1, @babel/code-frame@npm:^7.24.2": + version: 7.24.2 + resolution: "@babel/code-frame@npm:7.24.2" dependencies: - "@babel/highlight": "npm:^7.24.1" + "@babel/highlight": "npm:^7.24.2" picocolors: "npm:^1.0.0" - checksum: 10c0/c92f4244538089c95f0322c5e8f6c2287529a576ae9ab254366a073c8720ecb537e7009d5d79a6a5698d3b658b298fc77691c05608cafbe4957cab03033ada15 + checksum: 10c0/d1d4cba89475ab6aab7a88242e1fd73b15ecb9f30c109b69752956434d10a26a52cbd37727c4eca104b6d45227bd1dfce39a6a6f4a14c9b2f07f871e968cf406 languageName: node linkType: hard @@ -60,11 +60,11 @@ __metadata: linkType: hard "@babel/core@npm:^7.10.4, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.1": - version: 7.24.1 - resolution: "@babel/core@npm:7.24.1" + version: 7.24.3 + resolution: "@babel/core@npm:7.24.3" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.1" + "@babel/code-frame": "npm:^7.24.2" "@babel/generator": "npm:^7.24.1" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-module-transforms": "npm:^7.23.3" @@ -78,7 +78,7 @@ __metadata: gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/b085b0bc65c225f20b9d5f7b05c8b127c005a73c355d4a7480f099de5d6757abafa7f60786eb95e6d098a6b5c34618e7b0950d60ef55139db04d8767d410e0a9 + checksum: 10c0/e6e756b6de27d0312514a005688fa1915c521ad4269a388913eff2120a546538078f8488d6d16e86f851872f263cb45a6bbae08738297afb9382600d2ac342a9 languageName: node linkType: hard @@ -217,12 +217,12 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.0.0-beta.49, @babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/helper-module-imports@npm:7.24.1" +"@babel/helper-module-imports@npm:^7.0.0-beta.49, @babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.24.1, @babel/helper-module-imports@npm:^7.24.3": + version: 7.24.3 + resolution: "@babel/helper-module-imports@npm:7.24.3" dependencies: "@babel/types": "npm:^7.24.0" - checksum: 10c0/9242a9af73e7eb3fe106d7e55c157149f7f38df6494980744e99fc608103c2ee20726df9596fae722c57ae89c9c304200673b733c3c1c5312385ff26ebd2a4fa + checksum: 10c0/052c188adcd100f5e8b6ff0c9643ddaabc58b6700d3bbbc26804141ad68375a9f97d9d173658d373d31853019e65f62610239e3295cdd58e573bdcb2fded188d languageName: node linkType: hard @@ -353,15 +353,15 @@ __metadata: languageName: node linkType: hard -"@babel/highlight@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/highlight@npm:7.24.1" +"@babel/highlight@npm:^7.24.2": + version: 7.24.2 + resolution: "@babel/highlight@npm:7.24.2" dependencies: "@babel/helper-validator-identifier": "npm:^7.22.20" chalk: "npm:^2.4.2" js-tokens: "npm:^4.0.0" picocolors: "npm:^1.0.0" - checksum: 10c0/39520f655101245efd44a6e5997e73e2b977f8e2011897022ec81fa5b0366dbfef5313bdebadbd08186f52b7e9c21b38ba265cc78caa0c6a8c894461e7a70430 + checksum: 10c0/98ce00321daedeed33a4ed9362dc089a70375ff1b3b91228b9f05e6591d387a81a8cba68886e207861b8871efa0bc997ceabdd9c90f6cce3ee1b2f7f941b42db languageName: node linkType: hard @@ -662,9 +662,9 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.1" +"@babel/plugin-transform-async-generator-functions@npm:^7.24.3": + version: 7.24.3 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.3" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-plugin-utils": "npm:^7.24.0" @@ -672,7 +672,7 @@ __metadata: "@babel/plugin-syntax-async-generators": "npm:^7.8.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/c207cb6b3b7dcb5cd9b22ce5a063493ec7534a21375cb987ad079eee6cc5cae573bd3c97af91fbf0ee47cae1d3f8632c4387885aeab0eedece5652dc4e6b9f1c + checksum: 10c0/55ceed059f819dcccbfe69600bfa1c055ada466bd54eda117cfdd2cf773dd85799e2f6556e4a559b076e93b9704abcca2aef9d72aad7dc8a5d3d17886052f1d3 languageName: node linkType: hard @@ -1200,10 +1200,10 @@ __metadata: linkType: hard "@babel/plugin-transform-runtime@npm:^7.22.4": - version: 7.24.1 - resolution: "@babel/plugin-transform-runtime@npm:7.24.1" + version: 7.24.3 + resolution: "@babel/plugin-transform-runtime@npm:7.24.3" dependencies: - "@babel/helper-module-imports": "npm:^7.24.1" + "@babel/helper-module-imports": "npm:^7.24.3" "@babel/helper-plugin-utils": "npm:^7.24.0" babel-plugin-polyfill-corejs2: "npm:^0.4.10" babel-plugin-polyfill-corejs3: "npm:^0.10.1" @@ -1211,7 +1211,7 @@ __metadata: semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/54e4dbc7aa6fd6c338c657108418f10301e88bbc4c00675f901d529d3bbf578e6a438076bc57c1efdb433853dea1d7c1a6ebaa18f936debc1fd9e25f7553c33a + checksum: 10c0/ee01967bf405d84bd95ca4089166a18fb23fe9851a6da53dcf712a7f8ba003319996f21f320d568ec76126e18adfaee978206ccda86eef7652d47cc9a052e75e languageName: node linkType: hard @@ -1333,8 +1333,8 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.22.4": - version: 7.24.1 - resolution: "@babel/preset-env@npm:7.24.1" + version: 7.24.3 + resolution: "@babel/preset-env@npm:7.24.3" dependencies: "@babel/compat-data": "npm:^7.24.1" "@babel/helper-compilation-targets": "npm:^7.23.6" @@ -1363,7 +1363,7 @@ __metadata: "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" "@babel/plugin-transform-arrow-functions": "npm:^7.24.1" - "@babel/plugin-transform-async-generator-functions": "npm:^7.24.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.24.3" "@babel/plugin-transform-async-to-generator": "npm:^7.24.1" "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.1" "@babel/plugin-transform-block-scoping": "npm:^7.24.1" @@ -1412,13 +1412,13 @@ __metadata: "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.1" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.10.1" + babel-plugin-polyfill-corejs3: "npm:^0.10.4" babel-plugin-polyfill-regenerator: "npm:^0.6.1" core-js-compat: "npm:^3.31.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/c9fd96ed8561ac3f8d2e490face5b763ea05a7908770a52fe2ffa0e72581c5cd8ea5c016a85f47775fc3584c6d748eea62044c19ae3f4edf11ffc1e1e9c8bffd + checksum: 10c0/abd6f3b6c6a71d4ff766cda5b51467677a811240d022492e651065e26ce1a8eb2067eabe5653fce80dda9c5c204fb7b89b419578d7e86eaaf7970929ee7b4885 languageName: node linkType: hard @@ -5218,15 +5218,15 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.10.1": - version: 0.10.1 - resolution: "babel-plugin-polyfill-corejs3@npm:0.10.1" +"babel-plugin-polyfill-corejs3@npm:^0.10.1, babel-plugin-polyfill-corejs3@npm:^0.10.4": + version: 0.10.4 + resolution: "babel-plugin-polyfill-corejs3@npm:0.10.4" dependencies: "@babel/helper-define-polyfill-provider": "npm:^0.6.1" - core-js-compat: "npm:^3.36.0" + core-js-compat: "npm:^3.36.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/54ad0b2d2eb44ae8cc20485ef3be6097e262e02ee76003f39734af5e421743dcff478bfc3cc8fef7cda298e1b507c618ff161c47672fd1ae598df0a2ca48b4e1 + checksum: 10c0/31b92cd3dfb5b417da8dfcf0deaa4b8b032b476d7bb31ca51c66127cf25d41e89260e89d17bc004b2520faa38aa9515fafabf81d89f9d4976e9dc1163e4a7c41 languageName: node linkType: hard @@ -6299,7 +6299,7 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.36.0": +"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.36.1": version: 3.36.1 resolution: "core-js-compat@npm:3.36.1" dependencies: From d4449cc682d057a4c6873b6e13512c38e571372d Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 20 Mar 2024 17:08:34 +0100 Subject: [PATCH 257/954] Fix account_relationship_severance_events unique indexes (#29665) --- app/models/account_relationship_severance_event.rb | 1 + ...20140159_create_account_relationship_severance_events.rb | 6 ++++-- db/schema.rb | 5 +++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/models/account_relationship_severance_event.rb b/app/models/account_relationship_severance_event.rb index 0cf3fb117d..32b185e3af 100644 --- a/app/models/account_relationship_severance_event.rb +++ b/app/models/account_relationship_severance_event.rb @@ -8,6 +8,7 @@ # id :bigint(8) not null, primary key # account_id :bigint(8) not null # relationship_severance_event_id :bigint(8) not null +# relationships_count :integer default(0), not null # created_at :datetime not null # updated_at :datetime not null # diff --git a/db/migrate/20240320140159_create_account_relationship_severance_events.rb b/db/migrate/20240320140159_create_account_relationship_severance_events.rb index 160ef76213..5262c508fe 100644 --- a/db/migrate/20240320140159_create_account_relationship_severance_events.rb +++ b/db/migrate/20240320140159_create_account_relationship_severance_events.rb @@ -3,11 +3,13 @@ class CreateAccountRelationshipSeveranceEvents < ActiveRecord::Migration[7.1] def change create_table :account_relationship_severance_events do |t| - t.belongs_to :account, foreign_key: { on_delete: :cascade }, null: false, index: { unique: true } - t.belongs_to :relationship_severance_event, foreign_key: { on_delete: :cascade }, null: false, index: { unique: true } + t.belongs_to :account, foreign_key: { on_delete: :cascade }, null: false + t.belongs_to :relationship_severance_event, foreign_key: { on_delete: :cascade }, null: false t.integer :relationships_count, default: 0, null: false + t.index [:account_id, :relationship_severance_event_id], unique: true + t.timestamps end end diff --git a/db/schema.rb b/db/schema.rb index 1e1d99f26b..9756da1af8 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -96,8 +96,9 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_20_140159) do t.integer "relationships_count", default: 0, null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.index ["account_id"], name: "index_account_relationship_severance_events_on_account_id", unique: true - t.index ["relationship_severance_event_id"], name: "idx_on_relationship_severance_event_id_403f53e707", unique: true + t.index ["account_id", "relationship_severance_event_id"], name: "idx_on_account_id_relationship_severance_event_id_7bd82bf20e", unique: true + t.index ["account_id"], name: "index_account_relationship_severance_events_on_account_id" + t.index ["relationship_severance_event_id"], name: "idx_on_relationship_severance_event_id_403f53e707" end create_table "account_stats", force: :cascade do |t| From 954b470fbce3fbe4b9b42992b03425fa24d6a2ad Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 20 Mar 2024 17:48:24 +0100 Subject: [PATCH 258/954] Fix error when attempting to delete posts that triggered a notification request (#29666) --- app/models/notification_request.rb | 2 +- ..._change_notification_request_last_status_id_nullable.rb | 7 +++++++ db/schema.rb | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20240320163441_change_notification_request_last_status_id_nullable.rb diff --git a/app/models/notification_request.rb b/app/models/notification_request.rb index 6901b3985b..6e9cae6625 100644 --- a/app/models/notification_request.rb +++ b/app/models/notification_request.rb @@ -7,7 +7,7 @@ # id :bigint(8) not null, primary key # account_id :bigint(8) not null # from_account_id :bigint(8) not null -# last_status_id :bigint(8) not null +# last_status_id :bigint(8) # notifications_count :bigint(8) default(0), not null # dismissed :boolean default(FALSE), not null # created_at :datetime not null diff --git a/db/migrate/20240320163441_change_notification_request_last_status_id_nullable.rb b/db/migrate/20240320163441_change_notification_request_last_status_id_nullable.rb new file mode 100644 index 0000000000..afc3df5aa4 --- /dev/null +++ b/db/migrate/20240320163441_change_notification_request_last_status_id_nullable.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class ChangeNotificationRequestLastStatusIdNullable < ActiveRecord::Migration[7.1] + def change + change_column_null :notification_requests, :last_status_id, true + end +end diff --git a/db/schema.rb b/db/schema.rb index 9756da1af8..cd66ff750b 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_03_20_140159) do +ActiveRecord::Schema[7.1].define(version: 2024_03_20_163441) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -700,7 +700,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_20_140159) do create_table "notification_requests", id: :bigint, default: -> { "timestamp_id('notification_requests'::text)" }, force: :cascade do |t| t.bigint "account_id", null: false t.bigint "from_account_id", null: false - t.bigint "last_status_id", null: false + t.bigint "last_status_id" t.bigint "notifications_count", default: 0, null: false t.boolean "dismissed", default: false, null: false t.datetime "created_at", null: false From 98a2bb8be2e47d26b6306dcbe82c82a1f17f0813 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 20 Mar 2024 18:02:09 +0100 Subject: [PATCH 259/954] Fix issue with severed relationships notifications (#29668) --- app/models/account_relationship_severance_event.rb | 2 +- app/models/notification.rb | 2 +- app/serializers/rest/notification_serializer.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/account_relationship_severance_event.rb b/app/models/account_relationship_severance_event.rb index 32b185e3af..e621b54758 100644 --- a/app/models/account_relationship_severance_event.rb +++ b/app/models/account_relationship_severance_event.rb @@ -16,7 +16,7 @@ class AccountRelationshipSeveranceEvent < ApplicationRecord belongs_to :account belongs_to :relationship_severance_event - delegate :severed_relationships, :type, :target_name, :purged, to: :relationship_severance_event, prefix: false + delegate :severed_relationships, :type, :target_name, :purged?, to: :relationship_severance_event, prefix: false before_create :set_relationships_count! diff --git a/app/models/notification.rb b/app/models/notification.rb index 8ee7e77258..b2376c78a3 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -89,7 +89,7 @@ class Notification < ApplicationRecord belongs_to :favourite, inverse_of: :notification belongs_to :poll, inverse_of: false belongs_to :report, inverse_of: false - belongs_to :relationship_severance_event, inverse_of: false + belongs_to :account_relationship_severance_event, inverse_of: false end validates :type, inclusion: { in: TYPES } diff --git a/app/serializers/rest/notification_serializer.rb b/app/serializers/rest/notification_serializer.rb index d7b88b7c37..36a0adfec4 100644 --- a/app/serializers/rest/notification_serializer.rb +++ b/app/serializers/rest/notification_serializer.rb @@ -6,7 +6,7 @@ class REST::NotificationSerializer < ActiveModel::Serializer belongs_to :from_account, key: :account, serializer: REST::AccountSerializer belongs_to :target_status, key: :status, if: :status_type?, serializer: REST::StatusSerializer belongs_to :report, if: :report_type?, serializer: REST::ReportSerializer - belongs_to :relationship_severance_event, key: :event, if: :relationship_severance_event?, serializer: REST::AccountRelationshipSeveranceEventSerializer + belongs_to :account_relationship_severance_event, key: :event, if: :relationship_severance_event?, serializer: REST::AccountRelationshipSeveranceEventSerializer def id object.id.to_s From f4d753aedfd0916cba554e5cce42b854072de642 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 20 Mar 2024 18:14:53 +0100 Subject: [PATCH 260/954] Fix error in severed relationship event serializer (#29670) --- app/models/account_relationship_severance_event.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/models/account_relationship_severance_event.rb b/app/models/account_relationship_severance_event.rb index e621b54758..84b8b1c65a 100644 --- a/app/models/account_relationship_severance_event.rb +++ b/app/models/account_relationship_severance_event.rb @@ -16,7 +16,13 @@ class AccountRelationshipSeveranceEvent < ApplicationRecord belongs_to :account belongs_to :relationship_severance_event - delegate :severed_relationships, :type, :target_name, :purged?, to: :relationship_severance_event, prefix: false + delegate :severed_relationships, + :type, + :target_name, + :purged, + :purged?, + to: :relationship_severance_event, + prefix: false before_create :set_relationships_count! From be52633ee4ce4a14b48f82156cf64c0a3eb9835b Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 20 Mar 2024 18:21:03 +0100 Subject: [PATCH 261/954] Change back button to always appear in advanced web UI (#29669) --- .../mastodon/components/column_header.jsx | 23 ++++++++----------- .../features/follow_requests/index.jsx | 2 +- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/app/javascript/mastodon/components/column_header.jsx b/app/javascript/mastodon/components/column_header.jsx index 7fd646690d..a7d07ffdb0 100644 --- a/app/javascript/mastodon/components/column_header.jsx +++ b/app/javascript/mastodon/components/column_header.jsx @@ -13,7 +13,7 @@ import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react' import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import SettingsIcon from '@/material-icons/400-24px/settings.svg?react'; import { Icon } from 'mastodon/components/icon'; -import { ButtonInTabsBar, useColumnsContext } from 'mastodon/features/ui/util/columns_context'; +import { ButtonInTabsBar } from 'mastodon/features/ui/util/columns_context'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; import { useAppHistory } from './router'; @@ -26,10 +26,9 @@ const messages = defineMessages({ back: { id: 'column_back_button.label', defaultMessage: 'Back' }, }); -const BackButton = ({ pinned, show, onlyIcon }) => { +const BackButton = ({ onlyIcon }) => { const history = useAppHistory(); const intl = useIntl(); - const { multiColumn } = useColumnsContext(); const handleBackClick = useCallback(() => { if (history.location?.state?.fromMastodon) { @@ -39,10 +38,6 @@ const BackButton = ({ pinned, show, onlyIcon }) => { } }, [history]); - const showButton = history && !pinned && ((multiColumn && history.location?.state?.fromMastodon) || show); - - if (!showButton) return null; - return ( ; } - backButton = ; + if (history && !pinned && ((multiColumn && history.location?.state?.fromMastodon) || showBackButton)) { + backButton = ; + } const collapsedContent = [ extraContent, @@ -199,16 +194,16 @@ class ColumnHeader extends PureComponent {

{hasTitle && ( <> - {showBackButton && backButton} + {backButton} )} - {!hasTitle && showBackButton && backButton} + {!hasTitle && backButton}
{extraButton} diff --git a/app/javascript/mastodon/features/follow_requests/index.jsx b/app/javascript/mastodon/features/follow_requests/index.jsx index 7d651f2ca6..a8f40a31d0 100644 --- a/app/javascript/mastodon/features/follow_requests/index.jsx +++ b/app/javascript/mastodon/features/follow_requests/index.jsx @@ -68,7 +68,7 @@ class FollowRequests extends ImmutablePureComponent { ); return ( - + Date: Wed, 20 Mar 2024 18:10:50 -0400 Subject: [PATCH 262/954] Lock `i18n` gem to version `1.14.1` (#29674) --- Gemfile | 1 + Gemfile.lock | 1 + 2 files changed, 2 insertions(+) diff --git a/Gemfile b/Gemfile index 3a1ff81d43..c19a011538 100644 --- a/Gemfile +++ b/Gemfile @@ -58,6 +58,7 @@ gem 'htmlentities', '~> 4.3' gem 'http', '~> 5.1' gem 'http_accept_language', '~> 2.1' gem 'httplog', '~> 1.6.2' +gem 'i18n', '1.14.1' # TODO: Remove version when resolved: https://github.com/glebm/i18n-tasks/issues/552 / https://github.com/ruby-i18n/i18n/pull/688 gem 'idn-ruby', require: 'idn' gem 'inline_svg' gem 'kaminari', '~> 1.2' diff --git a/Gemfile.lock b/Gemfile.lock index 9c5bb940bc..46e8eb1e66 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -866,6 +866,7 @@ DEPENDENCIES http (~> 5.1) http_accept_language (~> 2.1) httplog (~> 1.6.2) + i18n (= 1.14.1) i18n-tasks (~> 1.0) idn-ruby inline_svg From 39bac24cb73b249e1260c5ee29cd9ffcf482dee0 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 20 Mar 2024 18:12:11 -0400 Subject: [PATCH 263/954] Remove reference to deleted haml lint todo file (#29675) --- .haml-lint.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.haml-lint.yml b/.haml-lint.yml index b94eb8b0df..2b553ca56c 100644 --- a/.haml-lint.yml +++ b/.haml-lint.yml @@ -1,5 +1,3 @@ -inherits_from: .haml-lint_todo.yml - exclude: - 'vendor/**/*' - lib/templates/haml/scaffold/_form.html.haml From 7434c9c2768a2c9776d69794f6200aa4c1e81607 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 21 Mar 2024 09:28:37 +0100 Subject: [PATCH 264/954] Fix the relationships controller spec, since it requires an extra model now (#29671) --- spec/requests/severed_relationships_spec.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/requests/severed_relationships_spec.rb b/spec/requests/severed_relationships_spec.rb index 4063026d79..05a48ca349 100644 --- a/spec/requests/severed_relationships_spec.rb +++ b/spec/requests/severed_relationships_spec.rb @@ -7,11 +7,12 @@ describe 'Severed relationships page' do describe 'GET severed_relationships#index' do let(:user) { Fabricate(:user) } + let(:event) { Fabricate(:account_relationship_severance_event, account: user.account) } before do sign_in user - Fabricate(:severed_relationship, local_account: user.account) + Fabricate.times(3, :severed_relationship, local_account: user.account, relationship_severance_event: event.relationship_severance_event) end it 'returns http success' do From 3f363c61bc5ccd55636c0d0bda67b47f956499fb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 09:32:25 +0100 Subject: [PATCH 265/954] Update dependency postcss to v8.4.38 (#29684) 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 4336dcb977..cef691dd01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13858,13 +13858,13 @@ __metadata: linkType: hard "postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.33": - version: 8.4.37 - resolution: "postcss@npm:8.4.37" + version: 8.4.38 + resolution: "postcss@npm:8.4.38" dependencies: nanoid: "npm:^3.3.7" picocolors: "npm:^1.0.0" source-map-js: "npm:^1.2.0" - checksum: 10c0/0b5730ad0ccbceaf0faaa4a283a144adefd23254f17dbdd63be5e0b37193c7df58003f88742c04c3ae6fd60d1a5158b331a4ce926797fb21e94833ae83c6bf69 + checksum: 10c0/955407b8f70cf0c14acf35dab3615899a2a60a26718a63c848cf3c29f2467b0533991b985a2b994430d890bd7ec2b1963e36352b0774a19143b5f591540f7c06 languageName: node linkType: hard From 01464074c91f9b7a720928fc4ee912be3d8002d2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 09:32:31 +0100 Subject: [PATCH 266/954] Update dependency autoprefixer to v10.4.19 (#29682) 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 cef691dd01..e8bb3c2eb9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5039,11 +5039,11 @@ __metadata: linkType: hard "autoprefixer@npm:^10.4.14, autoprefixer@npm:^10.4.18": - version: 10.4.18 - resolution: "autoprefixer@npm:10.4.18" + version: 10.4.19 + resolution: "autoprefixer@npm:10.4.19" dependencies: browserslist: "npm:^4.23.0" - caniuse-lite: "npm:^1.0.30001591" + caniuse-lite: "npm:^1.0.30001599" fraction.js: "npm:^4.3.7" normalize-range: "npm:^0.1.2" picocolors: "npm:^1.0.0" @@ -5052,7 +5052,7 @@ __metadata: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 10c0/b6e1c1ba2fc6c09360cdcd75b00ce809c5dbe1ad4c30f0186764609a982aa5563d45965cb9e6a9d195c639a9fb1dcac2594484fc41624050195f626e9add666e + checksum: 10c0/fe0178eb8b1da4f15c6535cd329926609b22d1811e047371dccce50563623f8075dd06fb167daff059e4228da651b0bdff6d9b44281541eaf0ce0b79125bfd19 languageName: node linkType: hard @@ -5795,10 +5795,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001591": - version: 1.0.30001591 - resolution: "caniuse-lite@npm:1.0.30001591" - checksum: 10c0/21937d341c3d75994504db21340f65573a1e847a8ab33ee4964ed493994d6552864c494ba144485459abd9c711c75c0708bc9fa19f2bff525bff75ffb0a42c3b +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001599": + version: 1.0.30001599 + resolution: "caniuse-lite@npm:1.0.30001599" + checksum: 10c0/8b3b9610b5be88533a3c8d0770d6896f7b1a9fee3dbeb7339e4ee119a514c81e5e07a628a5a289a6541ca291ac78a9402f5a99cf6012139e91f379083488a8eb languageName: node linkType: hard From cdd168f5d3222fc63bdbc8da36236c1b027507a8 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 21 Mar 2024 04:32:35 -0400 Subject: [PATCH 267/954] Update `enum` away from deprecated (#29678) --- app/models/relationship_severance_event.rb | 2 +- app/models/severed_relationship.rb | 2 +- lib/mastodon/cli/maintenance.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/relationship_severance_event.rb b/app/models/relationship_severance_event.rb index d9775150e8..30ada25767 100644 --- a/app/models/relationship_severance_event.rb +++ b/app/models/relationship_severance_event.rb @@ -16,7 +16,7 @@ class RelationshipSeveranceEvent < ApplicationRecord has_many :severed_relationships, inverse_of: :relationship_severance_event, dependent: :delete_all - enum type: { + enum :type, { domain_block: 0, user_domain_block: 1, account_suspension: 2, diff --git a/app/models/severed_relationship.rb b/app/models/severed_relationship.rb index 00a913f7fc..d71b2610fe 100644 --- a/app/models/severed_relationship.rb +++ b/app/models/severed_relationship.rb @@ -20,7 +20,7 @@ class SeveredRelationship < ApplicationRecord belongs_to :local_account, class_name: 'Account' belongs_to :remote_account, class_name: 'Account' - enum direction: { + enum :direction, { passive: 0, # analogous to `local_account.passive_relationships` active: 1, # analogous to `local_account.active_relationships` } diff --git a/lib/mastodon/cli/maintenance.rb b/lib/mastodon/cli/maintenance.rb index e6a346ae26..f376bcee07 100644 --- a/lib/mastodon/cli/maintenance.rb +++ b/lib/mastodon/cli/maintenance.rb @@ -42,7 +42,7 @@ module Mastodon::CLI class SeveredRelationship < ApplicationRecord; end class DomainBlock < ApplicationRecord - enum severity: { silence: 0, suspend: 1, noop: 2 } + enum :severity, { silence: 0, suspend: 1, noop: 2 } scope :by_severity, -> { in_order_of(:severity, %w(noop silence suspend)).order(:domain) } end From 718ee72c8073fe8851a29dc930fd78a41335906c Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 21 Mar 2024 04:32:40 -0400 Subject: [PATCH 268/954] Use `db_table_exists?` method in new cli/maintenance area (#29677) --- lib/mastodon/cli/maintenance.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mastodon/cli/maintenance.rb b/lib/mastodon/cli/maintenance.rb index f376bcee07..2e7c857078 100644 --- a/lib/mastodon/cli/maintenance.rb +++ b/lib/mastodon/cli/maintenance.rb @@ -131,7 +131,7 @@ module Mastodon::CLI end end - if ActiveRecord::Base.connection.table_exists?(:severed_relationships) + if db_table_exists?(:severed_relationships) SeveredRelationship.where(local_account_id: other_account.id).reorder(nil).find_each do |record| record.update_attribute(:local_account_id, id) rescue ActiveRecord::RecordNotUnique From 77897cd24cbf9802bd000c88ab3c7bfb6714f968 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 21 Mar 2024 04:36:49 -0400 Subject: [PATCH 269/954] Use existing `SeveredRelationship.about_local_account` scope in more places (#29673) --- app/controllers/severed_relationships_controller.rb | 4 ++-- app/models/account_relationship_severance_event.rb | 2 +- app/models/concerns/account/merging.rb | 4 ++-- app/models/severed_relationship.rb | 1 + app/views/severed_relationships/index.html.haml | 4 ++-- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/controllers/severed_relationships_controller.rb b/app/controllers/severed_relationships_controller.rb index 8994fff0ac..168e85e3fe 100644 --- a/app/controllers/severed_relationships_controller.rb +++ b/app/controllers/severed_relationships_controller.rb @@ -33,7 +33,7 @@ class SeveredRelationshipsController < ApplicationController def following_data CSV.generate(headers: ['Account address', 'Show boosts', 'Notify on new posts', 'Languages'], write_headers: true) do |csv| - @event.severed_relationships.active.where(local_account: current_account).includes(:remote_account).reorder(id: :desc).each do |follow| + @event.severed_relationships.active.about_local_account(current_account).includes(:remote_account).reorder(id: :desc).each do |follow| csv << [acct(follow.target_account), follow.show_reblogs, follow.notify, follow.languages&.join(', ')] end end @@ -41,7 +41,7 @@ class SeveredRelationshipsController < ApplicationController def followers_data CSV.generate(headers: ['Account address'], write_headers: true) do |csv| - @event.severed_relationships.passive.where(local_account: current_account).includes(:remote_account).reorder(id: :desc).each do |follow| + @event.severed_relationships.passive.about_local_account(current_account).includes(:remote_account).reorder(id: :desc).each do |follow| csv << [acct(follow.account)] end end diff --git a/app/models/account_relationship_severance_event.rb b/app/models/account_relationship_severance_event.rb index 84b8b1c65a..20b15e2839 100644 --- a/app/models/account_relationship_severance_event.rb +++ b/app/models/account_relationship_severance_event.rb @@ -29,6 +29,6 @@ class AccountRelationshipSeveranceEvent < ApplicationRecord private def set_relationships_count! - self.relationships_count = severed_relationships.where(local_account: account).count + self.relationships_count = severed_relationships.about_local_account(account).count end end diff --git a/app/models/concerns/account/merging.rb b/app/models/concerns/account/merging.rb index ebc57a1221..e6b147482c 100644 --- a/app/models/concerns/account/merging.rb +++ b/app/models/concerns/account/merging.rb @@ -48,13 +48,13 @@ module Account::Merging record.update_attribute(:account_warning_id, id) end - SeveredRelationship.where(local_account_id: other_account.id).reorder(nil).find_each do |record| + SeveredRelationship.about_local_account(other_account).reorder(nil).find_each do |record| record.update_attribute(:local_account_id, id) rescue ActiveRecord::RecordNotUnique next end - SeveredRelationship.where(remote_account_id: other_account.id).reorder(nil).find_each do |record| + SeveredRelationship.about_remote_account(other_account).reorder(nil).find_each do |record| record.update_attribute(:remote_account_id, id) rescue ActiveRecord::RecordNotUnique next diff --git a/app/models/severed_relationship.rb b/app/models/severed_relationship.rb index d71b2610fe..64b5b0001b 100644 --- a/app/models/severed_relationship.rb +++ b/app/models/severed_relationship.rb @@ -26,6 +26,7 @@ class SeveredRelationship < ApplicationRecord } scope :about_local_account, ->(account) { where(local_account: account) } + scope :about_remote_account, ->(account) { where(remote_account: account) } scope :active, -> { where(direction: :active) } scope :passive, -> { where(direction: :passive) } diff --git a/app/views/severed_relationships/index.html.haml b/app/views/severed_relationships/index.html.haml index 97bef87929..75296d90aa 100644 --- a/app/views/severed_relationships/index.html.haml +++ b/app/views/severed_relationships/index.html.haml @@ -21,13 +21,13 @@ %td{ rowspan: 2 }= t('severed_relationships.purged') - else %td - - count = event.severed_relationships.active.where(local_account: current_account).count + - count = event.severed_relationships.active.about_local_account(current_account).count - if count.zero? = t('generic.none') - else = table_link_to 'download', t('severed_relationships.download', count: count), following_severed_relationship_path(event, format: :csv) %td - - count = event.severed_relationships.passive.where(local_account: current_account).count + - count = event.severed_relationships.passive.about_local_account(current_account).count - if count.zero? = t('generic.none') - else From c007dd5dd21ded9b82d2f2e5dd063dc0fe88a797 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 10:57:45 +0100 Subject: [PATCH 270/954] New Crowdin Translations (automated) (#29687) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/bg.json | 10 ++++- app/javascript/mastodon/locales/ca.json | 8 ++++ app/javascript/mastodon/locales/da.json | 7 ++++ app/javascript/mastodon/locales/eu.json | 8 ++++ app/javascript/mastodon/locales/fi.json | 8 ++++ app/javascript/mastodon/locales/fo.json | 8 ++++ app/javascript/mastodon/locales/gd.json | 9 ++++- app/javascript/mastodon/locales/hu.json | 8 ++++ app/javascript/mastodon/locales/ko.json | 10 ++++- app/javascript/mastodon/locales/lad.json | 19 +++++++++ app/javascript/mastodon/locales/lv.json | 14 ++++--- app/javascript/mastodon/locales/nl.json | 8 ++++ app/javascript/mastodon/locales/nn.json | 32 +++++++++------ app/javascript/mastodon/locales/ry.json | 16 ++++++++ app/javascript/mastodon/locales/sk.json | 1 + app/javascript/mastodon/locales/sl.json | 10 ++++- app/javascript/mastodon/locales/sq.json | 6 +++ app/javascript/mastodon/locales/uk.json | 36 +++++++++++++++++ app/javascript/mastodon/locales/zh-CN.json | 8 ++++ app/javascript/mastodon/locales/zh-TW.json | 8 ++++ config/locales/be.yml | 1 + config/locales/bg.yml | 12 ++++++ config/locales/ca.yml | 12 ++++++ config/locales/da.yml | 11 ++++++ config/locales/devise.lv.yml | 8 ++-- config/locales/devise.nn.yml | 4 +- config/locales/doorkeeper.nl.yml | 2 +- config/locales/doorkeeper.zh-TW.yml | 2 +- config/locales/es-AR.yml | 3 ++ config/locales/es.yml | 3 ++ config/locales/eu.yml | 12 ++++++ config/locales/fi.yml | 12 ++++++ config/locales/fo.yml | 12 ++++++ config/locales/gd.yml | 15 ++++++++ config/locales/hu.yml | 14 ++++++- config/locales/ko.yml | 12 ++++++ config/locales/lad.yml | 7 ++++ config/locales/lv.yml | 45 +++++++++++++--------- config/locales/nl.yml | 16 +++++++- config/locales/nn.yml | 36 +++++++++++------ config/locales/pl.yml | 12 ++++++ config/locales/simple_form.lv.yml | 4 +- config/locales/sk.yml | 3 ++ config/locales/sl.yml | 12 ++++++ config/locales/sq.yml | 7 ++++ config/locales/uk.yml | 45 ++++++++++++++++++++++ config/locales/vi.yml | 4 ++ config/locales/zh-CN.yml | 12 ++++++ config/locales/zh-TW.yml | 14 ++++++- 49 files changed, 519 insertions(+), 67 deletions(-) diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index d692925d15..9d972726b7 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -434,7 +434,7 @@ "mute_modal.they_can_mention_and_follow": "Могат да ви споменават и последват, но няма да ги виждате.", "mute_modal.they_wont_know": "Няма да узнаят, че са били заглушени.", "mute_modal.title": "Заглушавате ли потребител?", - "mute_modal.you_wont_see_mentions": "Няма да виждате споменаващи ги публикации.", + "mute_modal.you_wont_see_mentions": "Няма да виждате споменаващите ги публикации.", "mute_modal.you_wont_see_posts": "Още могат да виждат публикациите ви, но вие техните не.", "navigation_bar.about": "Относно", "navigation_bar.advanced_interface": "Отваряне в разширен уебинтерфейс", @@ -471,6 +471,8 @@ "notification.own_poll": "Анкетата ви приключи", "notification.poll": "Анкета, в която гласувахте, приключи", "notification.reblog": "{name} подсили ваша публикация", + "notification.severedRelationships": "Връзката с {name} е прекъсната", + "notification.severed_relationships": "Връзката с {name} е прекъсната", "notification.status": "{name} току-що публикува", "notification.update": "{name} промени публикация", "notification_requests.accept": "Приемам", @@ -587,6 +589,12 @@ "refresh": "Опресняване", "regeneration_indicator.label": "Зареждане…", "regeneration_indicator.sublabel": "Подготовка на началния ви инфоканал!", + "relationship_severance_notification.purged_data": "прочистено от администраторите", + "relationship_severance_notification.relationships": "{count, plural, one {# връзка} other {# връзки}}", + "relationship_severance_notification.types.account_suspension": "Акаунтът е спрян", + "relationship_severance_notification.types.domain_block": "Домейнът е спрян", + "relationship_severance_notification.types.user_domain_block": "Блокирахте този домейн", + "relationship_severance_notification.view": "Преглед", "relative_time.days": "{number} д.", "relative_time.full.days": "преди {number, plural, one {# ден} other {# дни}}", "relative_time.full.hours": "преди {number, plural, one {# час} other {# часа}}", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index e0d62c78bb..3f1d7f858c 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -471,6 +471,8 @@ "notification.own_poll": "La teva enquesta ha finalitzat", "notification.poll": "Ha finalitzat una enquesta en què has votat", "notification.reblog": "{name} t'ha impulsat", + "notification.severedRelationships": "S'han eliminat les relacions amb {name}", + "notification.severed_relationships": "S'han eliminat les relacions amb {name}", "notification.status": "{name} acaba de publicar", "notification.update": "{name} ha editat un tut", "notification_requests.accept": "Accepta", @@ -587,6 +589,12 @@ "refresh": "Actualitza", "regeneration_indicator.label": "Es carrega…", "regeneration_indicator.sublabel": "Es prepara la teva línia de temps d'Inici!", + "relationship_severance_notification.purged_data": "ho han purgat els administradors", + "relationship_severance_notification.relationships": "{count, plural, one {# relació} other {# relacions}}", + "relationship_severance_notification.types.account_suspension": "S'ha suspès el compte", + "relationship_severance_notification.types.domain_block": "S'ha suspès el domini", + "relationship_severance_notification.types.user_domain_block": "Heu blocat aquest domini", + "relationship_severance_notification.view": "Veure", "relative_time.days": "{number}d", "relative_time.full.days": "fa {number, plural, one {# dia} other {# dies}}", "relative_time.full.hours": "fa {number, plural, one {# hora} other {# hores}}", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index bff044e7d6..e00e23f9b8 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -469,6 +469,7 @@ "notification.own_poll": "Din afstemning er afsluttet", "notification.poll": "En afstemning, hvori du stemte, er slut", "notification.reblog": "{name} boostede dit indlæg", + "notification.severedRelationships": "Forhold med {name} afbrudt", "notification.status": "{name} har netop postet", "notification.update": "{name} redigerede et indlæg", "notification_requests.accept": "Acceptér", @@ -585,6 +586,12 @@ "refresh": "Genindlæs", "regeneration_indicator.label": "Indlæser…", "regeneration_indicator.sublabel": "Din hjemmetidslinje klargøres!", + "relationship_severance_notification.purged_data": "renset af administratorer", + "relationship_severance_notification.relationships": "{count, plural, one {# forhold} other {# forhold}}", + "relationship_severance_notification.types.account_suspension": "Konto er blevet suspenderet", + "relationship_severance_notification.types.domain_block": "Domæne er blevet suspenderet", + "relationship_severance_notification.types.user_domain_block": "Dette domæne blev blokeret", + "relationship_severance_notification.view": "Vis", "relative_time.days": "{number}d", "relative_time.full.days": "{number, plural, one {# dag} other {# dage}} siden", "relative_time.full.hours": "{number, plural, one {# time} other {# timer}} siden", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index aae678a7d6..1a6338c2eb 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -471,6 +471,8 @@ "notification.own_poll": "Zure inkesta amaitu da", "notification.poll": "Zuk erantzun duzun inkesta bat bukatu da", "notification.reblog": "{name}(e)k bultzada eman dio zure bidalketari", + "notification.severedRelationships": "{name} erabiltzailearekin zenuen erlazioa galdu da", + "notification.severed_relationships": "{name} erabiltzailearekin zenuen erlazioa galdu da", "notification.status": "{name} erabiltzaileak bidalketa egin berri du", "notification.update": "{name} erabiltzaileak bidalketa bat editatu du", "notification_requests.accept": "Onartu", @@ -587,6 +589,12 @@ "refresh": "Berritu", "regeneration_indicator.label": "Kargatzen…", "regeneration_indicator.sublabel": "Zure hasiera-jarioa prestatzen ari da!", + "relationship_severance_notification.purged_data": "administratzaileek kendua", + "relationship_severance_notification.relationships": "{count, plural, one {Erlazio #} other {# erlazio}}", + "relationship_severance_notification.types.account_suspension": "Kontua bertan behera utzi da", + "relationship_severance_notification.types.domain_block": "Domeinua bertan behera utzi da", + "relationship_severance_notification.types.user_domain_block": "Domeinu hau blokeatu duzu", + "relationship_severance_notification.view": "Ikusi", "relative_time.days": "{number}e", "relative_time.full.days": "Duela {number, plural, one {egun #} other {# egun}}", "relative_time.full.hours": "Duela {number, plural, one {ordu #} other {# ordu}}", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index bb5370b6d7..b976b505d6 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -471,6 +471,8 @@ "notification.own_poll": "Äänestyksesi on päättynyt", "notification.poll": "Kysely, johon osallistuit, on päättynyt", "notification.reblog": "{name} tehosti julkaisuasi", + "notification.severedRelationships": "Suhteet palvelimeen {name} katkenneet", + "notification.severed_relationships": "Suhteet palvelimeen {name} katkenneet", "notification.status": "{name} julkaisi juuri", "notification.update": "{name} muokkasi julkaisua", "notification_requests.accept": "Hyväksy", @@ -587,6 +589,12 @@ "refresh": "Päivitä", "regeneration_indicator.label": "Ladataan…", "regeneration_indicator.sublabel": "Kotisyötettäsi valmistellaan!", + "relationship_severance_notification.purged_data": "ylläpitäjien tyhjentämä", + "relationship_severance_notification.relationships": "{count, plural, one {# suhde} other {# suhdetta}}", + "relationship_severance_notification.types.account_suspension": "Tili on jäädytetty", + "relationship_severance_notification.types.domain_block": "Verkkotunnus on jäädytetty", + "relationship_severance_notification.types.user_domain_block": "Estit tämän verkkotunnuksen", + "relationship_severance_notification.view": "Näytä", "relative_time.days": "{number} pv", "relative_time.full.days": "{number, plural, one {# päivä} other {# päivää}} sitten", "relative_time.full.hours": "{number, plural, one {# tunti} other {# tuntia}} sitten", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 27c0c8548f..5d8cafcd16 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -471,6 +471,8 @@ "notification.own_poll": "Tín atkvøðugreiðsla er endað", "notification.poll": "Ein atkvøðugreiðsla, har tú hevur atkvøtt, er endað", "notification.reblog": "{name} lyfti tín post", + "notification.severedRelationships": "Tilknýti við {name} avbrotið", + "notification.severed_relationships": "Tilknýti við {name} avbrotið", "notification.status": "{name} hevur júst postað", "notification.update": "{name} rættaði ein post", "notification_requests.accept": "Góðtak", @@ -587,6 +589,12 @@ "refresh": "Endurles", "regeneration_indicator.label": "Innlesur…", "regeneration_indicator.sublabel": "Tín heimarás verður gjørd klár!", + "relationship_severance_notification.purged_data": "reinsað av umsitarum", + "relationship_severance_notification.relationships": "{count, plural, one {# tilknýti} other {# tilknýti}}", + "relationship_severance_notification.types.account_suspension": "Kontan er ógildað", + "relationship_severance_notification.types.domain_block": "Økisnavn er ógildað", + "relationship_severance_notification.types.user_domain_block": "Tú hevur forðað hesum økisnavni", + "relationship_severance_notification.view": "Vís", "relative_time.days": "{number}d", "relative_time.full.days": "{number, plural, one {# dagur} other {# dagar}} síðani", "relative_time.full.hours": "{number, plural, one {# tími} other {# tímar}} síðani", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index ad9a58d83d..4696d50eac 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -471,6 +471,8 @@ "notification.own_poll": "Thàinig an cunntas-bheachd agad gu crìoch", "notification.poll": "Thàinig cunntas-bheachd sa bhòt thu gu crìoch", "notification.reblog": "Bhrosnaich {name} am post agad", + "notification.severedRelationships": "Chaidh na dàimhean le {name} a dhealachadh", + "notification.severed_relationships": "Chaidh na dàimhean le {name} a dhealachadh", "notification.status": "Phostaich {name} rud", "notification.update": "Dheasaich {name} post", "notification_requests.accept": "Gabh ris", @@ -514,7 +516,7 @@ "notifications.policy.filter_not_followers_title": "Daoine nach eil gad leantainn", "notifications.policy.filter_not_following_hint": "Gus an aontaich thu riutha a làimh", "notifications.policy.filter_not_following_title": "Daoine nach eil thu a’ leantainn", - "notifications.policy.filter_private_mentions_hint": "Criathraichte ach ma tha e a’ freagairt do dh’iomradh agad fhèin no ma tha thu a’ leantainn an seòladair", + "notifications.policy.filter_private_mentions_hint": "Criathraichte ach ma tha e a’ freagairt do dh’iomradh agad fhèin no ma tha thu a’ leantainn an t-seòladair", "notifications.policy.filter_private_mentions_title": "Iomraidhean prìobhaideach o choigrich", "notifications.policy.title": "Falamhaich na brathan o…", "notifications_permission_banner.enable": "Cuir brathan deasga an comas", @@ -587,6 +589,11 @@ "refresh": "Ath-nuadhaich", "regeneration_indicator.label": "’Ga luchdadh…", "regeneration_indicator.sublabel": "Tha do dhachaigh ’ga ullachadh!", + "relationship_severance_notification.purged_data": "chaidh a phurgaideachadh leis na rianairean", + "relationship_severance_notification.types.account_suspension": "Chaidh cunntas a chur à rèim", + "relationship_severance_notification.types.domain_block": "Chaidh àrainn a chur à rèim", + "relationship_severance_notification.types.user_domain_block": "Bhac thu an àrainn seo", + "relationship_severance_notification.view": "Seall", "relative_time.days": "{number}l", "relative_time.full.days": "{number, plural, one {# latha} two {# latha} few {# làithean} other {# latha}} air ais", "relative_time.full.hours": "{number, plural, one {# uair a thìde} two {# uair a thìde} few {# uairean a thìde} other {# uair a thìde}} air ais", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 38e46399d3..760063ab75 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -471,6 +471,8 @@ "notification.own_poll": "A szavazásod véget ért", "notification.poll": "Egy szavazás, melyben részt vettél, véget ért", "notification.reblog": "{name} megtolta a bejegyzésedet", + "notification.severedRelationships": "A kapcsolatok megszakítva ezzel: {name}", + "notification.severed_relationships": "A kapcsolatok megszakítva ezzel: {name}", "notification.status": "{name} bejegyzést tett közzé", "notification.update": "{name} szerkesztett egy bejegyzést", "notification_requests.accept": "Elfogadás", @@ -587,6 +589,12 @@ "refresh": "Frissítés", "regeneration_indicator.label": "Betöltés…", "regeneration_indicator.sublabel": "A saját idővonalad épp készül!", + "relationship_severance_notification.purged_data": "rendszergazdák által véglegesen törölve", + "relationship_severance_notification.relationships": "{count, plural, one {# kapcsolat} other {# kapcsolat}}", + "relationship_severance_notification.types.account_suspension": "A fiók fel van függesztve", + "relationship_severance_notification.types.domain_block": "A domain fel van függesztve", + "relationship_severance_notification.types.user_domain_block": "Blokkoltad ezt a domaint", + "relationship_severance_notification.view": "Megtekintés", "relative_time.days": "{number}n", "relative_time.full.days": "{number, plural, one {# napja} other {# napja}}", "relative_time.full.hours": "{number, plural, one {# órája} other {# órája}}", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 96407b0020..5ccd652a14 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -220,7 +220,7 @@ "domain_pill.activitypub_lets_connect": "이것은 마스토돈 뿐만이 아니라 다른 소셜 앱들을 넘나들며 사람들을 연결하고 상호작용 할 수 있게 합니다.", "domain_pill.activitypub_like_language": "액티비티펍은 마스토돈이 다른 소셜 네트워크와 대화할 때 쓰는 언어 같은 것입니다.", "domain_pill.server": "서버", - "domain_pill.their_handle": "그의 핸들:", + "domain_pill.their_handle": "이 사람의 핸들:", "domain_pill.their_server": "그의 게시물이 살고 있는 디지털 거처입니다.", "domain_pill.their_username": "그의 서버에서 유일한 식별자입니다. 다른 서버에서 같은 사용자명을 가진 사용자를 찾을 수도 있습니다.", "domain_pill.username": "사용자명", @@ -471,6 +471,8 @@ "notification.own_poll": "설문을 마침", "notification.poll": "참여한 설문이 종료됨", "notification.reblog": "{name} 님이 부스트했습니다", + "notification.severedRelationships": "{name} 님과의 관계가 단절되었습니다", + "notification.severed_relationships": "{name} 님과의 관계가 단절되었습니다", "notification.status": "{name} 님이 방금 게시물을 올렸습니다", "notification.update": "{name} 님이 게시물을 수정했습니다", "notification_requests.accept": "수락", @@ -587,6 +589,12 @@ "refresh": "새로고침", "regeneration_indicator.label": "불러오는 중…", "regeneration_indicator.sublabel": "홈 피드를 준비하고 있습니다!", + "relationship_severance_notification.purged_data": "관리자에 의해 제거되었습니다", + "relationship_severance_notification.relationships": "{count, plural, other {# 건의 관계}}", + "relationship_severance_notification.types.account_suspension": "계정이 정지되었습니다", + "relationship_severance_notification.types.domain_block": "도메인이 정지되었습니다", + "relationship_severance_notification.types.user_domain_block": "내가 이 도메인을 차단했습니다", + "relationship_severance_notification.view": "보기", "relative_time.days": "{number}일 전", "relative_time.full.days": "{number} 일 전", "relative_time.full.hours": "{number} 시간 전", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index 2f4185f69e..547351af8c 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -91,7 +91,10 @@ "audio.hide": "Eskonde audio", "block_modal.show_less": "Amostra manko", "block_modal.show_more": "Amostra mas", + "block_modal.they_cant_mention": "No te puede enmentar ni segir.", + "block_modal.they_will_know": "Puede ver ke esta blokado.", "block_modal.title": "Bloka utilizador?", + "block_modal.you_wont_see_mentions": "No veras publikasyones ke lo enmentan.", "boost_modal.combo": "Puedes klikar {combo} para ometer esto la proksima vez", "bundle_column_error.copy_stacktrace": "Kopia el raporto de yerro", "bundle_column_error.error.body": "La pajina solisitada no pudo ser renderada. Podria ser por un yerro en muestro kodiche o un problem de kompatibilita kon el navigador.", @@ -205,9 +208,16 @@ "dismissable_banner.explore_tags": "Estas etiketas estan agora popularas en la red sosyala. Etiketas uzadas por mas djente aparesen primero.", "dismissable_banner.public_timeline": "Estas son las publikasyones publikas mas resientes de personas en la red sosyala a las kualas la djente de {domain} sige.", "domain_block_modal.block": "Bloka sirvidor", + "domain_block_modal.block_account_instead": "Bloka @{name} en su lugar", + "domain_block_modal.they_cant_follow": "Dingun de este sirvidor puede segirte.", + "domain_block_modal.they_wont_know": "No savra ke tiene sido blokado.", "domain_block_modal.title": "Bloka el domeno?", + "domain_block_modal.you_will_lose_followers": "Se efasaran todos tus suivantes de este sirvidor.", "domain_pill.server": "Sirvidor", + "domain_pill.their_handle": "Su alias:", "domain_pill.username": "Nombre de utilizador", + "domain_pill.whats_in_a_handle": "En ke konsiste el alias?", + "domain_pill.your_handle": "Tu alias:", "embed.instructions": "Enkrusta esta publikasyon en tu sitio internetiko kopiando este kodiche.", "embed.preview": "Paresera ansina:", "emoji_button.activity": "Aktivita", @@ -404,6 +414,13 @@ "loading_indicator.label": "Eskargando…", "media_gallery.toggle_visible": "{number, plural, one {Eskonde imaje} other {Eskonde imajes}}", "moved_to_account_banner.text": "Tu kuento {disabledAccount} esta aktualmente inkapasitado porke transferates a {movedToAccount}.", + "mute_modal.hide_from_notifications": "Eskonde de avizos", + "mute_modal.hide_options": "Eskonde opsyones", + "mute_modal.indefinite": "Asta ke desho de silensyarlo", + "mute_modal.show_options": "Amostra opsyones", + "mute_modal.they_wont_know": "No savra ke tiene sido silensyado.", + "mute_modal.title": "Silensiar utilizador?", + "mute_modal.you_wont_see_mentions": "No veras publikasyones ke lo enmentan.", "navigation_bar.about": "Sovre mozotros", "navigation_bar.advanced_interface": "Avre en la enterfaz avanzada", "navigation_bar.blocks": "Utilizadores blokados", @@ -553,6 +570,8 @@ "refresh": "Arefreska", "regeneration_indicator.label": "Eskargando…", "regeneration_indicator.sublabel": "Tu linya de tiempo prinsipala esta preparando!", + "relationship_severance_notification.types.user_domain_block": "Blokates este domeno", + "relationship_severance_notification.view": "Mira", "relative_time.days": "{number} d", "relative_time.full.days": "antes {number, plural, one {# diya} other {# diyas}}", "relative_time.full.hours": "antes {number, plural, one {# ora} other {# oras}}", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 51d06c8233..21fa46faa6 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -236,7 +236,7 @@ "empty_column.lists": "Pašlaik Tev nav neviena saraksta. Kad tādu izveidosi, tas parādīsies šeit.", "empty_column.mutes": "Neviens lietotājs vēl nav apklusināts.", "empty_column.notifications": "Tev vēl nav paziņojumu. Kad citi cilvēki ar Tevi mijiedarbosies, Tu to redzēsi šeit.", - "empty_column.public": "Šeit nekā nav! Ieraksti kaut ko publiski vai seko lietotājiem no citiem serveriem, lai iegūtu saturu", + "empty_column.public": "Šeit nekā nav. Ieraksti kaut ko publiski vai seko lietotājiem no citiem serveriem, lai iegūtu saturu", "error.unexpected_crash.explanation": "Koda kļūdas vai pārlūkprogrammas saderības problēmas dēļ šo lapu nevarēja parādīt pareizi.", "error.unexpected_crash.explanation_addons": "Šo lapu nevarēja parādīt pareizi. Šo kļūdu, iespējams, izraisīja pārlūkprogrammas papildinājums vai automātiskās tulkošanas rīki.", "error.unexpected_crash.next_steps": "Mēģini atsvaidzināt lapu. Ja tas nepalīdz, iespējams, varēsi lietot Mastodon, izmantojot citu pārlūkprogrammu vai lietotni.", @@ -265,6 +265,7 @@ "filter_modal.select_filter.subtitle": "Izmanto esošu kategoriju vai izveido jaunu", "filter_modal.select_filter.title": "Filtrēt šo ziņu", "filter_modal.title.status": "Filtrēt ziņu", + "filtered_notifications_banner.pending_requests": "Paziņojumi no {count, plural, =0 {neviena} one {viena cilvēka} other {# cilvēkiem}}, ko Tu varētu zināt", "firehose.all": "Visi", "firehose.local": "Šis serveris", "firehose.remote": "Citi serveri", @@ -273,6 +274,7 @@ "follow_requests.unlocked_explanation": "Lai gan Tavs konts nav slēgts, {domain} darbinieki iedomājās, ka Tu varētu vēlēties pašrocīgi pārskatīt sekošanas pieprasījumus no šiem kontiem.", "follow_suggestions.curated_suggestion": "Darbinieku izvēle", "follow_suggestions.dismiss": "Vairs nerādīt", + "follow_suggestions.personalized_suggestion": "Pielāgots ieteikums", "follow_suggestions.view_all": "Skatīt visu", "follow_suggestions.who_to_follow": "Kam sekot", "followed_tags": "Sekojamie tēmturi", @@ -413,7 +415,7 @@ "navigation_bar.security": "Drošība", "not_signed_in_indicator.not_signed_in": "Ir jāpiesakās, lai piekļūtu šim resursam.", "notification.admin.report": "{name} ziņoja par {target}", - "notification.admin.sign_up": "{name} ir pierakstījies", + "notification.admin.sign_up": "{name} pierakstījās", "notification.favourite": "{name} pievienoja tavu ziņu izlasei", "notification.follow": "{name} uzsāka Tev sekot", "notification.follow_request": "{name} nosūtīja Tev sekošanas pieprasījumu", @@ -464,7 +466,7 @@ "onboarding.compose.template": "Sveiki, #Mastodon!", "onboarding.follows.empty": "Diemžēl pašlaik nevar parādīt rezultātus. Vari mēģināt izmantot meklēšanu vai pārlūkot izpētes lapu, lai atrastu cilvēkus, kuriem sekot, vai vēlāk mēģināt vēlreiz.", "onboarding.follows.lead": "Tava mājas plūsma ir galvenais veids, kā izbaudīt Mastodon. Jo vairāk cilvēku sekosi, jo aktīvāk un interesantāk tas būs. Lai sāktu, šeit ir daži ieteikumi:", - "onboarding.follows.title": "Populārs Mastodon", + "onboarding.follows.title": "Pielāgo savu mājas barotni", "onboarding.profile.discoverable": "Padarīt manu profilu atklājamu", "onboarding.profile.display_name": "Attēlojamais vārds", "onboarding.profile.display_name_hint": "Tavs pilnais vārds vai Tavs joku vārds…", @@ -482,7 +484,7 @@ "onboarding.start.skip": "Nav nepieciešama palīdzība darba sākšanai?", "onboarding.start.title": "Tev tas izdevās!", "onboarding.steps.follow_people.body": "Tu pats veido savu plūsmu. Piepildīsim to ar interesantiem cilvēkiem.", - "onboarding.steps.follow_people.title": "Sekot {count, plural, one {one person} other {# cilvēkiem}}", + "onboarding.steps.follow_people.title": "Pielāgo savu mājas barotni", "onboarding.steps.publish_status.body": "Sveicini pasauli ar tekstu, fotoattēliem, video, vai aptaujām {emoji}", "onboarding.steps.publish_status.title": "Izveido savu pirmo ziņu", "onboarding.steps.setup_profile.body": "Palielini mijiedarbību ar aptverošu profilu!", @@ -492,14 +494,14 @@ "onboarding.tips.2fa": "Vai zināji? Tu vari aizsargāt savu kontu, konta iestatījumos iestatot divpakāpju autentifikāciju. Tas darbojas ar jebkuru Tevis izvēlētu TOTP lietotni, nav nepieciešams tālruņa numurs!", "onboarding.tips.accounts_from_other_servers": "Vai zināji? Tā kā Mastodon ir decentralizēts, daži profili, ar kuriem saskaraties, tiks mitināti citos, nevis tavos serveros. Un tomēr tu varat sazināties ar viņiem nevainojami! Viņu serveris atrodas viņu lietotājvārda otrajā pusē!", "onboarding.tips.migration": "Vai zināji? Ja uzskati, ka {domain} nākotnē nav lieliska servera izvēle, vari pāriet uz citu Mastodon serveri, nezaudējot savus sekotājus. Tu pat vari mitināt savu serveri!", - "onboarding.tips.verification": "Vai zināji? Tu vari verificēt savu kontu, ievietojot saiti uz savu Mastodon profilu savā vietnē un pievienojot vietni savam profilam. Nav nepieciešami nekādi maksājumi vai dokumenti!", + "onboarding.tips.verification": "Vai zināji? Tu vari apliecināt savu kontu, ievietojot savā tīmekļvietnē saiti uz savu Mastodon profilu un pievienojot tīmekļvietni savam profilam. Nav nepieciešami nekādi maksājumi vai dokumenti.", "password_confirmation.exceeds_maxlength": "Paroles apstiprināšana pārsniedz maksimālo paroles garumu", "password_confirmation.mismatching": "Paroles apstiprinājums neatbilst", "picture_in_picture.restore": "Novietot atpakaļ", "poll.closed": "Pabeigta", "poll.refresh": "Atsvaidzināt", "poll.reveal": "Skatīt rezultātus", - "poll.total_people": "{count, plural, zero {# cilvēku} one {# persona} other {# cilvēki}}", + "poll.total_people": "{count, plural, zero {# cilvēku} one {# cilvēks} other {# cilvēki}}", "poll.total_votes": "{count, plural, zero {# balsojumu} one {# balsojums} other {# balsojumi}}", "poll.vote": "Balsot", "poll.voted": "Tu balsoji par šo atbildi", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 9bf40a7148..f60c426bc2 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -471,6 +471,8 @@ "notification.own_poll": "Jouw peiling is beëindigd", "notification.poll": "Een peiling waaraan jij hebt meegedaan is beëindigd", "notification.reblog": "{name} boostte jouw bericht", + "notification.severedRelationships": "Volgrelaties met {name} verbroken", + "notification.severed_relationships": "Volgrelaties met {name} verbroken", "notification.status": "{name} heeft zojuist een bericht geplaatst", "notification.update": "{name} heeft een bericht bewerkt", "notification_requests.accept": "Accepteren", @@ -587,6 +589,12 @@ "refresh": "Vernieuwen", "regeneration_indicator.label": "Aan het laden…", "regeneration_indicator.sublabel": "Jouw starttijdlijn wordt aangemaakt!", + "relationship_severance_notification.purged_data": "verwijderd door beheerders", + "relationship_severance_notification.relationships": "{count, plural, one {# volgrelatie} other {# volgrelaties}}", + "relationship_severance_notification.types.account_suspension": "Account is opgeschort", + "relationship_severance_notification.types.domain_block": "Domein is opgeschort", + "relationship_severance_notification.types.user_domain_block": "Je hebt dit domein geblokkeerd", + "relationship_severance_notification.view": "Weergeven", "relative_time.days": "{number}d", "relative_time.full.days": "{number, plural, one {# dag} other {# dagen}} geleden", "relative_time.full.hours": "{number, plural, one {# uur} other {# uur}} geleden", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index aa20207a76..a70d607d4d 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -32,7 +32,7 @@ "account.featured_tags.last_status_never": "Ingen innlegg", "account.featured_tags.title": "{name} sine framheva emneknaggar", "account.follow": "Fylg", - "account.follow_back": "Følg tilbake", + "account.follow_back": "Fylg tilbake", "account.followers": "Fylgjarar", "account.followers.empty": "Ingen fylgjer denne brukaren enno.", "account.followers_counter": "{count, plural, one {{counter} fylgjar} other {{counter} fylgjarar}}", @@ -79,8 +79,8 @@ "admin.dashboard.retention.cohort": "Registrert månad", "admin.dashboard.retention.cohort_size": "Nye brukarar", "admin.impact_report.instance_accounts": "Kontoprofilar dette vil sletta", - "admin.impact_report.instance_followers": "Følgjarar våre brukarar vil mista", - "admin.impact_report.instance_follows": "Følgjarar deira brukarar vil mista", + "admin.impact_report.instance_followers": "Fylgjarar som brukarane våre ville mista", + "admin.impact_report.instance_follows": "Fylgjarar som brukarane deira ville mista", "admin.impact_report.title": "Samandrag av konsekvensane", "alert.rate_limited.message": "Ver venleg å prøv på nytt etter {retry_time, time, medium}.", "alert.rate_limited.title": "Redusert kapasitet", @@ -89,7 +89,7 @@ "announcement.announcement": "Kunngjering", "attachments_list.unprocessed": "(ubehandla)", "audio.hide": "Gøym lyd", - "block_modal.remote_users_caveat": "Vi vil be tenaren {domain} om å respektere di avgjerd. Det kan ikkje garanterast at det vert etterfølgd, sidan nokre tenarar kan handtere blokkering ulikt. Offentlege innlegg kan framleis vere synlege for ikkje-innlogga brukarar.", + "block_modal.remote_users_caveat": "Me vil be tenaren {domain} om å respektere di avgjerd. Me kan ikkje garantera at det vert gjort, sidan nokre tenarar kan handtera blokkering ulikt. Offentlege innlegg kan framleis vera synlege for ikkje-innlogga brukarar.", "block_modal.show_less": "Vis mindre", "block_modal.show_more": "Vis meir", "block_modal.they_cant_mention": "Dei kan ikkje nemna eller fylgja deg.", @@ -208,7 +208,7 @@ "dismissable_banner.explore_links": "Desse nyhendesakene snakkast om av folk på denne og andre tenarar på det desentraliserte nettverket no.", "dismissable_banner.explore_statuses": "Dette er innlegg frå det desentraliserte nettverket som er i støytet i dag. Nye statusar som er mykje framheva og merkte som favorittar er rangert høgare.", "dismissable_banner.explore_tags": "Desse emneknaggane er populære blant folk på denne tenaren og andre tenarar i det desentraliserte nettverket nett no.", - "dismissable_banner.public_timeline": "Dette er dei nyaste offentlege innlegga frå menneske på det sosiale nettet som folk på {domain} følgjer.", + "dismissable_banner.public_timeline": "Dette er dei nyaste offentlege innlegga frå menneske på det sosiale nettet som folk på {domain} fylgjer.", "domain_block_modal.block": "Blokker tenaren", "domain_block_modal.block_account_instead": "Blokker @{name} i staden", "domain_block_modal.they_can_interact_with_old_posts": "Folk på denne tenaren kan samhandla med dei gamle innlegga dine.", @@ -228,7 +228,7 @@ "domain_pill.who_they_are": "Sidan handtak seier kven nokon er og kvar dei er, kan du interagere med folk på tvers av det sosiale nettverket av .", "domain_pill.who_you_are": "Sidan handtaket ditt seier kven du er og kvar du er, kan folk interagere med deg på tvers av det sosiale nettverket av .", "domain_pill.your_handle": "Handtaket ditt:", - "domain_pill.your_server": "Din digitale heim, som alle postane dine bur i. Liker du ikkje dette? Overfør tenarar når som helst og ta med følgjarane dine òg.", + "domain_pill.your_server": "Din digitale heim, der alle innlegga dine bur i. Liker du ikkje dette? Byt til ein ny tenar når som helst og ta med fylgjarane dine òg.", "domain_pill.your_username": "Din unike identifikator på denne tenaren. Det er mogleg å finne brukarar med same brukarnamn på forskjellige tenarar.", "embed.instructions": "Bygg inn denne statusen på nettsida di ved å kopiera koden nedanfor.", "embed.preview": "Slik kjem det til å sjå ut:", @@ -259,16 +259,16 @@ "empty_column.explore_statuses": "Ingenting er i støytet nett no. Prøv igjen seinare!", "empty_column.favourited_statuses": "Du har ingen favoritt-statusar ennå. Når du merkjer ein som favoritt, dukkar han opp her.", "empty_column.favourites": "Ingen har merkt denne statusen som favoritt enno. Når nokon gjer det, dukkar dei opp her.", - "empty_column.follow_requests": "Du har ingen følgjeførespurnadar ennå. Når du får ein, så vil den dukke opp her.", + "empty_column.follow_requests": "Ingen har spurt om å fylgja deg enno. Når nokon gjer det, vil det dukka opp her.", "empty_column.followed_tags": "Du fylgjer ingen emneknaggar enno. Når du gjer det, vil dei syna her.", "empty_column.hashtag": "Det er ingenting i denne emneknaggen enno.", - "empty_column.home": "Heime-tidslina di er tom! Følg fleire folk for å fylle ho med innhald. {suggestions}", + "empty_column.home": "Heime-tidslina di er tom! Fylg fleire folk for å fylla ho med innhald. {suggestions}.", "empty_column.list": "Det er ingenting i denne lista enno. Når medlemer av denne lista legg ut nye statusar, så dukkar dei opp her.", "empty_column.lists": "Du har ingen lister enno. Når du lagar ei, så dukkar ho opp her.", "empty_column.mutes": "Du har ikkje målbunde nokon enno.", "empty_column.notification_requests": "Ferdig! Her er det ingenting. Når du får nye varsel, kjem dei opp her slik du har valt.", "empty_column.notifications": "Du har ingen varsel enno. Kommuniser med andre for å starte samtalen.", - "empty_column.public": "Det er ingenting her! Skriv noko offentleg, eller følg brukarar frå andre tenarar manuelt for å fylle det opp", + "empty_column.public": "Det er ingenting her! Skriv noko offentleg, eller fylg brukarar frå andre tenarar manuelt for å få meir her", "error.unexpected_crash.explanation": "På grunn av eit nettlesarkompatibilitetsproblem eller ein feil i koden vår, kunne ikkje denne sida bli vist slik den skal.", "error.unexpected_crash.explanation_addons": "Denne sida kunne ikkje visast som den skulle. Feilen kjem truleg frå ei nettleserutviding eller frå automatiske omsetjingsverktøy.", "error.unexpected_crash.next_steps": "Prøv å lasta inn sida på nytt. Hjelper ikkje dette kan du framleis nytta Mastodon i ein annan nettlesar eller app.", @@ -315,7 +315,7 @@ "follow_suggestions.personalized_suggestion": "Personleg forslag", "follow_suggestions.popular_suggestion": "Populært forslag", "follow_suggestions.view_all": "Vis alle", - "follow_suggestions.who_to_follow": "Kven som skal følgjast", + "follow_suggestions.who_to_follow": "Kven du kan fylgja", "followed_tags": "Fylgde emneknaggar", "footer.about": "Om", "footer.directory": "Profilmappe", @@ -471,6 +471,8 @@ "notification.own_poll": "Rundspørjinga di er ferdig", "notification.poll": "Ei rundspørjing du har røysta i er ferdig", "notification.reblog": "{name} framheva innlegget ditt", + "notification.severedRelationships": "Forholda med {name} er brotne", + "notification.severed_relationships": "Forholda med {name} er brotne", "notification.status": "{name} la nettopp ut", "notification.update": "{name} redigerte eit innlegg", "notification_requests.accept": "Godkjenn", @@ -574,8 +576,8 @@ "privacy.change": "Endre personvernet på innlegg", "privacy.direct.long": "Alle nemnde i innlegget", "privacy.direct.short": "Spesifikke folk", - "privacy.private.long": "Berre dine følgjarar", - "privacy.private.short": "Følgjarar", + "privacy.private.long": "Berre dei som fylgjer deg", + "privacy.private.short": "Fylgjarar", "privacy.public.long": "Kven som helst på og av Mastodon", "privacy.public.short": "Offentleg", "privacy.unlisted.additional": "Dette er akkurat som offentleg, bortsett frå at innlegga ikkje dukkar opp i direktestraumar eller merkelappar, i oppdagingar eller Mastodon-søk, sjølv om du har sagt ja til at kontoen skal vera synleg.", @@ -587,6 +589,12 @@ "refresh": "Oppdater", "regeneration_indicator.label": "Lastar…", "regeneration_indicator.sublabel": "Heimetidslina di vert førebudd!", + "relationship_severance_notification.purged_data": "sletta av administratorar", + "relationship_severance_notification.relationships": "{count, plural, one {# forhold} other {# forhold}}", + "relationship_severance_notification.types.account_suspension": "Kontoen er utvist", + "relationship_severance_notification.types.domain_block": "Domenet er utestengt", + "relationship_severance_notification.types.user_domain_block": "Du blokkerte dette domenet", + "relationship_severance_notification.view": "Sjå", "relative_time.days": "{number}dg", "relative_time.full.days": "{number, plural, one {# dag} other {# dagar}} sidan", "relative_time.full.hours": "{number, plural, one {# time} other {# timar}} sidan", diff --git a/app/javascript/mastodon/locales/ry.json b/app/javascript/mastodon/locales/ry.json index 62772f4f22..67aad91005 100644 --- a/app/javascript/mastodon/locales/ry.json +++ b/app/javascript/mastodon/locales/ry.json @@ -35,11 +35,13 @@ "account.following": "Слідуєте", "account.follows.empty": "Сись хосновач щи никого не слідує.", "account.go_to_profile": "Перейти на профіл", + "account.hide_reblogs": "Спрятати друленя уд @{name}", "account.joined_short": "Датум прикапчованя", "account.languages": "Поміняти убрані языкы", "account.link_verified_on": "Властность сього удкликованя было звірено {date}", "account.media": "Медіа", "account.moved_to": "Хосновач {name} указав, ож новый профіл йим є:", + "account.mute": "Стишити {name}", "account.mute_notifications_short": "Стишити голошіня", "account.mute_short": "Стишити", "account.muted": "Стишено", @@ -52,8 +54,22 @@ "account.requested": "Чекат ся на пудтвердженя. Нажміт убы удмінити запрос на слідованя", "account.requested_follow": "Хосновач {name} просит ся пудписати ся на вас", "account.share": "Пошырити профіл хосновача {name}", + "account.show_reblogs": "Указати друленя уд {name}", "account.unblock": "Розблоковати {name}", "account.unblock_domain": "Розблоковати домен {domain}", + "account.unblock_short": "Розблоковати", + "account.unendorse": "Не указовати на профілови", + "account.unfollow": "Удписати ся", + "account.unmute_notifications_short": "Указовати голошіня", + "account.unmute_short": "Указовати", + "account_note.placeholder": "Клопкніт обы додати примітку", + "admin.dashboard.retention.cohort_size": "Нові хосновачі", + "admin.impact_report.instance_accounts": "Профілі из акаунтув, котрі ся удалят", + "admin.impact_report.instance_followers": "Пудписникы, котрых стратят наші хосновачі", + "admin.impact_report.instance_follows": "Пудписникы, котрых стратят їхні хосновачі", + "admin.impact_report.title": "Вплыв цілком", + "alert.rate_limited.message": "Попробуйте зась по {retry_time, time, medium}.", + "alert.rate_limited.title": "Частота обмежена", "bundle_column_error.return": "Вернути ся на головну", "bundle_column_error.routing.body": "Не можеме найти сяку сторунку. Бизувні сьте, ож URL у адресному шорикови є добрый?", "bundle_column_error.routing.title": "404", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index c2b1cede94..3387718aae 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -553,6 +553,7 @@ "refresh": "Obnoviť", "regeneration_indicator.label": "Načítavanie…", "regeneration_indicator.sublabel": "Váš domovský kanál sa pripravuje.", + "relationship_severance_notification.view": "Zobraziť", "relative_time.days": "{number} dní", "relative_time.full.days": "Pred {number, plural, one {# dňom} other {# dňami}}", "relative_time.full.hours": "Pred {number, plural, one {# hodinou} other {# hodinami}}", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index de22e98f07..b1923c7dd6 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -471,6 +471,8 @@ "notification.own_poll": "Vaša anketa je zaključena", "notification.poll": "Anketa, v kateri ste sodelovali, je zaključena", "notification.reblog": "{name} je izpostavila/a vašo objavo", + "notification.severedRelationships": "Veze z {name} prekinjene", + "notification.severed_relationships": "Veze z {name} prekinjene", "notification.status": "{name} je pravkar objavil/a", "notification.update": "{name} je uredil(a) objavo", "notification_requests.accept": "Sprejmi", @@ -516,7 +518,7 @@ "notifications.policy.filter_not_following_title": "Ljudje, ki jim ne sledite", "notifications.policy.filter_private_mentions_hint": "Filtrirano, razen če je odgovor na vašo lastno omembo ali če sledite pošiljatelju", "notifications.policy.filter_private_mentions_title": "Neželene zasebne omembe", - "notifications.policy.title": "Skrij obvestila od …", + "notifications.policy.title": "Filtriraj obvestila od …", "notifications_permission_banner.enable": "Omogoči obvestila na namizju", "notifications_permission_banner.how_to_control": "Če želite prejemati obvestila, ko Mastodon ni odprt, omogočite namizna obvestila. Natančno lahko nadzirate, katere vrste interakcij naj tvorijo namizna obvestila; ko so omogočena, za to uporabite gumb {icon} zgoraj.", "notifications_permission_banner.title": "Nikoli ne zamudite ničesar", @@ -587,6 +589,12 @@ "refresh": "Osveži", "regeneration_indicator.label": "Nalaganje …", "regeneration_indicator.sublabel": "Vaš domači vir se pripravlja!", + "relationship_severance_notification.purged_data": "očistili skrbniki", + "relationship_severance_notification.relationships": "{count, plural, one {# veza} two {# vezi} few {# veze} other {# vez}}", + "relationship_severance_notification.types.account_suspension": "Račun je bil suspendiran", + "relationship_severance_notification.types.domain_block": "Domena je bila suspendirana", + "relationship_severance_notification.types.user_domain_block": "Domeno ste blokirali", + "relationship_severance_notification.view": "Pogled", "relative_time.days": "{number} d", "relative_time.full.days": "{number, plural, one {pred # dnem} two {pred # dnevoma} few {pred # dnevi} other {pred # dnevi}}", "relative_time.full.hours": "{number, plural, one {pred # uro} two {pred # urama} few {pred # urami} other {pred # urami}}", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index dd8f4ad980..7f842c6bd8 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -584,6 +584,12 @@ "refresh": "Rifreskoje", "regeneration_indicator.label": "Po ngarkohet…", "regeneration_indicator.sublabel": "Prurja juaj vetjake po përgatitet!", + "relationship_severance_notification.purged_data": "spastruar nga përgjegjës", + "relationship_severance_notification.relationships": "{count, plural, one {# marrëdhënie} other {# marrëdhënie}}", + "relationship_severance_notification.types.account_suspension": "Llogaria është pezulluar", + "relationship_severance_notification.types.domain_block": "Përkatësia është pezulluar", + "relationship_severance_notification.types.user_domain_block": "E bllokuat këtë përkatësi", + "relationship_severance_notification.view": "Shiheni", "relative_time.days": "{number}d", "relative_time.full.days": "{number, plural, one {# ditë} other {# ditë}} më parë", "relative_time.full.hours": "{number, plural, one {# orë} other {# orë}} më parë", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index bb0d0b39e2..abc9c37758 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -89,6 +89,14 @@ "announcement.announcement": "Оголошення", "attachments_list.unprocessed": "(не оброблено)", "audio.hide": "Сховати аудіо", + "block_modal.remote_users_caveat": "Ми попросимо сервер {domain} поважати ваше рішення. Однак дотримання вимог не гарантується, оскільки деякі сервери можуть обробляти блоки по-різному. Загальнодоступні дописи все ще можуть бути видимими для користувачів, які не увійшли в систему.", + "block_modal.show_less": "Згорнути", + "block_modal.show_more": "Розгорнути", + "block_modal.they_cant_mention": "Вони не можуть згадувати та стежити за вами.", + "block_modal.they_cant_see_posts": "Вони не можуть бачити ваших дописів, а ви бачитимете їхні.", + "block_modal.they_will_know": "Вони можуть бачити, що вони заблоковані.", + "block_modal.title": "Заблокувати користувача?", + "block_modal.you_wont_see_mentions": "Ви не бачитимете дописів, де їх згадано.", "boost_modal.combo": "Ви можете натиснути {combo}, щоби пропустити це наступного разу", "bundle_column_error.copy_stacktrace": "Копіювати звіт про помилку", "bundle_column_error.error.body": "Неможливо показати запитану сторінку. Це може бути спричинено помилкою у нашому коді, або через проблему сумісності з браузером.", @@ -169,6 +177,7 @@ "confirmations.delete_list.message": "Ви впевнені, що хочете видалити цей список назавжди?", "confirmations.discard_edit_media.confirm": "Відкинути", "confirmations.discard_edit_media.message": "У вас є незбережені зміни в описі медіа або попереднього перегляду, все одно відкинути їх?", + "confirmations.domain_block.confirm": "Блокувати сервер", "confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати або приховати лише деяких користувачів. Ви не зможете бачити контент з цього домену у будь-яких стрічках або ваших сповіщеннях. Ваші підписники з цього домену будуть відписані від вас.", "confirmations.edit.confirm": "Змінити", "confirmations.edit.message": "Редагування перезапише повідомлення, яке ви зараз пишете. Ви впевнені, що хочете продовжити?", @@ -200,6 +209,16 @@ "dismissable_banner.explore_statuses": "Ці дописи з цього та інших серверів децентралізованої мережі зараз набирають популярності на цьому сервері. Новіші дописи з частішим поширенням та додаванням до вподобаного мають вищий рейтинг.", "dismissable_banner.explore_tags": "Ці хештеги зараз набирають популярності серед людей на цьому та інших серверах децентралізованої мережі. Хештеги, які використовуються більшою кількістю людей, мають вищий рейтинг.", "dismissable_banner.public_timeline": "Це найновіші загальнодоступні дописи від людей в соціальній мережі, на які підписані люди в {domain}.", + "domain_block_modal.block": "Блокувати сервер", + "domain_block_modal.block_account_instead": "Блокувати @{name} натомість", + "domain_block_modal.they_can_interact_with_old_posts": "Люди з цього сервера можуть взаємодіяти зі своїми старими дописами.", + "domain_block_modal.they_cant_follow": "Ніхто з цього сервера не може слідкувати за вами.", + "domain_block_modal.they_wont_know": "Вони не знають, що їх заблоковано.", + "domain_block_modal.title": "Заблокувати домен?", + "domain_block_modal.you_will_lose_followers": "Усіх ваших підписників з цього сервера буде вилучено.", + "domain_block_modal.you_wont_see_posts": "Ви не бачитимете дописів і сповіщень від користувачів на цьому сервері.", + "domain_pill.server": "Сервер", + "domain_pill.username": "Ім'я користувача", "embed.instructions": "Вбудуйте цей допис до вашого вебсайту, скопіювавши код нижче.", "embed.preview": "Ось який вигляд це матиме:", "emoji_button.activity": "Діяльність", @@ -397,6 +416,15 @@ "loading_indicator.label": "Завантаження…", "media_gallery.toggle_visible": "{number, plural, one {Приховати зображення} other {Приховати зображення}}", "moved_to_account_banner.text": "Ваш обліковий запис {disabledAccount} наразі вимкнений, оскільки вас перенесено до {movedToAccount}.", + "mute_modal.hide_from_notifications": "Сховати зі сповіщень", + "mute_modal.hide_options": "Сховати опції", + "mute_modal.indefinite": "Доки я не перестану ігнорувати їх", + "mute_modal.show_options": "Показати опції", + "mute_modal.they_can_mention_and_follow": "Вони зможуть згадувати та стежити за вами, але ви їх не бачитимете.", + "mute_modal.they_wont_know": "Вони не знатимуть, що їх ігнорують.", + "mute_modal.title": "Ігнорувати користувача?", + "mute_modal.you_wont_see_mentions": "Ви не бачитимете дописів, де їх згадано.", + "mute_modal.you_wont_see_posts": "Вони все ще можуть бачити ваші дописи, але ви не бачитимете їхніх.", "navigation_bar.about": "Про застосунок", "navigation_bar.advanced_interface": "Відкрити в розширеному вебінтерфейсі", "navigation_bar.blocks": "Заблоковані користувачі", @@ -432,6 +460,8 @@ "notification.own_poll": "Ваше опитування завершилося", "notification.poll": "Опитування, у якому ви голосували, скінчилося", "notification.reblog": "{name} поширює ваш допис", + "notification.severedRelationships": "Зв'язки з {name} розірвані", + "notification.severed_relationships": "Зв'язки з {name} розірвані", "notification.status": "{name} щойно дописує", "notification.update": "{name} змінює допис", "notification_requests.accept": "Прийняти", @@ -544,6 +574,12 @@ "refresh": "Оновити", "regeneration_indicator.label": "Завантаження…", "regeneration_indicator.sublabel": "Хвилинку, ми готуємо вашу стрічку!", + "relationship_severance_notification.purged_data": "очищено адміністраторами", + "relationship_severance_notification.relationships": "{count, plural, one {# зв'язок} few {# зв'язки} many {# зв'язків} other {# зв'язок}}", + "relationship_severance_notification.types.account_suspension": "Обліковий запис призупинено", + "relationship_severance_notification.types.domain_block": "Домен призупинено", + "relationship_severance_notification.types.user_domain_block": "Ви заблокували цей домен", + "relationship_severance_notification.view": "Вигляд", "relative_time.days": "{number}д", "relative_time.full.days": "{number, plural, one {# день} few {# дні} other {# днів}} тому", "relative_time.full.hours": "{number, plural, one {# година} few {# години} other {# годин}} тому", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 1a39dc235c..6ad7599060 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -471,6 +471,8 @@ "notification.own_poll": "你的投票已经结束", "notification.poll": "你参与的一个投票已经结束", "notification.reblog": "{name} 转发了你的嘟文", + "notification.severedRelationships": "与 {name} 的关系已被切断", + "notification.severed_relationships": "与 {name} 的关系已被切断", "notification.status": "{name} 刚刚发布嘟文", "notification.update": "{name} 编辑了嘟文", "notification_requests.accept": "接受", @@ -587,6 +589,12 @@ "refresh": "刷新", "regeneration_indicator.label": "加载中…", "regeneration_indicator.sublabel": "你的主页动态正在准备中!", + "relationship_severance_notification.purged_data": "被管理员清除", + "relationship_severance_notification.relationships": "{count, plural, other {# 条关系}}", + "relationship_severance_notification.types.account_suspension": "账户已被封禁", + "relationship_severance_notification.types.domain_block": "域名已被封禁", + "relationship_severance_notification.types.user_domain_block": "你屏蔽了这个域名", + "relationship_severance_notification.view": "查看", "relative_time.days": "{number} 天前", "relative_time.full.days": "{number, plural, one {# 天} other {# 天}}前", "relative_time.full.hours": "{number, plural, one {# 小时} other {# 小时}}前", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 30313d92f4..e352985811 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -471,6 +471,8 @@ "notification.own_poll": "您的投票已結束", "notification.poll": "您曾投過的投票已經結束", "notification.reblog": "{name} 已轉嘟您的嘟文", + "notification.severedRelationships": "已斷絕與 {name} 之服務關係", + "notification.severed_relationships": "已斷絕與 {name} 之服務關係", "notification.status": "{name} 剛剛嘟文", "notification.update": "{name} 已編輯嘟文", "notification_requests.accept": "接受", @@ -587,6 +589,12 @@ "refresh": "重新整理", "regeneration_indicator.label": "載入中…", "regeneration_indicator.sublabel": "您的首頁時間軸正在準備中!", + "relationship_severance_notification.purged_data": "已被管理員清除", + "relationship_severance_notification.relationships": "{count, plural, other {# 個服務關係}}", + "relationship_severance_notification.types.account_suspension": "該帳號已被停權", + "relationship_severance_notification.types.domain_block": "該網域已被停權", + "relationship_severance_notification.types.user_domain_block": "您已封鎖此網域", + "relationship_severance_notification.view": "檢視", "relative_time.days": "{number} 天", "relative_time.full.days": "{number, plural, other {# 天}}前", "relative_time.full.hours": "{number, plural, one {# 小時} other {# 小時}}前", diff --git a/config/locales/be.yml b/config/locales/be.yml index 0bdc3bb554..63f605e9fb 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1704,6 +1704,7 @@ be: import: Імпарт import_and_export: Імпарт і экспарт migrate: Перамяшчэнне ўліковага запісу + notifications: Email апавяшчэнні preferences: Налады profile: Профіль relationships: Падпіскі і падпісчыкі diff --git a/config/locales/bg.yml b/config/locales/bg.yml index feb4e74533..e888c2ea93 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1659,10 +1659,22 @@ bg: preferences: Предпочитания profile: Профил relationships: Последвания и последователи + severed_relationships: Прекъснати връзки statuses_cleanup: Автоматично изтриване на публикации strikes: Модериране на предупреждения two_factor_authentication: Двустепенно удостоверяване webauthn_authentication: Ключове за сигурност + severed_relationships: + download: Изтегляне (%{count}) + event_type: + account_suspension: Спиране на акаунта (%{target_name}) + domain_block: Спиране на сървъра (%{target_name}) + user_domain_block: Блокирахте %{target_name} + lost_followers: Загубени последователи + lost_follows: Загубени последвания + preamble: Може да загубите последванията и последователите, блокирайки домейн или когато модераторите ви решават да спрат отдалечен сървър. Случавайки се това, вие ще може да изтеглите списъците с прекъснати връзки, които да се проверят и възможно да се внесат на друг сървър. + purged: Сведенията за този сървър са били прочистени от администраторите на сървъра ви. + type: Събитие statuses: attached: audio: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 2523db0eb0..3601d5bd8b 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1659,10 +1659,22 @@ ca: preferences: Preferències profile: Perfil relationships: Seguits i seguidors + severed_relationships: Relacions eliminades statuses_cleanup: Esborrat automàtic de tuts strikes: Accions de mediació two_factor_authentication: Autenticació de dos factors webauthn_authentication: Claus de seguretat + severed_relationships: + download: Baixa (%{count}) + event_type: + account_suspension: Suspensió del compte (%{target_name}) + domain_block: Suspensió del servidor (%{target_name}) + user_domain_block: Heu blocat %{target_name} + lost_followers: Seguidors perduts + lost_follows: Seguiments perduts + preamble: Quan bloqueu un domini o els vostres moderadors decideixen suspendre un servidor remot, es poden perdre seguidors i seguiments. Si això passa, podeu baixar-vos la llista de relacions trencades per a revisar-la i, si voleu, importar-les a un altre servidor. + purged: Els administradors del vostre servidor han purgat la informació relativa a aquest servidor. + type: Esdeveniment statuses: attached: audio: diff --git a/config/locales/da.yml b/config/locales/da.yml index eda22d5b9c..63762f740c 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1659,10 +1659,21 @@ da: preferences: Præferencer profile: Offentlig profil relationships: Følger og følgere + severed_relationships: Afbrudte forhold statuses_cleanup: Auto-indlægssletning strikes: Moderationsadvarsler two_factor_authentication: Tofaktorgodkendelse webauthn_authentication: Sikkerhedsnøgler + severed_relationships: + download: Download (%{count}) + event_type: + account_suspension: Kontosuspendering (%{target_name}) + domain_block: Serversuspendering (%{target_name}) + user_domain_block: "%{target_name} blev blokeret" + lost_followers: Tabte følgere + preamble: Der kan mistes fulgte objekter og følgere, når et domæne blokeres eller moderatorerne beslutter at suspendere en ekstern server. Når det sker, kan der downloades lister over afbrudte relationer til inspektion og mulig import på anden server. + purged: Oplysninger om denne server er blevet renset af serveradministratoreren. + type: Begivenhed statuses: attached: audio: diff --git a/config/locales/devise.lv.yml b/config/locales/devise.lv.yml index 6746e813d8..94b4774b60 100644 --- a/config/locales/devise.lv.yml +++ b/config/locales/devise.lv.yml @@ -6,7 +6,7 @@ lv: send_instructions: Pēc dažām minūtēm saņemsi e-pastu ar norādījumiem, kā apstiprināt savu e-pasta adresi. Lūdzu, pārbaudi spama mapi, ja neesi saņēmis šo e-pastu. send_paranoid_instructions: Ja tava e-pasta adrese ir mūsu datu bāzē, pēc dažām minūtēm saņemsi e-pastu ar norādījumiem, kā apstiprināt savu e-pasta adresi. Lūdzu, pārbaudi spama mapi, ja neesi saņēmis šo e-pastu. failure: - already_authenticated: Jau esi pierakstījies. + already_authenticated: Tu jau esi pieteicies. inactive: Tavs konts vēl nav aktivizēts. invalid: Nederīga %{authentication_keys} vai parole. last_attempt: Tev ir vēl viens mēģinājums, pirms tavs konts tiks bloķēts. @@ -22,7 +22,7 @@ lv: action: Apstiprini savu e-pasta adresi action_with_app: Apstiprināt un atgriezties %{app} explanation: Ar šo e-pasta adresi esi izveidojis kontu vietnē %{host}. Tu esi viena klikšķa attālumā no tā aktivizēšanas. Ja tas nebiji tu, lūdzu, ignorē šo e-pasta ziņojumu. - explanation_when_pending: Tu pieteicies uzaicinājumam uz %{host} ar šo e-pasta adresi. Kad būsi apstiprinājis savu e-pasta adresi, mēs izskatīsim pieteikumu. Tu vari pierakstīties, lai mainītu savu informāciju vai dzēstu savu kontu, taču nevari piekļūt lielākajai daļai funkciju, kamēr tavs konts nav apstiprināts. Ja tavs pieteikums tiks noraidīts, tavi dati tiks noņemti, tāpēc tev nebūs jāveic nekādas darbības. Ja tas nebiji tu, lūdzu, ignorē šo e-pasta ziņojumu. + explanation_when_pending: Tu pieteicies uzaicinājumam uz %{host} ar šo e-pasta adresi. Kad būsi apstiprinājis savu e-pasta adresi, mēs izskatīsim pieteikumu. Tu vari pieteikties, lai mainītu savu informāciju vai izdzēstu savu kontu, taču Tu nevari piekļūt lielākajai daļai iespēju, kamēr Tavs konts nav apstiprināts. Ja Tavs pieteikums tiks noraidīts, Tavi dati tiks noņemti, tāpēc Tev nebūs jāveic nekādas darbības. Ja tas nebiji Tu, lūgums neņemt vērā šo e-pasta ziņojumu. extra_html: Lūdzu, pārskati arī servera noteikumus un mūsu pakalpojumu sniegšanas noteikumus. subject: 'Mastodon: Apstiprināšanas norādījumi %{instance}' title: Apstiprini savu e-pasta adresi @@ -90,7 +90,7 @@ lv: no_token: Tu nevari piekļūt šai lapai, ja neesi saņēmis paroles atiestatīšanas e-pasta ziņojumu. Ja ienāci no paroles atiestatīšanas e-pasta, lūdzu, pārliecinies, vai izmanto visu norādīto URL. send_instructions: Ja tava e-pasta adrese ir mūsu datu bāzē, pēc dažām minūtēm uz savu e-pasta adresi saņemsi paroles atkopšanas saiti. Lūdzu, pārbaudi spama mapi, ja neesi saņēmis šo e-pastu. send_paranoid_instructions: Ja tava e-pasta adrese ir mūsu datu bāzē, pēc dažām minūtēm uz savu e-pasta adresi saņemsi paroles atkopšanas saiti. Lūdzu, pārbaudi spama mapi, ja neesi saņēmis šo e-pastu. - updated: Tava parole ir veiksmīgi nomainīta. Tagad tu esi pierakstījies. + updated: Tava parole tika veiksmīgi nomainīta. Tu tagad esi pieteicies. updated_not_active: Tava parole ir veiksmīgi nomainīta. registrations: destroyed: Visu labu! Tavs konts ir veiksmīgi atcelts. Mēs ceram tevi drīz atkal redzēt. @@ -103,7 +103,7 @@ lv: updated: Tavs konts ir veiksmīgi atjaunināts. sessions: already_signed_out: Veiksmīgi izrakstījies. - signed_in: Veiksmīgi pierakstījies. + signed_in: Veiksmīgi pieteicies. signed_out: Veiksmīgi izrakstījies. unlocks: send_instructions: Pēc dažām minūtēm tu saņemsi e-pastu ar norādījumiem, kā atbloķēt savu kontu. Lūdzu, pārbaudi spama mapi, ja neesi saņēmis šo e-pastu. diff --git a/config/locales/devise.nn.yml b/config/locales/devise.nn.yml index 01d6e5a468..e9e8e1f6e0 100644 --- a/config/locales/devise.nn.yml +++ b/config/locales/devise.nn.yml @@ -66,11 +66,11 @@ nn: subject: 'Mastodon: Instruksjonar for å opne kontoen igjen' webauthn_credential: added: - explanation: Følgende sikkerhetsnøkkel har blitt lagt til i kontoen din + explanation: Denne tryggingsnykjelen er lagt til kontoen din subject: 'Mastodon: Ny sikkerheitsnøkkel' title: Ein ny sikkerheitsnøkkel har blitt lagt til deleted: - explanation: Den følgande sikkerheitsnøkkelen har blitt sletta frå kontoen din + explanation: Denne tryggingsnykjelen er sletta frå kontoen din subject: 'Mastodon: Sikkerheitsnøkkel sletta' title: Ein av sikkerheitsnøklane dine har blitt sletta webauthn_disabled: diff --git a/config/locales/doorkeeper.nl.yml b/config/locales/doorkeeper.nl.yml index 65e2bfcb7a..b3e6e79a1a 100644 --- a/config/locales/doorkeeper.nl.yml +++ b/config/locales/doorkeeper.nl.yml @@ -164,7 +164,7 @@ nl: admin:write:ip_blocks: moderatieacties op geblokkeerde IP-adressen uitvoeren admin:write:reports: moderatieacties op rapportages uitvoeren crypto: end-to-end-encryptie gebruiken - follow: relaties tussen accounts bewerken + follow: volgrelaties tussen accounts bewerken push: jouw pushmeldingen ontvangen read: alle gegevens van jouw account lezen read:accounts: informatie accounts bekijken diff --git a/config/locales/doorkeeper.zh-TW.yml b/config/locales/doorkeeper.zh-TW.yml index f9813b1319..f2250b79cb 100644 --- a/config/locales/doorkeeper.zh-TW.yml +++ b/config/locales/doorkeeper.zh-TW.yml @@ -130,7 +130,7 @@ zh-TW: favourites: 最愛 filters: 過濾器 follow: 跟隨、靜音與封鎖 - follows: 跟隨的使用者 + follows: 正在跟隨 lists: 列表 media: 多媒體附加檔案 mutes: 靜音 diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 6332911107..2e21c73279 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -597,6 +597,9 @@ es-AR: actions_description_html: Decidí qué medidas tomar para resolver esta denuncia. Si tomás una acción punitiva contra la cuenta denunciada, se le enviará a dicha cuenta una notificación por correo electrónico, excepto cuando se seleccione la categoría Spam. actions_description_remote_html: Decidí qué medidas tomar para resolver esta denuncia. Esto sólo afectará la forma en que tu servidor se comunica con esta cuenta remota y maneja su contenido. add_to_report: Agregar más a la denuncia + already_suspended_badges: + local: Ya suspendido en este servidor + remote: Ya suspendido en su servidor are_you_sure: "¿Estás seguro?" assign_to_self: Asignármela a mí assigned: Moderador asignado diff --git a/config/locales/es.yml b/config/locales/es.yml index 2f7877afed..22ee45d3bf 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -597,6 +597,9 @@ es: actions_description_html: Decide qué medidas tomar para resolver esta denuncia. Si tomas una acción punitiva contra la cuenta denunciada, se le enviará a dicha cuenta una notificación por correo electrónico, excepto cuando se seleccione la categoría Spam. actions_description_remote_html: Decide qué medidas tomar para resolver este informe. Esto solo afectará a la forma en que tu servidor se comunica con esta cuenta remota y gestiona su contenido. add_to_report: Añadir más al reporte + already_suspended_badges: + local: Ya suspendido en este servidor + remote: Ya suspendido en su servidor are_you_sure: "¿Estás seguro?" assign_to_self: Asignármela a mí assigned: Moderador asignado diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 4238e71c84..3e770b85c9 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -1663,10 +1663,22 @@ eu: preferences: Hobespenak profile: Profila relationships: Jarraitutakoak eta jarraitzaileak + severed_relationships: Indartutako erlazioak statuses_cleanup: Bidalketak automatikoki ezabatzea strikes: Moderazio neurriak two_factor_authentication: Bi faktoreetako autentifikazioa webauthn_authentication: Segurtasun gakoak + severed_relationships: + download: Deskargatu (%{count}) + event_type: + account_suspension: Kontua bertan behera uztea (%{target_name}) + domain_block: Domeinua bertan behera uztea (%{target_name}) + user_domain_block: "%{target_name} blokeatu duzu" + lost_followers: Galdutako jarraitzaileak + lost_follows: Jarraitzeari utzi diozun jendea + preamble: Jarraitzaileak gal ditzakezu, baita jendea jarraitzeari utzi domeinu bat blokeatzen duzunean edo moderatzaileek urruneko zerbitzari bat bertan behera uztea erabakitzen badute. Hau gertatzean, galdutako erlazioen zerrendak deskargatu ahalko dituzu, aztertzeko eta agian, beste zerbitzari batean inportatzeko. + purged: Zerbitzari honen informazioa kendu du zerbitzariko administratzaileak. + type: Gertaera statuses: attached: audio: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 0ba5931e5a..fe5956fd58 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1659,10 +1659,22 @@ fi: preferences: Ominaisuudet profile: Julkinen profiili relationships: Seuratut ja seuraajat + severed_relationships: Katkenneet suhteet statuses_cleanup: Autom. julkaisujen poisto strikes: Valvontavaroitukset two_factor_authentication: Kaksivaiheinen todennus webauthn_authentication: Suojausavaimet + severed_relationships: + download: Lataa (%{count}) + event_type: + account_suspension: Tilin jäädytys (%{target_name}) + domain_block: Palvelimen jäädytys (%{target_name}) + user_domain_block: Estit käyttäjän %{target_name} + lost_followers: Menetetyt seuraajat + lost_follows: Menetetyt seuratut + preamble: Voit menettää seurattusi ja seuraajasi, kun estät verkkotunnuksen tai kun valvojasi päättävät jäädyttää etäpalvelimen. Kun näin tapahtuu, voit ladata luetteloita katkenneista suhteista, jotta voit tarkastella niitä ja mahdollisesti viedä ne toiselle palvelimelle. + purged: Palvelimesi ylläpitäjät ovat tyhjentäneet tämän palvelimen tiedot. + type: Tapahtuma statuses: attached: audio: diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 49d206bbb9..1850c2a3b8 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1659,10 +1659,22 @@ fo: preferences: Stillingar profile: Vangi relationships: Fylging og fylgjarar + severed_relationships: Avbrotin tilknýti statuses_cleanup: Sjálvvirkandi striking av postum strikes: Umsjónaratsóknir two_factor_authentication: Váttan í tveimum stigum webauthn_authentication: Trygdarlyklar + severed_relationships: + download: Niðurtøkur (%{count}) + event_type: + account_suspension: Kontuógilding (%{target_name}) + domain_block: Ambætara-ógilding (%{target_name}) + user_domain_block: Tú hevur forðað %{target_name} + lost_followers: Mistir fylgjarar + lost_follows: Mist fylgi + preamble: Tá ið tú forðar einum økisnavni, ella tínir umsitarar velja at avgilda ein fjarambætara, kanst tú missa fylgi og fylgjarar. Um tað hendir, kanst tú taka ein lista av avbrotnum tilknýtum niður, sum tú kanst eftirhyggja og møguliga innflyta á ein nýggjan ambætara. + purged: Umsitararnir fyri tín ambætara hava tømt upplýsingar um henda ambætara úr skipanini. + type: Tiltak statuses: attached: audio: diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 381a0a8b40..d61c79aa56 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -621,6 +621,9 @@ gd: actions_description_html: Socraich dè a nì thu airson an gearan seo fhuasgladh. Ma chuireas tu peanas air a’ chunntas le gearan air, gheibh iad brath air a’ phost-d mura tagh thu an roinn-seòrsa Spama. actions_description_remote_html: Cuir romhad dè an gnìomh a ghabhas tu airson an gearan seo fhuasgladh. Cha bheir seo buaidh ach air mar a làimhsicheas am frithealaiche agadsa an cunntas cèin seo is mar a nì e conaltradh leis. add_to_report: Cuir barrachd ris a’ ghearan + already_suspended_badges: + local: Chaidh an cur à rèim air an fhrithealaiche seo mu thràth + remote: Chaidh an cur à rèim air an fhrithealaiche aca-san mu thràth are_you_sure: A bheil thu cinnteach? assign_to_self: Iomruin dhomh-sa assigned: Maor iomruinte @@ -1704,13 +1707,25 @@ gd: import: Ion-phortadh import_and_export: Ion-phortadh ⁊ às-phortadh migrate: Imrich cunntais + notifications: Brathan puist-d preferences: Roghainnean profile: Pròifil phoblach relationships: Dàimhean leantainn + severed_relationships: Dàimhean dealaichte statuses_cleanup: Sguabadh às phostaichean strikes: Rabhaidhean na maorsainneachd two_factor_authentication: Dearbhadh dà-cheumnach webauthn_authentication: Iuchraichean tèarainteachd + severed_relationships: + download: Luchdaich a-nuas (%{count}) + event_type: + account_suspension: Cunntas à rèim (%{target_name}) + domain_block: Frithealaiche à rèim (%{target_name}) + user_domain_block: Bhac thu %{target_name} + lost_followers: An luchd-leantainn a chaill thu + lost_follows: Daoine nach lean thu tuilleadh + purged: Chaidh am fiosrachadh mun fhrithealaiche seo a phurgaideachadh le rianairean an fhrithealaiche agad. + type: Tachartas statuses: attached: audio: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 7b0e72cfcd..4ea0a9652f 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1655,14 +1655,26 @@ hu: import: Importálás import_and_export: Import és export migrate: Fiók átirányítása - notifications: E-mail értesítések + notifications: E-mail-értesítések preferences: Beállítások profile: Profil relationships: Követések és követők + severed_relationships: Megszakított kapcsolatok statuses_cleanup: Bejegyzések automatikus törlése strikes: Moderációs felrótt vétségek two_factor_authentication: Kétlépcsős hitelesítés webauthn_authentication: Biztonsági kulcsok + severed_relationships: + download: Letöltés (%{count}) + event_type: + account_suspension: Fiók felfüggesztése (%{target_name}) + domain_block: Kiszolgáló felfüggesztése (%{target_name}) + user_domain_block: 'Blokkoltad ezt: %{target_name}' + lost_followers: Elvesztett követők + lost_follows: Elvesztett követések + preamble: Ha blokkolsz egy domaint, vagy ha a moderátorok úgy döntenek, hogy blokkolnak egy távoli kiszolgálót, akkor követőket és követéseket veszíthetsz. Amikor ez megtörténik, akkor letöltheted a megszakadt kapcsolatokat, hogy átvizsgáld őket, és esetleg egy másik kiszolgálón importáld őket. + purged: A kiszolgáló információit a kiszolgálód rendszergazdái véglegesen eltávolították. + type: Esemény statuses: attached: audio: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 82472788dc..c556c9e816 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1635,10 +1635,22 @@ ko: preferences: 환경설정 profile: 공개 프로필 relationships: 팔로잉과 팔로워 + severed_relationships: 단절된 관계들 statuses_cleanup: 게시물 자동 삭제 strikes: 중재 기록 two_factor_authentication: 2단계 인증 webauthn_authentication: 보안 키 + severed_relationships: + download: 다운로드 (%{count}) + event_type: + account_suspension: 계정 정지 (%{target_name}) + domain_block: 서버 정지 (%{target_name}) + user_domain_block: 내가 %{target_name}을 차단했습니다 + lost_followers: 잃은 팔로워 + lost_follows: 잃은 팔로우 + preamble: 내가 도메인을 차단하거나 중재진이 다른 서버를 정지하기로 결정했다면 내 팔로우와 팔로워를 잃게 됩니다. 그런 일이 일어났다면 그로 인해 단절된 관계들의 목록을 다운로드 받아 확인하고 다른 서버에서 불러올 수 있습니다. + purged: 이 서버에 대한 정보는 관리자에 의해 삭제되었습니다. + type: 이벤트 statuses: attached: audio: diff --git a/config/locales/lad.yml b/config/locales/lad.yml index 0f04ce8928..3aaac3ab5a 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -1655,6 +1655,7 @@ lad: import: Importo import_and_export: Importo i eksporto migrate: Migrasyon de kuento + notifications: Avizos por posta elektronika preferences: Preferensyas profile: Profil publiko relationships: Segidos i suivantes @@ -1662,6 +1663,9 @@ lad: strikes: Amonestamientos de moderasyon two_factor_authentication: Autentifikasyon en dos pasos webauthn_authentication: Yaves de sigurita + severed_relationships: + download: Abasha (%{count}) + type: Evenimiento statuses: attached: audio: @@ -1862,6 +1866,9 @@ lad: follows_subtitle: Sige kuentos konesidos follows_title: A ken segir follows_view_more: Ve mas personas para segir + hashtags_recent_count: + one: "%{people} persona en los ultimos 2 diyas" + other: "%{people} personas en los ultimos 2 diyas" hashtags_subtitle: Eksplora los trendes de los ultimos 2 diyas hashtags_title: Etiketas en trend hashtags_view_more: Ve mas etiketas en trend diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 481cd94f78..ee83954007 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -16,9 +16,9 @@ lv: instance_actor_flash: Šis konts ir virtuāls aktieris, ko izmanto, lai pārstāvētu pašu serveri, nevis atsevišķu lietotāju. To izmanto federācijas nolūkos, un to nevajadzētu apturēt. last_active: pēdējā aktivitāte link_verified_on: Šīs saites piederība tika pārbaudīta %{date} - nothing_here: Te nekā nav! + nothing_here: Šeit nekā nav. pin_errors: - following: Tev jau ir jāseko personai, kuru vēlies apstiprināt + following: Tev ir jāseko personai, kuru vēlies atbalstīt posts: one: Ziņa other: Ziņas @@ -575,7 +575,7 @@ lv: relays: add_new: Pievienot jaunu releju delete: Dzēst - description_html: "Federācijas relejs ir starpniekserveris, kas apmainās ar lielu publisko ziņu apjomu starp serveriem, kas to abonē un publicē. Tas var palīdzēt maziem un vidējiem serveriem atklāt saturu no federācijas, pretējā gadījumā vietējiem lietotājiem manuāli jāseko citām personām attālos serveros." + description_html: "Federācijas pārraidītājs ir starpniekserveris, kas apmainās ar lielu publisko ierakstu apjomu starp serveriem, kas to abonē un publicē tajā. Tas var palīdzēt maziem un vidējiem serveriem atklāt saturu fediversā, pretējā gadījumā vietējiem lietotājiem būtu pasrocīgi jāseko citiem cilvēkiem attālos serveros." disable: Atspējot disabled: Atspējots enable: Iespējot @@ -659,7 +659,7 @@ lv: actions: delete_html: Noņemt aizskarošās ziņas mark_as_sensitive_html: Atzīmēt aizskarošo ziņu multivides saturu kā sensitīvu - silence_html: Ievērojami ierobežojiet @%{acct} sasniedzamību, padarot viņa profilu un saturu redzamu tikai personām, kas jau seko viņiem vai manuāli meklē profilu + silence_html: Ievērojami ierobežo @%{acct} sasniedzamību, padarot viņa profilu un saturu redzamu tikai cilvēkiem, kas jau seko tam vai pašrocīgi uzmeklē profilu suspend_html: Apturēt @%{acct}, padarot viņu profilu un saturu nepieejamu un neiespējamu mijiedarbību ar close_report: 'Atzīmēt ziņojumu #%{id} kā atrisinātu' close_reports_html: Atzīmējiet visus pārskatus par @%{acct} kā atrisinātus @@ -902,9 +902,9 @@ lv: publishers: no_publisher_selected: Neviens publicētājs netika mainīts, jo neviens netika atlasīts shared_by_over_week: - one: Pēdējās nedēļas laikā kopīgoja viena persona + one: Pēdējās nedēļas laikā kopīgoja viens cilvēks other: Pēdējās nedēļas laikā kopīgoja %{count} cilvēki - zero: Pēdējās nedēļas laikā kopīgoja %{count} personas + zero: Pēdējās nedēļas laikā kopīgoja %{count} cilvēku title: Populārākās saites usage_comparison: Šodien kopīgots %{today} reizes, salīdzinot ar %{yesterday} vakar not_allowed_to_trend: Popularizešana nav atļauta @@ -944,7 +944,7 @@ lv: not_trendable: Neparādīsies pie tendencēm not_usable: Nevar tikt lietots peaked_on_and_decaying: Sasniedza maksimumu %{date}, tagad samazinās - title: Populārākie tēmturi + title: Izplatīti tēmturi trendable: Var parādīsies pie tendencēm trending_rank: 'Populārākie #%{rank}' usable: Var tikt lietots @@ -952,7 +952,7 @@ lv: used_by_over_week: one: Pēdējās nedēļas laikā izmantoja viens cilvēks other: Pēdējās nedēļas laikā izmantoja %{count} cilvēki - zero: Pēdējās nedēļas laikā izmantoja %{count} personas + zero: Pēdējās nedēļas laikā izmantoja %{count} cilvēku title: Tendences trending: Populārākie warning_presets: @@ -1015,7 +1015,7 @@ lv: new_trending_statuses: title: Populārākās ziņas new_trending_tags: - title: Populārākie tēmturi + title: Izplatīti tēmturi subject: Tiek pārskatītas jaunas tendences %{instance} aliases: add_new: Izveidot aizstājvārdu @@ -1040,7 +1040,7 @@ lv: salutation: "%{name}," settings: 'Mainīt e-pasta uztādījumus: %{link}' unsubscribe: Atcelt abonēšanu - view: 'Skatījums:' + view: 'Skatīt:' view_profile: Skatīt profilu view_status: Skatīt ziņu applications: @@ -1119,7 +1119,7 @@ lv: title: Pierakstīties %{domain} sign_up: manual_review: Reģistrācijas domēnā %{domain} manuāli pārbauda mūsu moderatori. Lai palīdzētu mums apstrādāt tavu reģistrāciju, uzraksti mazliet par sevi un to, kāpēc vēlies kontu %{domain}. - preamble: Izmantojot kontu šajā Mastodon serverī, tu varēsi sekot jebkurai citai personai tīklā neatkarīgi no tā, kur tiek mitināts viņas konts. + preamble: Ar kontu šajā Mastodon serverī varēsi sekot jebkuram citam tīklā esošam cilvēkam neatkarīgi no tā, kur tiek mitināts viņa konts. title: Atļauj tevi iestatīt %{domain}. status: account_status: Konta statuss @@ -1351,7 +1351,7 @@ lv: 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 importēt datus, kurus esi eksportējis no cita servera, piemēram, to personu sarakstu, kurām tu seko vai kuras bloķē. + 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: finished: Pabeigts @@ -1481,7 +1481,7 @@ lv: report: subject: "%{name} iesniedza ziņojumu" sign_up: - subject: "%{name} ir pierakstījies" + subject: "%{name} pierakstījās" favourite: body: 'Tavu ziņu izlasei pievienoja %{name}:' subject: "%{name} pievienoja tavu ziņu izlasei" @@ -1708,9 +1708,9 @@ lv: reblog: Izceltu ierakstu nevar piespraust poll: total_people: - one: "%{count} persona" + one: "%{count} cilvēks" other: "%{count} cilvēki" - zero: "%{count} personu" + zero: "%{count} cilvēku" total_votes: one: "%{count} balss" other: "%{count} balsis" @@ -1826,7 +1826,7 @@ lv: explanation: delete_statuses: Tika konstatēts, ka dažas no tavām ziņām pārkāpj vienu vai vairākas kopienas vadlīnijas, un rezultātā %{instance} moderatori tās noņēma. disable: Tu vairs nevari izmantot savu kontu, taču tavs profils un citi dati paliek neskarti. Tu vari pieprasīt savu datu dublējumu, mainīt konta iestatījumus vai dzēst kontu. - mark_statuses_as_sensitive: "%{instance} moderatori dažas no tavām ziņām ir atzīmējušas kā sensitīvas. Tas nozīmē, ka cilvēkiem būs jāpieskaras ziņās esošajai multividei, pirms tiek parādīts priekšskatījums. Tu arī pats vari atzīmēt mediju kā sensitīvu, kad tādu publicēsi turpmāk." + mark_statuses_as_sensitive: "%{instance} moderatori dažus no Taviem ierakstiem ir atzīmējuši kā jutīgus. Tas nozīmē, ka cilvēkiem būs jāpiesit ierakstos esošajiem informāijas nesējiem, pirms tiek attēlots priekšskatījums. Tu arī pats vari atzīmēt informācijas nesēju kā jutīgu, kad nākotnē tādu ievietosi." sensitive: No šī brīža visi augšupielādētie multivides faili tiks atzīmēti kā sensitīvi un paslēpti aiz klikšķa brīdinājuma. silence: Tu joprojām vari izmantot savu kontu, taču tikai tie cilvēki, kuri jau tev seko, redzēs tavas ziņas šajā serverī, un tev var tikt liegtas dažādas atklāšanas funkcijas. Tomēr citi joprojām var tev manuāli sekot. suspend: Tu vairs nevari izmantot savu kontu, un tavs profils un citi dati vairs nav pieejami. Tu joprojām vari pieteikties, lai pieprasītu savu datu dublēšanu, līdz dati tiks pilnībā noņemti aptuveni 30 dienu laikā, taču mēs saglabāsim dažus pamata datus, lai neļautu tev izvairīties no apturēšanas. @@ -1849,8 +1849,15 @@ lv: silence: Konts ierobežots suspend: Konts apturēts welcome: + edit_profile_action: Pielāgot + edit_profile_title: Pielāgo savu profilu explanation: Šeit ir daži padomi, kā sākt darbu feature_creativity: Mastodon nodrošina skaņas, video un attēlu ierakstus, pieejamības aprakstus, aptaujas, satura brīdinājumus, animētus profila attēlus, pielāgotas emocijzīmes, sīktēlu apgriešanas vadīklas un vēl, lai palīdzētu Tev sevi izpaust tiešsaistē. Vai Tu izplati savu mākslu, mūziku vai aplādes, Mastodon ir šeit ar Tevi. + follow_title: Pielāgo savu mājas barotni + hashtags_recent_count: + one: "%{people} cilvēks pēdējās 2 dienās" + other: "%{people} cilvēki pēdējās 2 dienās" + zero: "%{people} cilvēku pēdējās divās dienās" subject: Laipni lūgts Mastodon title: Laipni lūgts uz borta, %{name}! users: @@ -1859,11 +1866,11 @@ lv: invalid_otp_token: Nederīgs divfaktora kods otp_lost_help_html: Ja esi zaudējis piekļuvi abiem, tu vari sazināties ar %{email} seamless_external_login: Tu esi pieteicies, izmantojot ārēju pakalpojumu, tāpēc paroles un e-pasta iestatījumi nav pieejami. - signed_in_as: 'Pierakstījies kā:' + signed_in_as: 'Pieteicies kā:' verification: - extra_instructions_html: Padoms. saite tavā vietnē var būt neredzama. Svarīga daļa ir rel="me", kas novērš uzdošanos vietnēs ar lietotāju ģenerētu saturu. Tu vari pat lapas galvenē izmantot tagu link, nevis a, taču HTML ir jābūt pieejamam, neizpildot JavaScript. + extra_instructions_html: Padoms: saite Tavā vietnē var būt neredzama. Svarīga daļa ir rel="me", kas novērš uzdošanos vietnēs ar lietotāju izveidotu saturu. Tu pat vari lapas galvenē izmantot tagu link, nevis a, taču HTML ir jābūt pieejamam bez JavaScript izpildīšanas. here_is_how: Lūk, kā - hint_html: "Ikviens var apliecināt savu identitāti Mastodon. Pamatojoties uz atvērtiem tīmekļa standartiem, tagad un uz visiem laikiem bez maksas. Viss, kas tev nepieciešams, ir personīga vietne, pēc kuras cilvēki tevi atpazīst. Kad no sava profila izveidosi saiti uz šo vietni, mēs pārbaudīsim, vai vietne novirza atpakaļ uz tavu profilu, un tajā tiks parādīts vizuāls indikators." + hint_html: "Ikviens var apliecināt savu identitāti Mastodon. Balstīts uz atvērtiem tīmekļa standartiem, tagad un uz visiem laikiem bez maksas. Viss, kas Tev nepieciešams, ir personīga vietne, pēc kuras cilvēki Tevi atpazīst. Kad savā profilu sasaistīsi ar šo tīmekļvietni, mēs pārbaudīsim, vai tīmekļvietnei ir saite uz Tavu profilu, un tajā tiks parādīts redzama norāde." instructions_html: Ievieto starpliktuvē un ielīmē tālāk norādīto kodu savas tīmekļvietnes HTML! Tad pievieno savas tīmekļvietnes adresi vienā no papildu laukiem savā profila cilnē "Labot profilu" un saglabā izmaiņas! verification: Pārbaude verified_links: Tavas verifikācijas saites diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 561a0f0af8..91aabb1fa5 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -560,7 +560,7 @@ nl: no_ip_block_selected: Er zijn geen IP-regels veranderd, omdat er geen een was geselecteerd title: IP-regels relationships: - title: Relaties van %{acct} + title: Volgrelaties van %{acct} relays: add_new: Nieuwe relayserver toevoegen delete: Verwijderen @@ -1572,7 +1572,7 @@ nl: moved: Verhuisd mutual: Wederzijds primary: Primair - relationship: Relatie + relationship: Volgrelatie remove_selected_domains: Alle volgers van de geselecteerde domeinen verwijderen remove_selected_followers: Geselecteerde volgers verwijderen remove_selected_follows: Geselecteerde gebruikers ontvolgen @@ -1659,10 +1659,22 @@ nl: preferences: Voorkeuren profile: Openbaar profiel relationships: Volgers en gevolgde accounts + severed_relationships: Verbroken volgrelaties statuses_cleanup: Automatisch berichten verwijderen strikes: Vastgestelde overtredingen two_factor_authentication: Tweestapsverificatie webauthn_authentication: Beveiligingssleutels + severed_relationships: + download: Downloaden (%{count}) + event_type: + account_suspension: Accountschorsing (%{target_name}) + domain_block: Serverschorsing (%{target_name}) + user_domain_block: Je hebt %{target_name} geblokkeerd + lost_followers: Verloren volgers + lost_follows: Verloren gevolgde accounts + preamble: Je kan gevolgde accounts en volgers verliezen wanneer je een domein blokkeert of wanneer de moderators van jouw server beslissen om een externe server op te schorten. Wanneer dat gebeurt, kun je lijsten van verbroken volgrelaties downloaden, deze inspecteren en mogelijk importeren op een andere server. + purged: Informatie over deze server is verwijderd door de beheerders van jouw server. + type: Gebeurtenis statuses: attached: audio: diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 983dd01421..1470dc9fc0 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -391,7 +391,7 @@ nn: remove_all_data: Dette vil fjerna alt innhald, media og profildata for kontoar som tilhøyrer dette domenet frå din tenar. stop_communication: Tenaren din vil slutta å kommunisera med desse tenarane. title: Stadfest domeneblokkering for %{domain} - undo_relationships: Dette vil oppheve alle følgar-relasjonar mellom kontoane dine og kontoar på desse tenerane. + undo_relationships: Dette vil oppheve alle fylgjar-relasjonar mellom kontoane dine og kontoar på desse tenerane. created_msg: Domeneblokkering blir nå behandlet destroyed_msg: Domeneblokkering har nå blitt angret domain: Domene @@ -404,7 +404,7 @@ nn: create: Lag blokkering hint: Domeneblokkeringen vil ikke hindre opprettelse av kontooppføringer i databasen, men vil retroaktivt og automatisk benytte spesifikke moderasjonsmetoder på de kontoene. severity: - desc_html: "Målbind gjer kontoen sine postear usynlege for alle som ikkje følger den. Utvis fjernar alt innhald, media og profildata frå kontoen. Bruk Ingen viss du berre vil fjerne mediafiler." + desc_html: "Avgrens gjer innlegg frå kontoar på dette domenet usynlege for alle som ikkje fylgjer dei. Utvis fjernar alt innhald, media og profildata frå kontoar på dette domenet frå tenaren din. Bruk Ingen viss du berre vil avvisa mediafiler." noop: Ingen silence: Målbind suspend: Utvis @@ -499,8 +499,8 @@ nn: dashboard: instance_accounts_dimension: Mest fylgde kontoar instance_accounts_measure: lagrede kontoer - instance_followers_measure: våre følgere der - instance_follows_measure: deres følgere her + instance_followers_measure: fylgjarane våre der + instance_follows_measure: fylgjarane deira her instance_languages_dimension: Mest brukte språk instance_media_attachments_measure: lagrede mediavedlegg instance_reports_measure: rapporter om dem @@ -834,7 +834,7 @@ nn: sensitive: "%{name} markerte %{target} sin konto som ømtolig" silence: "%{name} begrenset %{target}s konto" suspend: "%{name} utviste %{target} sin konto" - appeal_approved: Klage tatt til følge + appeal_approved: Anka appeal_pending: Klage behandles appeal_rejected: Anken er avvist system_checks: @@ -1013,7 +1013,7 @@ nn: created_msg: Laga eit nytt kallenamn. No kan du setja i gang med flyttinga frå den gamle kontoen. deleted_msg: Fjerna kallenamnet. No vert det ikkje lenger mogeleg å flytta frå den andre kontoen til denne. empty: Du har inkje alias. - hint_html: Dersom du vil flytte fra en annen konto til den, kan du lage et alias her, som er påkrevd før du kan gå videre med å flytte følgere fra den gamle kontoen til den nye. Handlingen i seg selv er harmløs og reversibel. Kontoflyttingen har blitt satt i gang fra den gamle kontoen. + hint_html: Viss du vil flytta frå ein annan konto til denne, kan du laga eit alias her. Det treng du før du kan halda fram med å flytta fylgjarar frå den gamle kontoen til dnene. Denne handlinga er i seg sjølv harmlaus og kan angrast. Du har starta overføringa frå den gamle kontoen. remove: Fjern aliaslenking appearance: advanced_web_interface: Avansert nettgrensesnitt @@ -1110,7 +1110,7 @@ nn: title: Logg inn på %{domain} sign_up: manual_review: Når du lagar ein konto på %{domain}, vil moderatorane våre gå gjennom påmeldinga di manuelt. For å hjelpa oss med påmeldinga di, er det fint om du skriv litt om deg sjølv og kvifor du vil ha ein konto på %{domain}. - preamble: Med en konto på denne Mastodon-tjeneren vil du kunne følge andre personer på nettverket, uansett hvor kontoen deres holder til. + preamble: Med ein konto på denne Mastodon-tenaren kan du fylgja andre folk på nettverket, uansett kvar dei har brukarkontoen sin. title: La oss få deg satt i gang på %{domain}. status: account_status: Kontostatus @@ -1170,7 +1170,7 @@ nn: strikes: action_taken: Handling utført appeal: Klage - appeal_approved: Denne advarselens klage ble tatt til følge og er ikke lenger gyldig + appeal_approved: Denne handlinga er anka og er ikkje lenger gyldig appeal_rejected: Klagen ble avvist appeal_submitted_at: Klage levert appealed_msg: Din klage har blitt levert. Du får beskjed om den blir godkjent. @@ -1424,7 +1424,7 @@ nn: migrations: acct: Flytta til cancel: Avbryt omdirigeringen - cancel_explanation: Å avbryte omdirigeringen vil reaktivere din nåværende konto, men vil ikke bringe tilbake følgere som har blitt flyttet til den kontoen. + cancel_explanation: Viss du avbryt omdirigeringa, vil det ta i bruk at den noverande kontoen din, men det vil ikkje få tilbake fylgjarar som er flytte til den andre kontoen. cancelled_msg: Avbrøt omdirigeringen med suksess. errors: already_moved: er den same kontoen som du allereie har flytta til @@ -1435,7 +1435,7 @@ nn: followers_count: Fylgjarar då kontoen vart flytta incoming_migrations: Flyttar frå ein annan konto incoming_migrations_html: For å flytta frå ein annnan konto til denne må du fyrst laga eit kallenamn til kontoen. - moved_msg: Kontoen din omdirigeres nå til %{acct}, og følgerne dine blir flyttet over. + moved_msg: Kontoen din vidaresender no til %{acct}, og fylgjarane dine blir flytte over dit. not_redirecting: Kontoen din omdirigeres ikke til noen andre kontoer for øyeblikket. on_cooldown: Du har nylig overført kontoen din. Denne funksjonen blir tilgjengelig igjen om %{count} dager. past_migrations: Tidlegare vandringar @@ -1448,7 +1448,7 @@ nn: before: 'Før du fortsetter, vennligst les disse notisene nøye:' cooldown: Etter flytting er det en nedkjølingsperiode der du ikke vil kunne flytte igjen disabled_account: Din nåværende konto vil ikke være fullt brukbar etterpå. Men du vil ha tilgang til dataeksportering såvel som reaktivering. - followers: Denne handlingen vil flytte alle følgere fra den nåværende kontoen til den nye kontoen + followers: Denne handlinga flyttar alle fylgjarar frå denne kontoen til den nye only_redirect_html: Alternativt kan du velge å bare legge ut en omdirigering på profilen din. other_data: Inkje anna data flyttast av seg sjølve redirect: Profilen til din nåværende konto vil bli oppdatert med en omdirigeringsnotis og bli fjernet fra søk @@ -1564,7 +1564,7 @@ nn: dormant: I dvale follow_failure: Greidde ikkje fylgja alle kontoane du valde. follow_selected_followers: Følg valgte tilhengere - followers: Følgere + followers: Fylgjarar following: Følginger invited: Innboden last_active: Sist aktiv @@ -1659,10 +1659,22 @@ nn: preferences: Innstillingar profile: Profil relationships: Fylgjar og fylgjarar + severed_relationships: Brotne forhold statuses_cleanup: Automatisert sletting av innlegg strikes: Modereringsadvarsler two_factor_authentication: Tostegsautorisering webauthn_authentication: Sikkerhetsnøkler + severed_relationships: + download: Last ned (%{count}) + event_type: + account_suspension: Utestenging av konto (%{target_name}) + domain_block: Tenarutestenging (%{target_name}) + user_domain_block: Du blokkerte %{target_name} + lost_followers: Mista fylgjarar + lost_follows: Mista fylgjer + preamble: Du kan mista fylgjarar og folk du fylgjer når du blokkerer eit domene eller når moderatorar avgjer å utestenga ein annan tenar. Når det skjer, vil du kunne lasta ned ei liste over brotne forhold, slik at du kan sjå gjennom ho og kanskje importera ho på ein annan tenar. + purged: Informasjonen om denne tenaren er sletta av administratorane på tenaren din. + type: Hending statuses: attached: audio: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 1dc1482e20..89eec685d8 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1711,10 +1711,22 @@ pl: preferences: Preferencje profile: Profil relationships: Obserwowani i obserwujący + severed_relationships: Zerwane związki statuses_cleanup: Automatyczne usuwanie wpisów strikes: Ostrzeżenia moderacyjne two_factor_authentication: Uwierzytelnianie dwuetapowe webauthn_authentication: Klucze bezpieczeństwa + severed_relationships: + download: Pobierz (%{count}) + event_type: + account_suspension: Zawieszenie konta (%{target_name}) + domain_block: Zawieszenie serwera (%{target_name}) + user_domain_block: Zablokowano %{target_name} + lost_followers: Utraceni obserwujący + lost_follows: Utracone obserwowania + preamble: Możesz stracić obserwowania i obserwujących kiedy zablokujesz domenę albo kiedy twoi moderatorzy postanowią zawiesić obcy serwer. W tym wypadku będziesz móc pobrać listę zerwanych związków do przejrzenia i potencjalnego importu na innym serwerze. + purged: Informacje o tym serwerze zostały wyczyszczone przez administratora twojego serwera. + type: Zdarzenie statuses: attached: audio: diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 596fbe3e34..002761065d 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -6,7 +6,7 @@ lv: discoverable: Tavas publiskās ziņas un profils var tikt piedāvāti vai ieteikti dažādās Mastodon vietās, un tavs profils var tikt ieteikts citiem lietotājiem. display_name: Tavs pilnais vārds vai tavs joku vārds. fields: Tava mājas lapa, vietniekvārdi, vecums, viss, ko vēlies. - indexable: Tavas publiskās ziņas var tikt parādītas Mastodon meklēšanas rezultātos. Personas, kuras ir mijiedarbojušās ar tavām ziņām, var tās meklēt neatkarīgi no tā. + indexable: Tavi publiskie ieraksti var tikt parādīti Mastodon meklēšanas iznākumā. Cilvēki, kuri ir mijiedarbojušies ar Taviem ierakstiem, var tos meklēt neatkarīgi no tā. note: 'Tu vari @minēt citus cilvēkus vai #mirkļbirkas.' show_collections: Cilvēki varēs pārlūkot Tavus sekotājus un sekojamos. Cilvēki, kuriem Tu seko, redzēs, ka Tu seko viņiem neatkarīgi no tā. unlocked: Cilvēki varēs tev sekot, neprasot apstiprinājumu. Noņem atzīmi, ja vēlies pārskatīt sekošanas pieprasījumus un izvēlēties, pieņemt vai noraidīt jaunus sekotājus. @@ -44,7 +44,7 @@ lv: context: Viens vai vairāki konteksti, kur jāpiemēro filtrs current_password: Drošības nolūkos, lūdzu, ievadi pašreizējā konta paroli current_username: Lai apstiprinātu, lūdzu, ievadi pašreizējā konta paroli - digest: Sūta tikai pēc ilgstošas neaktivitātes un tikai tad, ja savas prombūtnes laikā neesi saņēmis personiskas ziņas + digest: Tiek nosūtīts tikai pēc ilgstošas bezdarbības un tikai tad, ja savas prombūtnes laikā esi saņēmis jebkādas personīgas ziņas email: Tev tiks nosūtīts apstiprinājuma e-pasts header: WEBP, PNG, GIF vai JPG. Ne vairāk kā %{size}. Tiks samazināts līdz %{dimensions}px inbox_url: Nokopē URL no tā releja sākumlapas, kuru vēlies izmantot diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 6b59677910..8c613e9589 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -1199,6 +1199,9 @@ sk: profile: Profil relationships: Sledovania a následovatelia two_factor_authentication: Dvojfázové overenie + severed_relationships: + lost_followers: Stratení nasledovatelia + lost_follows: Stratené sledovania statuses: attached: description: 'Priložené: %{attached}' diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 9498ca7898..6355d01924 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1711,10 +1711,22 @@ sl: preferences: Nastavitve profile: Profil relationships: Sledenja in sledilci + severed_relationships: Prekinjene veze statuses_cleanup: Samodejno brisanje objav strikes: Ukrepi morediranja two_factor_authentication: Dvofaktorsko overjanje webauthn_authentication: Varnostni ključi + severed_relationships: + download: Prejmi (%{count}) + event_type: + account_suspension: Suspendiranje računa (%{target_name}) + domain_block: Suspendiranje strežnika (%{target_name}) + user_domain_block: Blokirali ste %{target_name} + lost_followers: Izgubljeni sledilci + lost_follows: Izgubljena sledeni + preamble: Če blokirate domeno ali če se vaši moderatorji odločijo suspendirati oddaljen strežnik, lahko izgubite sledene in sledilce. Ko se to zgodi, boste lahko prejeli sezname prekinjenih vez za pregled in morebitno uvažanje na drugem strežniku. + purged: Podatke o tem strežniku so očistili skrbniki vašega strežnika. + type: Dogodek statuses: attached: audio: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index ce2c8b0f99..25286c00f5 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1659,6 +1659,13 @@ sq: strikes: Paralajmërime nga moderimi two_factor_authentication: Mirëfilltësim Dyfaktorësh webauthn_authentication: Kyçe sigurie + severed_relationships: + event_type: + account_suspension: Pezullim llogarie (%{target_name}) + domain_block: Pezullim shërbyesi (%{target_name}) + user_domain_block: Bllokuat %{target_name} + purged: Hollësitë rreth këtij shërbyesi janë spastuar nga përgjegjësit e shërbyesit tuaj. + type: Akt statuses: attached: audio: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 21ddeb5117..b02e9c5562 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1711,10 +1711,22 @@ uk: preferences: Налаштування profile: Загальнодоступний профіль relationships: Підписки та підписники + severed_relationships: Розірвані зв'язки statuses_cleanup: Автовидалення допису strikes: Попередження модераторів two_factor_authentication: Двофакторна автентифікація webauthn_authentication: Ключі безпеки + severed_relationships: + download: Завантажити (%{count}) + event_type: + account_suspension: Призупинення облікового запису (%{target_name}) + domain_block: Призупинення сервера (%{target_name}) + user_domain_block: Ви заблокували %{target_name} + lost_followers: Втрачені підписники + lost_follows: Втрачені підписки + preamble: Ви можете втратити підписки та підписників, коли ви блокуєте домен або коли модератори вирішують призупинити віддалений сервер. Коли це станеться, ви зможете завантажити списки розірваних зв'язків, які мають бути перевірені та, можливо, імпортовані на іншому сервері. + purged: Інформацію про цей сервер очищені адміністраторами вашого сервера. + type: Подія statuses: attached: audio: @@ -1911,8 +1923,41 @@ uk: apps_ios_action: Завантажити з App Store apps_step: Завантажити наші офіційні застосунки. apps_title: Застосунки Mastodon + checklist_subtitle: 'Розпочнімо у цій новій соціальній межі:' + checklist_title: Контрольний список привітання + edit_profile_action: Персоналізувати + edit_profile_step: Інші, ймовірно, швидше взаємодіятимуть з вами, якщо ви заповните профіль. + edit_profile_title: Персоналізуйте свій профіль explanation: Ось кілька порад для початку feature_action: Докладніше + feature_audience: Mastodon надає унікальну можливість керувати своєю аудиторією без посередників. Маючи сервер Mastodon, розгорнутий на власній інфраструктурі, його користувачі можуть взаємодіяти з будь-яким іншим сервером Mastodon, не віддаючи контроль у чужі руки. + feature_audience_title: Формуйте свою аудиторію з впевненістю + feature_control: Тільки ви знаєте, що саме хочете бачити на своєму сервері. Немає алгоритмів або реклами, що марнують ваш час. Слідкуйте за будь-яким сервером Mastodon з одного облікового запису та отримуйте повідомлення в хронологічному порядку, і зробіть ваш куточок інтернету трохи схожим на вас. + feature_control_title: Керуйте своєю стрічкою + feature_creativity: Mastodon підтримує дописи з аудіо, відео та зображеннями, опис для доступності, опитування, попередження про вміст, анімовані аватари, користувацькі емодзі, мініатюри, керування кадруванням мініатюр та багато іншого. Чи викладаєте ви своє мистецтво, чи музику або подкаст, Mastodon тут для вас. + feature_creativity_title: Необмежена творчість + feature_moderation: Mastodon повертає прийняття рішень у ваші руки. На відміну від соціальних мереж, що належать корпораціям, які спускають свої правила згори, кожен сервер Mastodon встановлює свої правила і норми, яких дотримуються на місцевому рівні, що робить їх найгнучкішими для задовільнення потреб різних груп людей. Приєднуйтесь до сервера з правилами, з якими ви згодні, або створіть свій власний. + feature_moderation_title: Модерація, якою вона має бути + follow_action: Підписатися + follow_step: Ви керуєте головною стрічкою. Заповнюйте її цікавими людьми. + follow_title: Персоналізуйте домашню стрічку + follows_subtitle: Стежте за відомими обліковими записами + follows_title: На кого підписатися + follows_view_more: Переглянути більше людей, щоб підписатися + hashtags_recent_count: + few: "%{people} особи за останні 2 дні" + many: "%{people} осіб за останні 2 дні" + one: "%{people} особа за останні 2 дні" + other: "%{people} особа за останні 2 дні" + hashtags_subtitle: Дізнавайтеся, що було популярним минулі 2 дні + hashtags_title: Популярні хештеги + hashtags_view_more: Переглянути більше популярних хештеґів + post_action: Створити + post_step: Привітайтеся зі світом, з текстом, світлинами, відео та опитуваннями. + post_title: Напишіть свій перший допис + share_action: Поділитися + share_step: Розкажіть друзям, як знайти вас на Mastodon. + share_title: Поділіться своїм профілем Mastodon sign_in_action: Увійти subject: Ласкаво просимо до Mastodon title: Ласкаво просимо, %{name}! diff --git a/config/locales/vi.yml b/config/locales/vi.yml index fc4ec80482..eaa913c8cd 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -585,6 +585,9 @@ vi: actions_description_html: Nếu áp đặt trừng phạt, một email thông báo sẽ được gửi cho người này, ngoại trừ Spam. actions_description_remote_html: Chọn hành động cần thực hiện để xử lý báo cáo này. Điều này sẽ chỉ ảnh hưởng đến cách máy chủ của bạn giao tiếp với tài khoản này và xử lý nội dung của nó. add_to_report: Bổ sung báo cáo + already_suspended_badges: + local: Đã vô hiệu hóa trên máy chủ này + remote: Đã vô hiệu hóa trên máy chủ khác are_you_sure: Bạn có chắc không? assign_to_self: Giao cho tôi assigned: Người xử lý @@ -1626,6 +1629,7 @@ vi: import: Nhập dữ liệu import_and_export: Dữ liệu migrate: Chuyển tài khoản sang máy chủ khác + notifications: Thông báo email preferences: Chung profile: Hồ sơ relationships: Quan hệ diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 29f9badb80..dcc99d7a91 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1633,10 +1633,22 @@ zh-CN: preferences: 首选项 profile: 个人资料 relationships: 关注管理 + severed_relationships: 已断开的关系 statuses_cleanup: 自动删除嘟文 strikes: 操作记录 two_factor_authentication: 双因素认证 webauthn_authentication: 安全密钥 + severed_relationships: + download: 下载 (%{count}) + event_type: + account_suspension: 账户被封禁 (%{target_name}) + domain_block: 服务器被封禁 (%{target_name}) + user_domain_block: 你屏蔽了 %{target_name} + lost_followers: 失去的关注者 + lost_follows: 失去的关注 + preamble: 当你屏蔽一个域名或你的管理员决定封禁一个外站服务器时,你可能会失去关注和粉丝。在这种情况下,你可以下载被切断的关系的列表,进行检查以便导入另一个服务器。 + purged: 关于此服务器的信息已被你所在服务器的管理员清除。 + type: 事件 statuses: attached: audio: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index b78c7d3319..e83001e7db 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1331,7 +1331,7 @@ zh-TW: muting: 正在匯入已靜音帳號 type: 匯入類型 type_groups: - constructive: 跟隨者與書籤 + constructive: 跟隨中與書籤 destructive: 封鎖與靜音 types: blocking: 您封鎖的使用者列表 @@ -1635,10 +1635,22 @@ zh-TW: preferences: 偏好設定 profile: 個人檔案 relationships: 跟隨中與跟隨者 + severed_relationships: 已斷絕服務關係 statuses_cleanup: 自動嘟文刪除 strikes: 管理警告 two_factor_authentication: 兩階段驗證 webauthn_authentication: 安全金鑰 + severed_relationships: + download: 下載 (%{count} 份) + event_type: + account_suspension: 停權帳號 (%{target_name}) + domain_block: 停權伺服器 (%{target_name}) + user_domain_block: 您已封鎖 %{target_name} + lost_followers: 失去之跟隨者 + lost_follows: 失去之跟隨中 + preamble: 當您封鎖網域或您的管理員決定停權遠端伺服器時,您可能失去跟隨中或跟隨者。當此發生時,您能下載斷絕服務關係之列表並於其他伺服器中檢視或匯入資料。 + purged: 關於此伺服器已被您的伺服器管理員清除之資訊 + type: 事件 statuses: attached: audio: From 885d0faf83d55f2f67ad76f7f34c51afcd72efe5 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 21 Mar 2024 11:06:21 +0100 Subject: [PATCH 271/954] Fix duplicate translation string for severed relationships (#29689) --- .../features/notifications/components/notification.jsx | 3 +-- app/javascript/mastodon/locales/en.json | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/javascript/mastodon/features/notifications/components/notification.jsx b/app/javascript/mastodon/features/notifications/components/notification.jsx index 1af1eb78d9..1e89f77d45 100644 --- a/app/javascript/mastodon/features/notifications/components/notification.jsx +++ b/app/javascript/mastodon/features/notifications/components/notification.jsx @@ -38,7 +38,6 @@ const messages = defineMessages({ reblog: { id: 'notification.reblog', defaultMessage: '{name} boosted your status' }, status: { id: 'notification.status', defaultMessage: '{name} just posted' }, update: { id: 'notification.update', defaultMessage: '{name} edited a post' }, - severedRelationships: { id: 'notification.severed_relationships', defaultMessage: 'Relationships with {name} severed' }, adminSignUp: { id: 'notification.admin.sign_up', defaultMessage: '{name} signed up' }, adminReport: { id: 'notification.admin.report', defaultMessage: '{name} reported {target}' }, }); @@ -375,7 +374,7 @@ class Notification extends ImmutablePureComponent { - +
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index ca69853366..efda92d213 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -471,7 +471,6 @@ "notification.own_poll": "Your poll has ended", "notification.poll": "A poll you have voted in has ended", "notification.reblog": "{name} boosted your post", - "notification.severedRelationships": "Relationships with {name} severed", "notification.severed_relationships": "Relationships with {name} severed", "notification.status": "{name} just posted", "notification.update": "{name} edited a post", From d13cdced1ed6e698d67d046ed26cbae33718dcf9 Mon Sep 17 00:00:00 2001 From: Nick Schonning Date: Thu, 21 Mar 2024 06:35:12 -0400 Subject: [PATCH 272/954] Add Renovate grouped updates for RSpec and RuboCop (#29621) --- .github/renovate.json5 | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/renovate.json5 b/.github/renovate.json5 index dab99829a1..e92608a437 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -125,6 +125,22 @@ ], groupName: null, // We dont want them to belong to any group }, + { + // Group all RuboCop packages with `rubocop` in the same PR + matchManagers: ['bundler'], + matchPackageNames: ['rubocop'], + matchPackagePrefixes: ['rubocop-'], + matchUpdateTypes: ['patch', 'minor'], + groupName: 'RuboCop (non-major)', + }, + { + // Group all RSpec packages with `rspec` in the same PR + matchManagers: ['bundler'], + matchPackageNames: ['rspec'], + matchPackagePrefixes: ['rspec-'], + matchUpdateTypes: ['patch', 'minor'], + groupName: 'RSpec (non-major)', + }, // Add labels depending on package manager { matchManagers: ['npm', 'nvm'], addLabels: ['javascript'] }, { matchManagers: ['bundler', 'ruby-version'], addLabels: ['ruby'] }, From 1feb228275e9e0fee69b58593ad97881deed40aa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 11:40:38 +0100 Subject: [PATCH 273/954] Update dependency express to v4.19.1 (#29663) 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 e8bb3c2eb9..90cc201dc6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6285,10 +6285,10 @@ __metadata: languageName: node linkType: hard -"cookie@npm:0.5.0": - version: 0.5.0 - resolution: "cookie@npm:0.5.0" - checksum: 10c0/c01ca3ef8d7b8187bae434434582288681273b5a9ed27521d4d7f9f7928fe0c920df0decd9f9d3bbd2d14ac432b8c8cf42b98b3bdd5bfe0e6edddeebebe8b61d +"cookie@npm:0.6.0": + version: 0.6.0 + resolution: "cookie@npm:0.6.0" + checksum: 10c0/f2318b31af7a31b4ddb4a678d024514df5e705f9be5909a192d7f116cfb6d45cbacf96a473fa733faa95050e7cff26e7832bb3ef94751592f1387b71c8956686 languageName: node linkType: hard @@ -8187,15 +8187,15 @@ __metadata: linkType: hard "express@npm:^4.17.1, express@npm:^4.18.2": - version: 4.18.3 - resolution: "express@npm:4.18.3" + version: 4.19.1 + resolution: "express@npm:4.19.1" dependencies: accepts: "npm:~1.3.8" array-flatten: "npm:1.1.1" body-parser: "npm:1.20.2" content-disposition: "npm:0.5.4" content-type: "npm:~1.0.4" - cookie: "npm:0.5.0" + cookie: "npm:0.6.0" cookie-signature: "npm:1.0.6" debug: "npm:2.6.9" depd: "npm:2.0.0" @@ -8221,7 +8221,7 @@ __metadata: type-is: "npm:~1.6.18" utils-merge: "npm:1.0.1" vary: "npm:~1.1.2" - checksum: 10c0/0b9eeafbac549e3c67d92d083bf1773e358359f41ad142b92121935c6348d29079b75054555b3f62de39263fffc8ba06898b09fdd3e213e28e714c03c5d9f44c + checksum: 10c0/1cf6d3c095131f0d730105fac23a713083604d4f3ad9364df53cade50662abcfee2f6f8a955fdf164a5ee63f09f457da0b70cbed435ad302fa6f14162a9757f9 languageName: node linkType: hard From a506b09de0725f5756c01e3a3747cbaf10608fb7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 11:41:47 +0100 Subject: [PATCH 274/954] Update dependency @reduxjs/toolkit to v2.2.2 (#29681) 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 90cc201dc6..7273817bb7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3005,8 +3005,8 @@ __metadata: linkType: hard "@reduxjs/toolkit@npm:^2.0.1": - version: 2.2.1 - resolution: "@reduxjs/toolkit@npm:2.2.1" + version: 2.2.2 + resolution: "@reduxjs/toolkit@npm:2.2.2" dependencies: immer: "npm:^10.0.3" redux: "npm:^5.0.1" @@ -3020,7 +3020,7 @@ __metadata: optional: true react-redux: optional: true - checksum: 10c0/675f816b311d6d703259e00c73977c9c5968e41b039d6d149e34e9084d5e6718aff3b692d2b7697974fb57a056687932117da1dd5202d392811d8d4e91d09322 + checksum: 10c0/d749181b1bc071698517cba7ce05c42ddfe99363019249722b4dfa3afc71b3a6e4cb9885af574cf81c5d6515f68201ebfedddb5c14b262c941a45112fdc66ce3 languageName: node linkType: hard From 2ec3fcaffef12f52cd8f9177bc95e889ea1f852b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 10:43:37 +0000 Subject: [PATCH 275/954] Update dependency rack to v2.2.9 (#29685) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 46e8eb1e66..3e3cd8dc09 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -535,7 +535,7 @@ GEM activesupport (>= 3.0.0) raabro (1.4.0) racc (1.7.3) - rack (2.2.8.1) + rack (2.2.9) rack-attack (6.7.0) rack (>= 1.0, < 4) rack-cors (2.0.2) From 1df00d4e76686a50da533a9217534cbb95e49097 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 10:46:14 +0000 Subject: [PATCH 276/954] Update dependency pino-pretty to v11 (#29662) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- streaming/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/streaming/package.json b/streaming/package.json index 6e183a181c..f90a1e4404 100644 --- a/streaming/package.json +++ b/streaming/package.json @@ -37,7 +37,7 @@ "@types/uuid": "^9.0.0", "@types/ws": "^8.5.9", "eslint-define-config": "^2.0.0", - "pino-pretty": "^10.3.1", + "pino-pretty": "^11.0.0", "typescript": "^5.0.4" }, "optionalDependencies": { diff --git a/yarn.lock b/yarn.lock index 7273817bb7..13ea8583d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2886,7 +2886,7 @@ __metadata: pg-connection-string: "npm:^2.6.0" pino: "npm:^8.17.2" pino-http: "npm:^9.0.0" - pino-pretty: "npm:^10.3.1" + pino-pretty: "npm:^11.0.0" prom-client: "npm:^15.0.0" typescript: "npm:^5.0.4" utf-8-validate: "npm:^6.0.3" @@ -12982,9 +12982,9 @@ __metadata: languageName: node linkType: hard -"pino-pretty@npm:^10.3.1": - version: 10.3.1 - resolution: "pino-pretty@npm:10.3.1" +"pino-pretty@npm:^11.0.0": + version: 11.0.0 + resolution: "pino-pretty@npm:11.0.0" dependencies: colorette: "npm:^2.0.7" dateformat: "npm:^4.6.3" @@ -13002,7 +13002,7 @@ __metadata: strip-json-comments: "npm:^3.1.1" bin: pino-pretty: bin.js - checksum: 10c0/6964fba5acc7a9f112e4c6738d602e123daf16cb5f6ddc56ab4b6bb05059f28876d51da8f72358cf1172e95fa12496b70465431a0836df693c462986d050686b + checksum: 10c0/d42213f3fdf19d92152b0a14683b2bb8443423739c81ab7c1181a5dac0e0ca7621d232c8264ece81edc01106ca2a8e165783daca0a902f0fde480027075d5540 languageName: node linkType: hard From 75f34b80a8b3913d81a71ac7dc237d23c990bb4a Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 21 Mar 2024 15:12:26 +0100 Subject: [PATCH 277/954] Clean up notification requests when deleting accounts (#29693) --- app/services/delete_account_service.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/services/delete_account_service.rb b/app/services/delete_account_service.rb index bdfe0e7167..328d8ae8f8 100644 --- a/app/services/delete_account_service.rb +++ b/app/services/delete_account_service.rb @@ -185,6 +185,7 @@ class DeleteAccountService < BaseService # polymorphically associated notifications generated by this account Notification.where(from_account: @account).in_batches.delete_all + NotificationRequest.where(from_account: @account).in_batches.delete_all end def purge_favourites! From a59f5694fec6131d9b3eefe9b24dd3813d2cf4d3 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 21 Mar 2024 10:12:50 -0400 Subject: [PATCH 278/954] =?UTF-8?q?Add=20empty=20line=20after=20=E2=9C=A8m?= =?UTF-8?q?agic=E2=9C=A8=20frozen=20string=20comment=20(#29696)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/initializers/application_controller_renderer.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb index f4556db399..6d56e43900 100644 --- a/config/initializers/application_controller_renderer.rb +++ b/config/initializers/application_controller_renderer.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + # Be sure to restart your server when you modify this file. # ActiveSupport::Reloader.to_prepare do From 814a48517fe820db9a606ba8274c104f002678d9 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 21 Mar 2024 17:46:38 +0100 Subject: [PATCH 279/954] Add some more tests for notification policies (#29698) --- .../api/v1/notifications/policies_spec.rb | 29 ++++++++++++++++--- .../api/v1/notifications/requests_spec.rb | 7 +---- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/spec/requests/api/v1/notifications/policies_spec.rb b/spec/requests/api/v1/notifications/policies_spec.rb index fe6bdbd973..9acd47a7b4 100644 --- a/spec/requests/api/v1/notifications/policies_spec.rb +++ b/spec/requests/api/v1/notifications/policies_spec.rb @@ -22,10 +22,20 @@ RSpec.describe 'Policies' do it_behaves_like 'forbidden for wrong scope', 'write write:notifications' context 'with no options' do - it 'returns http success', :aggregate_failures do + it 'returns json with expected attributes', :aggregate_failures do subject expect(response).to have_http_status(200) + expect(body_as_json).to include( + filter_not_following: false, + filter_not_followers: false, + filter_new_accounts: false, + filter_private_mentions: true, + summary: a_hash_including( + pending_requests_count: '1', + pending_notifications_count: '0' + ) + ) end end end @@ -35,14 +45,25 @@ RSpec.describe 'Policies' do put '/api/v1/notifications/policy', headers: headers, params: params end - let(:params) { {} } + let(:params) { { filter_not_following: true } } it_behaves_like 'forbidden for wrong scope', 'read read:notifications' - it 'returns http success' do - subject + it 'changes notification policy and returns an updated json object', :aggregate_failures do + expect { subject } + .to change { NotificationPolicy.find_or_initialize_by(account: user.account).filter_not_following }.from(false).to(true) expect(response).to have_http_status(200) + expect(body_as_json).to include( + filter_not_following: true, + filter_not_followers: false, + filter_new_accounts: false, + filter_private_mentions: true, + summary: a_hash_including( + pending_requests_count: '0', + pending_notifications_count: '0' + ) + ) end end end diff --git a/spec/requests/api/v1/notifications/requests_spec.rb b/spec/requests/api/v1/notifications/requests_spec.rb index 64675d562c..772402a6b5 100644 --- a/spec/requests/api/v1/notifications/requests_spec.rb +++ b/spec/requests/api/v1/notifications/requests_spec.rb @@ -82,15 +82,10 @@ RSpec.describe 'Requests' do it_behaves_like 'forbidden for wrong scope', 'read read:notifications' - it 'returns http success' do + it 'returns http success and dismisses the notification request', :aggregate_failures do subject expect(response).to have_http_status(200) - end - - it 'dismisses the notification request' do - subject - expect(notification_request.reload.dismissed?).to be true end From 05abefe989a12dd805193a59873e60d6b60d1297 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 18:39:27 +0100 Subject: [PATCH 280/954] Update RuboCop (non-major) to v1.62.1 (#29692) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3e3cd8dc09..54b6504e28 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -139,7 +139,7 @@ GEM erubi (~> 1.4) parser (>= 2.4) smart_properties - bigdecimal (3.1.6) + bigdecimal (3.1.7) bindata (2.4.15) binding_of_caller (1.0.0) debug_inspector (>= 0.0.1) @@ -225,8 +225,7 @@ GEM dotenv-rails (2.8.1) dotenv (= 2.8.1) railties (>= 3.2) - drb (2.2.0) - ruby2_keywords + drb (2.2.1) ed25519 (1.3.0) elasticsearch (7.13.3) elasticsearch-api (= 7.13.3) @@ -438,7 +437,7 @@ GEM mime-types-data (3.2023.1205) mini_mime (1.1.5) mini_portile2 (2.8.5) - minitest (5.21.2) + minitest (5.22.3) msgpack (1.7.2) multi_json (1.15.0) multipart-post (2.3.0) @@ -649,7 +648,7 @@ GEM rspec-mocks (~> 3.0) sidekiq (>= 5, < 8) rspec-support (3.13.1) - rubocop (1.60.2) + rubocop (1.62.1) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) @@ -657,24 +656,24 @@ GEM rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 1.8, < 3.0) rexml (>= 3.2.5, < 4.0) - rubocop-ast (>= 1.30.0, < 2.0) + rubocop-ast (>= 1.31.1, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.30.0) - parser (>= 3.2.1.0) + rubocop-ast (1.31.2) + parser (>= 3.3.0.4) rubocop-capybara (2.20.0) rubocop (~> 1.41) - rubocop-factory_bot (2.25.0) - rubocop (~> 1.33) + rubocop-factory_bot (2.25.1) + rubocop (~> 1.41) rubocop-performance (1.20.2) rubocop (>= 1.48.1, < 2.0) rubocop-ast (>= 1.30.0, < 2.0) - rubocop-rails (2.23.1) + rubocop-rails (2.24.0) activesupport (>= 4.2.0) rack (>= 1.1) rubocop (>= 1.33.0, < 2.0) - rubocop-ast (>= 1.30.0, < 2.0) - rubocop-rspec (2.26.1) + rubocop-ast (>= 1.31.1, < 2.0) + rubocop-rspec (2.27.1) rubocop (~> 1.40) rubocop-capybara (~> 2.17) rubocop-factory_bot (~> 2.22) From f5444c8fe4a913d67f8540cd0f5dff1ad5aae232 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 19:06:32 +0100 Subject: [PATCH 281/954] Update dependency rspec-rails to v6.1.2 (#29691) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 54b6504e28..715a02377e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -213,7 +213,7 @@ GEM devise_pam_authenticatable2 (9.2.0) devise (>= 4.0.0) rpam2 (~> 4.0) - diff-lcs (1.5.0) + diff-lcs (1.5.1) discard (1.3.0) activerecord (>= 4.2, < 8) docile (1.4.0) @@ -600,7 +600,7 @@ GEM link_header (~> 0.0, >= 0.0.8) rdf-normalize (0.7.0) rdf (~> 3.3) - rdoc (6.6.2) + rdoc (6.6.3.1) psych (>= 4.0.0) redcarpet (3.6.0) redis (4.8.1) @@ -634,14 +634,14 @@ GEM rspec-mocks (3.13.0) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (6.1.1) + rspec-rails (6.1.2) actionpack (>= 6.1) activesupport (>= 6.1) railties (>= 6.1) - rspec-core (~> 3.12) - rspec-expectations (~> 3.12) - rspec-mocks (~> 3.12) - rspec-support (~> 3.12) + rspec-core (~> 3.13) + rspec-expectations (~> 3.13) + rspec-mocks (~> 3.13) + rspec-support (~> 3.13) rspec-sidekiq (4.1.0) rspec-core (~> 3.0) rspec-expectations (~> 3.0) From 7f5e930bd2f92fcdd570f288647908f83c878632 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 18:09:26 +0000 Subject: [PATCH 282/954] Update dependency strong_migrations to v1.8.0 (#29556) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index c19a011538..35b9ee91db 100644 --- a/Gemfile +++ b/Gemfile @@ -90,7 +90,7 @@ gem 'sidekiq-bulk', '~> 0.2.0' gem 'simple-navigation', '~> 4.4' gem 'simple_form', '~> 5.2' gem 'stoplight', '~> 3.0.1' -gem 'strong_migrations', '1.7.0' +gem 'strong_migrations', '1.8.0' gem 'tty-prompt', '~> 0.23', require: false gem 'twitter-text', '~> 3.1.0' gem 'tzinfo-data', '~> 1.2023' diff --git a/Gemfile.lock b/Gemfile.lock index 715a02377e..2a64928c50 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -734,7 +734,7 @@ GEM stoplight (3.0.2) redlock (~> 1.0) stringio (3.1.0) - strong_migrations (1.7.0) + strong_migrations (1.8.0) activerecord (>= 5.2) swd (1.3.0) activesupport (>= 3) @@ -940,7 +940,7 @@ DEPENDENCIES simplecov-lcov (~> 0.8) stackprof stoplight (~> 3.0.1) - strong_migrations (= 1.7.0) + strong_migrations (= 1.8.0) test-prof thor (~> 1.2) tty-prompt (~> 0.23) From ec6d016da1fcf5830d5e10b30106969a9e6467d2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 19:09:45 +0100 Subject: [PATCH 283/954] Update dependency ox to v2.14.18 (#29701) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2a64928c50..17b7bfb4a0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -499,7 +499,7 @@ GEM openssl-signature_algorithm (1.3.0) openssl (> 2.0) orm_adapter (0.5.0) - ox (2.14.17) + ox (2.14.18) parallel (1.24.0) parser (3.3.0.5) ast (~> 2.4.1) From 142c018cfa5c6273b2f52b1fdb7dad76eb24fd81 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 21 Mar 2024 17:48:41 -0400 Subject: [PATCH 284/954] Add ruby 3.3 to CI test matrix (#29705) --- .github/workflows/test-ruby.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml index 7fd259ae01..624c3b7a2f 100644 --- a/.github/workflows/test-ruby.yml +++ b/.github/workflows/test-ruby.yml @@ -114,6 +114,7 @@ jobs: - '3.0' - '3.1' - '.ruby-version' + - '3.3' steps: - uses: actions/checkout@v4 @@ -189,6 +190,7 @@ jobs: - '3.0' - '3.1' - '.ruby-version' + - '3.3' steps: - uses: actions/checkout@v4 @@ -288,6 +290,7 @@ jobs: - '3.0' - '3.1' - '.ruby-version' + - '3.3' search-image: - docker.elastic.co/elasticsearch/elasticsearch:7.17.13 include: From 70a8fcf07d1ddf6621aadcda9d9a36e7dc646083 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 21 Mar 2024 22:52:29 +0100 Subject: [PATCH 285/954] Fix notification policy migration not preserving `filter_private_mentions` correctly (#29699) --- ..._migrate_interaction_settings_to_policy.rb | 4 +- ...te_interaction_settings_to_policy_again.rb | 54 +++++++++++++++++++ db/schema.rb | 2 +- lib/tasks/tests.rake | 9 +++- 4 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 db/post_migrate/20240321160706_migrate_interaction_settings_to_policy_again.rb diff --git a/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb b/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb index 0e9a42f8df..a0ce0a6638 100644 --- a/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb +++ b/db/migrate/20240304090449_migrate_interaction_settings_to_policy.rb @@ -36,8 +36,8 @@ class MigrateInteractionSettingsToPolicy < ActiveRecord::Migration[7.1] requires_new_policy = true end - if deserialized_settings['interactions.must_be_following_dm'] - policy.filter_private_mentions = true + unless deserialized_settings['interactions.must_be_following_dm'] + policy.filter_private_mentions = false requires_new_policy = true end diff --git a/db/post_migrate/20240321160706_migrate_interaction_settings_to_policy_again.rb b/db/post_migrate/20240321160706_migrate_interaction_settings_to_policy_again.rb new file mode 100644 index 0000000000..9baefa6775 --- /dev/null +++ b/db/post_migrate/20240321160706_migrate_interaction_settings_to_policy_again.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +class MigrateInteractionSettingsToPolicyAgain < ActiveRecord::Migration[7.1] + disable_ddl_transaction! + + # Dummy classes, to make migration possible across version changes + class Account < ApplicationRecord + has_one :user, inverse_of: :account + has_one :notification_policy, inverse_of: :account + end + + class User < ApplicationRecord + belongs_to :account + end + + class NotificationPolicy < ApplicationRecord + belongs_to :account + end + + def up + User.includes(account: :notification_policy).find_each do |user| + deserialized_settings = Oj.load(user.attributes_before_type_cast['settings']) + + next if deserialized_settings.nil? + + # If the user has configured a notification policy, don't override it + next if user.account.notification_policy.present? + + policy = user.account.build_notification_policy + requires_new_policy = false + + if deserialized_settings['interactions.must_be_follower'] + policy.filter_not_followers = true + requires_new_policy = true + end + + if deserialized_settings['interactions.must_be_following'] + policy.filter_not_following = true + requires_new_policy = true + end + + unless deserialized_settings['interactions.must_be_following_dm'] + policy.filter_private_mentions = false + requires_new_policy = true + end + + policy.save if requires_new_policy && policy.changed? + rescue ActiveRecord::RecordNotUnique + next + end + end + + def down; end +end diff --git a/db/schema.rb b/db/schema.rb index cd66ff750b..3456319158 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_03_20_163441) do +ActiveRecord::Schema[7.1].define(version: 2024_03_21_160706) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake index 935f6d24a3..6afc013ede 100644 --- a/lib/tasks/tests.rake +++ b/lib/tasks/tests.rake @@ -105,6 +105,12 @@ namespace :tests do exit(1) end + policy = NotificationPolicy.find_by(account: User.find(1).account) + unless policy.filter_private_mentions == false && policy.filter_not_following == true + puts 'Notification policy not migrated as expected' + exit(1) + end + puts 'No errors found. Database state is consistent with a successful migration process.' end @@ -181,7 +187,8 @@ namespace :tests do INSERT INTO "settings" (id, thing_type, thing_id, var, value, created_at, updated_at) VALUES - (5, 'User', 4, 'default_language', E'--- kmr\n', now(), now()); + (5, 'User', 4, 'default_language', E'--- kmr\n', now(), now()), + (6, 'User', 1, 'interactions', E'--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess\nmust_be_follower: false\nmust_be_following: true\nmust_be_following_dm: false\n', now(), now()); SQL end From 05eda8d19330a9c27c0cf07de19a87edff269057 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 21 Mar 2024 22:53:24 +0100 Subject: [PATCH 286/954] Remove severed relationship notifications for single account suspensions (#29700) --- app/services/suspend_account_service.rb | 18 ------------------ spec/services/suspend_account_service_spec.rb | 6 +----- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb index 86c4ff6416..8d5446f1a8 100644 --- a/app/services/suspend_account_service.rb +++ b/app/services/suspend_account_service.rb @@ -8,7 +8,6 @@ class SuspendAccountService < BaseService def call(account) return unless account.suspended? - @relationship_severance_event = nil @account = account reject_remote_follows! @@ -16,7 +15,6 @@ class SuspendAccountService < BaseService unmerge_from_home_timelines! unmerge_from_list_timelines! privatize_media_attachments! - notify_of_severed_relationships! end private @@ -38,8 +36,6 @@ class SuspendAccountService < BaseService [Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer)), follow.target_account_id, @account.inbox_url] end - relationship_severance_event.import_from_passive_follows!(follows) - follows.each(&:destroy) end end @@ -105,21 +101,7 @@ class SuspendAccountService < BaseService end end - def notify_of_severed_relationships! - return if @relationship_severance_event.nil? - - # TODO: check how efficient that query is, also check `push_bulk`/`perform_bulk` - @relationship_severance_event.affected_local_accounts.reorder(nil).find_each do |account| - event = AccountRelationshipSeveranceEvent.create!(account: account, relationship_severance_event: @relationship_severance_event) - LocalNotificationWorker.perform_async(account.id, event.id, 'AccountRelationshipSeveranceEvent', 'severed_relationships') - end - end - def signed_activity_json @signed_activity_json ||= Oj.dump(serialize_payload(@account, ActivityPub::UpdateSerializer, signer: @account)) end - - def relationship_severance_event - @relationship_severance_event ||= RelationshipSeveranceEvent.create!(type: :account_suspension, target_name: @account.acct) - end end diff --git a/spec/services/suspend_account_service_spec.rb b/spec/services/suspend_account_service_spec.rb index 74ef8f60e2..7c72a4776b 100644 --- a/spec/services/suspend_account_service_spec.rb +++ b/spec/services/suspend_account_service_spec.rb @@ -85,14 +85,10 @@ RSpec.describe SuspendAccountService, :sidekiq_inline do account.follow!(local_followee) end - it 'sends a Reject Follow activity, and records severed relationships', :aggregate_failures do + it 'sends a Reject Follow activity', :aggregate_failures do subject expect(a_request(:post, account.inbox_url).with { |req| match_reject_follow_request(req, account, local_followee) }).to have_been_made.once - - severed_relationships = local_followee.severed_relationships.to_a - expect(severed_relationships.count).to eq 1 - expect(severed_relationships.map { |rel| [rel.account, rel.target_account] }).to contain_exactly([account, local_followee]) end end end From ec1e770feaef81574482b841bc04a286f9dc7249 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Fri, 22 Mar 2024 12:59:35 +0100 Subject: [PATCH 287/954] Add the role ID to the badge component (#29707) --- app/javascript/mastodon/components/badge.jsx | 5 +++-- .../mastodon/features/account/components/header.jsx | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/javascript/mastodon/components/badge.jsx b/app/javascript/mastodon/components/badge.jsx index 646655c249..5e0b2587bd 100644 --- a/app/javascript/mastodon/components/badge.jsx +++ b/app/javascript/mastodon/components/badge.jsx @@ -7,8 +7,8 @@ import PersonIcon from '@/material-icons/400-24px/person.svg?react'; import SmartToyIcon from '@/material-icons/400-24px/smart_toy.svg?react'; -export const Badge = ({ icon, label, domain }) => ( -
+export const Badge = ({ icon, label, domain, roleId }) => ( +
{icon} {label} {domain && {domain}} @@ -19,6 +19,7 @@ Badge.propTypes = { icon: PropTypes.node, label: PropTypes.node, domain: PropTypes.node, + roleId: PropTypes.string }; Badge.defaultProps = { diff --git a/app/javascript/mastodon/features/account/components/header.jsx b/app/javascript/mastodon/features/account/components/header.jsx index ecb1108ded..e9d6071a21 100644 --- a/app/javascript/mastodon/features/account/components/header.jsx +++ b/app/javascript/mastodon/features/account/components/header.jsx @@ -408,7 +408,7 @@ class Header extends ImmutablePureComponent { } account.get('roles', []).forEach((role) => { - badges.push({role.get('name')}} domain={domain} />); + badges.push({role.get('name')}} domain={domain} roleId={role.get('id')} />); }); return ( From 8c1d29df7ee11c0d8c803c366b125badda8f4e1b Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 22 Mar 2024 10:43:35 -0400 Subject: [PATCH 288/954] Use `has_many through` instead of `delegate` for ARSE<>SR (#29672) --- app/models/account_relationship_severance_event.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/account_relationship_severance_event.rb b/app/models/account_relationship_severance_event.rb index 20b15e2839..697b06b74b 100644 --- a/app/models/account_relationship_severance_event.rb +++ b/app/models/account_relationship_severance_event.rb @@ -16,8 +16,9 @@ class AccountRelationshipSeveranceEvent < ApplicationRecord belongs_to :account belongs_to :relationship_severance_event - delegate :severed_relationships, - :type, + has_many :severed_relationships, through: :relationship_severance_event + + delegate :type, :target_name, :purged, :purged?, From 5db5fa879bd2f48f207567581458bad5a74ec004 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 15:50:03 +0100 Subject: [PATCH 289/954] New Crowdin Translations (automated) (#29708) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/bg.json | 1 - app/javascript/mastodon/locales/ca.json | 5 +- app/javascript/mastodon/locales/da.json | 1 - app/javascript/mastodon/locales/de.json | 7 +++ app/javascript/mastodon/locales/es-AR.json | 7 +++ app/javascript/mastodon/locales/eu.json | 1 - app/javascript/mastodon/locales/fi.json | 1 - app/javascript/mastodon/locales/fo.json | 1 - app/javascript/mastodon/locales/fr-CA.json | 63 ++++++++++++++++++++++ app/javascript/mastodon/locales/fr.json | 63 ++++++++++++++++++++++ app/javascript/mastodon/locales/gd.json | 6 +-- app/javascript/mastodon/locales/gl.json | 7 +++ app/javascript/mastodon/locales/he.json | 9 +++- app/javascript/mastodon/locales/hu.json | 1 - app/javascript/mastodon/locales/it.json | 46 ++++++++++++++++ app/javascript/mastodon/locales/ko.json | 1 - app/javascript/mastodon/locales/lad.json | 1 + app/javascript/mastodon/locales/nl.json | 1 - app/javascript/mastodon/locales/nn.json | 23 ++++---- app/javascript/mastodon/locales/sk.json | 2 + app/javascript/mastodon/locales/sl.json | 1 - app/javascript/mastodon/locales/sq.json | 1 + app/javascript/mastodon/locales/sv.json | 19 +++++++ app/javascript/mastodon/locales/tr.json | 7 +++ app/javascript/mastodon/locales/uk.json | 1 - app/javascript/mastodon/locales/vi.json | 7 +++ app/javascript/mastodon/locales/zh-CN.json | 1 - app/javascript/mastodon/locales/zh-TW.json | 1 - config/locales/ca.yml | 2 +- config/locales/de.yml | 12 +++++ config/locales/doorkeeper.nn.yml | 14 ++--- config/locales/es-AR.yml | 12 +++++ config/locales/fr-CA.yml | 19 +++++++ config/locales/fr.yml | 19 +++++++ config/locales/gd.yml | 1 + config/locales/gl.yml | 12 +++++ config/locales/he.yml | 13 +++++ config/locales/it.yml | 15 ++++++ config/locales/nn.yml | 48 ++++++++--------- config/locales/simple_form.fr-CA.yml | 2 + config/locales/simple_form.fr.yml | 2 + config/locales/simple_form.ko.yml | 2 +- config/locales/simple_form.nn.yml | 4 +- config/locales/simple_form.sv.yml | 1 + config/locales/sl.yml | 22 ++++---- config/locales/sq.yml | 3 ++ config/locales/sv.yml | 3 ++ config/locales/tr.yml | 12 +++++ config/locales/vi.yml | 12 +++++ 49 files changed, 438 insertions(+), 77 deletions(-) diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 9d972726b7..4670a6e2d6 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -471,7 +471,6 @@ "notification.own_poll": "Анкетата ви приключи", "notification.poll": "Анкета, в която гласувахте, приключи", "notification.reblog": "{name} подсили ваша публикация", - "notification.severedRelationships": "Връзката с {name} е прекъсната", "notification.severed_relationships": "Връзката с {name} е прекъсната", "notification.status": "{name} току-що публикува", "notification.update": "{name} промени публикация", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 3f1d7f858c..c95e8a9502 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -471,7 +471,6 @@ "notification.own_poll": "La teva enquesta ha finalitzat", "notification.poll": "Ha finalitzat una enquesta en què has votat", "notification.reblog": "{name} t'ha impulsat", - "notification.severedRelationships": "S'han eliminat les relacions amb {name}", "notification.severed_relationships": "S'han eliminat les relacions amb {name}", "notification.status": "{name} acaba de publicar", "notification.update": "{name} ha editat un tut", @@ -589,12 +588,12 @@ "refresh": "Actualitza", "regeneration_indicator.label": "Es carrega…", "regeneration_indicator.sublabel": "Es prepara la teva línia de temps d'Inici!", - "relationship_severance_notification.purged_data": "ho han purgat els administradors", + "relationship_severance_notification.purged_data": "purgat pels administradors", "relationship_severance_notification.relationships": "{count, plural, one {# relació} other {# relacions}}", "relationship_severance_notification.types.account_suspension": "S'ha suspès el compte", "relationship_severance_notification.types.domain_block": "S'ha suspès el domini", "relationship_severance_notification.types.user_domain_block": "Heu blocat aquest domini", - "relationship_severance_notification.view": "Veure", + "relationship_severance_notification.view": "Visualitza", "relative_time.days": "{number}d", "relative_time.full.days": "fa {number, plural, one {# dia} other {# dies}}", "relative_time.full.hours": "fa {number, plural, one {# hora} other {# hores}}", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index e00e23f9b8..ca32ba298a 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -469,7 +469,6 @@ "notification.own_poll": "Din afstemning er afsluttet", "notification.poll": "En afstemning, hvori du stemte, er slut", "notification.reblog": "{name} boostede dit indlæg", - "notification.severedRelationships": "Forhold med {name} afbrudt", "notification.status": "{name} har netop postet", "notification.update": "{name} redigerede et indlæg", "notification_requests.accept": "Acceptér", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index cb03e7ba3d..bed336f76b 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -471,6 +471,7 @@ "notification.own_poll": "Deine Umfrage ist beendet", "notification.poll": "Eine Umfrage, an der du teilgenommen hast, ist beendet", "notification.reblog": "{name} teilte deinen Beitrag", + "notification.severed_relationships": "Beziehungen zu {name} getrennt", "notification.status": "{name} hat gerade etwas gepostet", "notification.update": "{name} bearbeitete einen Beitrag", "notification_requests.accept": "Akzeptieren", @@ -587,6 +588,12 @@ "refresh": "Aktualisieren", "regeneration_indicator.label": "Wird geladen …", "regeneration_indicator.sublabel": "Deine Startseite wird gerade vorbereitet!", + "relationship_severance_notification.purged_data": "von Administrator*innen entfernt", + "relationship_severance_notification.relationships": "{count, plural, one {# Beziehung} other {# Beziehungen}}", + "relationship_severance_notification.types.account_suspension": "Konto wurde gesperrt", + "relationship_severance_notification.types.domain_block": "Domain wurde gesperrt", + "relationship_severance_notification.types.user_domain_block": "Du hast diese Domain blockiert", + "relationship_severance_notification.view": "Anzeigen", "relative_time.days": "{number} T.", "relative_time.full.days": "vor {number, plural, one {# Tag} other {# Tagen}}", "relative_time.full.hours": "vor {number, plural, one {# Stunde} other {# Stunden}}", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 53144cfcbf..fec707be62 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -471,6 +471,7 @@ "notification.own_poll": "Tu encuesta finalizó", "notification.poll": "Finalizó una encuesta en la que votaste", "notification.reblog": "{name} adhirió a tu mensaje", + "notification.severed_relationships": "Relaciones con {name} cortadas", "notification.status": "{name} acaba de enviar un mensaje", "notification.update": "{name} editó un mensaje", "notification_requests.accept": "Aceptar", @@ -587,6 +588,12 @@ "refresh": "Refrescar", "regeneration_indicator.label": "Cargando…", "regeneration_indicator.sublabel": "¡Se está preparando tu línea temporal principal!", + "relationship_severance_notification.purged_data": "purgada por administradores", + "relationship_severance_notification.relationships": "{count, plural, one {# relación} other {# relaciones}}", + "relationship_severance_notification.types.account_suspension": "La cuenta fue suspendida", + "relationship_severance_notification.types.domain_block": "El dominio fue suspendido", + "relationship_severance_notification.types.user_domain_block": "Bloqueaste este dominio", + "relationship_severance_notification.view": "Ver", "relative_time.days": "{number}d", "relative_time.full.days": "{number, plural,one {hace # día} other {hace # días}}", "relative_time.full.hours": "{number, plural,one {hace # hora} other {hace # horas}}", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 1a6338c2eb..bd0081d71a 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -471,7 +471,6 @@ "notification.own_poll": "Zure inkesta amaitu da", "notification.poll": "Zuk erantzun duzun inkesta bat bukatu da", "notification.reblog": "{name}(e)k bultzada eman dio zure bidalketari", - "notification.severedRelationships": "{name} erabiltzailearekin zenuen erlazioa galdu da", "notification.severed_relationships": "{name} erabiltzailearekin zenuen erlazioa galdu da", "notification.status": "{name} erabiltzaileak bidalketa egin berri du", "notification.update": "{name} erabiltzaileak bidalketa bat editatu du", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index b976b505d6..2cf85926fc 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -471,7 +471,6 @@ "notification.own_poll": "Äänestyksesi on päättynyt", "notification.poll": "Kysely, johon osallistuit, on päättynyt", "notification.reblog": "{name} tehosti julkaisuasi", - "notification.severedRelationships": "Suhteet palvelimeen {name} katkenneet", "notification.severed_relationships": "Suhteet palvelimeen {name} katkenneet", "notification.status": "{name} julkaisi juuri", "notification.update": "{name} muokkasi julkaisua", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 5d8cafcd16..3ea13cc7f0 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -471,7 +471,6 @@ "notification.own_poll": "Tín atkvøðugreiðsla er endað", "notification.poll": "Ein atkvøðugreiðsla, har tú hevur atkvøtt, er endað", "notification.reblog": "{name} lyfti tín post", - "notification.severedRelationships": "Tilknýti við {name} avbrotið", "notification.severed_relationships": "Tilknýti við {name} avbrotið", "notification.status": "{name} hevur júst postað", "notification.update": "{name} rættaði ein post", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 9549686d7c..1e1c78f29d 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -89,6 +89,14 @@ "announcement.announcement": "Annonce", "attachments_list.unprocessed": "(non traité)", "audio.hide": "Masquer l'audio", + "block_modal.remote_users_caveat": "Nous allons demander au serveur {domain} de respecter votre décision. Cependant, ce respect n'est pas garanti, car certains serveurs peuvent gérer différemment les blocages. Les messages publics peuvent rester visibles par les utilisateurs non connectés.", + "block_modal.show_less": "Afficher moins", + "block_modal.show_more": "Afficher plus", + "block_modal.they_cant_mention": "Il ne peut pas vous mentionner ou vous suivre.", + "block_modal.they_cant_see_posts": "Il peut toujours voir vos publications, mais vous ne verrez pas les siennes.", + "block_modal.they_will_know": "Il peut voir qu'il est bloqué.", + "block_modal.title": "Bloquer l'utilisateur ?", + "block_modal.you_wont_see_mentions": "Vous ne verrez pas les publications qui le mentionne.", "boost_modal.combo": "Vous pouvez appuyer sur {combo} pour sauter ceci la prochaine fois", "bundle_column_error.copy_stacktrace": "Copier le rapport d'erreur", "bundle_column_error.error.body": "La page demandée n'a pas pu être affichée. Cela pourrait être dû à un bogue dans notre code, ou à un problème de compatibilité avec le navigateur.", @@ -169,6 +177,7 @@ "confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste?", "confirmations.discard_edit_media.confirm": "Rejeter", "confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, voulez-vous quand même les supprimer?", + "confirmations.domain_block.confirm": "Bloquer le serveur", "confirmations.domain_block.message": "Voulez-vous vraiment, vraiment bloquer {domain} en entier? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans vos fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.", "confirmations.edit.confirm": "Éditer", "confirmations.edit.message": "Modifier maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?", @@ -200,6 +209,27 @@ "dismissable_banner.explore_statuses": "Voici des publications venant de tout le web social gagnant en popularité aujourd’hui. Les nouvelles publications avec plus de boosts et de favoris sont classés plus haut.", "dismissable_banner.explore_tags": "Ces hashtags sont présentement en train de gagner de l'ampleur parmi des personnes sur les serveurs du réseau décentralisé dont celui-ci.", "dismissable_banner.public_timeline": "Ce sont les messages publics les plus récents de personnes sur le web social que les gens de {domain} suivent.", + "domain_block_modal.block": "Bloquer le serveur", + "domain_block_modal.block_account_instead": "Bloquer @{name} à la place", + "domain_block_modal.they_can_interact_with_old_posts": "Les personnes de ce serveur peuvent interagir avec vos anciennes publications.", + "domain_block_modal.they_cant_follow": "Personne de ce serveur ne peut vous suivre.", + "domain_block_modal.they_wont_know": "Il ne saura pas qu'il a été bloqué.", + "domain_block_modal.title": "Bloquer le domaine ?", + "domain_block_modal.you_will_lose_followers": "Tous vos abonnés de ce serveur seront supprimés.", + "domain_block_modal.you_wont_see_posts": "Vous ne verrez plus les publications ou les notifications des utilisateurs de ce serveur.", + "domain_pill.activitypub_lets_connect": "Cela vous permet de vous connecter et d'interagir avec les autres non seulement sur Mastodon, mais également sur d'autres applications de réseaux sociaux.", + "domain_pill.activitypub_like_language": "ActivityPub est comme une langue que Mastodon utilise pour communiquer avec les autres réseaux sociaux.", + "domain_pill.server": "Serveur", + "domain_pill.their_handle": "Son identifiant :", + "domain_pill.their_server": "Son foyer numérique, là où tous ses posts résident.", + "domain_pill.their_username": "Son identifiant unique sur leur serveur. Il est possible de rencontrer des utilisateurs avec le même nom sur différents serveurs.", + "domain_pill.username": "Nom d’utilisateur", + "domain_pill.whats_in_a_handle": "Qu'est-ce qu'un identifiant ?", + "domain_pill.who_they_are": "Comme un identifiant contient le nom et le service hébergeant une personne, vous pouvez interagir sur .", + "domain_pill.who_you_are": "Comme un identifiant indique votre nom et le service vous hébergeant, vous pouvez interagir avec .", + "domain_pill.your_handle": "Votre identifiant :", + "domain_pill.your_server": "Votre foyer numérique, là où vos messages résident. Vous souhaitez changer ? Lancez un transfert vers un autre serveur quand vous le voulez et vos abonné·e·s suivront automatiquement.", + "domain_pill.your_username": "Votre identifiant unique sur ce serveur. Il est possible de trouver des utilisateurs ayant le même nom d'utilisateur sur différents serveurs.", "embed.instructions": "Intégrez cette publication à votre site en copiant le code ci-dessous.", "embed.preview": "Voici comment il apparaîtra:", "emoji_button.activity": "Activité", @@ -236,6 +266,7 @@ "empty_column.list": "Il n’y a rien dans cette liste pour l’instant. Quand des membres de cette liste publieront de nouvelles publications, elles apparaîtront ici.", "empty_column.lists": "Vous n’avez pas encore de liste. Lorsque vous en créerez une, elle apparaîtra ici.", "empty_column.mutes": "Vous n’avez masqué aucun compte pour le moment.", + "empty_column.notification_requests": "C'est fini ! Il n'y a plus rien ici. Lorsque vous recevez de nouvelles notifications, elles apparaitront ici conformément à vos préférences.", "empty_column.notifications": "Vous n'avez pas encore de notifications. Quand d'autres personnes interagissent avec vous, vous en verrez ici.", "empty_column.public": "Il n’y a rien ici! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres serveurs pour remplir le fil public", "error.unexpected_crash.explanation": "En raison d’un bogue dans notre code ou d’un problème de compatibilité avec votre navigateur, cette page n’a pas pu être affichée correctement.", @@ -396,6 +427,15 @@ "loading_indicator.label": "Chargement…", "media_gallery.toggle_visible": "{number, plural, one {Cacher l’image} other {Cacher les images}}", "moved_to_account_banner.text": "Votre compte {disabledAccount} est actuellement désactivé parce que vous avez déménagé sur {movedToAccount}.", + "mute_modal.hide_from_notifications": "Cacher des notifications", + "mute_modal.hide_options": "Masquer les options", + "mute_modal.indefinite": "Jusqu'à ce que je les réactive", + "mute_modal.show_options": "Afficher les options", + "mute_modal.they_can_mention_and_follow": "Ils peuvent vous mentionner et vous suivre, mais vous ne les verrez pas.", + "mute_modal.they_wont_know": "Ils ne sauront pas qu'ils ont été rendus silencieux.", + "mute_modal.title": "Rendre cet utilisateur silencieux ?", + "mute_modal.you_wont_see_mentions": "Vous ne verrez pas les publications qui le mentionne.", + "mute_modal.you_wont_see_posts": "Il peut toujours voir vos publications, mais vous ne verrez pas les siennes.", "navigation_bar.about": "À propos", "navigation_bar.advanced_interface": "Ouvrir dans l’interface avancée", "navigation_bar.blocks": "Comptes bloqués", @@ -431,8 +471,13 @@ "notification.own_poll": "Votre sondage est terminé", "notification.poll": "Un sondage auquel vous avez participé est terminé", "notification.reblog": "{name} a boosté votre message", + "notification.severed_relationships": "Relation avec {name} rompues", "notification.status": "{name} vient de publier", "notification.update": "{name} a modifié une publication", + "notification_requests.accept": "Accepter", + "notification_requests.dismiss": "Rejeter", + "notification_requests.notifications_from": "Notifications de {name}", + "notification_requests.title": "Notifications filtrées", "notifications.clear": "Effacer notifications", "notifications.clear_confirmation": "Voulez-vous vraiment effacer toutes vos notifications?", "notifications.column_settings.admin.report": "Nouveaux signalements:", @@ -464,6 +509,15 @@ "notifications.permission_denied": "Les notifications de bureau ne sont pas disponibles en raison d'une demande de permission de navigateur précédemment refusée", "notifications.permission_denied_alert": "Les notifications de bureau ne peuvent pas être activées, car l’autorisation du navigateur a précedemment été refusée", "notifications.permission_required": "Les notifications de bureau ne sont pas disponibles car l’autorisation requise n’a pas été accordée.", + "notifications.policy.filter_new_accounts.hint": "Créés au cours des derniers {days, plural, one {un jour} other {# jours}}", + "notifications.policy.filter_new_accounts_title": "Nouveaux comptes", + "notifications.policy.filter_not_followers_hint": "Incluant les personnes qui vous suivent depuis moins de {days, plural, one {un jour} other {# jours}}", + "notifications.policy.filter_not_followers_title": "Personnes qui ne vous suivent pas", + "notifications.policy.filter_not_following_hint": "Jusqu'à ce que vous les validiez manuellement", + "notifications.policy.filter_not_following_title": "Personnes que vous ne suivez pas", + "notifications.policy.filter_private_mentions_hint": "Filtré sauf si c'est en réponse à une mention de vous ou si vous suivez l'expéditeur", + "notifications.policy.filter_private_mentions_title": "Mentions privées non sollicitées", + "notifications.policy.title": "Filtrer les notifications de…", "notifications_permission_banner.enable": "Activer les notifications de bureau", "notifications_permission_banner.how_to_control": "Pour recevoir des notifications lorsque Mastodon n’est pas ouvert, activez les notifications de bureau. Vous pouvez contrôler précisément quels types d’interactions génèrent des notifications de bureau via le bouton {icon} ci-dessus une fois qu’elles sont activées.", "notifications_permission_banner.title": "Ne rien rater", @@ -534,6 +588,12 @@ "refresh": "Actualiser", "regeneration_indicator.label": "Chargement…", "regeneration_indicator.sublabel": "Votre fil d'accueil est en cours de préparation!", + "relationship_severance_notification.purged_data": "supprimées par les administrateurs", + "relationship_severance_notification.relationships": "{count, plural, one {# relation} other {# relations}}", + "relationship_severance_notification.types.account_suspension": "Le compte a été suspendu", + "relationship_severance_notification.types.domain_block": "Le domaine a été suspendu", + "relationship_severance_notification.types.user_domain_block": "Vous avez bloqué ce domaine", + "relationship_severance_notification.view": "Afficher", "relative_time.days": "{number} j", "relative_time.full.days": "il y a {number, plural, one {# jour} other {# jours}}", "relative_time.full.hours": "il y a {number, plural, one {# heure} other {# heures}}", @@ -640,9 +700,11 @@ "status.direct": "Mention privée @{name}", "status.direct_indicator": "Mention privée", "status.edit": "Modifier", + "status.edited": "Dernière modification le {date}", "status.edited_x_times": "Modifiée {count, plural, one {{count} fois} other {{count} fois}}", "status.embed": "Intégrer", "status.favourite": "Ajouter aux favoris", + "status.favourites": "{count, plural, one {favori} other {favoris}}", "status.filter": "Filtrer cette publication", "status.filtered": "Filtrée", "status.hide": "Masquer le message", @@ -663,6 +725,7 @@ "status.reblog": "Booster", "status.reblog_private": "Booster avec visibilité originale", "status.reblogged_by": "{name} a boosté", + "status.reblogs": "{count, plural, one {boost} other {boosts}}", "status.reblogs.empty": "Personne n’a encore boosté cette publication. Lorsque quelqu’un le fera, elle apparaîtra ici.", "status.redraft": "Supprimer et réécrire", "status.remove_bookmark": "Retirer des signets", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 29b4d56a4f..af5ed66bd8 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -89,6 +89,14 @@ "announcement.announcement": "Annonce", "attachments_list.unprocessed": "(non traité)", "audio.hide": "Masquer l'audio", + "block_modal.remote_users_caveat": "Nous allons demander au serveur {domain} de respecter votre décision. Cependant, ce respect n'est pas garanti, car certains serveurs peuvent gérer différemment les blocages. Les messages publics peuvent rester visibles par les utilisateurs non connectés.", + "block_modal.show_less": "Afficher moins", + "block_modal.show_more": "Afficher plus", + "block_modal.they_cant_mention": "Il ne peut pas vous mentionner ou vous suivre.", + "block_modal.they_cant_see_posts": "Il peut toujours voir vos publications, mais vous ne verrez pas les siennes.", + "block_modal.they_will_know": "Il peut voir qu'il est bloqué.", + "block_modal.title": "Bloquer l'utilisateur ?", + "block_modal.you_wont_see_mentions": "Vous ne verrez pas les publications qui le mentionne.", "boost_modal.combo": "Vous pouvez appuyer sur {combo} pour passer ceci la prochaine fois", "bundle_column_error.copy_stacktrace": "Copier le rapport d'erreur", "bundle_column_error.error.body": "La page demandée n'a pas pu être affichée. Cela peut être dû à un bogue dans notre code, ou à un problème de compatibilité avec le navigateur.", @@ -169,6 +177,7 @@ "confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste ?", "confirmations.discard_edit_media.confirm": "Rejeter", "confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, les supprimer quand même ?", + "confirmations.domain_block.confirm": "Bloquer le serveur", "confirmations.domain_block.message": "Voulez-vous vraiment, vraiment bloquer {domain} en entier ? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans vos fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.", "confirmations.edit.confirm": "Modifier", "confirmations.edit.message": "Modifier maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?", @@ -200,6 +209,27 @@ "dismissable_banner.explore_statuses": "Ces messages venant de tout le web social gagnent en popularité aujourd’hui. Les nouveaux messages avec plus de boosts et de favoris sont classés plus haut.", "dismissable_banner.explore_tags": "Ces hashtags sont actuellement en train de gagner de l'ampleur parmi les personnes sur les serveurs du réseau décentralisé dont celui-ci.", "dismissable_banner.public_timeline": "Ce sont les posts publics les plus récents de personnes sur le web social que les gens sur {domain} suivent.", + "domain_block_modal.block": "Bloquer le serveur", + "domain_block_modal.block_account_instead": "Bloquer @{name} à la place", + "domain_block_modal.they_can_interact_with_old_posts": "Les personnes de ce serveur peuvent interagir avec vos anciennes publications.", + "domain_block_modal.they_cant_follow": "Personne de ce serveur ne peut vous suivre.", + "domain_block_modal.they_wont_know": "Il ne saura pas qu'il a été bloqué.", + "domain_block_modal.title": "Bloquer le domaine ?", + "domain_block_modal.you_will_lose_followers": "Tous vos abonnés de ce serveur seront supprimés.", + "domain_block_modal.you_wont_see_posts": "Vous ne verrez plus les publications ou les notifications des utilisateurs de ce serveur.", + "domain_pill.activitypub_lets_connect": "Cela vous permet de vous connecter et d'interagir avec les autres non seulement sur Mastodon, mais également sur d'autres applications de réseaux sociaux.", + "domain_pill.activitypub_like_language": "ActivityPub est comme une langue que Mastodon utilise pour communiquer avec les autres réseaux sociaux.", + "domain_pill.server": "Serveur", + "domain_pill.their_handle": "Son identifiant :", + "domain_pill.their_server": "Son foyer numérique, là où tous ses posts résident.", + "domain_pill.their_username": "Son identifiant unique sur leur serveur. Il est possible de rencontrer des utilisateurs avec le même nom sur différents serveurs.", + "domain_pill.username": "Nom d’utilisateur", + "domain_pill.whats_in_a_handle": "Qu'est-ce qu'un identifiant ?", + "domain_pill.who_they_are": "Comme un identifiant contient le nom et le service hébergeant une personne, vous pouvez interagir sur .", + "domain_pill.who_you_are": "Comme un identifiant indique votre nom et le service vous hébergeant, vous pouvez interagir avec .", + "domain_pill.your_handle": "Votre identifiant :", + "domain_pill.your_server": "Votre foyer numérique, là où vos messages résident. Vous souhaitez changer ? Lancez un transfert vers un autre serveur quand vous le voulez et vos abonné·e·s suivront automatiquement.", + "domain_pill.your_username": "Votre identifiant unique sur ce serveur. Il est possible de trouver des utilisateurs ayant le même nom d'utilisateur sur différents serveurs.", "embed.instructions": "Intégrez ce message à votre site en copiant le code ci-dessous.", "embed.preview": "Il apparaîtra comme cela :", "emoji_button.activity": "Activités", @@ -236,6 +266,7 @@ "empty_column.list": "Il n’y a rien dans cette liste pour l’instant. Quand des membres de cette liste publieront de nouveaux messages, ils apparaîtront ici.", "empty_column.lists": "Vous n’avez pas encore de liste. Lorsque vous en créerez une, elle apparaîtra ici.", "empty_column.mutes": "Vous n’avez masqué aucun compte pour le moment.", + "empty_column.notification_requests": "C'est fini ! Il n'y a plus rien ici. Lorsque vous recevez de nouvelles notifications, elles apparaitront ici conformément à vos préférences.", "empty_column.notifications": "Vous n’avez pas encore de notification. Interagissez avec d’autres personnes pour débuter la conversation.", "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres serveurs pour remplir le fil public", "error.unexpected_crash.explanation": "En raison d’un bug dans notre code ou d’un problème de compatibilité avec votre navigateur, cette page n’a pas pu être affichée correctement.", @@ -396,6 +427,15 @@ "loading_indicator.label": "Chargement…", "media_gallery.toggle_visible": "{number, plural, one {Cacher l’image} other {Cacher les images}}", "moved_to_account_banner.text": "Votre compte {disabledAccount} est actuellement désactivé parce que vous l'avez déplacé à {movedToAccount}.", + "mute_modal.hide_from_notifications": "Cacher des notifications", + "mute_modal.hide_options": "Masquer les options", + "mute_modal.indefinite": "Jusqu'à ce que je les réactive", + "mute_modal.show_options": "Afficher les options", + "mute_modal.they_can_mention_and_follow": "Ils peuvent vous mentionner et vous suivre, mais vous ne les verrez pas.", + "mute_modal.they_wont_know": "Ils ne sauront pas qu'ils ont été rendus silencieux.", + "mute_modal.title": "Rendre cet utilisateur silencieux ?", + "mute_modal.you_wont_see_mentions": "Vous ne verrez pas les publications qui le mentionne.", + "mute_modal.you_wont_see_posts": "Il peut toujours voir vos publications, mais vous ne verrez pas les siennes.", "navigation_bar.about": "À propos", "navigation_bar.advanced_interface": "Ouvrir dans l’interface avancée", "navigation_bar.blocks": "Comptes bloqués", @@ -431,8 +471,13 @@ "notification.own_poll": "Votre sondage est terminé", "notification.poll": "Un sondage auquel vous avez participé vient de se terminer", "notification.reblog": "{name} a partagé votre message", + "notification.severed_relationships": "Relation avec {name} rompues", "notification.status": "{name} vient de publier", "notification.update": "{name} a modifié un message", + "notification_requests.accept": "Accepter", + "notification_requests.dismiss": "Rejeter", + "notification_requests.notifications_from": "Notifications de {name}", + "notification_requests.title": "Notifications filtrées", "notifications.clear": "Effacer les notifications", "notifications.clear_confirmation": "Voulez-vous vraiment effacer toutes vos notifications ?", "notifications.column_settings.admin.report": "Nouveaux signalements :", @@ -464,6 +509,15 @@ "notifications.permission_denied": "Impossible d’activer les notifications de bureau car l’autorisation a été refusée.", "notifications.permission_denied_alert": "Les notifications de bureau ne peuvent pas être activées, car l’autorisation du navigateur a été refusée avant", "notifications.permission_required": "Les notifications de bureau ne sont pas disponibles car l’autorisation requise n’a pas été accordée.", + "notifications.policy.filter_new_accounts.hint": "Créés au cours des derniers {days, plural, one {un jour} other {# jours}}", + "notifications.policy.filter_new_accounts_title": "Nouveaux comptes", + "notifications.policy.filter_not_followers_hint": "Incluant les personnes qui vous suivent depuis moins de {days, plural, one {un jour} other {# jours}}", + "notifications.policy.filter_not_followers_title": "Personnes qui ne vous suivent pas", + "notifications.policy.filter_not_following_hint": "Jusqu'à ce que vous les validiez manuellement", + "notifications.policy.filter_not_following_title": "Personnes que vous ne suivez pas", + "notifications.policy.filter_private_mentions_hint": "Filtré sauf si c'est en réponse à une mention de vous ou si vous suivez l'expéditeur", + "notifications.policy.filter_private_mentions_title": "Mentions privées non sollicitées", + "notifications.policy.title": "Filtrer les notifications de…", "notifications_permission_banner.enable": "Activer les notifications de bureau", "notifications_permission_banner.how_to_control": "Pour recevoir des notifications lorsque Mastodon n’est pas ouvert, activez les notifications du bureau. Vous pouvez contrôler précisément quels types d’interactions génèrent des notifications de bureau via le bouton {icon} ci-dessus une fois qu’elles sont activées.", "notifications_permission_banner.title": "Toujours au courant", @@ -534,6 +588,12 @@ "refresh": "Actualiser", "regeneration_indicator.label": "Chargement…", "regeneration_indicator.sublabel": "Votre fil principal est en cours de préparation !", + "relationship_severance_notification.purged_data": "supprimées par les administrateurs", + "relationship_severance_notification.relationships": "{count, plural, one {# relation} other {# relations}}", + "relationship_severance_notification.types.account_suspension": "Le compte a été suspendu", + "relationship_severance_notification.types.domain_block": "Le domaine a été suspendu", + "relationship_severance_notification.types.user_domain_block": "Vous avez bloqué ce domaine", + "relationship_severance_notification.view": "Afficher", "relative_time.days": "{number} j", "relative_time.full.days": "il y a {number, plural, one {# jour} other {# jours}}", "relative_time.full.hours": "il y a {number, plural, one {# heure} other {# heures}}", @@ -640,9 +700,11 @@ "status.direct": "Mention privée @{name}", "status.direct_indicator": "Mention privée", "status.edit": "Modifier", + "status.edited": "Dernière modification le {date}", "status.edited_x_times": "Modifié {count, plural, one {{count} fois} other {{count} fois}}", "status.embed": "Intégrer", "status.favourite": "Ajouter aux favoris", + "status.favourites": "{count, plural, one {favori} other {favoris}}", "status.filter": "Filtrer ce message", "status.filtered": "Filtré", "status.hide": "Masquer le message", @@ -663,6 +725,7 @@ "status.reblog": "Partager", "status.reblog_private": "Partager à l’audience originale", "status.reblogged_by": "{name} a partagé", + "status.reblogs": "{count, plural, one {boost} other {boosts}}", "status.reblogs.empty": "Personne n’a encore partagé ce message. Lorsque quelqu’un le fera, il apparaîtra ici.", "status.redraft": "Supprimer et réécrire", "status.remove_bookmark": "Retirer des marque-pages", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 4696d50eac..9c566909a7 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -471,7 +471,6 @@ "notification.own_poll": "Thàinig an cunntas-bheachd agad gu crìoch", "notification.poll": "Thàinig cunntas-bheachd sa bhòt thu gu crìoch", "notification.reblog": "Bhrosnaich {name} am post agad", - "notification.severedRelationships": "Chaidh na dàimhean le {name} a dhealachadh", "notification.severed_relationships": "Chaidh na dàimhean le {name} a dhealachadh", "notification.status": "Phostaich {name} rud", "notification.update": "Dheasaich {name} post", @@ -510,9 +509,9 @@ "notifications.permission_denied": "Chan eil brathan deasga ri fhaighinn on a chaidh iarrtas ceadan a’ bhrabhsair a dhiùltadh cheana", "notifications.permission_denied_alert": "Cha ghabh brathan deasga a chur an comas on a chaidh iarrtas ceadan a’ bhrabhsair a dhiùltadh cheana", "notifications.permission_required": "Chan eil brathan deasga ri fhaighinn on nach deach an cead riatanach a thoirt seachad.", - "notifications.policy.filter_new_accounts.hint": "Chaidh a chruthachadh o chionn {count, plural, one {# latha} two {# latha} few {# làithean} other {# latha}}", + "notifications.policy.filter_new_accounts.hint": "Chaidh a chruthachadh o chionn {days, plural, one {# latha} two {# latha} few {# làithean} other {# latha}}", "notifications.policy.filter_new_accounts_title": "Cunntasan ùra", - "notifications.policy.filter_not_followers_hint": "A’ gabhail a-staigh an fheadhainn a lean ort nas lugha na {count, plural, one {# latha} two {# latha} few {# làithean} other {# latha}} seo chaidh", + "notifications.policy.filter_not_followers_hint": "A’ gabhail a-staigh an fheadhainn a lean ort nas lugha na {days, plural, one {# latha} two {# latha} few {# làithean} other {# latha}} seo chaidh", "notifications.policy.filter_not_followers_title": "Daoine nach eil gad leantainn", "notifications.policy.filter_not_following_hint": "Gus an aontaich thu riutha a làimh", "notifications.policy.filter_not_following_title": "Daoine nach eil thu a’ leantainn", @@ -590,6 +589,7 @@ "regeneration_indicator.label": "’Ga luchdadh…", "regeneration_indicator.sublabel": "Tha do dhachaigh ’ga ullachadh!", "relationship_severance_notification.purged_data": "chaidh a phurgaideachadh leis na rianairean", + "relationship_severance_notification.relationships": "{count, plural, one {# dàimh} two {# dhàimh} few {# dàimhean} other {# dàimh}}", "relationship_severance_notification.types.account_suspension": "Chaidh cunntas a chur à rèim", "relationship_severance_notification.types.domain_block": "Chaidh àrainn a chur à rèim", "relationship_severance_notification.types.user_domain_block": "Bhac thu an àrainn seo", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 57882196f3..57d13205fb 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -471,6 +471,7 @@ "notification.own_poll": "A túa enquisa rematou", "notification.poll": "Rematou a enquisa na que votaches", "notification.reblog": "{name} compartiu a túa publicación", + "notification.severed_relationships": "Cortouse a relación con {name}", "notification.status": "{name} publicou", "notification.update": "{name} editou unha publicación", "notification_requests.accept": "Aceptar", @@ -587,6 +588,12 @@ "refresh": "Actualizar", "regeneration_indicator.label": "Estase a cargar…", "regeneration_indicator.sublabel": "Estase a preparar a túa cronoloxía de inicio!", + "relationship_severance_notification.purged_data": "purgada pola administración", + "relationship_severance_notification.relationships": "{count, plural, one {# relación} other {# relacións}}", + "relationship_severance_notification.types.account_suspension": "A conta foi suspendida", + "relationship_severance_notification.types.domain_block": "O dominio foi suspendido", + "relationship_severance_notification.types.user_domain_block": "Bloqueaches este dominio", + "relationship_severance_notification.view": "Ver", "relative_time.days": "{number}d", "relative_time.full.days": "hai {number, plural, one {# día} other {# días}}", "relative_time.full.hours": "hai {number, plural, one {# hora} other {# horas}}", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 48f028f3b5..1f65c3549d 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -248,7 +248,7 @@ "emoji_button.symbols": "סמלים", "emoji_button.travel": "טיולים ואתרים", "empty_column.account_hides_collections": "המשתמש.ת בחר.ה להסתיר מידע זה", - "empty_column.account_suspended": "חשבון מושהה", + "empty_column.account_suspended": "חשבון מושעה", "empty_column.account_timeline": "אין עדיין אף הודעה!", "empty_column.account_unavailable": "פרופיל לא זמין", "empty_column.blocks": "עדיין לא חסמתם משתמשים אחרים.", @@ -471,6 +471,7 @@ "notification.own_poll": "הסקר שלך הסתיים", "notification.poll": "סקר שהצבעת בו הסתיים", "notification.reblog": "הודעתך הודהדה על ידי {name}", + "notification.severed_relationships": "חתכתם כל קשר עם {name}", "notification.status": "{name} הרגע פרסמו", "notification.update": "{name} ערכו הודעה", "notification_requests.accept": "לקבל", @@ -587,6 +588,12 @@ "refresh": "רענון", "regeneration_indicator.label": "טוען…", "regeneration_indicator.sublabel": "פיד הבית שלך בהכנה!", + "relationship_severance_notification.purged_data": "המידע נמחק על ידי ההנהלה", + "relationship_severance_notification.relationships": "{count, plural, one {קשר אחד} other {# קשרים}}", + "relationship_severance_notification.types.account_suspension": "החשבון הושעה", + "relationship_severance_notification.types.domain_block": "השרת הושעה", + "relationship_severance_notification.types.user_domain_block": "חסמת שרת זה", + "relationship_severance_notification.view": "הצג", "relative_time.days": "{number} ימים", "relative_time.full.days": "לפני {number, plural, one {# יום} other {# ימים}}", "relative_time.full.hours": "לפני {number, plural, one {# שעה} other {# שעות}}", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 760063ab75..d9dfd01a26 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -471,7 +471,6 @@ "notification.own_poll": "A szavazásod véget ért", "notification.poll": "Egy szavazás, melyben részt vettél, véget ért", "notification.reblog": "{name} megtolta a bejegyzésedet", - "notification.severedRelationships": "A kapcsolatok megszakítva ezzel: {name}", "notification.severed_relationships": "A kapcsolatok megszakítva ezzel: {name}", "notification.status": "{name} bejegyzést tett közzé", "notification.update": "{name} szerkesztett egy bejegyzést", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 3b4ea15f9e..7d5df9198d 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -89,6 +89,14 @@ "announcement.announcement": "Annuncio", "attachments_list.unprocessed": "(non elaborato)", "audio.hide": "Nascondi audio", + "block_modal.remote_users_caveat": "Chiederemo al server {domain} di rispettare la tua decisione. Tuttavia, la conformità non è garantita poiché alcuni server potrebbero gestire i blocchi in modo diverso. I post pubblici potrebbero essere ancora visibili agli utenti che non hanno effettuato l'accesso.", + "block_modal.show_less": "Mostra meno", + "block_modal.show_more": "Mostra di più", + "block_modal.they_cant_mention": "Non possono menzionarti o seguirti.", + "block_modal.they_cant_see_posts": "Non possono vedere i tuoi post e tu non vedrai i loro.", + "block_modal.they_will_know": "Possono vedere che sono bloccati.", + "block_modal.title": "Bloccare l'utente?", + "block_modal.you_wont_see_mentions": "Non vedrai i post che li menzionano.", "boost_modal.combo": "Puoi premere {combo} per saltare questo passaggio, la prossima volta", "bundle_column_error.copy_stacktrace": "Copia rapporto sull'errore", "bundle_column_error.error.body": "Impossibile rendedrizzare la pagina richiesta. Potrebbe dipendere da un bug nel nostro codice o da un problema di compatibilità di un browser.", @@ -169,6 +177,7 @@ "confirmations.delete_list.message": "Sei sicuro di voler eliminare permanentemente questa lista?", "confirmations.discard_edit_media.confirm": "Scarta", "confirmations.discard_edit_media.message": "Hai delle modifiche non salvate alla descrizione o anteprima del media, scartarle comunque?", + "confirmations.domain_block.confirm": "Blocca il server", "confirmations.domain_block.message": "Sei davvero sicuro di voler bloccare l'intero {domain}? In gran parte dei casi, è sufficiente e preferibile bloccare o silenziare alcuni profili. Non visualizzerai i contenuti da quel dominio in alcuna cronologia pubblica o tra le tue notifiche. I tuoi seguaci da quel dominio saranno rimossi.", "confirmations.edit.confirm": "Modifica", "confirmations.edit.message": "Modificare ora sovrascriverà il messaggio che stai correntemente componendo. Sei sicuro di voler procedere?", @@ -200,6 +209,27 @@ "dismissable_banner.explore_statuses": "Questi sono post da tutto il social web che stanno guadagnando popolarità oggi. I post più recenti con più condivisioni e preferiti sono classificati più in alto.", "dismissable_banner.explore_tags": "Questi hashtag stanno ottenendo popolarità tra le persone su questo e altri server della rete decentralizzata, al momento.", "dismissable_banner.public_timeline": "Questi sono i post pubblici più recenti di persone sul social che le persone su {domain} seguono.", + "domain_block_modal.block": "Blocca il server", + "domain_block_modal.block_account_instead": "Blocca invece @{name}", + "domain_block_modal.they_can_interact_with_old_posts": "Le persone da questo server possono interagire con i tuoi vecchi post.", + "domain_block_modal.they_cant_follow": "Nessuno da questo server può seguirti.", + "domain_block_modal.they_wont_know": "Non sapranno di essere stati bloccati.", + "domain_block_modal.title": "Bloccare il dominio?", + "domain_block_modal.you_will_lose_followers": "Tutti i tuoi seguaci da questo server verranno rimossi.", + "domain_block_modal.you_wont_see_posts": "Non vedrai post o notifiche dagli utenti su questo server.", + "domain_pill.activitypub_lets_connect": "Ti consente di connetterti e interagire con le persone non solo su Mastodon, ma anche su diverse app social.", + "domain_pill.activitypub_like_language": "ActivityPub è come la lingua che Mastodon parla con altri social network.", + "domain_pill.server": "Server", + "domain_pill.their_handle": "Il loro nome univoco:", + "domain_pill.their_server": "La loro casa digitale, dove risiedono tutti i loro post.", + "domain_pill.their_username": "Il loro identificatore univoco sul loro server. È possibile trovare utenti con lo stesso nome utente su server diversi.", + "domain_pill.username": "Nome utente", + "domain_pill.whats_in_a_handle": "Cosa c'è in un nome univoco?", + "domain_pill.who_they_are": "Poiché i nomi univoci indicano chi sia qualcuno e dove si trovi, puoi interagire con le persone attraverso la rete sociale delle .", + "domain_pill.who_you_are": "Poiché il tuo nome univoco indica chi tu sia e dove ti trovi, le persone possono interagire con te sulla rete sociale delle .", + "domain_pill.your_handle": "Il tuo nome univoco:", + "domain_pill.your_server": "La tua casa digitale, dove vivono tutti i tuoi post. Non ti piace questa? Cambia server in qualsiasi momento e porta con te anche i tuoi seguaci.", + "domain_pill.your_username": "Il tuo identificatore univoco su questo server. È possibile trovare utenti con lo stesso nome utente su server diversi.", "embed.instructions": "Incorpora questo post sul tuo sito web, copiando il seguente codice.", "embed.preview": "Ecco come apparirà:", "emoji_button.activity": "Attività", @@ -397,6 +427,15 @@ "loading_indicator.label": "Caricamento…", "media_gallery.toggle_visible": "{number, plural, one {Nascondi immagine} other {Nascondi immagini}}", "moved_to_account_banner.text": "Il tuo profilo {disabledAccount} è correntemente disabilitato perché ti sei spostato a {movedToAccount}.", + "mute_modal.hide_from_notifications": "Nascondi dalle notifiche", + "mute_modal.hide_options": "Nascondi le opzioni", + "mute_modal.indefinite": "Finché io non le riattivo", + "mute_modal.show_options": "Mostre le opzioni", + "mute_modal.they_can_mention_and_follow": "Possono menzionarti e seguirti, ma non li vedrai.", + "mute_modal.they_wont_know": "Non sapranno di essere stati silenziati.", + "mute_modal.title": "Silenziare l'utente?", + "mute_modal.you_wont_see_mentions": "Non vedrai i post che li menzionano.", + "mute_modal.you_wont_see_posts": "Possono ancora vedere i tuoi post, ma tu non vedrai i loro.", "navigation_bar.about": "Info", "navigation_bar.advanced_interface": "Apri nell'interfaccia web avanzata", "navigation_bar.blocks": "Utenti bloccati", @@ -432,6 +471,7 @@ "notification.own_poll": "Il tuo sondaggio è terminato", "notification.poll": "Un sondaggio in cui hai votato è terminato", "notification.reblog": "{name} ha rebloggato il tuo post", + "notification.severed_relationships": "Relazioni interrotte con {name}", "notification.status": "{name} ha appena pubblicato un post", "notification.update": "{name} ha modificato un post", "notification_requests.accept": "Accetta", @@ -548,6 +588,12 @@ "refresh": "Ricarica", "regeneration_indicator.label": "Caricamento…", "regeneration_indicator.sublabel": "Il feed della tua home è in preparazione!", + "relationship_severance_notification.purged_data": "rimossi dagli amministratori", + "relationship_severance_notification.relationships": "{count, plural,one {# relazione} other {# relazioni}}", + "relationship_severance_notification.types.account_suspension": "L'account è stato sospeso", + "relationship_severance_notification.types.domain_block": "Il dominio è stato sospeso", + "relationship_severance_notification.types.user_domain_block": "Hai bloccato questo dominio", + "relationship_severance_notification.view": "Visualizza", "relative_time.days": "{number}g", "relative_time.full.days": "{number, plural, one {# giorno} other {# giorni}} fa", "relative_time.full.hours": "{number, plural, one {# ora} other {# ore}} fa", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 5ccd652a14..da354f3910 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -471,7 +471,6 @@ "notification.own_poll": "설문을 마침", "notification.poll": "참여한 설문이 종료됨", "notification.reblog": "{name} 님이 부스트했습니다", - "notification.severedRelationships": "{name} 님과의 관계가 단절되었습니다", "notification.severed_relationships": "{name} 님과의 관계가 단절되었습니다", "notification.status": "{name} 님이 방금 게시물을 올렸습니다", "notification.update": "{name} 님이 게시물을 수정했습니다", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index 547351af8c..1eb8aa4abc 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -213,6 +213,7 @@ "domain_block_modal.they_wont_know": "No savra ke tiene sido blokado.", "domain_block_modal.title": "Bloka el domeno?", "domain_block_modal.you_will_lose_followers": "Se efasaran todos tus suivantes de este sirvidor.", + "domain_block_modal.you_wont_see_posts": "No veras publikasyones ni avizos de utilizadores en este sirvidor.", "domain_pill.server": "Sirvidor", "domain_pill.their_handle": "Su alias:", "domain_pill.username": "Nombre de utilizador", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index f60c426bc2..4be0808f23 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -471,7 +471,6 @@ "notification.own_poll": "Jouw peiling is beëindigd", "notification.poll": "Een peiling waaraan jij hebt meegedaan is beëindigd", "notification.reblog": "{name} boostte jouw bericht", - "notification.severedRelationships": "Volgrelaties met {name} verbroken", "notification.severed_relationships": "Volgrelaties met {name} verbroken", "notification.status": "{name} heeft zojuist een bericht geplaatst", "notification.update": "{name} heeft een bericht bewerkt", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index a70d607d4d..7742d83e17 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -49,7 +49,7 @@ "account.media": "Media", "account.mention": "Nemn @{name}", "account.moved_to": "{name} seier at deira nye konto no er:", - "account.mute": "Målbind @{name}", + "account.mute": "Demp @{name}", "account.mute_notifications_short": "Demp varslingar", "account.mute_short": "Demp", "account.muted": "Målbunden", @@ -69,9 +69,9 @@ "account.unblock_short": "Stopp blokkering", "account.unendorse": "Ikkje vis på profil", "account.unfollow": "Slutt å fylgja", - "account.unmute": "Opphev målbinding av @{name}", + "account.unmute": "Opphev demping av @{name}", "account.unmute_notifications_short": "Opphev demping av varslingar", - "account.unmute_short": "Opphev målbinding", + "account.unmute_short": "Opphev demping", "account_note.placeholder": "Klikk for å leggja til merknad", "admin.dashboard.daily_retention": "Mengda brukarar aktive ved dagar etter registrering", "admin.dashboard.monthly_retention": "Mengda brukarar aktive ved månader etter registrering", @@ -178,12 +178,12 @@ "confirmations.discard_edit_media.confirm": "Forkast", "confirmations.discard_edit_media.message": "Du har ulagra endringar i mediaskildringa eller førehandsvisinga. Vil du forkasta dei likevel?", "confirmations.domain_block.confirm": "Blokker tenaren", - "confirmations.domain_block.message": "Er du heilt, heilt sikker på at du vil skjula heile {domain}? I dei fleste tilfelle er det godt nok og føretrekt med nokre få målretta blokkeringar eller målbindingar. Du kjem ikkje til å sjå innhald frå domenet i fødererte tidsliner eller i varsla dine. Fylgjarane dine frå domenet vert fjerna.", + "confirmations.domain_block.message": "Er du heilt, heilt sikker på at du vil skjula heile {domain}? I dei fleste tilfelle er det godt nok og føretrekt med nokre få målretta blokkeringar eller dempingar. Du kjem ikkje til å sjå innhald frå domenet i fødererte tidsliner eller i varsla dine. Fylgjarane dine frå domenet vert fjerna.", "confirmations.edit.confirm": "Rediger", "confirmations.edit.message": "Å redigera no vil overskriva den meldinga du er i ferd med å skriva. Er du sikker på at du vil halda fram?", "confirmations.logout.confirm": "Logg ut", "confirmations.logout.message": "Er du sikker på at du vil logga ut?", - "confirmations.mute.confirm": "Målbind", + "confirmations.mute.confirm": "Demp", "confirmations.redraft.confirm": "Slett & skriv på nytt", "confirmations.redraft.message": "Er du sikker på at du vil sletta denne statusen og skriva han på nytt? Då misser du favorittar og framhevingar, og svar til det opprinnelege innlegget vert foreldrelause.", "confirmations.reply.confirm": "Svar", @@ -471,7 +471,6 @@ "notification.own_poll": "Rundspørjinga di er ferdig", "notification.poll": "Ei rundspørjing du har røysta i er ferdig", "notification.reblog": "{name} framheva innlegget ditt", - "notification.severedRelationships": "Forholda med {name} er brotne", "notification.severed_relationships": "Forholda med {name} er brotne", "notification.status": "{name} la nettopp ut", "notification.update": "{name} redigerte eit innlegg", @@ -623,7 +622,7 @@ "report.comment.title": "Er det noko anna du meiner me bør vite?", "report.forward": "Vidaresend til {target}", "report.forward_hint": "Kontoen er frå ein annan tenar. Vil du senda ein anonymisert kopi av rapporten dit òg?", - "report.mute": "Målbind", + "report.mute": "Demp", "report.mute_explanation": "Du vil ikkje lenger sjå innlegga deira. Dei kan framleis fylgje deg og sjå innlegga dine, men vil ikkje vite at du har valt å ikkje sjå innlegga deira.", "report.next": "Neste", "report.placeholder": "Tilleggskommentarar", @@ -694,7 +693,7 @@ "status.block": "Blokker @{name}", "status.bookmark": "Set bokmerke", "status.cancel_reblog_private": "Opphev framheving", - "status.cannot_reblog": "Denne posten kan ikkje framhevast", + "status.cannot_reblog": "Du kan ikkje framheva dette innlegget", "status.copy": "Kopier lenke til status", "status.delete": "Slett", "status.detailed_status": "Detaljert samtalevisning", @@ -717,8 +716,8 @@ "status.media_hidden": "Mediet er gøymt", "status.mention": "Nemn @{name}", "status.more": "Meir", - "status.mute": "Målbind @{name}", - "status.mute_conversation": "Målbind samtale", + "status.mute": "Demp @{name}", + "status.mute_conversation": "Demp samtale", "status.open": "Utvid denne statusen", "status.pin": "Fest på profil", "status.pinned": "Festa tut", @@ -742,11 +741,11 @@ "status.show_more": "Vis meir", "status.show_more_all": "Vis meir for alle", "status.show_original": "Vis original", - "status.title.with_attachments": "{user} postet {attachmentCount, plural, one {et vedlegg} other {{attachmentCount} vedlegg}}", + "status.title.with_attachments": "{user} la ut {attachmentCount, plural, one {eitt vedlegg} other {{attachmentCount} vedlegg}}", "status.translate": "Omset", "status.translated_from_with": "Omsett frå {lang} ved bruk av {provider}", "status.uncached_media_warning": "Førehandsvisning er ikkje tilgjengeleg", - "status.unmute_conversation": "Opphev målbinding av samtalen", + "status.unmute_conversation": "Opphev demping av samtalen", "status.unpin": "Løys frå profil", "subscribed_languages.lead": "Kun innlegg på valde språk vil bli dukke opp i heimestraumen din og i listene dine etter denne endringa. For å motta innlegg på alle språk, la vere å velje nokon.", "subscribed_languages.save": "Lagre endringar", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 3387718aae..dd21d3030a 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -205,8 +205,10 @@ "dismissable_banner.explore_tags": "Toto sú hashtagy zo sociálnej siete, ktoré sú dnes populárne. Novšie hashtagy používané viacerými ľuďmi sú radené vyššie.", "dismissable_banner.public_timeline": "Toto sú najnovšie verejné príspevky od účtov na sociálnej sieti, ktoré sú sledované účtami z {domain}.", "domain_block_modal.block": "Blokovať server", + "domain_block_modal.block_account_instead": "Namiesto toho zablokuj @{name}", "domain_block_modal.title": "Blokovať doménu?", "domain_pill.server": "Server", + "domain_pill.their_server": "Ich digitálny domov, kde žijú všetky ich príspevky.", "domain_pill.username": "Používateľské meno", "embed.instructions": "Tento príspevok môžete pridať na svoju webovú stránku použitím tohto kódu.", "embed.preview": "Takto bude vyzerať:", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index b1923c7dd6..d31b410804 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -471,7 +471,6 @@ "notification.own_poll": "Vaša anketa je zaključena", "notification.poll": "Anketa, v kateri ste sodelovali, je zaključena", "notification.reblog": "{name} je izpostavila/a vašo objavo", - "notification.severedRelationships": "Veze z {name} prekinjene", "notification.severed_relationships": "Veze z {name} prekinjene", "notification.status": "{name} je pravkar objavil/a", "notification.update": "{name} je uredil(a) objavo", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 7f842c6bd8..a5122d098b 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -470,6 +470,7 @@ "notification.own_poll": "Pyetësori juaj ka përfunduar", "notification.poll": "Ka përfunduar një pyetësor ku keni votuar", "notification.reblog": "{name} përforcoi mesazhin tuaj", + "notification.severed_relationships": "Marrëdhëniet me {name} u ndërprenë", "notification.status": "{name} sapo postoi", "notification.update": "{name} përpunoi një postim", "notification_requests.accept": "Pranoje", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 1bfd3e480f..016007f499 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -89,6 +89,7 @@ "announcement.announcement": "Meddelande", "attachments_list.unprocessed": "(obehandlad)", "audio.hide": "Dölj audio", + "block_modal.remote_users_caveat": "Vi kommer att be servern {domain} att respektera ditt beslut. Dock garanteras inte efterlevnad eftersom vissa servrar kan hantera blockeringar på olika sätt. Offentliga inlägg kan fortfarande vara synliga för icke-inloggade användare.", "block_modal.show_less": "Visa mindre", "block_modal.show_more": "Visa mer", "block_modal.they_cant_mention": "De kan inte nämna eller följa dig.", @@ -212,8 +213,12 @@ "domain_block_modal.block_account_instead": "Blockera @{name} istället", "domain_block_modal.they_can_interact_with_old_posts": "Personer från denna server kan interagera med dina gamla inlägg.", "domain_block_modal.they_cant_follow": "Ingen från denna server kan följa dig.", + "domain_block_modal.they_wont_know": "De kommer inte veta att de har blockerats.", "domain_block_modal.title": "Blockera domän?", "domain_block_modal.you_will_lose_followers": "Alla dina följare från denna server kommer att tas bort.", + "domain_block_modal.you_wont_see_posts": "Du kommer inte att se inlägg eller meddelanden från användare på den här servern.", + "domain_pill.activitypub_lets_connect": "Det låter dig ansluta och interagera med människor inte bara på Mastodon, men även på andra sociala appar.", + "domain_pill.activitypub_like_language": "ActivityPub är som språket Mastodon talar med andra sociala nätverk.", "domain_pill.server": "Server", "domain_pill.their_username": "Deras unika identifierare på deras server. Det är möjligt att hitta användare med samma användarnamn på olika servrar.", "domain_pill.username": "Användarnamn", @@ -415,6 +420,8 @@ "mute_modal.hide_options": "Dölj alternativ", "mute_modal.show_options": "Visa alternativ", "mute_modal.they_can_mention_and_follow": "De kan nämna och följa dig, men du ser dem inte.", + "mute_modal.they_wont_know": "De vet inte att de har blivit tysta.", + "mute_modal.title": "Tysta användare?", "mute_modal.you_wont_see_mentions": "Du kommer inte att se inlägg som nämner dem.", "mute_modal.you_wont_see_posts": "De kan fortfarande se dina inlägg, men du kan inte se deras.", "navigation_bar.about": "Om", @@ -454,6 +461,10 @@ "notification.reblog": "{name} boostade ditt inlägg", "notification.status": "{name} publicerade just ett inlägg", "notification.update": "{name} redigerade ett inlägg", + "notification_requests.accept": "Godkänn", + "notification_requests.dismiss": "Avfärda", + "notification_requests.notifications_from": "Aviseringar från {name}", + "notification_requests.title": "Filtrerade meddelanden", "notifications.clear": "Rensa aviseringar", "notifications.clear_confirmation": "Är du säker på att du vill rensa alla dina aviseringar permanent?", "notifications.column_settings.admin.report": "Nya rapporter:", @@ -485,9 +496,12 @@ "notifications.permission_denied": "Skrivbordsaviseringar är otillgängliga på grund av tidigare nekade förfrågningar om behörighet i webbläsaren", "notifications.permission_denied_alert": "Skrivbordsaviseringar kan inte aktiveras, eftersom att webbläsarens behörighet har nekats innan", "notifications.permission_required": "Skrivbordsaviseringar är otillgängliga eftersom att rättigheten som krävs inte har godkänts.", + "notifications.policy.filter_new_accounts.hint": "Skapad inom de senaste {days, plural, one {dagen} other {# dagarna}}", "notifications.policy.filter_new_accounts_title": "Nya konton", "notifications.policy.filter_not_followers_title": "Personer som inte följer dig", "notifications.policy.filter_not_following_title": "Personer du inte följer", + "notifications.policy.filter_private_mentions_title": "Oombedda privata omnämnanden", + "notifications.policy.title": "Filtrera ut aviseringar från…", "notifications_permission_banner.enable": "Aktivera skrivbordsaviseringar", "notifications_permission_banner.how_to_control": "För att ta emot aviseringar när Mastodon inte är öppet, aktivera skrivbordsaviseringar. När de är aktiverade kan du styra exakt vilka typer av interaktioner som aviseras via {icon} -knappen ovan.", "notifications_permission_banner.title": "Missa aldrig något", @@ -558,6 +572,11 @@ "refresh": "Läs om", "regeneration_indicator.label": "Laddar…", "regeneration_indicator.sublabel": "Ditt hemmaflöde förbereds!", + "relationship_severance_notification.purged_data": "rensad av administratörer", + "relationship_severance_notification.types.account_suspension": "Ditt konto har blivit avstängt", + "relationship_severance_notification.types.domain_block": "Domänen har stängts av", + "relationship_severance_notification.types.user_domain_block": "Du blockerade denna domän", + "relationship_severance_notification.view": "Visa", "relative_time.days": "{number}d", "relative_time.full.days": "{number, plural, one {# dag} other {# dagar}} sedan", "relative_time.full.hours": "{number, plural, one {# timme} other {# timmar}} sedan", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index bf88e53c94..799400ea35 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -471,6 +471,7 @@ "notification.own_poll": "Anketiniz sona erdi", "notification.poll": "Oy verdiğiniz bir anket sona erdi", "notification.reblog": "{name} gönderini yeniden paylaştı", + "notification.severed_relationships": "{name} ile ilişkiler koptu", "notification.status": "{name} az önce gönderdi", "notification.update": "{name} bir gönderiyi düzenledi", "notification_requests.accept": "Onayla", @@ -587,6 +588,12 @@ "refresh": "Yenile", "regeneration_indicator.label": "Yükleniyor…", "regeneration_indicator.sublabel": "Ana akışın hazırlanıyor!", + "relationship_severance_notification.purged_data": "yöneticiler tarafından temizlendi", + "relationship_severance_notification.relationships": "{count, plural, one {# ilişki} other {# ilişki}}", + "relationship_severance_notification.types.account_suspension": "Hesap askıya alındı", + "relationship_severance_notification.types.domain_block": "Alan adı askıya alındı", + "relationship_severance_notification.types.user_domain_block": "Bu alan adını engellediniz", + "relationship_severance_notification.view": "Görüntüle", "relative_time.days": "{number}d", "relative_time.full.days": "{number, plural, one {# gün} other {# gün}} önce", "relative_time.full.hours": "{number, plural, one {# saat} other {# saat}} önce", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index abc9c37758..3456327a67 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -460,7 +460,6 @@ "notification.own_poll": "Ваше опитування завершилося", "notification.poll": "Опитування, у якому ви голосували, скінчилося", "notification.reblog": "{name} поширює ваш допис", - "notification.severedRelationships": "Зв'язки з {name} розірвані", "notification.severed_relationships": "Зв'язки з {name} розірвані", "notification.status": "{name} щойно дописує", "notification.update": "{name} змінює допис", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index b51b832b2b..9b09d21450 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -471,6 +471,7 @@ "notification.own_poll": "Cuộc bình chọn của bạn đã kết thúc", "notification.poll": "Cuộc bình chọn đã kết thúc", "notification.reblog": "{name} đăng lại tút của bạn", + "notification.severed_relationships": "Mối quan hệ với {name} bị cắt đứt", "notification.status": "{name} đăng tút mới", "notification.update": "{name} đã sửa tút", "notification_requests.accept": "Chấp nhận", @@ -587,6 +588,12 @@ "refresh": "Làm mới", "regeneration_indicator.label": "Đang tải…", "regeneration_indicator.sublabel": "Trang chủ của bạn đang được cập nhật!", + "relationship_severance_notification.purged_data": "bị quản trị viên xóa", + "relationship_severance_notification.relationships": "{count, plural, other {# mối quan hệ}}", + "relationship_severance_notification.types.account_suspension": "Người này đã bị vô hiệu hóa", + "relationship_severance_notification.types.domain_block": "Máy chủ này đã bị vô hiệu hóa", + "relationship_severance_notification.types.user_domain_block": "Bạn đã chặn máy chủ này", + "relationship_severance_notification.view": "Chi tiết", "relative_time.days": "{number} ngày", "relative_time.full.days": "{number, plural, other {# ngày}}", "relative_time.full.hours": "{number, plural, other {# giờ}}", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 6ad7599060..cc68ab762f 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -471,7 +471,6 @@ "notification.own_poll": "你的投票已经结束", "notification.poll": "你参与的一个投票已经结束", "notification.reblog": "{name} 转发了你的嘟文", - "notification.severedRelationships": "与 {name} 的关系已被切断", "notification.severed_relationships": "与 {name} 的关系已被切断", "notification.status": "{name} 刚刚发布嘟文", "notification.update": "{name} 编辑了嘟文", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index e352985811..228430dd80 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -471,7 +471,6 @@ "notification.own_poll": "您的投票已結束", "notification.poll": "您曾投過的投票已經結束", "notification.reblog": "{name} 已轉嘟您的嘟文", - "notification.severedRelationships": "已斷絕與 {name} 之服務關係", "notification.severed_relationships": "已斷絕與 {name} 之服務關係", "notification.status": "{name} 剛剛嘟文", "notification.update": "{name} 已編輯嘟文", diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 3601d5bd8b..f94abe265e 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1672,7 +1672,7 @@ ca: user_domain_block: Heu blocat %{target_name} lost_followers: Seguidors perduts lost_follows: Seguiments perduts - preamble: Quan bloqueu un domini o els vostres moderadors decideixen suspendre un servidor remot, es poden perdre seguidors i seguiments. Si això passa, podeu baixar-vos la llista de relacions trencades per a revisar-la i, si voleu, importar-les a un altre servidor. + preamble: Quan bloqueu un domini o els vostres moderadors decideixen suspendre un servidor remot, podeu perdre seguidors i seguiments. Si passa, podeu baixar la llista de relacions trencades per a revisar-la i, de cas, importar-la a un altre servidor. purged: Els administradors del vostre servidor han purgat la informació relativa a aquest servidor. type: Esdeveniment statuses: diff --git a/config/locales/de.yml b/config/locales/de.yml index 62e62c2c0b..620b571f9f 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1659,10 +1659,22 @@ de: preferences: Einstellungen profile: Öffentliches Profil relationships: Follower und Folge ich + severed_relationships: Getrennte Beziehungen statuses_cleanup: Automatische Löschung strikes: Maßnahmen two_factor_authentication: Zwei-Faktor-Authentisierung (2FA) webauthn_authentication: Sicherheitsschlüssel + severed_relationships: + download: Herunterladen (%{count}) + event_type: + account_suspension: Kontosperre (%{target_name}) + domain_block: Serversperre (%{target_name}) + user_domain_block: Du hast %{target_name} blockiert + lost_followers: Verlorene Follower + lost_follows: Konten entfolgt + preamble: Möglicherweise verlierst du Follower und entfolgst Konten, wenn du eine Domain blockierst oder Moderator*innen externe Server sperren. Sollte das der Fall sein, wirst du eine Liste mit den getrennten Beziehungen herunterladen können. Dadurch kannst du die Änderungen einsehen oder die Liste auf einen anderen Server importieren. + purged: Informationen über diesen Server wurden von deinen Server-Administrator*innen entfernt. + type: Ereignis statuses: attached: audio: diff --git a/config/locales/doorkeeper.nn.yml b/config/locales/doorkeeper.nn.yml index 66dd0f9093..0e5d1ca455 100644 --- a/config/locales/doorkeeper.nn.yml +++ b/config/locales/doorkeeper.nn.yml @@ -92,9 +92,9 @@ nn: invalid_resource_owner: Ressurseigardetaljane er ikkje gyldige, eller så er det ikkje mogleg å finna eigaren invalid_scope: Det etterspurte omfanget er ugyldig, ukjent eller har feil struktur. invalid_token: - expired: Tilgangsbeviset har gått ut på dato - revoked: Tilgangsbeviset har blitt oppheva - unknown: Tilgangsbeviset er ugyldig + expired: Innloggingsnykelen har gått ut på dato + revoked: Innloggingsnykelen er oppheva + unknown: Innloggngsnykelen er ugyldig resource_owner_authenticator_not_configured: Ressurseigar kunne ikkje finnast fordi Doorkeeper.configure.resource_owner_authenticator ikkje er konfigurert. server_error: Autoriseringstenaren støtte på ei uventa hending som hindra han i å svara på førespurnaden. temporarily_unavailable: Autoriseringstenaren kan ikkje hansama førespurnaden grunna kortvarig overbelastning eller tenarvedlikehald. @@ -129,11 +129,11 @@ nn: crypto: Ende-til-ende-kryptering favourites: Favorittar filters: Filter - follow: Dei du fylgjer, målbind og blokkerer + follow: Dei du fylgjer, dempar og blokkerer follows: Fylgjer lists: Lister media: Mediavedlegg - mutes: Målbindingar + mutes: Dempingar notifications: Varsel push: Pushvarsel reports: Rapportar @@ -183,13 +183,13 @@ nn: write:accounts: redigera profilen din write:blocks: blokker kontoar og domene write:bookmarks: bokmerk innlegg - write:conversations: målbind og slett samtalar + write:conversations: demp og slett samtalar write:favourites: favorittmarker innlegg write:filters: lag filter write:follows: fylg folk write:lists: lag lister write:media: last opp mediefiler - write:mutes: målbind folk og samtalar + write:mutes: demp folk og samtalar write:notifications: tøm varsla dine write:reports: rapporter andre folk write:statuses: publiser innlegg diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 2e21c73279..fd53f9d4fd 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1659,10 +1659,22 @@ es-AR: preferences: Configuración profile: Perfil público relationships: Seguimientos + severed_relationships: Relaciones cortadas statuses_cleanup: Eliminación auto. de mensajes strikes: Moderación de incumplimientos two_factor_authentication: Aut. de dos factores webauthn_authentication: Llaves de seguridad + severed_relationships: + download: Descargar (%{count}) + event_type: + account_suspension: Suspensión de cuenta (%{target_name}) + domain_block: Suspensión de cuenta (%{target_name}) + user_domain_block: Bloqueaste a %{target_name} + lost_followers: Seguidores perdidos + lost_follows: Cuentas seguidas perdidas + preamble: Podés perder seguidores y cuentas seguidas cuando bloqueás un dominio o cuando tus moderadores deciden suspender un servidor remoto. Cuando esto suceda, vas a poder descargar listas de relaciones cortadas, que serán inspectadas y posiblemente importadas en otro servidor. + purged: La información sobre este servidor fue purgada por los administradores de tu servidor. + type: Evento statuses: attached: audio: diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index fa69e36cc0..6e422455c3 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -597,6 +597,9 @@ fr-CA: actions_description_html: Décidez des mesures à prendre pour résoudre ce signalement. Si vous prenez des mesures punitives contre le compte signalé, une notification sera envoyée par e-mail, sauf si la catégorie Spam est sélectionnée. actions_description_remote_html: Décidez des mesures à prendre pour résoudre ce signalement. Cela n'affectera que la manière dont votre serveur communique avec ce compte distant et traite son contenu. add_to_report: Ajouter davantage au rapport + already_suspended_badges: + local: Déjà suspendu sur ce serveur + remote: Déjà suspendu sur le serveur distant are_you_sure: Voulez-vous vraiment faire ça ? assign_to_self: Me l’assigner assigned: Modérateur assigné @@ -1652,13 +1655,26 @@ fr-CA: import: Import de données import_and_export: Import et export migrate: Migration de compte + notifications: Notifications par mail preferences: Préférences profile: Profil relationships: Abonnements et abonné·e·s + severed_relationships: Relations rompues statuses_cleanup: Suppression automatique de messages strikes: Sanctions de modération two_factor_authentication: Identification à deux facteurs webauthn_authentication: Clés de sécurité + severed_relationships: + download: Téléchargement (%{count}) + event_type: + account_suspension: Suspension du compte (%{target_name}) + domain_block: Suspension du serveur (%{target_name}) + user_domain_block: Vous avez bloqué %{target_name} + lost_followers: Abonné·e·s perdu·e·s + lost_follows: Abonnements perdus + preamble: Vous pouvez perdre des abonnés et des abonnements lorsque vous bloquez un domaine ou lorsque vos modérateurs décident de suspendre un serveur distant. Lorsque cela arrive, vous êtes en mesure de télécharger une liste de vos relations rompues, afin de l'inspecter et d'éventuellement l'importer sur un autre serveur. + purged: Les informations sur ce serveur ont été purgées par les administrateurs du serveur. + type: Evènement statuses: attached: audio: @@ -1864,6 +1880,9 @@ fr-CA: follows_subtitle: Suivez des comptes populaires follows_title: Qui suivre follows_view_more: Voir plus de personnes à suivre + hashtags_recent_count: + one: "%{people} personne dans les deux derniers jours" + other: "%{people} personnes dans les deux derniers jours" hashtags_subtitle: Explorez les tendances depuis les 2 derniers jours hashtags_title: Hashtags populaires hashtags_view_more: Voir plus de hashtags populaires diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 2045760655..31f5bfa515 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -597,6 +597,9 @@ fr: actions_description_html: Décidez des mesures à prendre pour résoudre ce signalement. Si vous prenez des mesures punitives contre le compte signalé, une notification sera envoyée par e-mail, sauf si la catégorie Spam est sélectionnée. actions_description_remote_html: Décidez des mesures à prendre pour résoudre ce signalement. Cela n'affectera que la manière dont votre serveur communique avec ce compte distant et traite son contenu. add_to_report: Ajouter davantage au rapport + already_suspended_badges: + local: Déjà suspendu sur ce serveur + remote: Déjà suspendu sur le serveur distant are_you_sure: Voulez-vous vraiment faire ça ? assign_to_self: Me l’assigner assigned: Modérateur assigné @@ -1652,13 +1655,26 @@ fr: import: Import de données import_and_export: Import et export migrate: Migration de compte + notifications: Notifications par mail preferences: Préférences profile: Profil relationships: Abonnements et abonné·e·s + severed_relationships: Relations rompues statuses_cleanup: Suppression automatique de messages strikes: Sanctions de modération two_factor_authentication: Authentification à deux facteurs webauthn_authentication: Clés de sécurité + severed_relationships: + download: Téléchargement (%{count}) + event_type: + account_suspension: Suspension du compte (%{target_name}) + domain_block: Suspension du serveur (%{target_name}) + user_domain_block: Vous avez bloqué %{target_name} + lost_followers: Abonné·e·s perdu·e·s + lost_follows: Abonnements perdus + preamble: Vous pouvez perdre des abonnés et des abonnements lorsque vous bloquez un domaine ou lorsque vos modérateurs décident de suspendre un serveur distant. Lorsque cela arrive, vous êtes en mesure de télécharger une liste de vos relations rompues, afin de l'inspecter et d'éventuellement l'importer sur un autre serveur. + purged: Les informations sur ce serveur ont été purgées par les administrateurs du serveur. + type: Evènement statuses: attached: audio: @@ -1864,6 +1880,9 @@ fr: follows_subtitle: Suivez des comptes populaires follows_title: Qui suivre follows_view_more: Voir plus de personnes à suivre + hashtags_recent_count: + one: "%{people} personne dans les deux derniers jours" + other: "%{people} personnes dans les deux derniers jours" hashtags_subtitle: Explorez les tendances depuis les 2 derniers jours hashtags_title: Hashtags populaires hashtags_view_more: Voir plus de hashtags populaires diff --git a/config/locales/gd.yml b/config/locales/gd.yml index d61c79aa56..11402d3f56 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -1724,6 +1724,7 @@ gd: user_domain_block: Bhac thu %{target_name} lost_followers: An luchd-leantainn a chaill thu lost_follows: Daoine nach lean thu tuilleadh + preamble: Dh’fhaoidte gun chaill thu dàimhean leantainn nuair a bhacas tu àrainn no nuair a chuireas na maoir romhpa gun cuir iad frithealaiche cèin à rèim. Nuair a thachras sin, ’s urrainn dhut liosta de na dàimhean dealaichte a luchdadh a-nuas airson sùil a thoirt orra agus an ion-phortadh gu frithealaiche eile ’s dòcha. purged: Chaidh am fiosrachadh mun fhrithealaiche seo a phurgaideachadh le rianairean an fhrithealaiche agad. type: Tachartas statuses: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 7fbba21b27..4b1c9f096b 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1659,10 +1659,22 @@ gl: preferences: Preferencias profile: Perfil relationships: Seguindo e seguidoras + severed_relationships: Relacións cortadas statuses_cleanup: Borrado automático da publicación strikes: Avisos da moderación two_factor_authentication: Validar Dobre Factor webauthn_authentication: Chaves de seguridade + severed_relationships: + download: Descargar (%{count}) + event_type: + account_suspension: Suspensión da conta (%{target_name}) + domain_block: Suspensión do servidor (%{target_name}) + user_domain_block: Bloqueaches a %{target_name} + lost_followers: Seguidoras perdidas + lost_follows: Seguimentos perdidos + preamble: Pode acontecer que perdas seguidoras e seguimentos ao bloquear un dominio ou cando a Moderación do teu servidor decide suspender un servidor remoto. Se acontecese isto, podes descargar unha lista coas relacións cortadas para revisala e, se queres, importala noutro servidor. + purged: A administración do teu servidor purgou a información acerca deste servidor. + type: Evento statuses: attached: audio: diff --git a/config/locales/he.yml b/config/locales/he.yml index 2dfb98a2d8..da93925548 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1707,13 +1707,26 @@ he: import: יבוא import_and_export: יבוא ויצוא migrate: הגירת חשבון + notifications: התראות בדואל preferences: העדפות profile: פרופיל relationships: נעקבים ועוקבים + severed_relationships: קשרים שנותקו statuses_cleanup: מחיקת הודעות אוטומטית strikes: עבירות מנהלתיות two_factor_authentication: אימות דו-שלבי webauthn_authentication: מפתחות אבטחה + severed_relationships: + download: הורדה (%{count}) + event_type: + account_suspension: השעיית חשבון (%{target_name}) + domain_block: השעיית שרת (%{target_name}) + user_domain_block: חסמת את %{target_name} + lost_followers: אובדן עוקבים + lost_follows: אובדן נעקבים + preamble: הנכם עשויים לאבד עוקבים ונעקבים כשתחסמו שרת או כשמנהליכם יחליטו להשעות שרת אחר. במקרה כזה, תוכלו להוריד רשימה של קשרי המעקב שנותקו, כדי לעבור עליהם ואם תרצו לייבא אותם לשרת אחר. + purged: מידע על שרת מרוחק זה נמחק על ידי מנהלי השרת שלך. + type: אירוע statuses: attached: audio: diff --git a/config/locales/it.yml b/config/locales/it.yml index 16a42b0760..c63d8ef285 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1661,10 +1661,22 @@ it: preferences: Preferenze profile: Profilo relationships: Follows e followers + severed_relationships: Relazioni interrotte statuses_cleanup: Cancellazione automatica dei post strikes: Sanzioni di moderazione two_factor_authentication: Autenticazione a due fattori webauthn_authentication: Chiavi di sicurezza + severed_relationships: + download: Scarica (%{count}) + event_type: + account_suspension: Sospensione dell'account (%{target_name}) + domain_block: Sospensione del server (%{target_name}) + user_domain_block: Hai bloccato %{target_name} + lost_followers: Seguaci persi + lost_follows: Account seguiti persi + preamble: Potresti perdere account seguiti e seguaci quando blocchi un dominio o quando i tuoi moderatori decidono di sospendere un server remoto. Quando ciò accadrà, potrai scaricare liste di relazioni interrotte, da consultare ed eventualmente importare su un altro server. + purged: Le informazioni su questo server sono state eliminate dagli amministratori del tuo server. + type: Evento statuses: attached: audio: @@ -1870,6 +1882,9 @@ it: follows_subtitle: Segui account ben noti follows_title: Chi seguire follows_view_more: Visualizza più persone da seguire + hashtags_recent_count: + one: "%{people} persona negli ultimi 2 giorni" + other: "%{people} persone negli ultimi 2 giorni" hashtags_subtitle: Esplora le tendenze degli ultimi 2 giorni hashtags_title: Hashtag di tendenza hashtags_view_more: Visualizza altri hashtag di tendenza diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 1470dc9fc0..7145f30377 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -58,7 +58,7 @@ nn: demote: Degrader destroyed_msg: "%{username} sine data er no i slettekøa" disable: Slå av - disable_sign_in_token_auth: Slå av e-post token autentisering + disable_sign_in_token_auth: Slå av innlogging med epost-nykel disable_two_factor_authentication: Slå av 2FA disabled: Slege av display_name: Synleg namn @@ -67,7 +67,7 @@ nn: email: E-post email_status: E-poststatus enable: Slå på - enable_sign_in_token_auth: Slå på e-post token autentisering + enable_sign_in_token_auth: Slå på innlogging med epost-nykel enabled: Aktivert enabled_msg: Gjenaktiverte %{username} sin konto followers: Fylgjarar @@ -158,9 +158,9 @@ nn: unblocked_email_msg: Avblokkerte %{username} si e-postadresse unconfirmed_email: E-post utan stadfesting undo_sensitized: Angr tving ømtolig - undo_silenced: Angr målbinding + undo_silenced: Angre avgrensinga undo_suspension: Angr utvising - unsilenced_msg: Opphevde vellykket begrensningen av %{username} sin konto + unsilenced_msg: Oppheva avgrensinga av %{username} sin konto unsubscribe: Avmeld unsuspended_msg: Oppheving av utvisinga av %{username} sin konto var vellykka username: Brukarnamn @@ -200,10 +200,10 @@ nn: destroy_user_role: Øydelegg rolle disable_2fa_user: Skruv av 2FA disable_custom_emoji: Skruv av tilpassa emoji - disable_sign_in_token_auth_user: Slå av e-post tokenautentisering for brukar + disable_sign_in_token_auth_user: Slå av innlogging med epost-nykel for brukaren disable_user: Skruv av brukar enable_custom_emoji: Skruv på tilpassa emoji - enable_sign_in_token_auth_user: Slå på e-post tokenautentisering for brukar + enable_sign_in_token_auth_user: Slå på innlogging med epost-nykel for brukaren enable_user: Skruv på brukar memorialize_account: Opprett minnekonto promote_user: Forfrem brukar @@ -259,10 +259,10 @@ nn: destroy_user_role_html: "%{name} sletta rolla %{target}" disable_2fa_user_html: "%{name} tok vekk krav om tofaktorautentisering for brukaren %{target}" disable_custom_emoji_html: "%{name} deaktiverte emojien %{target}" - disable_sign_in_token_auth_user_html: "%{name} deaktivert e-post token for godkjenning for %{target}" + disable_sign_in_token_auth_user_html: "%{name} skrudde av innlogging med epost-nykel for %{target}" disable_user_html: "%{name} slo av innlogging for brukaren %{target}" enable_custom_emoji_html: "%{name} aktiverte emojien %{target}" - enable_sign_in_token_auth_user_html: "%{name} aktiverte e-post token autentisering for %{target}" + enable_sign_in_token_auth_user_html: "%{name} skrudde på innlogging med epost-nykel for %{target}" enable_user_html: "%{name} aktiverte innlogging for brukaren %{target}" memorialize_account_html: "%{name} endret %{target}s konto til en minneside" promote_user_html: "%{name} fremja brukaren %{target}" @@ -274,7 +274,7 @@ nn: reset_password_user_html: "%{name} tilbakestilte passordet for brukaren %{target}" resolve_report_html: "%{name} løyste ein rapport %{target}" sensitive_account_html: "%{name} markerte %{target} sitt media som ømtolig" - silence_account_html: "%{name} begrensa %{target} sin konto" + silence_account_html: "%{name} avgrensa %{target} sin konto" suspend_account_html: "%{name} utviste %{target} sin konto" unassigned_report_html: "%{name} løyste ein rapport %{target}" unblock_email_account_html: "%{name} avblokkerte %{target} si e-postadresse" @@ -396,8 +396,8 @@ nn: destroyed_msg: Domeneblokkering har nå blitt angret domain: Domene edit: Rediger domeneblokkering - existing_domain_block: Du har allerede pålagt strengere begrensninger på %{name}. - existing_domain_block_html: Du har allerede pålagt strengere begrensninger på %{name}, du kan være nødt til oppheve blokkeringen av den først. + existing_domain_block: Du har allereie gjort strengare avgrensingar av %{name}. + existing_domain_block_html: Du har allereie avgrensa kontoen til %{name} kraftig, det kan henda du må oppheva blokkeringa fyrst. export: Eksporter import: Importer new: @@ -406,17 +406,17 @@ nn: severity: desc_html: "Avgrens gjer innlegg frå kontoar på dette domenet usynlege for alle som ikkje fylgjer dei. Utvis fjernar alt innhald, media og profildata frå kontoar på dette domenet frå tenaren din. Bruk Ingen viss du berre vil avvisa mediafiler." noop: Ingen - silence: Målbind + silence: Avgrens suspend: Utvis title: Ny domeneblokkering no_domain_block_selected: Ingen domeneblokkeringar vart endra sidan ingen var valde not_permitted: Du har ikkje løyve til å utføra denne handlinga obfuscate: Obfuskere domenenavn - obfuscate_hint: Skjul deler av domenenavnet i listen hvis annonsering av listen over domenebegrensninger er slått på + obfuscate_hint: Gøym delar av domenenamnet i lista viss kunngjering av lista over domeneavgrensingar er påskrudd private_comment: Privat kommentar - private_comment_hint: Kommenter angående denne domenebegrensningen for internt bruk av moderatorene. + private_comment_hint: Kommentar om denne domeneavgrensinga til intern bruk for administratorane. public_comment: Offentleg kommentar - public_comment_hint: Kommenter angående denne domenebegrensningen for offentligheten, hvis publisering av domenebegrensningslisten er slått på. + public_comment_hint: Kommentar om denne domeneavgrensinga for publikum, viss kunngjering av lista over avgrensa domene er påskrudd. reject_media: Avvis mediefiler reject_media_hint: Fjernar mediefiler som er lagra lokalt og nektar å lasta ned andre i framtida. Har ikkje noko å seia for utvisingar reject_reports: Avvis rapportar @@ -480,7 +480,7 @@ nn: title: Tilgjenge warning: Det siste forsøket på å koble til denne serveren lyktes ikke back_to_all: Alle - back_to_limited: Begrenset + back_to_limited: Avgrensa back_to_warning: Advarsel by_domain: Domene confirm_purge: Er du sikker på at du vil slette data permanent fra dette domenet? @@ -491,7 +491,7 @@ nn: policies: reject_media: Avvis media reject_reports: Avvis rapporter - silence: Begrens + silence: Avgrens suspend: Utvis policy: Vilkår reason: Offentlig årsak @@ -651,7 +651,7 @@ nn: actions: delete_html: Fjerna dei påtala innlegga mark_as_sensitive_html: Markera dei påtala mediefilene som sensitive - silence_html: Sterkt avgrensa korleis @%{acct} kan samhandla ved å gjera brukarprofilen og innhaldet synleg berre for folk som allereie fylgjer brukarkontoen eller søkjer han opp manuelt + silence_html: Avgrens kraftig korleis @%{acct} kan samhandla med andre ved å gjera brukarprofilen og innhaldet synleg berre for folk som allereie fylgjer brukarkontoen eller søkjer opp profilen manuelt suspend_html: Stengja brukarkontoen til @%{acct}, slik at brukarprofilen og innhaldet blir utilgjengeleg og umogleg å samhandla med close_report: Marker rapport nr. %{id} som løyst close_reports_html: Marker alle rapportane om @%{acct} som løyste @@ -832,7 +832,7 @@ nn: mark_statuses_as_sensitive: "%{name} markerte %{target} sine innlegg som ømtålige" none: "%{name} sendte en advarsel til %{target}" sensitive: "%{name} markerte %{target} sin konto som ømtolig" - silence: "%{name} begrenset %{target}s konto" + silence: "%{name} avgrensa kontoen til %{target}" suspend: "%{name} utviste %{target} sin konto" appeal_approved: Anka appeal_pending: Klage behandles @@ -981,7 +981,7 @@ nn: mark_statuses_as_sensitive: å merke innleggene sine som følsomme none: en advarsel sensitive: å merke kontoen sin som følsom - silence: for å begrense deres konto + silence: for å avgrensa kontoen deira suspend: for å stenga kontoen deira body: "%{target} ankar på ei modereringsavgjerd av %{action_taken_by} den %{date}, som var %{type}. Dei skreiv:" next_steps: Du kan godkjenna anken for å endra modereringsavgjerda, eller du kan oversjå anken. @@ -1067,7 +1067,7 @@ nn: didnt_get_confirmation: Fekk du ikkje stadfestingslenka? dont_have_your_security_key: Har du ikke sikkerhetsnøkkelen din? forgot_password: Har du gløymt passordet ditt? - invalid_reset_password_token: Tilgangsnykelen er ugyldig eller utgått. Ver venleg å beda om ein ny ein. + invalid_reset_password_token: Tilgangsnykelen er ugyldig eller utgått. Ver venleg å be om ein ny ein. link_to_otp: Skriv inn en 2-trinnskode fra din 2-trinnspåloggingsenhet eller en gjenopprettingskode link_to_webauth: Bruk sikkerhetsnøkkel-enheten din log_in_with: Logg inn med @@ -1191,7 +1191,7 @@ nn: mark_statuses_as_sensitive: Markering av innlegg som ømtolige none: Advarsel sensitive: Markering av konto som ømtolig - silence: Begrensning av konto + silence: Avgrensing av konto suspend: Utestenging av konto your_appeal_approved: Din klage har blitt godkjent your_appeal_pending: Du har levert en klage @@ -1510,9 +1510,9 @@ nn: trillion: Bil otp_authentication: code_hint: Skriv inn koden generert av autentiseringsappen din for å bekrefte - description_html: Hvis du skrur på 2-trinnsautentisering ved hjelp av en autentiseringsapp, vil pålogging kreve at du er i besittelse av autentiseringsenheten din, som genererer sjetonger som du skal skrive inn. + description_html: Viss du skrur på tofaktorinnlogging med ein innloggingsapp, må du ha telefonen din klar når du loggar inn. Telefonen lagar innloggingsnyklar du må skriva inn. enable: Aktiver - instructions_html: "Skann denne QR-koden i Authy, Google Autentisering, eller en lignende TOTP-app på en av dine enheter. Fra nå av, vil den appen generere sjetonger som du vil måtte skrive inn når du logger på." + instructions_html: "Skann denne QR-koden i Google authenticator eller annan tofaktor-app på telefonen din. Frå no vil den appen laga tilgangsnyklar som du skriv inn når du vil logga inn." manual_instructions: 'Hvis du ikke kan skanne QR-koden og må skrive den inn manuelt, her er tekstkoden i ren tekst:' setup: Sett opp wrong_code: Den innskrevne koden var ugyldig! Er tjenertiden og enhetstiden riktige? diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index a4e57841e6..823929c550 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -116,6 +116,7 @@ fr-CA: sign_up_requires_approval: Les nouvelles inscriptions nécessiteront votre approbation severity: Choisir ce qui se passera avec les requêtes de cette adresse IP rule: + hint: Optionnel. Fournissez plus de détails sur la règle text: Décrivez une règle ou une exigence pour les utilisateurs sur ce serveur. Essayez de la garder courte et simple sessions: otp: 'Entrez le code d’authentification à deux facteurs généré par l’application de votre téléphone ou utilisez un de vos codes de récupération :' @@ -299,6 +300,7 @@ fr-CA: patch: Notifier pour des mises à jour de corrections de bug trending_tag: Nouvelle tendance nécessitant supervision rule: + hint: Information supplémentaire text: Règle settings: indexable: Inclure la page de profil dans les moteurs de recherches diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index bd1dc6885f..4c8de1b20d 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -116,6 +116,7 @@ fr: sign_up_requires_approval: Les nouvelles inscriptions nécessiteront votre approbation severity: Choisir ce qui se passera avec les requêtes de cette adresse IP rule: + hint: Optionnel. Fournissez plus de détails sur la règle text: Décrivez une règle ou une exigence pour les utilisateurs sur ce serveur. Essayez de la garder courte et simple sessions: otp: 'Entrez le code d’authentification à deux facteurs généré par l’application de votre téléphone ou utilisez un de vos codes de récupération :' @@ -299,6 +300,7 @@ fr: patch: Notifier pour des mises à jour de corrections de bug trending_tag: Nouvelle tendance nécessitant supervision rule: + hint: Information supplémentaire text: Règle settings: indexable: Inclure la page de profil dans les moteurs de recherches diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index d948a88ed1..627d96df02 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -303,7 +303,7 @@ ko: hint: 추가 정보 text: 규칙 settings: - indexable: 검색 엔진에 프로필 페이지 기재하기 + indexable: 검색엔진에 프로필 페이지 포함하기 show_application: 어떤 앱으로 게시물을 보냈는지 표시 tag: listable: 이 해시태그가 검색과 추천에 보여지도록 허용 diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index 1edf185c0a..a9f5f609fa 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -224,7 +224,7 @@ nn: setting_use_blurhash: Vis fargerike overgangar for gøymde medium setting_use_pending_items: Saktemodus severity: Alvorsgrad - sign_in_token_attempt: Trygdenykel + sign_in_token_attempt: Innloggingsnykel title: Tittel type: Importtype username: Brukarnamn @@ -280,7 +280,7 @@ nn: severities: no_access: Blokker tilgang sign_up_block: Blokker registrering - sign_up_requires_approval: Begrens påmeldinger + sign_up_requires_approval: Avgrens påmeldingar severity: Oppføring notification_emails: appeal: Nokon klagar på ei moderatoravgjerd diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index c3b8625c8e..37372cac27 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -116,6 +116,7 @@ sv: sign_up_requires_approval: Nya registreringar kräver ditt godkännande severity: Välj vad som ska hända med förfrågningar från denna IP rule: + hint: Valfritt. Ange mer information om regeln text: Beskriv en regel eller ett krav för användare av denna server. Försök hålla det kort och koncist sessions: otp: 'Ange tvåfaktorskoden som genererades av din telefonapp, eller använd någon av dina återställningskoder:' diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 6355d01924..adb3a041ca 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1259,17 +1259,17 @@ sl: exports: archive_takeout: date: Datum - download: Prenesi svoj arhiv - hint_html: Zahtevate lahko arhiv vaših objav in naloženih medijev. Izvoženi podatki bodo v zapisu ActivityPub, ki ga bo mogoče brati s poljubno skladno programsko opremo. Arhiv lahko zahtevate vsakih 7 dni. - in_progress: Prevajanje arhiva... + download: Prenesite svoj arhiv + hint_html: Zahtevate lahko arhiv svojih objav in naloženih medijev. Izvoženi podatki bodo v zapisu ActivityPub, ki ga bo mogoče brati s poljubno skladno programsko opremo. Arhiv lahko zahtevate vsakih 7 dni. + in_progress: Pripravljanje vašega arhiva … request: Zahtevajte svoj arhiv size: Velikost - blocks: Blokirate + blocks: Blokirani bookmarks: Zaznamki csv: CSV - domain_blocks: Bloki domene + domain_blocks: Blokirane domene lists: Seznami - mutes: Utišate + mutes: Utišani storage: Shranjeni mediji featured_tags: add_new: Dodaj novo @@ -1613,17 +1613,17 @@ sl: confirm_follow_selected_followers: Ali ste prepričani, da želite slediti izbranim sledilcem? confirm_remove_selected_followers: Ali ste prepričani, da želite odstraniti izbrane sledilce? confirm_remove_selected_follows: Ali ste prepričani, da želite odstraniti izbrana sledenja? - dormant: Skrit + dormant: Nedejavno follow_failure: Nekaterim od izbranih računov ni bilo mogoče slediti. follow_selected_followers: Sledi izbranim sledilcem followers: Sledilci - following: Sledi + following: Sledeni invited: Vabljeni last_active: Zadnja dejavnost - most_recent: Najnovejša + most_recent: Najnovejše moved: Prestavljeno - mutual: Vzajemna - primary: Primarna + mutual: Vzajemno + primary: Primarno relationship: Razmerje remove_selected_domains: Odstrani vse sledilce iz izbranih domen remove_selected_followers: Odstrani izbrane sledilce diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 25286c00f5..3742b61427 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1655,15 +1655,18 @@ sq: preferences: Parapëlqime profile: Profil relationships: Ndjekje dhe ndjekës + severed_relationships: Marrëdhënie të ndërprera statuses_cleanup: Fshirje e automatizuar postimesh strikes: Paralajmërime nga moderimi two_factor_authentication: Mirëfilltësim Dyfaktorësh webauthn_authentication: Kyçe sigurie severed_relationships: + download: Shkarkim (%{count}) event_type: account_suspension: Pezullim llogarie (%{target_name}) domain_block: Pezullim shërbyesi (%{target_name}) user_domain_block: Bllokuat %{target_name} + preamble: Mund të humbni ndjekje dhe ndjekës, kur bllokoni një përkatësi, ose kur moderatorët tuaj vendosin të pezullojnë një shërbyes të largët. Kur kjo ndodh, do të jeni në gjendje të shkarkoni lista marrëdhëniesh të dëmtuara, për t’i shqyrtuar dhe mundet për t’i importuar në një shërbyes tjetër. purged: Hollësitë rreth këtij shërbyesi janë spastuar nga përgjegjësit e shërbyesit tuaj. type: Akt statuses: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 855fa765f5..8ffb3c1e29 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -1660,6 +1660,9 @@ sv: strikes: Modereringsprickar two_factor_authentication: Tvåfaktorsautentisering webauthn_authentication: Säkerhetsnycklar + severed_relationships: + lost_follows: Förlorade följare + type: Händelse statuses: attached: audio: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index bdf002333d..692b3d281f 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1659,10 +1659,22 @@ tr: preferences: Tercihler profile: Profil relationships: Takip edilenler ve takipçiler + severed_relationships: Kopmuş ilişkiler statuses_cleanup: Otomatik gönderi silme strikes: Moderasyon eylemleri two_factor_authentication: İki adımlı doğrulama webauthn_authentication: Güvenlik anahtarları + severed_relationships: + download: İndir (%{count}) + event_type: + account_suspension: Hesap askıya alma (%{target_name}) + domain_block: Sunucu askıya alma (%{target_name}) + user_domain_block: 'Engellediniz: %{target_name}' + lost_followers: Kaybedilen takipçiler + lost_follows: Kaybedilen takipler + preamble: Bir alan adını engellediğinizde veya denetleyicileriniz uzak bir sunucuyu askıya almaya karar verdiğinde takipçilerinizi ve takiplerinizi kaybedebilirsiniz. Bu olduğunda, kopan ilişkilerin bir listesini, incelemek ve başka bir sunucuya aktarmak için indirebileceksiniz. + purged: Bu sunucu hakkındaki bilgiler, sunucunun yöneticileri tarafından temizlenmiş. + type: Olay statuses: attached: audio: diff --git a/config/locales/vi.yml b/config/locales/vi.yml index eaa913c8cd..f71ff741dc 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1633,10 +1633,22 @@ vi: preferences: Chung profile: Hồ sơ relationships: Quan hệ + severed_relationships: Mối quan hệ bị cắt đứt statuses_cleanup: Tự động xóa tút cũ strikes: Lần cảnh cáo two_factor_authentication: Xác minh 2 bước webauthn_authentication: Khóa bảo mật + severed_relationships: + download: Tải xuống (%{count}) + event_type: + account_suspension: Người bị vô hiệu hóa (%{target_name}) + domain_block: Máy chủ bị vô hiệu hóa (%{target_name}) + user_domain_block: Bạn đã chặn %{target_name} + lost_followers: Mất người theo dõi + lost_follows: Mất người đang theo dõi + preamble: Bạn có thể mất số lượt theo dõi và người theo dõi khi chặn một máy chủ hoặc khi kiểm duyệt viên của bạn quyết định tạm dừng máy chủ từ xa. Khi điều đó xảy ra, bạn sẽ có thể tải xuống danh sách các mối quan hệ đã bị cắt đứt, để kiểm tra và nhập vào máy chủ khác. + purged: Thông tin về máy chủ này đã bị quản trị viên máy chủ của bạn xóa sạch. + type: Sự kiện statuses: attached: audio: From 34f293475eb6c303a110219d717f430e2edeb269 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 22 Mar 2024 11:08:27 -0400 Subject: [PATCH 290/954] Fix results/query in `api/v1/featured_tags/suggestions` (#29597) --- .../featured_tags/suggestions_controller.rb | 6 +++- spec/fabricators/featured_tag_fabricator.rb | 2 +- .../api/v1/featured_tags/suggestions_spec.rb | 30 ++++++++++++++++--- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/app/controllers/api/v1/featured_tags/suggestions_controller.rb b/app/controllers/api/v1/featured_tags/suggestions_controller.rb index 76633210a1..4f732ed2d5 100644 --- a/app/controllers/api/v1/featured_tags/suggestions_controller.rb +++ b/app/controllers/api/v1/featured_tags/suggestions_controller.rb @@ -12,6 +12,10 @@ class Api::V1::FeaturedTags::SuggestionsController < Api::BaseController private def set_recently_used_tags - @recently_used_tags = Tag.recently_used(current_account).where.not(id: current_account.featured_tags).limit(10) + @recently_used_tags = Tag.recently_used(current_account).where.not(id: featured_tag_ids).limit(10) + end + + def featured_tag_ids + current_account.featured_tags.pluck(:tag_id) end end diff --git a/spec/fabricators/featured_tag_fabricator.rb b/spec/fabricators/featured_tag_fabricator.rb index 0803dc43a7..6003099dbd 100644 --- a/spec/fabricators/featured_tag_fabricator.rb +++ b/spec/fabricators/featured_tag_fabricator.rb @@ -2,6 +2,6 @@ Fabricator(:featured_tag) do account { Fabricate.build(:account) } - tag { Fabricate.build(:tag) } + tag { nil } name { sequence(:name) { |i| "Tag#{i}" } } end diff --git a/spec/requests/api/v1/featured_tags/suggestions_spec.rb b/spec/requests/api/v1/featured_tags/suggestions_spec.rb index f7b453b740..00451540ca 100644 --- a/spec/requests/api/v1/featured_tags/suggestions_spec.rb +++ b/spec/requests/api/v1/featured_tags/suggestions_spec.rb @@ -7,13 +7,35 @@ describe 'Featured Tags Suggestions API' do let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:scopes) { 'read:accounts' } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - let(:account) { Fabricate(:account) } + let(:account) { Fabricate(:account, user: user) } describe 'GET /api/v1/featured_tags/suggestions' do - it 'returns http success' do - get '/api/v1/featured_tags/suggestions', params: { account_id: account.id, limit: 2 }, headers: headers + let!(:unused_featured_tag) { Fabricate(:tag, name: 'unused_featured_tag') } + let!(:used_tag) { Fabricate(:tag, name: 'used_tag') } + let!(:used_featured_tag) { Fabricate(:tag, name: 'used_featured_tag') } - expect(response).to have_http_status(200) + before do + _unused_tag = Fabricate(:tag, name: 'unused_tag') + + # Make relevant tags used by account + status = Fabricate(:status, account: account) + status.tags << used_tag + status.tags << used_featured_tag + + # Feature the relevant tags + Fabricate :featured_tag, account: account, name: unused_featured_tag.name + Fabricate :featured_tag, account: account, name: used_featured_tag.name + end + + it 'returns http success and recently used but not featured tags' do + get '/api/v1/featured_tags/suggestions', params: { limit: 2 }, headers: headers + + expect(response) + .to have_http_status(200) + expect(body_as_json) + .to contain_exactly( + include(name: used_tag.name) + ) end end end From dfa43707eb88276b8268e49c7853d226006bf140 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 22 Mar 2024 16:44:31 +0100 Subject: [PATCH 291/954] Change `AccountRelationshipSeveranceEvent` model to store lost followers and following counts separately (#29714) --- .../components/relationships_severance_event.jsx | 2 +- app/models/account_relationship_severance_event.rb | 10 ++++++++-- .../account_relationship_severance_event_serializer.rb | 2 +- app/views/severed_relationships/index.html.haml | 4 ++-- ..._counts_to_account_relationship_severance_events.rb | 8 ++++++++ ...count_from_account_relationship_severance_events.rb | 7 +++++++ db/schema.rb | 5 +++-- 7 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 db/migrate/20240322125607_add_followers_and_following_counts_to_account_relationship_severance_events.rb create mode 100644 db/post_migrate/20240322130318_remove_relationships_count_from_account_relationship_severance_events.rb diff --git a/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx b/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx index 12bc5f130d..23d0d2eecf 100644 --- a/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx +++ b/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx @@ -35,7 +35,7 @@ const RelationshipsSeveranceEvent = ({ event, hidden }) => { )}
diff --git a/app/models/account_relationship_severance_event.rb b/app/models/account_relationship_severance_event.rb index 697b06b74b..c1269fad6d 100644 --- a/app/models/account_relationship_severance_event.rb +++ b/app/models/account_relationship_severance_event.rb @@ -8,11 +8,16 @@ # id :bigint(8) not null, primary key # account_id :bigint(8) not null # relationship_severance_event_id :bigint(8) not null -# relationships_count :integer default(0), not null # created_at :datetime not null # updated_at :datetime not null +# followers_count :integer default(0), not null +# following_count :integer default(0), not null # class AccountRelationshipSeveranceEvent < ApplicationRecord + self.ignored_columns += %w( + relationships_count + ) + belongs_to :account belongs_to :relationship_severance_event @@ -30,6 +35,7 @@ class AccountRelationshipSeveranceEvent < ApplicationRecord private def set_relationships_count! - self.relationships_count = severed_relationships.about_local_account(account).count + self.followers_count = severed_relationships.about_local_account(account).passive.count + self.following_count = severed_relationships.about_local_account(account).active.count end end diff --git a/app/serializers/rest/account_relationship_severance_event_serializer.rb b/app/serializers/rest/account_relationship_severance_event_serializer.rb index 2578e3a20f..751bc103c2 100644 --- a/app/serializers/rest/account_relationship_severance_event_serializer.rb +++ b/app/serializers/rest/account_relationship_severance_event_serializer.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class REST::AccountRelationshipSeveranceEventSerializer < ActiveModel::Serializer - attributes :id, :type, :purged, :target_name, :created_at + attributes :id, :type, :purged, :target_name, :followers_count, :following_count, :created_at def id object.id.to_s diff --git a/app/views/severed_relationships/index.html.haml b/app/views/severed_relationships/index.html.haml index 75296d90aa..7c599e9c0e 100644 --- a/app/views/severed_relationships/index.html.haml +++ b/app/views/severed_relationships/index.html.haml @@ -21,13 +21,13 @@ %td{ rowspan: 2 }= t('severed_relationships.purged') - else %td - - count = event.severed_relationships.active.about_local_account(current_account).count + - count = event.following_count - if count.zero? = t('generic.none') - else = table_link_to 'download', t('severed_relationships.download', count: count), following_severed_relationship_path(event, format: :csv) %td - - count = event.severed_relationships.passive.about_local_account(current_account).count + - count = event.followers_count - if count.zero? = t('generic.none') - else diff --git a/db/migrate/20240322125607_add_followers_and_following_counts_to_account_relationship_severance_events.rb b/db/migrate/20240322125607_add_followers_and_following_counts_to_account_relationship_severance_events.rb new file mode 100644 index 0000000000..ab5752b7a5 --- /dev/null +++ b/db/migrate/20240322125607_add_followers_and_following_counts_to_account_relationship_severance_events.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class AddFollowersAndFollowingCountsToAccountRelationshipSeveranceEvents < ActiveRecord::Migration[7.1] + def change + add_column :account_relationship_severance_events, :followers_count, :integer, default: 0, null: false + add_column :account_relationship_severance_events, :following_count, :integer, default: 0, null: false + end +end diff --git a/db/post_migrate/20240322130318_remove_relationships_count_from_account_relationship_severance_events.rb b/db/post_migrate/20240322130318_remove_relationships_count_from_account_relationship_severance_events.rb new file mode 100644 index 0000000000..76f2d325fe --- /dev/null +++ b/db/post_migrate/20240322130318_remove_relationships_count_from_account_relationship_severance_events.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class RemoveRelationshipsCountFromAccountRelationshipSeveranceEvents < ActiveRecord::Migration[7.1] + def change + safety_assured { remove_column :account_relationship_severance_events, :relationships_count, :integer, default: 0, null: false } + end +end diff --git a/db/schema.rb b/db/schema.rb index 3456319158..dcf16a7ed9 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_03_21_160706) do +ActiveRecord::Schema[7.1].define(version: 2024_03_22_130318) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -93,9 +93,10 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_21_160706) do create_table "account_relationship_severance_events", force: :cascade do |t| t.bigint "account_id", null: false t.bigint "relationship_severance_event_id", null: false - t.integer "relationships_count", default: 0, null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "followers_count", default: 0, null: false + t.integer "following_count", default: 0, null: false t.index ["account_id", "relationship_severance_event_id"], name: "idx_on_account_id_relationship_severance_event_id_7bd82bf20e", unique: true t.index ["account_id"], name: "index_account_relationship_severance_events_on_account_id" t.index ["relationship_severance_event_id"], name: "idx_on_relationship_severance_event_id_403f53e707" From 387c78ddf9c7654090b7b529ccebfb96f5cab534 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 22 Mar 2024 16:45:04 +0100 Subject: [PATCH 292/954] Change icon of severed relationships notifications (#29712) --- .../features/notifications/components/notification.jsx | 4 ++-- app/javascript/material-icons/400-24px/heart_broken-fill.svg | 1 + app/javascript/material-icons/400-24px/heart_broken.svg | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 app/javascript/material-icons/400-24px/heart_broken-fill.svg create mode 100644 app/javascript/material-icons/400-24px/heart_broken.svg diff --git a/app/javascript/mastodon/features/notifications/components/notification.jsx b/app/javascript/mastodon/features/notifications/components/notification.jsx index 1e89f77d45..5527f3d482 100644 --- a/app/javascript/mastodon/features/notifications/components/notification.jsx +++ b/app/javascript/mastodon/features/notifications/components/notification.jsx @@ -12,9 +12,9 @@ import { HotKeys } from 'react-hotkeys'; import EditIcon from '@/material-icons/400-24px/edit.svg?react'; import FlagIcon from '@/material-icons/400-24px/flag-fill.svg?react'; +import HeartBrokenIcon from '@/material-icons/400-24px/heart_broken-fill.svg?react'; import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react'; import InsertChartIcon from '@/material-icons/400-24px/insert_chart.svg?react'; -import LinkOffIcon from '@/material-icons/400-24px/link_off.svg?react'; import PersonIcon from '@/material-icons/400-24px/person-fill.svg?react'; import PersonAddIcon from '@/material-icons/400-24px/person_add-fill.svg?react'; import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; @@ -371,7 +371,7 @@ class Notification extends ImmutablePureComponent {
- + diff --git a/app/javascript/material-icons/400-24px/heart_broken-fill.svg b/app/javascript/material-icons/400-24px/heart_broken-fill.svg new file mode 100644 index 0000000000..75ff3932cd --- /dev/null +++ b/app/javascript/material-icons/400-24px/heart_broken-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/heart_broken.svg b/app/javascript/material-icons/400-24px/heart_broken.svg new file mode 100644 index 0000000000..2ce7de57f1 --- /dev/null +++ b/app/javascript/material-icons/400-24px/heart_broken.svg @@ -0,0 +1 @@ + \ No newline at end of file From de6c9e0fcd9d9768b3696b27122334aaf955c231 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 22 Mar 2024 17:21:50 +0100 Subject: [PATCH 293/954] Change new modals to allow vertical scrolling (#29644) --- app/javascript/styles/mastodon/components.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index c2a968aec3..4bb3216e45 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -8823,8 +8823,9 @@ noscript { .safety-action-modal, .interaction-modal { - max-width: 90vw; + max-width: 100vw; width: 600px; + overflow-y: auto; } .interaction-modal { From d71d26a3c90ba196dfc41043b73c53d4ca8f2398 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 22 Mar 2024 17:21:53 +0100 Subject: [PATCH 294/954] Reattribute notification-related records if possible when merging accounts (#29694) --- app/models/concerns/account/merging.rb | 10 ++++++++++ lib/mastodon/cli/maintenance.rb | 15 +++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/app/models/concerns/account/merging.rb b/app/models/concerns/account/merging.rb index e6b147482c..bd8b162238 100644 --- a/app/models/concerns/account/merging.rb +++ b/app/models/concerns/account/merging.rb @@ -27,6 +27,16 @@ module Account::Merging end end + [ + Notification, NotificationPermission, NotificationRequest + ].each do |klass| + klass.where(from_account_id: other_account.id).reorder(nil).find_each do |record| + record.update_attribute(:from_account_id, id) + rescue ActiveRecord::RecordNotUnique + next + end + end + target_classes = [ Follow, FollowRequest, Block, Mute, AccountModerationNote, AccountPin, AccountNote diff --git a/lib/mastodon/cli/maintenance.rb b/lib/mastodon/cli/maintenance.rb index 2e7c857078..d16d55eae1 100644 --- a/lib/mastodon/cli/maintenance.rb +++ b/lib/mastodon/cli/maintenance.rb @@ -26,6 +26,9 @@ module Mastodon::CLI class ListAccount < ApplicationRecord; end class PollVote < ApplicationRecord; end class Mention < ApplicationRecord; end + class Notification < ApplicationRecord; end + class NotificationPermission < ApplicationRecord; end + class NotificationRequest < ApplicationRecord; end class AccountDomainBlock < ApplicationRecord; end class AnnouncementReaction < ApplicationRecord; end class FeaturedTag < ApplicationRecord; end @@ -108,6 +111,18 @@ module Mastodon::CLI end end + from_classes = [Notification] + from_classes << NotificationPermission if db_table_exists?(:notification_permissions) + from_classes << NotificationRequest if db_table_exists?(:notification_requests) + + from_classes.each do |klass| + klass.where(from_account_id: other_account.id).find_each do |record| + record.update_attribute(:from_account_id, id) + rescue ActiveRecord::RecordNotUnique + next + end + end + target_classes = [Follow, FollowRequest, Block, Mute, AccountModerationNote, AccountPin] target_classes << AccountNote if db_table_exists?(:account_notes) From 58376eeddac328d275339cd920a49bb29067f1c6 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 22 Mar 2024 17:22:36 +0100 Subject: [PATCH 295/954] Remove obsolete `admin` and `moderator` columns from `users` table (#29718) --- app/models/user.rb | 2 -- .../20240322161611_remove_obsolete_roles_from_users.rb | 8 ++++++++ db/schema.rb | 4 +--- 3 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 db/post_migrate/20240322161611_remove_obsolete_roles_from_users.rb diff --git a/app/models/user.rb b/app/models/user.rb index ee9116b9f4..17ec90c9ee 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -14,7 +14,6 @@ # sign_in_count :integer default(0), not null # current_sign_in_at :datetime # last_sign_in_at :datetime -# admin :boolean default(FALSE), not null # confirmation_token :string # confirmed_at :datetime # confirmation_sent_at :datetime @@ -29,7 +28,6 @@ # otp_backup_codes :string is an Array # account_id :bigint(8) not null # disabled :boolean default(FALSE), not null -# moderator :boolean default(FALSE), not null # invite_id :bigint(8) # chosen_languages :string is an Array # created_by_application_id :bigint(8) diff --git a/db/post_migrate/20240322161611_remove_obsolete_roles_from_users.rb b/db/post_migrate/20240322161611_remove_obsolete_roles_from_users.rb new file mode 100644 index 0000000000..8a46a1d7d3 --- /dev/null +++ b/db/post_migrate/20240322161611_remove_obsolete_roles_from_users.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class RemoveObsoleteRolesFromUsers < ActiveRecord::Migration[7.1] + def change + safety_assured { remove_column :users, :admin, :boolean, default: false, null: false } + safety_assured { remove_column :users, :moderator, :boolean, default: false, null: false } + end +end diff --git a/db/schema.rb b/db/schema.rb index dcf16a7ed9..27c486487d 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_03_22_130318) do +ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -1170,7 +1170,6 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_130318) do t.integer "sign_in_count", default: 0, null: false t.datetime "current_sign_in_at", precision: nil t.datetime "last_sign_in_at", precision: nil - t.boolean "admin", default: false, null: false t.string "confirmation_token" t.datetime "confirmed_at", precision: nil t.datetime "confirmation_sent_at", precision: nil @@ -1185,7 +1184,6 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_130318) do t.string "otp_backup_codes", array: true t.bigint "account_id", null: false t.boolean "disabled", default: false, null: false - t.boolean "moderator", default: false, null: false t.bigint "invite_id" t.string "chosen_languages", array: true t.bigint "created_by_application_id" From 119c7aa0df1e1d26bdee1701250d23a7af9e9136 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 16:22:52 +0000 Subject: [PATCH 296/954] Update dependency rails-i18n to v7.0.9 (#29564) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 17b7bfb4a0..b341ca84b3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -582,7 +582,7 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - rails-i18n (7.0.8) + rails-i18n (7.0.9) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 8) railties (7.1.3.2) From 37ca59815cd3a3b2662e20f0c28185eb0d604dd4 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 22 Mar 2024 17:24:04 +0100 Subject: [PATCH 297/954] Remove setting for unfollow confirmation modal, and make it unconditional (#29373) --- .../mastodon/containers/account_container.jsx | 21 +++----- .../containers/header_container.jsx | 41 ++++++--------- .../directory/components/account_card.jsx | 52 ++++++++----------- app/javascript/mastodon/initial_state.js | 2 - app/models/concerns/user/has_settings.rb | 4 -- app/models/user_settings.rb | 1 - app/serializers/initial_state_serializer.rb | 1 - .../preferences/appearance/show.html.haml | 1 - 8 files changed, 46 insertions(+), 77 deletions(-) diff --git a/app/javascript/mastodon/containers/account_container.jsx b/app/javascript/mastodon/containers/account_container.jsx index a134452e77..f171fcc2fe 100644 --- a/app/javascript/mastodon/containers/account_container.jsx +++ b/app/javascript/mastodon/containers/account_container.jsx @@ -13,7 +13,6 @@ import { import { openModal } from '../actions/modal'; import { initMuteModal } from '../actions/mutes'; import Account from '../components/account'; -import { unfollowModal } from '../initial_state'; import { makeGetAccount } from '../selectors'; const messages = defineMessages({ @@ -34,18 +33,14 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ onFollow (account) { if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) { - if (unfollowModal) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: @{account.get('acct')} }} />, - confirm: intl.formatMessage(messages.unfollowConfirm), - onConfirm: () => dispatch(unfollowAccount(account.get('id'))), - }, - })); - } else { - dispatch(unfollowAccount(account.get('id'))); - } + dispatch(openModal({ + modalType: 'CONFIRM', + modalProps: { + message: @{account.get('acct')} }} />, + confirm: intl.formatMessage(messages.unfollowConfirm), + onConfirm: () => dispatch(unfollowAccount(account.get('id'))), + }, + })); } else { dispatch(followAccount(account.get('id'))); } diff --git a/app/javascript/mastodon/features/account_timeline/containers/header_container.jsx b/app/javascript/mastodon/features/account_timeline/containers/header_container.jsx index 071dbdbfb7..73fd62841b 100644 --- a/app/javascript/mastodon/features/account_timeline/containers/header_container.jsx +++ b/app/javascript/mastodon/features/account_timeline/containers/header_container.jsx @@ -21,7 +21,6 @@ import { initDomainBlockModal, unblockDomain } from '../../../actions/domain_blo import { openModal } from '../../../actions/modal'; import { initMuteModal } from '../../../actions/mutes'; import { initReport } from '../../../actions/reports'; -import { unfollowModal } from '../../../initial_state'; import { makeGetAccount, getAccountHidden } from '../../../selectors'; import Header from '../components/header'; @@ -47,31 +46,23 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ onFollow (account) { if (account.getIn(['relationship', 'following'])) { - if (unfollowModal) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: @{account.get('acct')} }} />, - confirm: intl.formatMessage(messages.unfollowConfirm), - onConfirm: () => dispatch(unfollowAccount(account.get('id'))), - }, - })); - } else { - dispatch(unfollowAccount(account.get('id'))); - } + dispatch(openModal({ + modalType: 'CONFIRM', + modalProps: { + message: @{account.get('acct')} }} />, + confirm: intl.formatMessage(messages.unfollowConfirm), + onConfirm: () => dispatch(unfollowAccount(account.get('id'))), + }, + })); } else if (account.getIn(['relationship', 'requested'])) { - if (unfollowModal) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: @{account.get('acct')} }} />, - confirm: intl.formatMessage(messages.cancelFollowRequestConfirm), - onConfirm: () => dispatch(unfollowAccount(account.get('id'))), - }, - })); - } else { - dispatch(unfollowAccount(account.get('id'))); - } + dispatch(openModal({ + modalType: 'CONFIRM', + modalProps: { + message: @{account.get('acct')} }} />, + confirm: intl.formatMessage(messages.cancelFollowRequestConfirm), + onConfirm: () => dispatch(unfollowAccount(account.get('id'))), + }, + })); } else { dispatch(followAccount(account.get('id'))); } diff --git a/app/javascript/mastodon/features/directory/components/account_card.jsx b/app/javascript/mastodon/features/directory/components/account_card.jsx index ff1f8a653b..9c5e688120 100644 --- a/app/javascript/mastodon/features/directory/components/account_card.jsx +++ b/app/javascript/mastodon/features/directory/components/account_card.jsx @@ -20,7 +20,7 @@ import { Avatar } from 'mastodon/components/avatar'; import { Button } from 'mastodon/components/button'; import { DisplayName } from 'mastodon/components/display_name'; import { ShortNumber } from 'mastodon/components/short_number'; -import { autoPlayGif, me, unfollowModal } from 'mastodon/initial_state'; +import { autoPlayGif, me } from 'mastodon/initial_state'; import { makeGetAccount } from 'mastodon/selectors'; const messages = defineMessages({ @@ -48,38 +48,30 @@ const makeMapStateToProps = () => { const mapDispatchToProps = (dispatch, { intl }) => ({ onFollow(account) { if (account.getIn(['relationship', 'following'])) { - if (unfollowModal) { - dispatch( - openModal({ - modalType: 'CONFIRM', - modalProps: { - message: ( - @{account.get('acct')} }} - /> - ), - confirm: intl.formatMessage(messages.unfollowConfirm), - onConfirm: () => dispatch(unfollowAccount(account.get('id'))), - } }), - ); - } else { - dispatch(unfollowAccount(account.get('id'))); - } - } else if (account.getIn(['relationship', 'requested'])) { - if (unfollowModal) { - dispatch(openModal({ + dispatch( + openModal({ modalType: 'CONFIRM', modalProps: { - message: @{account.get('acct')} }} />, - confirm: intl.formatMessage(messages.cancelFollowRequestConfirm), + message: ( + @{account.get('acct')} }} + /> + ), + confirm: intl.formatMessage(messages.unfollowConfirm), onConfirm: () => dispatch(unfollowAccount(account.get('id'))), - }, - })); - } else { - dispatch(unfollowAccount(account.get('id'))); - } + } }), + ); + } else if (account.getIn(['relationship', 'requested'])) { + dispatch(openModal({ + modalType: 'CONFIRM', + modalProps: { + message: @{account.get('acct')} }} />, + confirm: intl.formatMessage(messages.cancelFollowRequestConfirm), + onConfirm: () => dispatch(unfollowAccount(account.get('id'))), + }, + })); } else { dispatch(followAccount(account.get('id'))); } diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index 596c9ca49f..d8c57a2a0c 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -38,7 +38,6 @@ * @property {string} title * @property {boolean} show_trends * @property {boolean} trends_as_landing_page - * @property {boolean} unfollow_modal * @property {boolean} use_blurhash * @property {boolean=} use_pending_items * @property {string} version @@ -99,7 +98,6 @@ export const source_url = getMeta('source_url'); export const timelinePreview = getMeta('timeline_preview'); export const title = getMeta('title'); export const trendsAsLanding = getMeta('trends_as_landing_page'); -export const unfollowModal = getMeta('unfollow_modal'); export const useBlurhash = getMeta('use_blurhash'); export const usePendingItems = getMeta('use_pending_items'); export const version = getMeta('version'); diff --git a/app/models/concerns/user/has_settings.rb b/app/models/concerns/user/has_settings.rb index bfa8aa2ca3..65373325f0 100644 --- a/app/models/concerns/user/has_settings.rb +++ b/app/models/concerns/user/has_settings.rb @@ -27,10 +27,6 @@ module User::HasSettings settings['default_sensitive'] end - def setting_unfollow_modal - settings['web.unfollow_modal'] - end - def setting_boost_modal settings['web.reblog_modal'] end diff --git a/app/models/user_settings.rb b/app/models/user_settings.rb index 030cbec4d8..6571632fcd 100644 --- a/app/models/user_settings.rb +++ b/app/models/user_settings.rb @@ -27,7 +27,6 @@ class UserSettings setting :disable_swiping, default: false setting :delete_modal, default: true setting :reblog_modal, default: false - setting :unfollow_modal, default: true setting :reduce_motion, default: false setting :expand_content_warnings, default: false setting :display_media, default: 'default', in: %w(default show_all hide_all) diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index 9f7921461d..72aaabcfcb 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -17,7 +17,6 @@ class InitialStateSerializer < ActiveModel::Serializer if object.current_account store[:me] = object.current_account.id.to_s - store[:unfollow_modal] = object_account_user.setting_unfollow_modal store[:boost_modal] = object_account_user.setting_boost_modal store[:delete_modal] = object_account_user.setting_delete_modal store[:auto_play_gif] = object_account_user.setting_auto_play_gif diff --git a/app/views/settings/preferences/appearance/show.html.haml b/app/views/settings/preferences/appearance/show.html.haml index 76cd4381d8..e89e015b29 100644 --- a/app/views/settings/preferences/appearance/show.html.haml +++ b/app/views/settings/preferences/appearance/show.html.haml @@ -66,7 +66,6 @@ %h4= t 'appearance.confirmation_dialogs' .fields-group - = ff.input :'web.unfollow_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_unfollow_modal') = ff.input :'web.reblog_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_boost_modal') = ff.input :'web.delete_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_delete_modal') From 81a04ac25cb5a25d8501e59a16b272a6b4e177f0 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 22 Mar 2024 17:25:36 +0100 Subject: [PATCH 298/954] Improve specs for severed relationships (#29688) --- spec/features/severed_relationships_spec.rb | 24 +++++++++++++++++++++ spec/requests/severed_relationships_spec.rb | 24 --------------------- spec/services/block_domain_service_spec.rb | 5 ++++- 3 files changed, 28 insertions(+), 25 deletions(-) create mode 100644 spec/features/severed_relationships_spec.rb delete mode 100644 spec/requests/severed_relationships_spec.rb diff --git a/spec/features/severed_relationships_spec.rb b/spec/features/severed_relationships_spec.rb new file mode 100644 index 0000000000..b933398a08 --- /dev/null +++ b/spec/features/severed_relationships_spec.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'Severed relationships page' do + include ProfileStories + + describe 'GET severed_relationships#index' do + before do + as_a_logged_in_user + + event = Fabricate(:relationship_severance_event) + Fabricate.times(3, :severed_relationship, local_account: bob.account, relationship_severance_event: event) + Fabricate(:account_relationship_severance_event, account: bob.account, relationship_severance_event: event) + end + + it 'returns http success' do + visit severed_relationships_path + + expect(page).to have_title(I18n.t('settings.severed_relationships')) + expect(page).to have_link(href: following_severed_relationship_path(AccountRelationshipSeveranceEvent.first, format: :csv)) + end + end +end diff --git a/spec/requests/severed_relationships_spec.rb b/spec/requests/severed_relationships_spec.rb deleted file mode 100644 index 05a48ca349..0000000000 --- a/spec/requests/severed_relationships_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe 'Severed relationships page' do - include RoutingHelper - - describe 'GET severed_relationships#index' do - let(:user) { Fabricate(:user) } - let(:event) { Fabricate(:account_relationship_severance_event, account: user.account) } - - before do - sign_in user - - Fabricate.times(3, :severed_relationship, local_account: user.account, relationship_severance_event: event.relationship_severance_event) - end - - it 'returns http success' do - get severed_relationships_path - - expect(response).to have_http_status(200) - end - end -end diff --git a/spec/services/block_domain_service_spec.rb b/spec/services/block_domain_service_spec.rb index 26f80eaf62..d4f0c042d4 100644 --- a/spec/services/block_domain_service_spec.rb +++ b/spec/services/block_domain_service_spec.rb @@ -19,7 +19,7 @@ RSpec.describe BlockDomainService do bystander.follow!(local_account) end - it 'creates a domain block, suspends remote accounts with appropriate suspension date, records severed relationships', :aggregate_failures do + it 'creates a domain block, suspends remote accounts with appropriate suspension date, records severed relationships and sends notification', :aggregate_failures do subject.call(DomainBlock.create!(domain: 'evil.org', severity: :suspend)) expect(DomainBlock.blocked?('evil.org')).to be true @@ -42,6 +42,9 @@ RSpec.describe BlockDomainService do expect(severed_relationships.count).to eq 2 expect(severed_relationships[0].relationship_severance_event).to eq severed_relationships[1].relationship_severance_event expect(severed_relationships.map { |rel| [rel.account, rel.target_account] }).to contain_exactly([bystander, local_account], [local_account, bad_account]) + + # Sends severed relationships notification + expect(LocalNotificationWorker).to have_enqueued_sidekiq_job(local_account.id, anything, 'AccountRelationshipSeveranceEvent', 'severed_relationships') end end From 6c381f20b1d52c96525cbd5c41b0c972c3394a48 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Sun, 24 Mar 2024 15:17:06 +0100 Subject: [PATCH 299/954] Restore advanced filter bar setting (#29737) --- .../notifications/components/column_settings.jsx | 11 +++++++++++ .../notifications/containers/filter_bar_container.js | 2 +- app/javascript/mastodon/locales/en.json | 2 ++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/notifications/components/column_settings.jsx b/app/javascript/mastodon/features/notifications/components/column_settings.jsx index caa1b757a4..fc737c0fe2 100644 --- a/app/javascript/mastodon/features/notifications/components/column_settings.jsx +++ b/app/javascript/mastodon/features/notifications/components/column_settings.jsx @@ -54,6 +54,7 @@ export default class ColumnSettings extends PureComponent { render () { const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission, notificationPolicy } = this.props; + const filterAdvancedStr = ; const unreadMarkersShowStr = ; const alertStr = ; const showStr = ; @@ -116,6 +117,16 @@ export default class ColumnSettings extends PureComponent {
+
+

+ +

+ +
+ +
+
+

diff --git a/app/javascript/mastodon/features/notifications/containers/filter_bar_container.js b/app/javascript/mastodon/features/notifications/containers/filter_bar_container.js index e448cd26ad..4e0184cef3 100644 --- a/app/javascript/mastodon/features/notifications/containers/filter_bar_container.js +++ b/app/javascript/mastodon/features/notifications/containers/filter_bar_container.js @@ -5,7 +5,7 @@ import FilterBar from '../components/filter_bar'; const makeMapStateToProps = state => ({ selectedFilter: state.getIn(['settings', 'notifications', 'quickFilter', 'active']), - advancedMode: false, + advancedMode: state.getIn(['settings', 'notifications', 'quickFilter', 'advanced']), }); const mapDispatchToProps = (dispatch) => ({ diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index efda92d213..1134b393a7 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -484,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favorites:", + "notifications.column_settings.filter_bar.advanced": "Display all categories", + "notifications.column_settings.filter_bar.category": "Quick filter bar", "notifications.column_settings.follow": "New followers:", "notifications.column_settings.follow_request": "New follow requests:", "notifications.column_settings.mention": "Mentions:", From 8e7e86ee354fca36b989b6de40904f38e6db103b Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 25 Mar 2024 11:29:55 +0100 Subject: [PATCH 300/954] Add ability to reorder uploaded media before posting in web UI (#28456) --- app/javascript/mastodon/actions/compose.js | 7 ++ .../compose/components/compose_form.jsx | 4 +- .../features/compose/components/upload.jsx | 114 +++++++++--------- .../compose/components/upload_form.jsx | 70 +++++++---- .../compose/components/upload_progress.jsx | 77 ++++++------ .../compose/containers/upload_container.js | 27 ----- .../containers/upload_form_container.js | 9 -- .../containers/upload_progress_container.js | 11 -- .../ui/components/focal_point_modal.jsx | 2 +- app/javascript/mastodon/reducers/compose.js | 9 ++ 10 files changed, 159 insertions(+), 171 deletions(-) delete mode 100644 app/javascript/mastodon/features/compose/containers/upload_container.js delete mode 100644 app/javascript/mastodon/features/compose/containers/upload_form_container.js delete mode 100644 app/javascript/mastodon/features/compose/containers/upload_progress_container.js diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 12bd43f807..7477e45e5e 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -75,6 +75,7 @@ export const INIT_MEDIA_EDIT_MODAL = 'INIT_MEDIA_EDIT_MODAL'; export const COMPOSE_CHANGE_MEDIA_DESCRIPTION = 'COMPOSE_CHANGE_MEDIA_DESCRIPTION'; export const COMPOSE_CHANGE_MEDIA_FOCUS = 'COMPOSE_CHANGE_MEDIA_FOCUS'; +export const COMPOSE_CHANGE_MEDIA_ORDER = 'COMPOSE_CHANGE_MEDIA_ORDER'; export const COMPOSE_SET_STATUS = 'COMPOSE_SET_STATUS'; export const COMPOSE_FOCUS = 'COMPOSE_FOCUS'; @@ -809,3 +810,9 @@ export function changePollSettings(expiresIn, isMultiple) { isMultiple, }; } + +export const changeMediaOrder = (a, b) => ({ + type: COMPOSE_CHANGE_MEDIA_ORDER, + a, + b, +}); diff --git a/app/javascript/mastodon/features/compose/components/compose_form.jsx b/app/javascript/mastodon/features/compose/components/compose_form.jsx index b93bac9d19..9b4d3dfeb5 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.jsx +++ b/app/javascript/mastodon/features/compose/components/compose_form.jsx @@ -21,7 +21,6 @@ import PollButtonContainer from '../containers/poll_button_container'; import PrivacyDropdownContainer from '../containers/privacy_dropdown_container'; import SpoilerButtonContainer from '../containers/spoiler_button_container'; import UploadButtonContainer from '../containers/upload_button_container'; -import UploadFormContainer from '../containers/upload_form_container'; import WarningContainer from '../containers/warning_container'; import { countableText } from '../util/counter'; @@ -30,6 +29,7 @@ import { EditIndicator } from './edit_indicator'; import { NavigationBar } from './navigation_bar'; import { PollForm } from "./poll_form"; import { ReplyIndicator } from './reply_indicator'; +import { UploadForm } from './upload_form'; const allowedAroundShortCode = '><\u0085\u0020\u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\u0009\u000a\u000b\u000c\u000d'; @@ -283,7 +283,7 @@ class ComposeForm extends ImmutablePureComponent { />
- +
diff --git a/app/javascript/mastodon/features/compose/components/upload.jsx b/app/javascript/mastodon/features/compose/components/upload.jsx index e8045ae81f..7f6ef6cfd8 100644 --- a/app/javascript/mastodon/features/compose/components/upload.jsx +++ b/app/javascript/mastodon/features/compose/components/upload.jsx @@ -1,77 +1,81 @@ import PropTypes from 'prop-types'; +import { useCallback } from 'react'; import { FormattedMessage } from 'react-intl'; import classNames from 'classnames'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; +import { useDispatch, useSelector } from 'react-redux'; import spring from 'react-motion/lib/spring'; import CloseIcon from '@/material-icons/400-20px/close.svg?react'; import EditIcon from '@/material-icons/400-24px/edit.svg?react'; import WarningIcon from '@/material-icons/400-24px/warning.svg?react'; +import { undoUploadCompose, initMediaEditModal } from 'mastodon/actions/compose'; import { Blurhash } from 'mastodon/components/blurhash'; import { Icon } from 'mastodon/components/icon'; +import Motion from 'mastodon/features/ui/util/optional_motion'; -import Motion from '../../ui/util/optional_motion'; +export const Upload = ({ id, onDragStart, onDragEnter, onDragEnd }) => { + const dispatch = useDispatch(); + const media = useSelector(state => state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id)); + const sensitive = useSelector(state => state.getIn(['compose', 'spoiler'])); -export default class Upload extends ImmutablePureComponent { + const handleUndoClick = useCallback(() => { + dispatch(undoUploadCompose(id)); + }, [dispatch, id]); - static propTypes = { - media: ImmutablePropTypes.map.isRequired, - sensitive: PropTypes.bool, - onUndo: PropTypes.func.isRequired, - onOpenFocalPoint: PropTypes.func.isRequired, - }; + const handleFocalPointClick = useCallback(() => { + dispatch(initMediaEditModal(id)); + }, [dispatch, id]); - handleUndoClick = e => { - e.stopPropagation(); - this.props.onUndo(this.props.media.get('id')); - }; + const handleDragStart = useCallback(() => { + onDragStart(id); + }, [onDragStart, id]); - handleFocalPointClick = e => { - e.stopPropagation(); - this.props.onOpenFocalPoint(this.props.media.get('id')); - }; + const handleDragEnter = useCallback(() => { + onDragEnter(id); + }, [onDragEnter, id]); - render () { - const { media, sensitive } = this.props; - - if (!media) { - return null; - } - - const focusX = media.getIn(['meta', 'focus', 'x']); - const focusY = media.getIn(['meta', 'focus', 'y']); - const x = ((focusX / 2) + .5) * 100; - const y = ((focusY / -2) + .5) * 100; - const missingDescription = (media.get('description') || '').length === 0; - - return ( -
- - {({ scale }) => ( -
- {sensitive && } - -
- - -
- -
- -
-
- )} -
-
- ); + if (!media) { + return null; } -} + const focusX = media.getIn(['meta', 'focus', 'x']); + const focusY = media.getIn(['meta', 'focus', 'y']); + const x = ((focusX / 2) + .5) * 100; + const y = ((focusY / -2) + .5) * 100; + const missingDescription = (media.get('description') || '').length === 0; + + return ( +
+ + {({ scale }) => ( +
+ {sensitive && } + +
+ + +
+ +
+ +
+
+ )} +
+
+ ); +}; + +Upload.propTypes = { + id: PropTypes.string, + onDragEnter: PropTypes.func, + onDragStart: PropTypes.func, + onDragEnd: PropTypes.func, +}; diff --git a/app/javascript/mastodon/features/compose/components/upload_form.jsx b/app/javascript/mastodon/features/compose/components/upload_form.jsx index 46bac7823b..adf5591382 100644 --- a/app/javascript/mastodon/features/compose/components/upload_form.jsx +++ b/app/javascript/mastodon/features/compose/components/upload_form.jsx @@ -1,31 +1,53 @@ -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; +import { useRef, useCallback } from 'react'; -import UploadContainer from '../containers/upload_container'; -import UploadProgressContainer from '../containers/upload_progress_container'; +import { useSelector, useDispatch } from 'react-redux'; -export default class UploadForm extends ImmutablePureComponent { +import { changeMediaOrder } from 'mastodon/actions/compose'; - static propTypes = { - mediaIds: ImmutablePropTypes.list.isRequired, - }; +import { Upload } from './upload'; +import { UploadProgress } from './upload_progress'; - render () { - const { mediaIds } = this.props; +export const UploadForm = () => { + const dispatch = useDispatch(); + const mediaIds = useSelector(state => state.getIn(['compose', 'media_attachments']).map(item => item.get('id'))); + const active = useSelector(state => state.getIn(['compose', 'is_uploading'])); + const progress = useSelector(state => state.getIn(['compose', 'progress'])); + const isProcessing = useSelector(state => state.getIn(['compose', 'is_processing'])); - return ( - <> - + const dragItem = useRef(); + const dragOverItem = useRef(); - {mediaIds.size > 0 && ( -
- {mediaIds.map(id => ( - - ))} -
- )} - - ); - } + const handleDragStart = useCallback(id => { + dragItem.current = id; + }, [dragItem]); -} + const handleDragEnter = useCallback(id => { + dragOverItem.current = id; + }, [dragOverItem]); + + const handleDragEnd = useCallback(() => { + dispatch(changeMediaOrder(dragItem.current, dragOverItem.current)); + dragItem.current = null; + dragOverItem.current = null; + }, [dispatch, dragItem, dragOverItem]); + + return ( + <> + + + {mediaIds.size > 0 && ( +
+ {mediaIds.map(id => ( + + ))} +
+ )} + + ); +}; diff --git a/app/javascript/mastodon/features/compose/components/upload_progress.jsx b/app/javascript/mastodon/features/compose/components/upload_progress.jsx index 1276cded1f..fd0c8f4530 100644 --- a/app/javascript/mastodon/features/compose/components/upload_progress.jsx +++ b/app/javascript/mastodon/features/compose/components/upload_progress.jsx @@ -1,5 +1,4 @@ import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; import { FormattedMessage } from 'react-intl'; @@ -10,46 +9,40 @@ import { Icon } from 'mastodon/components/icon'; import Motion from '../../ui/util/optional_motion'; -export default class UploadProgress extends PureComponent { - - static propTypes = { - active: PropTypes.bool, - progress: PropTypes.number, - isProcessing: PropTypes.bool, - }; - - render () { - const { active, progress, isProcessing } = this.props; - - if (!active) { - return null; - } - - let message; - - if (isProcessing) { - message = ; - } else { - message = ; - } - - return ( -
- - -
- {message} - -
- - {({ width }) => -
- } - -
-
-
- ); +export const UploadProgress = ({ active, progress, isProcessing }) => { + if (!active) { + return null; } -} + let message; + + if (isProcessing) { + message = ; + } else { + message = ; + } + + return ( +
+ + +
+ {message} + +
+ + {({ width }) => +
+ } + +
+
+
+ ); +}; + +UploadProgress.propTypes = { + active: PropTypes.bool, + progress: PropTypes.number, + isProcessing: PropTypes.bool, +}; diff --git a/app/javascript/mastodon/features/compose/containers/upload_container.js b/app/javascript/mastodon/features/compose/containers/upload_container.js deleted file mode 100644 index a17a691444..0000000000 --- a/app/javascript/mastodon/features/compose/containers/upload_container.js +++ /dev/null @@ -1,27 +0,0 @@ -import { connect } from 'react-redux'; - -import { undoUploadCompose, initMediaEditModal, submitCompose } from '../../../actions/compose'; -import Upload from '../components/upload'; - -const mapStateToProps = (state, { id }) => ({ - media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id), - sensitive: state.getIn(['compose', 'spoiler']), -}); - -const mapDispatchToProps = dispatch => ({ - - onUndo: id => { - dispatch(undoUploadCompose(id)); - }, - - onOpenFocalPoint: id => { - dispatch(initMediaEditModal(id)); - }, - - onSubmit (router) { - dispatch(submitCompose(router)); - }, - -}); - -export default connect(mapStateToProps, mapDispatchToProps)(Upload); diff --git a/app/javascript/mastodon/features/compose/containers/upload_form_container.js b/app/javascript/mastodon/features/compose/containers/upload_form_container.js deleted file mode 100644 index 336525cf53..0000000000 --- a/app/javascript/mastodon/features/compose/containers/upload_form_container.js +++ /dev/null @@ -1,9 +0,0 @@ -import { connect } from 'react-redux'; - -import UploadForm from '../components/upload_form'; - -const mapStateToProps = state => ({ - mediaIds: state.getIn(['compose', 'media_attachments']).map(item => item.get('id')), -}); - -export default connect(mapStateToProps)(UploadForm); diff --git a/app/javascript/mastodon/features/compose/containers/upload_progress_container.js b/app/javascript/mastodon/features/compose/containers/upload_progress_container.js deleted file mode 100644 index ffff321c3f..0000000000 --- a/app/javascript/mastodon/features/compose/containers/upload_progress_container.js +++ /dev/null @@ -1,11 +0,0 @@ -import { connect } from 'react-redux'; - -import UploadProgress from '../components/upload_progress'; - -const mapStateToProps = state => ({ - active: state.getIn(['compose', 'is_uploading']), - progress: state.getIn(['compose', 'progress']), - isProcessing: state.getIn(['compose', 'is_processing']), -}); - -export default connect(mapStateToProps)(UploadProgress); diff --git a/app/javascript/mastodon/features/ui/components/focal_point_modal.jsx b/app/javascript/mastodon/features/ui/components/focal_point_modal.jsx index 5f430d5392..7adfc208e7 100644 --- a/app/javascript/mastodon/features/ui/components/focal_point_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/focal_point_modal.jsx @@ -22,7 +22,7 @@ import { GIFV } from 'mastodon/components/gifv'; import { IconButton } from 'mastodon/components/icon_button'; import Audio from 'mastodon/features/audio'; import { CharacterCounter } from 'mastodon/features/compose/components/character_counter'; -import UploadProgress from 'mastodon/features/compose/components/upload_progress'; +import { UploadProgress } from 'mastodon/features/compose/components/upload_progress'; import { Tesseract as fetchTesseract } from 'mastodon/features/ui/util/async-components'; import { me } from 'mastodon/initial_state'; import { assetHost } from 'mastodon/utils/config'; diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index 8dc2801857..97218e9f75 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -45,6 +45,7 @@ import { INIT_MEDIA_EDIT_MODAL, COMPOSE_CHANGE_MEDIA_DESCRIPTION, COMPOSE_CHANGE_MEDIA_FOCUS, + COMPOSE_CHANGE_MEDIA_ORDER, COMPOSE_SET_STATUS, COMPOSE_FOCUS, } from '../actions/compose'; @@ -536,6 +537,14 @@ export default function compose(state = initialState, action) { return state.set('language', action.language); case COMPOSE_FOCUS: return state.set('focusDate', new Date()).update('text', text => text.length > 0 ? text : action.defaultText); + case COMPOSE_CHANGE_MEDIA_ORDER: + return state.update('media_attachments', list => { + const indexA = list.findIndex(x => x.get('id') === action.a); + const moveItem = list.get(indexA); + const indexB = list.findIndex(x => x.get('id') === action.b); + + return list.splice(indexA, 1).splice(indexB, 0, moveItem); + }); default: return state; } From 799e3be9bdbb5b895b004a0c553954b3f104ace6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 12:07:38 +0100 Subject: [PATCH 301/954] New Crowdin Translations (automated) (#29726) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/ar.json | 1 + app/javascript/mastodon/locales/be.json | 4 ++ app/javascript/mastodon/locales/da.json | 4 +- app/javascript/mastodon/locales/de.json | 2 + app/javascript/mastodon/locales/es-AR.json | 4 +- app/javascript/mastodon/locales/es-MX.json | 9 ++++ app/javascript/mastodon/locales/es.json | 9 ++++ app/javascript/mastodon/locales/eu.json | 2 + app/javascript/mastodon/locales/fa.json | 2 + app/javascript/mastodon/locales/fi.json | 2 + app/javascript/mastodon/locales/fo.json | 2 + app/javascript/mastodon/locales/gd.json | 6 +-- app/javascript/mastodon/locales/he.json | 2 + app/javascript/mastodon/locales/is.json | 4 ++ app/javascript/mastodon/locales/it.json | 2 + app/javascript/mastodon/locales/ja.json | 25 +++++++++++ app/javascript/mastodon/locales/ko.json | 1 + app/javascript/mastodon/locales/lt.json | 3 ++ app/javascript/mastodon/locales/nl.json | 20 +++++---- app/javascript/mastodon/locales/pl.json | 9 ++++ app/javascript/mastodon/locales/pt-PT.json | 9 ++++ app/javascript/mastodon/locales/sk.json | 3 ++ app/javascript/mastodon/locales/sq.json | 2 + app/javascript/mastodon/locales/sv.json | 1 + app/javascript/mastodon/locales/th.json | 9 ++++ app/javascript/mastodon/locales/tr.json | 2 + app/javascript/mastodon/locales/uk.json | 2 + app/javascript/mastodon/locales/zh-CN.json | 2 + app/javascript/mastodon/locales/zh-HK.json | 9 ++++ app/javascript/mastodon/locales/zh-TW.json | 2 + config/locales/be.yml | 8 ++++ config/locales/devise.hu.yml | 2 +- config/locales/doorkeeper.hu.yml | 4 +- config/locales/es-AR.yml | 2 +- config/locales/es-MX.yml | 12 ++++++ config/locales/es.yml | 12 ++++++ config/locales/hu.yml | 48 +++++++++++----------- config/locales/is.yml | 3 ++ config/locales/ja.yml | 3 ++ config/locales/ko.yml | 2 +- config/locales/lt.yml | 19 ++++++--- config/locales/pt-PT.yml | 12 ++++++ config/locales/simple_form.hu.yml | 12 +++--- config/locales/simple_form.nl.yml | 4 +- config/locales/th.yml | 11 +++++ config/locales/zh-HK.yml | 13 ++++++ 46 files changed, 265 insertions(+), 56 deletions(-) diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 747c47960f..62ac7739d3 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -89,6 +89,7 @@ "announcement.announcement": "إعلان", "attachments_list.unprocessed": "(غير معالَج)", "audio.hide": "إخفاء المقطع الصوتي", + "block_modal.remote_users_caveat": "Do t’i kërkojmë shërbyesit {domain} të respektojë vendimin tuaj. Por, pajtimi s’është i garantuar, ngaqë disa shërbyes mund t’i trajtojnë ndryshe bllokimet. Psotimet publike mundet të jenë ende të dukshme për përdorues pa bërë hyrje në llogari.", "boost_modal.combo": "يُمكنك الضّغط على {combo} لتخطي هذا في المرة المُقبلة", "bundle_column_error.copy_stacktrace": "انسخ تقرير الخطأ", "bundle_column_error.error.body": "لا يمكن تقديم الصفحة المطلوبة. قد يكون بسبب خطأ في التعليمات البرمجية، أو مشكلة توافق المتصفح.", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 1ff94eca6c..754b7156b8 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -471,6 +471,7 @@ "notification.own_poll": "Ваша апытанне скончылася", "notification.poll": "Апытанне, дзе вы прынялі ўдзел, скончылася", "notification.reblog": "{name} пашырыў ваш допіс", + "notification.severed_relationships": "Зносіны з {name} былі разарваныя", "notification.status": "Новы допіс ад {name}", "notification.update": "Допіс {name} адрэдагаваны", "notification_requests.accept": "Прыняць", @@ -483,6 +484,7 @@ "notifications.column_settings.admin.sign_up": "Новыя ўваходы:", "notifications.column_settings.alert": "Апавяшчэнні на працоўным стале", "notifications.column_settings.favourite": "Упадабанае:", + "notifications.column_settings.filter_bar.advanced": "Паказаць усе катэгорыі", "notifications.column_settings.follow": "Новыя падпісчыкі:", "notifications.column_settings.follow_request": "Новыя запыты на падпіску:", "notifications.column_settings.mention": "Згадванні:", @@ -587,6 +589,8 @@ "refresh": "Абнавiць", "regeneration_indicator.label": "Загрузка…", "regeneration_indicator.sublabel": "Пачакайце, рыхтуем вашу стужку!", + "relationship_severance_notification.types.user_domain_block": "Вы заблакіравалі гэты дамен", + "relationship_severance_notification.view": "Праглядзець", "relative_time.days": "{number} д", "relative_time.full.days": "{number, plural, one {# дзень} few {# дні} many {# дзён} other {# дня}} таму", "relative_time.full.hours": "{number, plural, one {# гадзіна} few {# гадзіны} many {# гадзін} other {# гадзіны}} таму", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index ca32ba298a..97468c6272 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -220,7 +220,7 @@ "domain_pill.activitypub_lets_connect": "Det muliggør at komme i forbindelse og interagere med folk ikke kun på Mastodon, men også på tværs af forskellige sociale apps.", "domain_pill.activitypub_like_language": "ActivityPub er \"sproget\", Mastodon taler med andre sociale netværk.", "domain_pill.server": "Server", - "domain_pill.their_handle": "Deres handle:", + "domain_pill.their_handle": "Vedkommendes handle:", "domain_pill.username": "Brugernavn", "domain_pill.whats_in_a_handle": "Hvad er der i et handle (@brugernavn)?", "domain_pill.who_they_are": "Da et handle fortæller, hvem nogen er, og hvor de er, kan man interagere med folk på tværs af det sociale net af .", @@ -481,6 +481,8 @@ "notifications.column_settings.admin.sign_up": "Nye tilmeldinger:", "notifications.column_settings.alert": "Computernotifikationer", "notifications.column_settings.favourite": "Favoritter:", + "notifications.column_settings.filter_bar.advanced": "Vis alle kategorier", + "notifications.column_settings.filter_bar.category": "Hurtigfiltreringsbjælke", "notifications.column_settings.follow": "Nye følgere:", "notifications.column_settings.follow_request": "Nye følgeanmodninger:", "notifications.column_settings.mention": "Omtaler:", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index bed336f76b..8cc77c0725 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -484,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "Neue Registrierungen:", "notifications.column_settings.alert": "Desktop-Benachrichtigungen", "notifications.column_settings.favourite": "Favoriten:", + "notifications.column_settings.filter_bar.advanced": "Alle Filterkategorien anzeigen", + "notifications.column_settings.filter_bar.category": "Filterleiste", "notifications.column_settings.follow": "Neue Follower:", "notifications.column_settings.follow_request": "Neue Follower-Anfragen:", "notifications.column_settings.mention": "Erwähnungen:", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index fec707be62..a9db8831e2 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -427,7 +427,7 @@ "loading_indicator.label": "Cargando…", "media_gallery.toggle_visible": "Ocultar {number, plural, one {imagen} other {imágenes}}", "moved_to_account_banner.text": "Tu cuenta {disabledAccount} está actualmente deshabilitada porque te mudaste a {movedToAccount}.", - "mute_modal.hide_from_notifications": "Ocultar de las notificaciones", + "mute_modal.hide_from_notifications": "Ocultar en las notificaciones", "mute_modal.hide_options": "Ocultar opciones", "mute_modal.indefinite": "Hasta que deje de silenciarlos", "mute_modal.show_options": "Mostrar opciones", @@ -484,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "Nuevos registros:", "notifications.column_settings.alert": "Notificaciones de escritorio", "notifications.column_settings.favourite": "Favoritos:", + "notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías", + "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", "notifications.column_settings.follow": "Nuevos seguidores:", "notifications.column_settings.follow_request": "Nuevas solicitudes de seguimiento:", "notifications.column_settings.mention": "Menciones:", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 00dcb81461..dea71a9351 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -471,6 +471,7 @@ "notification.own_poll": "Tu encuesta ha terminado", "notification.poll": "Una encuesta en la que has votado ha terminado", "notification.reblog": "{name} ha retooteado tu estado", + "notification.severed_relationships": "Se han cortado las relaciones con {name}", "notification.status": "{name} acaba de publicar", "notification.update": "{name} editó una publicación", "notification_requests.accept": "Aceptar", @@ -483,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "Registros nuevos:", "notifications.column_settings.alert": "Notificaciones de escritorio", "notifications.column_settings.favourite": "Favoritos:", + "notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías", + "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", "notifications.column_settings.follow": "Nuevos seguidores:", "notifications.column_settings.follow_request": "Nuevas solicitudes de seguimiento:", "notifications.column_settings.mention": "Menciones:", @@ -587,6 +590,12 @@ "refresh": "Actualizar", "regeneration_indicator.label": "Cargando…", "regeneration_indicator.sublabel": "¡Tu historia de inicio se está preparando!", + "relationship_severance_notification.purged_data": "purgado por administradores", + "relationship_severance_notification.relationships": "{count, plural, one {# relación} other {# relaciones}}", + "relationship_severance_notification.types.account_suspension": "La cuenta ha sido suspendida", + "relationship_severance_notification.types.domain_block": "El dominio ha sido suspendido", + "relationship_severance_notification.types.user_domain_block": "Bloqueaste este dominio", + "relationship_severance_notification.view": "Ver", "relative_time.days": "{number} d", "relative_time.full.days": "{number, plural, one {# día} other {# días hace}}", "relative_time.full.hours": "{number, plural, one {# hora} other {# horas}} hace", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 728f4d05fc..64bcf7d9c0 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -471,6 +471,7 @@ "notification.own_poll": "Tu encuesta ha terminado", "notification.poll": "Una encuesta en la que has votado ha terminado", "notification.reblog": "{name} ha impulsado tu publicación", + "notification.severed_relationships": "Se han cortado las relaciones con {name}", "notification.status": "{name} acaba de publicar", "notification.update": "{name} editó una publicación", "notification_requests.accept": "Aceptar", @@ -483,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "Nuevos registros:", "notifications.column_settings.alert": "Notificaciones de escritorio", "notifications.column_settings.favourite": "Favoritos:", + "notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías", + "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", "notifications.column_settings.follow": "Nuevos seguidores:", "notifications.column_settings.follow_request": "Nuevas solicitudes de seguimiento:", "notifications.column_settings.mention": "Menciones:", @@ -587,6 +590,12 @@ "refresh": "Actualizar", "regeneration_indicator.label": "Cargando…", "regeneration_indicator.sublabel": "¡Tu historia de inicio se está preparando!", + "relationship_severance_notification.purged_data": "purgado por administradores", + "relationship_severance_notification.relationships": "{count, plural, one {# relación} other {# relaciones}}", + "relationship_severance_notification.types.account_suspension": "La cuenta ha sido suspendida", + "relationship_severance_notification.types.domain_block": "El dominio ha sido suspendido", + "relationship_severance_notification.types.user_domain_block": "Bloqueaste este dominio", + "relationship_severance_notification.view": "Ver", "relative_time.days": "{number} d", "relative_time.full.days": "hace {number, plural, one {# día} other {# días}}", "relative_time.full.hours": "hace {number, plural, one {# hora} other {# horas}}", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index bd0081d71a..8c3c5f9845 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -484,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "Izen-emate berriak:", "notifications.column_settings.alert": "Mahaigaineko jakinarazpenak", "notifications.column_settings.favourite": "Gogokoak:", + "notifications.column_settings.filter_bar.advanced": "Bistaratu kategoria guztiak", + "notifications.column_settings.filter_bar.category": "Iragazki-barra bizkorra", "notifications.column_settings.follow": "Jarraitzaile berriak:", "notifications.column_settings.follow_request": "Jarraitzeko eskaera berriak:", "notifications.column_settings.mention": "Aipamenak:", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index b784a1d5c0..6d6b7d612c 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -462,6 +462,8 @@ "notifications.permission_denied": "آگاهی‌های میزکار به دلیل رد کردن درخواست اجازهٔ پیشین مرورگر، در دسترس نیستند", "notifications.permission_denied_alert": "از آن‌جا که پیش از این اجازهٔ مرورگر رد شده است، آگاهی‌های میزکار نمی‌توانند به کار بیفتند", "notifications.permission_required": "آگاهی‌های میزکار در دسترس نیستند زیرا اجازه‌های لازم، اعطا نشده.", + "notifications.policy.filter_not_followers_title": "کسانی که شما را دنبال میکنند", + "notifications.policy.filter_not_following_hint": "", "notifications_permission_banner.enable": "به کار انداختن آگاهی‌های میزکار", "notifications_permission_banner.how_to_control": "برای دریافت آگاهی‌ها هنگام باز نبودن ماستودون، آگاهی‌های میزکار را به کار بیندازید. پس از به کار افتادنشان می‌توانید گونه‌های دقیق برهم‌کنش‌هایی که آگاهی‌های میزکار تولید می‌کنند را از {icon} بالا واپایید.", "notifications_permission_banner.title": "هرگز چیزی را از دست ندهید", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 2cf85926fc..16670d9ffe 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -484,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "Uudet rekisteröitymiset:", "notifications.column_settings.alert": "Työpöytäilmoitukset", "notifications.column_settings.favourite": "Suosikit:", + "notifications.column_settings.filter_bar.advanced": "Näytä kaikki luokat", + "notifications.column_settings.filter_bar.category": "Pikasuodatuspalkki", "notifications.column_settings.follow": "Uudet seuraajat:", "notifications.column_settings.follow_request": "Uudet seuraamispyynnöt:", "notifications.column_settings.mention": "Maininnat:", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 3ea13cc7f0..c86829ee30 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -484,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "Nýggjar tilmeldingar:", "notifications.column_settings.alert": "Skriviborðsfráboðanir", "notifications.column_settings.favourite": "Dámdir postar:", + "notifications.column_settings.filter_bar.advanced": "Vís allar bólkar", + "notifications.column_settings.filter_bar.category": "Skjótfilturbjálki", "notifications.column_settings.follow": "Nýggir fylgjarar:", "notifications.column_settings.follow_request": "Nýggjar umbønir um at fylgja:", "notifications.column_settings.mention": "Umrøður:", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 9c566909a7..612e363774 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -701,10 +701,10 @@ "status.direct_indicator": "Iomradh prìobhaideach", "status.edit": "Deasaich", "status.edited": "An deasachadh mu dheireadh {date}", - "status.edited_x_times": "Chaidh a dheasachadh {count, plural, one {{counter} turas} two {{counter} thuras} few {{counter} tursan} other {{counter} turas}}", + "status.edited_x_times": "Chaidh a dheasachadh {count, plural, one {{count} turas} two {{count} thuras} few {{count} tursan} other {{count} turas}}", "status.embed": "Leabaich", "status.favourite": "Cuir ris na h-annsachdan", - "status.favourites": "{count, plural, one {annsachd} two {annsachd} few {annsachdan} other {annsachd}", + "status.favourites": "{count, plural, one {annsachd} two {annsachd} few {annsachdan} other {annsachd}}", "status.filter": "Criathraich am post seo", "status.filtered": "Criathraichte", "status.hide": "Falaich am post", @@ -725,7 +725,7 @@ "status.reblog": "Brosnaich", "status.reblog_private": "Brosnaich leis an t-so-fhaicsinneachd tùsail", "status.reblogged_by": "’Ga bhrosnachadh le {name}", - "status.reblogs": "{count, plural, one {bhrosnachadh} two {bhrosnachadh} few {brosnachaidhean} other {brosnachadh}", + "status.reblogs": "{count, plural, one {bhrosnachadh} two {bhrosnachadh} few {brosnachaidhean} other {brosnachadh}}", "status.reblogs.empty": "Chan deach am post seo a bhrosnachadh le duine sam bith fhathast. Nuair a bhrosnaicheas cuideigin e, nochdaidh iad an-seo.", "status.redraft": "Sguab às ⁊ dèan dreachd ùr", "status.remove_bookmark": "Thoir an comharra-lìn air falbh", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 1f65c3549d..82dec2d863 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -484,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "הרשמות חדשות:", "notifications.column_settings.alert": "התראות לשולחן העבודה", "notifications.column_settings.favourite": "חיבובים:", + "notifications.column_settings.filter_bar.advanced": "להציג את כל הקטגוריות", + "notifications.column_settings.filter_bar.category": "שורת סינון מהיר", "notifications.column_settings.follow": "עוקבים חדשים:", "notifications.column_settings.follow_request": "בקשות מעקב חדשות:", "notifications.column_settings.mention": "פניות:", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index d050aa0311..b65df2fc51 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -483,6 +483,8 @@ "notifications.column_settings.admin.sign_up": "Nýjar skráningar:", "notifications.column_settings.alert": "Tilkynningar á skjáborði", "notifications.column_settings.favourite": "Eftirlæti:", + "notifications.column_settings.filter_bar.advanced": "Birta alla flokka", + "notifications.column_settings.filter_bar.category": "Skyndisíustika", "notifications.column_settings.follow": "Nýir fylgjendur:", "notifications.column_settings.follow_request": "Nýjar beiðnir um að fylgjast með:", "notifications.column_settings.mention": "Tilvísanir:", @@ -587,6 +589,8 @@ "refresh": "Endurlesa", "regeneration_indicator.label": "Hleð inn…", "regeneration_indicator.sublabel": "Verið er að útbúa heimastreymið þitt!", + "relationship_severance_notification.relationships": "{count, plural, one {# tengsl} other {# tengsl}}", + "relationship_severance_notification.view": "Skoða", "relative_time.days": "{number}d", "relative_time.full.days": "Fyrir {number, plural, one {# degi} other {# dögum}} síðan", "relative_time.full.hours": "Fyrir {number, plural, one {# klukkustund} other {# klukkustundum}} síðan", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 7d5df9198d..090278b83b 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -484,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "Nuove iscrizioni:", "notifications.column_settings.alert": "Notifiche desktop", "notifications.column_settings.favourite": "Preferiti:", + "notifications.column_settings.filter_bar.advanced": "Mostra tutte le categorie", + "notifications.column_settings.filter_bar.category": "Barra del filtro veloce", "notifications.column_settings.follow": "Nuovi seguaci:", "notifications.column_settings.follow_request": "Nuove richieste di seguirti:", "notifications.column_settings.mention": "Menzioni:", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 66811eafd6..1f1065f5fd 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -89,6 +89,14 @@ "announcement.announcement": "お知らせ", "attachments_list.unprocessed": "(未処理)", "audio.hide": "音声を閉じる", + "block_modal.remote_users_caveat": "このサーバーはあなたのブロックの意思を尊重するように {domain} へ通知します。しかしながら、ブロックの扱い方はサーバーによってさまざまで、相手のサーバーは必ずしもこのブロックを適切に取り扱うものではないことに留意が必要です。また、あなたの公開投稿はサーバーからログアウトすれば誰からも見ることができます。", + "block_modal.show_less": "注意事項を閉じる", + "block_modal.show_more": "注意事項", + "block_modal.they_cant_mention": "相手はあなたへの返信やフォローができなくなります。", + "block_modal.they_cant_see_posts": "相手はあなたの投稿を閲覧できなくなり、あなたも相手の投稿を閲覧できなくなります。", + "block_modal.they_will_know": "ブロックは相手からわかります。", + "block_modal.title": "ユーザーをブロックしますか?", + "block_modal.you_wont_see_mentions": "宛先に相手が入っている投稿も閲覧できなくなります。", "boost_modal.combo": "次からは{combo}を押せばスキップできます", "bundle_column_error.copy_stacktrace": "エラーレポートをコピー", "bundle_column_error.error.body": "要求されたページをレンダリングできませんでした。コードのバグ、またはブラウザの互換性の問題が原因である可能性があります。", @@ -200,6 +208,14 @@ "dismissable_banner.explore_statuses": "ネットワーク上で注目を集めている投稿です。ブーストやお気に入り登録の多い新しい投稿が上位に表示されます。", "dismissable_banner.explore_tags": "ネットワーク上でトレンドになっているハッシュタグです。たくさんのユーザーに使われたタグほど上位に表示されます。", "dismissable_banner.public_timeline": "{domain}のユーザーがリモートフォローしているアカウントからの公開投稿のタイムラインです。", + "domain_block_modal.block": "サーバーをブロック", + "domain_block_modal.block_account_instead": "@{name} さんのみをブロック", + "domain_block_modal.they_can_interact_with_old_posts": "あなたの今までの投稿は、引き続きこのサーバーのユーザーが閲覧できます。", + "domain_block_modal.they_cant_follow": "このサーバーのユーザーはあなたをフォローできなくなります。", + "domain_block_modal.they_wont_know": "ドメインブロックは相手からはわかりません。", + "domain_block_modal.title": "ドメインをブロックしますか?", + "domain_block_modal.you_will_lose_followers": "このサーバーのフォロワーはすべてフォロー解除されます。", + "domain_block_modal.you_wont_see_posts": "このサーバーのユーザーからの投稿や通知が閲覧できなくなります。", "embed.instructions": "下記のコードをコピーしてウェブサイトに埋め込みます。", "embed.preview": "表示例:", "emoji_button.activity": "活動", @@ -397,6 +413,15 @@ "loading_indicator.label": "読み込み中…", "media_gallery.toggle_visible": "{number, plural, one {画像を閉じる} other {画像を閉じる}}", "moved_to_account_banner.text": "あなたのアカウント『{disabledAccount}』は『{movedToAccount}』に移動したため現在無効になっています。", + "mute_modal.hide_from_notifications": "通知をオフにする", + "mute_modal.hide_options": "オプションを閉じる", + "mute_modal.indefinite": "無期限", + "mute_modal.show_options": "オプションを表示", + "mute_modal.they_can_mention_and_follow": "相手はあなたへの返信やフォローができますが、あなたには見えません。", + "mute_modal.they_wont_know": "ミュートは相手からはわかりません。", + "mute_modal.title": "ユーザーをミュートしますか?", + "mute_modal.you_wont_see_mentions": "宛先に相手が入っている投稿も閲覧できなくなります。", + "mute_modal.you_wont_see_posts": "相手はあなたの投稿を今までどおり閲覧できますが、あなたは相手の投稿を閲覧できなくなります。", "navigation_bar.about": "概要", "navigation_bar.advanced_interface": "上級者向けUIに戻る", "navigation_bar.blocks": "ブロックしたユーザー", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index da354f3910..5553636f26 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -484,6 +484,7 @@ "notifications.column_settings.admin.sign_up": "새로운 가입:", "notifications.column_settings.alert": "데스크탑 알림", "notifications.column_settings.favourite": "좋아요:", + "notifications.column_settings.filter_bar.advanced": "모든 범주 표시", "notifications.column_settings.follow": "새 팔로워:", "notifications.column_settings.follow_request": "새 팔로우 요청:", "notifications.column_settings.mention": "멘션:", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index f9ef7e242c..728485b2bc 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -555,6 +555,9 @@ "refresh": "Atnaujinti", "regeneration_indicator.label": "Kraunama…", "regeneration_indicator.sublabel": "Ruošiamas tavo pagrindinis srautas!", + "relationship_severance_notification.relationships": "{count, plural, one {# santykis} few {# santykiai} many {# santykio} other {# santykių}}", + "relationship_severance_notification.types.user_domain_block": "Užblokavai šį domeną", + "relationship_severance_notification.view": "Peržiūrėti", "relative_time.days": "{number} d.", "relative_time.full.days": "prieš {number, plural, one {# dieną} few {# dienas} many {# dienos} other {# dienų}}", "relative_time.full.hours": "prieš {number, plural, one {# valandą} few {# valandas} many {# valandos} other {# valandų}}", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 4be0808f23..1e710bda45 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -205,10 +205,10 @@ "disabled_account_banner.text": "Jouw account {disabledAccount} is momenteel uitgeschakeld.", "dismissable_banner.community_timeline": "Dit zijn de meest recente openbare berichten van accounts op {domain}. Je kunt onder 'instellingen > voorkeuren > overig' kiezen welke talen je wilt zien.", "dismissable_banner.dismiss": "Sluiten", - "dismissable_banner.explore_links": "Dit zijn nieuwsberichten die vandaag het meest op het sociale web worden gedeeld. Nieuwere nieuwsberichten die door meer verschillende mensen zijn geplaatst staan hoger op de lijst.", - "dismissable_banner.explore_statuses": "Dit zijn berichten op het sociale web die vandaag aan populariteit winnen. Nieuwere berichten met meer boosts en favorieten staan hoger.", - "dismissable_banner.explore_tags": "Deze hashtags winnen aan populariteit op het sociale web. Hashtags die door meer verschillende mensen worden gebruikt staan hoger.", - "dismissable_banner.public_timeline": "Dit zijn de meest recente openbare berichten van accounts op het sociale web die door mensen op {domain} worden gevolgd.", + "dismissable_banner.explore_links": "Dit zijn nieuwsberichten die vandaag het meest op het sociale web (fediverse) worden gedeeld. Nieuwere nieuwsberichten die door meer verschillende mensen zijn geplaatst staan hoger op de lijst.", + "dismissable_banner.explore_statuses": "Dit zijn berichten op het sociale web (fediverse) die vandaag aan populariteit winnen. Nieuwere berichten met meer boosts en favorieten staan hoger.", + "dismissable_banner.explore_tags": "Deze hashtags winnen aan populariteit op het sociale web (fediverse). Hashtags die door meer verschillende mensen worden gebruikt staan hoger.", + "dismissable_banner.public_timeline": "Dit zijn de meest recente openbare berichten van accounts op het sociale web (fediverse) die door mensen op {domain} worden gevolgd.", "domain_block_modal.block": "Server blokkeren", "domain_block_modal.block_account_instead": "In plaats hiervan {name} blokkeren", "domain_block_modal.they_can_interact_with_old_posts": "Mensen op deze server kunnen interactie hebben met jouw oude berichten.", @@ -220,14 +220,14 @@ "domain_pill.activitypub_lets_connect": "Het zorgt ervoor dat je niet alleen maar kunt verbinden en communiceren met mensen op Mastodon, maar ook met andere sociale apps.", "domain_pill.activitypub_like_language": "ActivityPub is de taal die Mastodon met andere sociale netwerken spreekt.", "domain_pill.server": "Server", - "domain_pill.their_handle": "Hun Mastodon-adres:", + "domain_pill.their_handle": "Hun fediverse-adres:", "domain_pill.their_server": "Hun digitale thuis, waar al hun berichten zich bevinden.", "domain_pill.their_username": "Hun unieke identificatie-adres op hun server. Het is mogelijk dat er gebruikers met dezelfde gebruikersnaam op verschillende servers te vinden zijn.", "domain_pill.username": "Gebruikersnaam", - "domain_pill.whats_in_a_handle": "Wat is een Mastodon-adres?", - "domain_pill.who_they_are": "Omdat je aan een Mastodon-adres kunt zien wie iemand is en waar die zich bevindt, kun je met mensen op het door sociale web communiceren.", - "domain_pill.who_you_are": "Omdat je aan jouw Mastodon-adres kunt zien wie jij bent is en waar je je bevindt, kunnen mensen op het door sociale web met jou communiceren.", - "domain_pill.your_handle": "Jouw Mastodon-adres:", + "domain_pill.whats_in_a_handle": "Wat is een fediverse-adres?", + "domain_pill.who_they_are": "Omdat je aan een fediverse-adres kunt zien wie iemand is en waar die zich bevindt, kun je met mensen op het door sociale web (fediverse) communiceren.", + "domain_pill.who_you_are": "Omdat je aan jouw fediverse-adres kunt zien wie jij bent is en waar je je bevindt, kunnen mensen op het door sociale web (fediverse) met jou communiceren.", + "domain_pill.your_handle": "Jouw fediverse-adres:", "domain_pill.your_server": "Jouw digitale thuis, waar al jouw berichten zich bevinden. Is deze server toch niet naar jouw wens? Dan kun je op elk moment naar een andere server verhuizen en ook jouw volgers overbrengen.", "domain_pill.your_username": "Jouw unieke identificatie-adres op deze server. Het is mogelijk dat er gebruikers met dezelfde gebruikersnaam op verschillende servers te vinden zijn.", "embed.instructions": "Embed dit bericht op jouw website door de onderstaande code te kopiëren.", @@ -484,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "Nieuwe registraties:", "notifications.column_settings.alert": "Desktopmeldingen", "notifications.column_settings.favourite": "Favorieten:", + "notifications.column_settings.filter_bar.advanced": "Alle categorieën tonen", + "notifications.column_settings.filter_bar.category": "Snelle filterbalk", "notifications.column_settings.follow": "Nieuwe volgers:", "notifications.column_settings.follow_request": "Nieuw volgverzoek:", "notifications.column_settings.mention": "Vermeldingen:", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 782ea9d762..3ee134d6c5 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -471,6 +471,7 @@ "notification.own_poll": "Twoje głosowanie zakończyło się", "notification.poll": "Głosowanie w którym brałeś(-aś) udział zakończyło się", "notification.reblog": "Twój post został podbity przez {name}", + "notification.severed_relationships": "Zerwano związki z {name}", "notification.status": "{name} opublikował(a) nowy wpis", "notification.update": "{name} edytował(a) post", "notification_requests.accept": "Akceptuj", @@ -483,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "Nowe rejestracje:", "notifications.column_settings.alert": "Powiadomienia na pulpicie", "notifications.column_settings.favourite": "Ulubione:", + "notifications.column_settings.filter_bar.advanced": "Wyświetl wszystkie kategorie", + "notifications.column_settings.filter_bar.category": "Szybkie filtrowanie", "notifications.column_settings.follow": "Nowi obserwujący:", "notifications.column_settings.follow_request": "Nowe prośby o możliwość obserwacji:", "notifications.column_settings.mention": "Wspomnienia:", @@ -587,6 +590,12 @@ "refresh": "Odśwież", "regeneration_indicator.label": "Ładuję…", "regeneration_indicator.sublabel": "Twoja oś czasu jest przygotowywana!", + "relationship_severance_notification.purged_data": "wyczyszczone przez administratorów", + "relationship_severance_notification.relationships": "{count, plural, one {# związek} few {# związki} other {# związków}}", + "relationship_severance_notification.types.account_suspension": "Konto zostało zawieszone", + "relationship_severance_notification.types.domain_block": "Domena została zawieszona", + "relationship_severance_notification.types.user_domain_block": "Domena przez ciebie blokowana", + "relationship_severance_notification.view": "Pokaż", "relative_time.days": "{number} dni", "relative_time.full.days": "{number, plural, one {# dzień} few {# dni} many {# dni} other {# dni}} temu", "relative_time.full.hours": "{number, plural, one {# godzinę} few {# godziny} many {# godzin} other {# godzin}} temu", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index d4b37ffe6d..6732973d5a 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -471,6 +471,7 @@ "notification.own_poll": "A sua votação terminou", "notification.poll": "Uma votação em que participaste chegou ao fim", "notification.reblog": "{name} reforçou a tua publicação", + "notification.severed_relationships": "Relações com {name} cessadas", "notification.status": "{name} acabou de publicar", "notification.update": "{name} editou uma publicação", "notification_requests.accept": "Aceitar", @@ -483,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "Novas inscrições:", "notifications.column_settings.alert": "Notificações no ambiente de trabalho", "notifications.column_settings.favourite": "Favoritos:", + "notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorias", + "notifications.column_settings.filter_bar.category": "Barra de filtros rápidos", "notifications.column_settings.follow": "Novos seguidores:", "notifications.column_settings.follow_request": "Novos pedidos de seguidor:", "notifications.column_settings.mention": "Menções:", @@ -587,6 +590,12 @@ "refresh": "Actualizar", "regeneration_indicator.label": "A carregar…", "regeneration_indicator.sublabel": "A tua página inicial está a ser preparada!", + "relationship_severance_notification.purged_data": "purgado pelos administradores", + "relationship_severance_notification.relationships": "{count, plural,one {# relação} other {# relações}}", + "relationship_severance_notification.types.account_suspension": "A conta foi suspensa", + "relationship_severance_notification.types.domain_block": "O domínio foi suspenso", + "relationship_severance_notification.types.user_domain_block": "Bloqueou este domínio", + "relationship_severance_notification.view": "Visualizar", "relative_time.days": "{number}d", "relative_time.full.days": "{number, plural,one {# dia} other {# dias}} atrás", "relative_time.full.hours": "{number, plural,one {# hora}other {# horas}} atrás", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index dd21d3030a..0ab1475699 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -406,6 +406,7 @@ "loading_indicator.label": "Načítavanie…", "media_gallery.toggle_visible": "{number, plural, one {Skryť obrázok} other {Skryť obrázky}}", "moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálne deaktivovaný, pretože ste sa presunuli na {movedToAccount}.", + "mute_modal.hide_from_notifications": "Ukryť z upozornení", "mute_modal.hide_options": "Skryť možnosti", "mute_modal.show_options": "Zobraziť možnosti", "mute_modal.title": "Stíšiť užívateľa?", @@ -456,6 +457,7 @@ "notifications.column_settings.admin.sign_up": "Nové registrácie:", "notifications.column_settings.alert": "Upozornenia na ploche", "notifications.column_settings.favourite": "Ohviezdičkované:", + "notifications.column_settings.filter_bar.advanced": "Zobraziť všetky kategórie", "notifications.column_settings.follow": "Nové sledovania od:", "notifications.column_settings.follow_request": "Nové žiadosti o sledovanie od:", "notifications.column_settings.mention": "Označenia:", @@ -555,6 +557,7 @@ "refresh": "Obnoviť", "regeneration_indicator.label": "Načítavanie…", "regeneration_indicator.sublabel": "Váš domovský kanál sa pripravuje.", + "relationship_severance_notification.types.user_domain_block": "Túto doménu si zablokoval/a", "relationship_severance_notification.view": "Zobraziť", "relative_time.days": "{number} dní", "relative_time.full.days": "Pred {number, plural, one {# dňom} other {# dňami}}", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index a5122d098b..d69231d823 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -483,6 +483,8 @@ "notifications.column_settings.admin.sign_up": "Regjistrime të reja:", "notifications.column_settings.alert": "Njoftime desktopi", "notifications.column_settings.favourite": "Të parapëlqyer:", + "notifications.column_settings.filter_bar.advanced": "Shfaq krejt kategoritë", + "notifications.column_settings.filter_bar.category": "Shtyllë filtrimesh të shpejta", "notifications.column_settings.follow": "Ndjekës të rinj:", "notifications.column_settings.follow_request": "Kërkesa të reja për ndjekje:", "notifications.column_settings.mention": "Përmendje:", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 016007f499..b28b4826d4 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -471,6 +471,7 @@ "notifications.column_settings.admin.sign_up": "Nya registreringar:", "notifications.column_settings.alert": "Skrivbordsaviseringar", "notifications.column_settings.favourite": "Favoriter:", + "notifications.column_settings.filter_bar.advanced": "Visa alla kategorier", "notifications.column_settings.follow": "Nya följare:", "notifications.column_settings.follow_request": "Ny följ-förfrågan:", "notifications.column_settings.mention": "Omnämningar:", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index ce3b4eaa25..4490f038ca 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -471,6 +471,7 @@ "notification.own_poll": "การสำรวจความคิดเห็นของคุณได้สิ้นสุดแล้ว", "notification.poll": "การสำรวจความคิดเห็นที่คุณได้ลงคะแนนได้สิ้นสุดแล้ว", "notification.reblog": "{name} ได้ดันโพสต์ของคุณ", + "notification.severed_relationships": "ตัดขาดความสัมพันธ์กับ {name} แล้ว", "notification.status": "{name} เพิ่งโพสต์", "notification.update": "{name} ได้แก้ไขโพสต์", "notification_requests.accept": "ยอมรับ", @@ -483,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "การลงทะเบียนใหม่:", "notifications.column_settings.alert": "การแจ้งเตือนบนเดสก์ท็อป", "notifications.column_settings.favourite": "รายการโปรด:", + "notifications.column_settings.filter_bar.advanced": "แสดงหมวดหมู่ทั้งหมด", + "notifications.column_settings.filter_bar.category": "แถบตัวกรองด่วน", "notifications.column_settings.follow": "ผู้ติดตามใหม่:", "notifications.column_settings.follow_request": "คำขอติดตามใหม่:", "notifications.column_settings.mention": "การกล่าวถึง:", @@ -587,6 +590,12 @@ "refresh": "รีเฟรช", "regeneration_indicator.label": "กำลังโหลด…", "regeneration_indicator.sublabel": "กำลังเตรียมฟีดหน้าแรกของคุณ!", + "relationship_severance_notification.purged_data": "ล้างข้อมูลโดยผู้ดูแล", + "relationship_severance_notification.relationships": "{count, plural, other {# ความสัมพันธ์}}", + "relationship_severance_notification.types.account_suspension": "ระงับบัญชีแล้ว", + "relationship_severance_notification.types.domain_block": "ระงับโดเมนแล้ว", + "relationship_severance_notification.types.user_domain_block": "คุณได้ปิดกั้นโดเมนนี้", + "relationship_severance_notification.view": "ดู", "relative_time.days": "{number} วัน", "relative_time.full.days": "{number, plural, other {# วัน}}ที่แล้ว", "relative_time.full.hours": "{number, plural, other {# ชั่วโมง}}ที่แล้ว", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 799400ea35..12d82c70ec 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -484,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "Yeni kayıtlar:", "notifications.column_settings.alert": "Masaüstü bildirimleri", "notifications.column_settings.favourite": "Favorilerin:", + "notifications.column_settings.filter_bar.advanced": "Tüm kategorileri görüntüle", + "notifications.column_settings.filter_bar.category": "Hızlı filtre çubuğu", "notifications.column_settings.follow": "Yeni takipçiler:", "notifications.column_settings.follow_request": "Yeni takip istekleri:", "notifications.column_settings.mention": "Değinmeler:", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 3456327a67..f2e58f0937 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -473,6 +473,8 @@ "notifications.column_settings.admin.sign_up": "Нові реєстрації:", "notifications.column_settings.alert": "Сповіщення стільниці", "notifications.column_settings.favourite": "Уподобане:", + "notifications.column_settings.filter_bar.advanced": "Показати всі категорії", + "notifications.column_settings.filter_bar.category": "Панель швидкого фільтру", "notifications.column_settings.follow": "Нові підписники:", "notifications.column_settings.follow_request": "Нові запити на підписку:", "notifications.column_settings.mention": "Згадки:", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index cc68ab762f..52a98d0005 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -484,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "新注册:", "notifications.column_settings.alert": "桌面通知", "notifications.column_settings.favourite": "喜欢:", + "notifications.column_settings.filter_bar.advanced": "显示所有类别", + "notifications.column_settings.filter_bar.category": "快速筛选栏", "notifications.column_settings.follow": "新粉丝:", "notifications.column_settings.follow_request": "新关注请求:", "notifications.column_settings.mention": "提及:", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 44a1435b2f..68be293df9 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -471,6 +471,7 @@ "notification.own_poll": "你的投票已結束", "notification.poll": "你參與過的一個投票已經結束", "notification.reblog": "{name} 轉推你的文章", + "notification.severed_relationships": "已斷絕與 {name} 的關係", "notification.status": "{name} 剛發表了文章", "notification.update": "{name} 編輯了帖文", "notification_requests.accept": "接受", @@ -587,6 +588,12 @@ "refresh": "重新整理", "regeneration_indicator.label": "載入中……", "regeneration_indicator.sublabel": "你的主頁時間軸正在準備中!", + "relationship_severance_notification.purged_data": "已被管理員清除", + "relationship_severance_notification.relationships": "{count, plural, one {# 個關係} other {# 個關係}}", + "relationship_severance_notification.types.account_suspension": "帳號已被停權", + "relationship_severance_notification.types.domain_block": "網域已被停權", + "relationship_severance_notification.types.user_domain_block": "你封鎖了此網域", + "relationship_severance_notification.view": "查看", "relative_time.days": "{number}日前", "relative_time.full.days": "{number, plural, one {# 天} other {# 天}}前", "relative_time.full.hours": "{number, plural, one {# 小時} other {# 小時}}前", @@ -697,6 +704,7 @@ "status.edited_x_times": "Edited {count, plural, one {{count} 次} other {{count} 次}}", "status.embed": "嵌入", "status.favourite": "最愛", + "status.favourites": "{count, plural, one {則最愛} other {則最愛}}", "status.filter": "篩選此帖文", "status.filtered": "已過濾", "status.hide": "隱藏帖文", @@ -717,6 +725,7 @@ "status.reblog": "轉推", "status.reblog_private": "轉推到原讀者", "status.reblogged_by": "{name} 轉推", + "status.reblogs": "{count, plural, one {則轉推} other {則轉推}}", "status.reblogs.empty": "還未有人轉推。有的話會顯示在這裡。", "status.redraft": "刪除並編輯", "status.remove_bookmark": "移除書籤", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 228430dd80..d8e1e1e32b 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -484,6 +484,8 @@ "notifications.column_settings.admin.sign_up": "新註冊帳號:", "notifications.column_settings.alert": "桌面通知", "notifications.column_settings.favourite": "最愛:", + "notifications.column_settings.filter_bar.advanced": "顯示所有分類", + "notifications.column_settings.filter_bar.category": "快速過濾器", "notifications.column_settings.follow": "新的跟隨者:", "notifications.column_settings.follow_request": "新的跟隨請求:", "notifications.column_settings.mention": "提及:", diff --git a/config/locales/be.yml b/config/locales/be.yml index 63f605e9fb..cdfc9cb39c 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1712,6 +1712,14 @@ be: strikes: Папярэджанні мадэратараў two_factor_authentication: Двухфактарная аўтэнтыфікацыя webauthn_authentication: Ключы бяспекі + severed_relationships: + download: Спампаваць (%{count}) + event_type: + user_domain_block: Вы заблакіравалі %{target_name} + lost_followers: Страчаныя падпісчыкі + lost_follows: Страчаныя падпіскі + preamble: Вы можаце страціць падпіскі і падпісчыкаў, калі заблакіруеце дамен або калі вашы мадэратары вырашаць прыпыніць зносіны з серверам. Калі гэта адбудзецца, вы зможаце загрузіць спіс страчаных зносін, каб праверыць іх і, магчыма, імпартаваць на іншы сервер. + type: Падзея statuses: attached: audio: diff --git a/config/locales/devise.hu.yml b/config/locales/devise.hu.yml index 8c9fdf6a50..459bd01d9d 100644 --- a/config/locales/devise.hu.yml +++ b/config/locales/devise.hu.yml @@ -54,7 +54,7 @@ hu: title: Kétlépcsős hitelesítés kikapcsolva two_factor_enabled: explanation: Egy párosított TOTP appal generált tokenre lesz szükség a bejelentkezéshez. - subject: 'Mastodon: Kétlépcsős azonosítás engedélyezve' + subject: 'Mastodon: kétlépcsős hitelesítés engedélyezve' subtitle: A kétlépcsős hitelesítés a fiókodhoz aktiválva lett. title: Kétlépcsős hitelesítés engedélyezve two_factor_recovery_codes_changed: diff --git a/config/locales/doorkeeper.hu.yml b/config/locales/doorkeeper.hu.yml index 4559dcbd31..f03f6b58b4 100644 --- a/config/locales/doorkeeper.hu.yml +++ b/config/locales/doorkeeper.hu.yml @@ -38,7 +38,7 @@ hu: application: Alkalmazás callback_url: Visszahívási URL delete: Eltávolítás - empty: Nincsenek saját alkalmazások. + empty: Nincsenek saját alkalmazásaid. name: Név new: Új alkalmazás scopes: Hatókörök @@ -129,7 +129,7 @@ hu: crypto: Végpontok közti titkosítás favourites: Kedvencek filters: Szűrők - follow: Követések, Némítások és Letiltások + follow: Követések, némítások és letiltások follows: Követések lists: Listák media: Médiamellékletek diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index fd53f9d4fd..e10183be15 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1046,7 +1046,7 @@ es-AR: apply_for_account: Solicitar una cuenta captcha_confirmation: help_html: Si tenés problemas resolviendo la CAPTCHA, podés ponerte en contacto con nosotros a través de %{email} y te vamos a ayudar. - hint_html: ¡Sólo una cosa más! Necesitamos confirmar que sos humano (¡esto es para que podamos mantener el spam fuera!). Resuelvé la CAPTCHA abajo y hacé clic en "Continuar". + hint_html: ¡Solo una cosa más! Necesitamos confirmar que sos humano (¡esto es para que podamos mantener el spam fuera!). Resolvé la CAPTCHA abajo y hacé clic en "Continuar". title: Comprobación de seguridad confirmations: awaiting_review: "¡Tu dirección de correo electrónico fue confirmada! El equipo de %{domain} está revisando tu registro. ¡Recibirás un correo electrónico si aprueban tu cuenta!" diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 24b4af7ecd..f497de5683 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -1659,10 +1659,22 @@ es-MX: preferences: Preferencias profile: Perfil relationships: Siguiendo y seguidores + severed_relationships: Relaciones cortadas statuses_cleanup: Eliminación automática de publicaciones strikes: Amonestaciones de moderación two_factor_authentication: Autenticación de dos factores webauthn_authentication: Claves de seguridad + severed_relationships: + download: Descargar (%{count}) + event_type: + account_suspension: Suspensión de cuenta (%{target_name}) + domain_block: Suspensión del servidor (%{target_name}) + user_domain_block: Bloqueaste %{target_name} + lost_followers: Seguidores perdidos + lost_follows: Cuentas seguidas perdidas + preamble: Puedes perder cuentas seguidas y seguidores cuando bloqueas un dominio o cuando tus moderadores deciden suspender un servidor remoto. Cuando esto suceda, podrás descargar listas de relaciones cortadas, para ser inspeccionadas y posiblemente importadas en otro servidor. + purged: La información sobre este servidor ha sido purgada por los administradores de tu servidor. + type: Suceso statuses: attached: audio: diff --git a/config/locales/es.yml b/config/locales/es.yml index 22ee45d3bf..b5b98bb88f 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1659,10 +1659,22 @@ es: preferences: Preferencias profile: Perfil relationships: Siguiendo y seguidores + severed_relationships: Relaciones cortadas statuses_cleanup: Eliminación automática de publicaciones strikes: Amonestaciones de moderación two_factor_authentication: Autenticación de dos factores webauthn_authentication: Claves de seguridad + severed_relationships: + download: Descargar (%{count}) + event_type: + account_suspension: Suspensión de cuenta (%{target_name}) + domain_block: Suspensión del servidor (%{target_name}) + user_domain_block: Bloqueaste %{target_name} + lost_followers: Seguidores perdidos + lost_follows: Cuentas seguidas perdidas + preamble: Puedes perder cuentas seguidas y seguidores cuando bloqueas un dominio o cuando tus moderadores deciden suspender un servidor remoto. Cuando esto suceda, podrás descargar listas de relaciones cortadas, para ser inspeccionadas y posiblemente importadas en otro servidor. + purged: La información sobre este servidor ha sido purgada por los administradores de tu servidor. + type: Suceso statuses: attached: audio: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 4ea0a9652f..e29ce37523 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -139,7 +139,7 @@ hu: only_password: Csak jelszó password_and_2fa: Jelszó és kétlépcsős hitelesítés sensitive: Kényes - sensitized: kényesnek jelölve + sensitized: Kényesnek jelölve shared_inbox_url: Megosztott bejövő üzenetek URL show: created_reports: Létrehozott jelentések @@ -257,7 +257,7 @@ hu: destroy_status_html: "%{name} eltávolította %{target} felhasználó bejegyzését" destroy_unavailable_domain_html: "%{name} újraindította a kézbesítést a %{target} domainbe" destroy_user_role_html: "%{name} törölte a(z) %{target} szerepkört" - disable_2fa_user_html: "%{name} kikapcsolta a kétlépcsős azonosítást %{target} felhasználó fiókján" + disable_2fa_user_html: "%{name} kikapcsolta a kétlépcsős hitelesítést %{target} felhasználó fiókján" disable_custom_emoji_html: "%{name} letiltotta az emodzsit: %{target}" disable_sign_in_token_auth_user_html: "%{name} letiltotta a tokenes e-mail hitelesítést %{target} felhasználóra" disable_user_html: "%{name} letiltotta %{target} felhasználó bejelentkezését" @@ -716,7 +716,7 @@ hu: manage_taxonomies: Taxonómiák kezelése manage_taxonomies_description: Lehetővé teszi, hogy a felhasználó átnézze a felkapott tartalmakat és frissítse a hashtagek beállításait manage_user_access: Felhasználói hozzáférések kezelése - manage_user_access_description: Lehetővé teszi, hogy a felhasználó letiltsa mások kétlépcsős azonosítását, megváltoztassa az email címüket, és alaphelyzetbe állítsa a jelszavukat + manage_user_access_description: Lehetővé teszi, hogy a felhasználó letiltsa mások kétlépcsős hitelesítését, megváltoztassa az e-mail-címüket, és alaphelyzetbe állítsa a jelszavukat manage_users: Felhasználók kezelése manage_users_description: Lehetővé teszi, hogy a felhasználó megtekintse mások részletes adatait és moderálja őket manage_webhooks: Webhookok kezelése @@ -1057,7 +1057,7 @@ hu: redirect_to_app_html: Át kellett volna irányítsunk a %{app_name} alkalmazáshoz. Ha ez nem történt meg, próbálkozz a %{clicking_this_link} lehetőséggel vagy térj vissza manuálisan az alkalmazáshoz. registration_complete: A regisztrációd %{domain} domainen befejeződött! welcome_title: Üdvözlet, %{name}! - wrong_email_hint: Ha az emailcím nem helyes, a fiókbeállításokban megváltoztathatod. + wrong_email_hint: Ha az e-mail-cím nem helyes, a fiókbeállításokban megváltoztathatod. delete_account: Felhasználói fiók törlése delete_account_html: Felhasználói fiókod törléséhez kattints ide. A rendszer újbóli megerősítést fog kérni. description: @@ -1074,7 +1074,7 @@ hu: login: Bejelentkezés logout: Kijelentkezés migrate_account: Felhasználói fiók költöztetése - migrate_account_html: Ha szeretnéd átirányítani ezt a fiókodat egy másikra, a beállításokat itt találod meg. + migrate_account_html: Ha át szeretnéd irányítani ezt a fiókodat egy másikra, akkor itt állíthatod be. or_log_in_with: Vagy jelentkezz be ezzel privacy_policy_agreement_html: Elolvastam és egyetértek az adatvédemi nyilatkozattal progress: @@ -1133,7 +1133,7 @@ hu: invalid_signature: érvénytelen Ed25519 aláírás date: formats: - default: "%Y.%b.%d." + default: "%Y. %b %d." with_month_name: "%Y. %B %d" datetime: distance_in_words: @@ -1223,17 +1223,17 @@ hu: exports: archive_takeout: date: Dátum - download: Archív letöltése + download: Archívum letöltése hint_html: Itt kérhető egy archív az összes feltöltött bejegyzésedről és médiádról. Az exportált adatok ActivityPub formátumban lesznek, melyet bármilyen szabványos program tud olvasni. 7 naponként kérhetsz ilyen archívot. - in_progress: Archív összeállítása... - request: Archív kérése + in_progress: Archívum összeállítása… + request: Archívum kérése size: Méret - blocks: Tiltólistádon - bookmarks: Könyvjelzők + blocks: Tiltás + bookmarks: Könyvjelző csv: CSV - domain_blocks: Tiltott domainjeid - lists: Listáid - mutes: Némításaid + domain_blocks: Tiltott domain + lists: Lista + mutes: Némítás storage: Médiatároló featured_tags: add_new: Új hozzáadása @@ -1413,7 +1413,7 @@ hu: follow_request: követési kérelemről email értesítő mention: megemlítésről email értesítő reblog: megtolásról email értesítő - resubscribe_html: Ha tévedésből iratkoztál le, újra feliratkozhatsz az email értesítések beállításainál. + resubscribe_html: Ha tévedésből iratkoztál le, újra feliratkozhatsz az e-mail-értesítések beállításainál. success_html: 'Mostantól nem kapsz %{type} típusú üzeneket a(z) %{domain} Mastodon-kiszolgálón erre a címedre: %{email}.' title: Leiratkozás media_attachments: @@ -1496,7 +1496,7 @@ hu: subject: "%{name} szerkesztett egy bejegyzést" notifications: administration_emails: Adminisztrátori e-mail-értesítések - email_events: Események email értesítésekhez + email_events: Az e-mail-értesítések eseményei email_events_hint: 'Válaszd ki azokat az eseményeket, melyekről értesítést szeretnél:' number: human: @@ -1510,7 +1510,7 @@ hu: trillion: T otp_authentication: code_hint: Jóváhagyáshoz írd be a hitelesítő alkalmazás által generált kódot - description_html: Ha engedélyezed a kétlépcsős azonosítást, a bejelentkezéshez szükséged lesz a telefonodra és egy alkalmazásra, amely hozzáférési kódot generál számodra. + description_html: Ha engedélyezed a kétlépcsős hitelesítést, akkor a bejelentkezéshez szükséged lesz a telefonodra és egy alkalmazásra, amely hozzáférési kódokat állít elő a belépéshez. enable: Engedélyezés instructions_html: "Olvasd be ezt a QR-kódot a telefonodon futó Google Authenticator vagy egyéb TOTP alkalmazással. A jövőben ez az alkalmazás fog számodra hozzáférési kódot generálni a belépéshez." manual_instructions: 'Ha nem sikerült a QR-kód beolvasása, itt a szöveges kulcs, amelyet manuálisan kell begépelned:' @@ -1639,10 +1639,10 @@ hu: revoke: Visszavonás revoke_success: Munkamenet sikeresen visszavonva title: Munkamenetek - view_authentication_history: Fiókod hitelesítési történetének megtekintése + view_authentication_history: Fiók hitelesítési előzményeinek megtekintése settings: account: Fiók - account_settings: Fiók beállítások + account_settings: Fiókbeállítások aliases: Fiók aliasok appearance: Megjelenés authorized_apps: Jóváhagyott alkalmazások @@ -1740,7 +1740,7 @@ hu: keep_polls: Szavazások megtartása keep_polls_hint: Egyetlen szavazásodat sem törli keep_self_bookmark: Általad könyvjelzőzött bejegyzések megtartása - keep_self_bookmark_hint: Egyetlen olyan bejegyzésedet sem törli, melyet könyvjelzővel láttál el + keep_self_bookmark_hint: Egyetlen olyan bejegyzésedet sem törli, melyet könyvjelzőztél keep_self_fav: Kedvenc bejegyzések megtartása keep_self_fav_hint: Nem törli azon bejegyzéseidet, melyeket kedvencnek jelöltél min_age: @@ -1781,10 +1781,10 @@ hu: two_factor_authentication: add: Hozzáadás disable: Kikapcsolás - disabled_success: A kétlépcsős azonosítást sikeresen letiltottuk + disabled_success: A kétlépcsős hitelesítés sikeresen letiltva edit: Szerkesztés - enabled: Kétlépcsős azonosítás engedélyezve - enabled_success: A kétlépcsős azonosítást sikeresen engedélyezted + enabled: Kétlépcsős hitelesítés engedélyezve + enabled_success: A kétlépcsős hitelesítés sikeresen engedélyezve generate_recovery_codes: Visszaállítási kódok generálása lost_recovery_codes: A visszaállítási kódok segítségével tudsz belépni, ha elveszítenéd a telefonod. Ha a visszaállítási kódjaidat hagytad el, itt generálhatsz újakat. A régi kódokat ebben az esetben érvénytelenítjük. methods: Kétlépcsős eljárások @@ -1925,5 +1925,5 @@ hu: nickname_hint: Írd be az új biztonsági kulcsod becenevét not_enabled: Még nem engedélyezted a WebAuthn-t not_supported: Ez a böngésző nem támogatja a biztonsági kulcsokat - otp_required: A biztonsági kulcsok használatához először engedélyezd a kétlépcsős azonosítást. + otp_required: A biztonsági kulcsok használatához először engedélyezd a kétlépcsős hitelesítést. registered_on: 'Regisztráció ekkor: %{date}' diff --git a/config/locales/is.yml b/config/locales/is.yml index 710b35fce9..fdf54030a1 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -1666,6 +1666,9 @@ is: strikes: Umsýsla refsinga two_factor_authentication: Tveggja-þátta auðkenning webauthn_authentication: Öryggislyklar + severed_relationships: + download: Sækja (%{count}) + type: Atburður statuses: attached: audio: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 19b2e94db0..b7c6813a74 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -585,6 +585,9 @@ ja: actions_description_html: このレポートを解決するために取るアクションを決定します。 報告されたアカウントに対して懲罰的な措置を取った場合、メール通知が送信されますがスパムカテゴリが選択されている場合を除きます。 actions_description_remote_html: この通報を解決するためのアクションを選択してください。これはあなたのサーバーがこのリモートアカウントと通信し、そのコンテンツを処理する時のみ影響します。 add_to_report: 通報にさらに追加 + already_suspended_badges: + local: このサーバーで停止済み + remote: リモートのサーバーで停止済み are_you_sure: 本当に実行しますか? assign_to_self: 担当になる assigned: 担当者 diff --git a/config/locales/ko.yml b/config/locales/ko.yml index c556c9e816..9548c4e449 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -14,7 +14,7 @@ ko: instance_actor_flash: 이 계정은 서버 자신을 나타내기 위한 가상의 계정이며 개인 사용자가 아닙니다. 이 계정은 연합을 위해 사용되며 정지되지 않아야 합니다. last_active: 최근 활동 link_verified_on: "%{date}에 이 링크의 소유가 확인되었습니다" - nothing_here: 텅 비어있네요! + nothing_here: 아무 것도 없습니다! pin_errors: following: 추천하려는 사람을 팔로우 하고 있어야 합니다 posts: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 44b5443fc8..832d9e9db4 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -509,7 +509,7 @@ lt: software_updates: description: Rekomenduojama nuolat atnaujinti Mastodon diegyklę, kad galėtum naudotis naujausiais pataisymais ir funkcijomis. Be to, kartais labai svarbu laiku naujinti Mastodon, kad būtų išvengta saugumo problemų. Dėl šių priežasčių Mastodon kas 30 minučių tikrina, ar yra atnaujinimų, ir praneša tau apie tai pagal tavo el. pašto pranešimų parinktis. statuses: - back_to_account: Atgal į paskyros puslapį + back_to_account: Grįžti į paskyros puslapį media: title: Medija no_status_selected: Jokie statusai nebuvo pakeisti, nes niekas nepasirinkta @@ -741,16 +741,24 @@ lt: browser: Naršyklė browsers: generic: Nežinoma naršyklė - current_session: Dabartinė sesija + current_session: Dabartinis seansas date: Data description: "%{browser} ant %{platform}" explanation: Čia rodomos web naršyklės prijungtos prie Jūsų Mastodon paskyros. + platforms: + android: Android + ios: iOS + kai_os: KaiOS + mac: macOS + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone revoke: Atšaukti - revoke_success: Sesija sėkmingai atšaukta - title: Sesijos + revoke_success: Seansas sėkmingai panaikintas. + title: Seansai settings: authorized_apps: Autorizuotos aplikacijos - back: Atgal į Mastodon + back: Grįžti į Mastodon delete: Paskyros trynimas development: Plėtojimas edit_profile: Keisti profilį @@ -758,6 +766,7 @@ lt: featured_tags: Rodomi saitažodžiai(#) import: Importuoti migrate: Paskyros migracija + notifications: El. laiško pranešimai preferences: Preferencijos two_factor_authentication: Dviejų veiksnių autentikacija statuses: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 9dde61ff06..666eb0bdd7 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -1659,10 +1659,22 @@ pt-PT: preferences: Preferências profile: Perfil relationships: Seguindo e seguidores + severed_relationships: Relações cessadas statuses_cleanup: Remoção automática da publicação strikes: Punições de moderação two_factor_authentication: Autenticação em duas etapas webauthn_authentication: Chaves de segurança + severed_relationships: + download: Transferir (%{count}) + event_type: + account_suspension: Suspensão de conta (%{target_name}) + domain_block: Suspensão de servidor (%{target_name}) + user_domain_block: Bloqueou %{target_name} + lost_followers: Seguidores perdidos + lost_follows: Pessoas que segue perdidas + preamble: Pode perder seguidores e pessoas que segue quando bloqueia um domínio ou quando os seus moderadores decidem suspender um servidor remoto. Quando isso acontecer, poderá descarregar listas de relações cessadas, para serem inspeccionadas e possivelmente importadas para outro servidor. + purged: Informações sobre este servidor foram purgadas pelos administradores do seu servidor. + type: Evento statuses: attached: audio: diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 1d5e149339..242c863274 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -54,11 +54,11 @@ hu: phrase: Illeszkedni fog kis/nagybetű függetlenül, és tartalmi figyelmeztetések mögött is scopes: Mely API-kat érheti el az alkalmazás. Ha felső szintű hatáskört választasz, nem kell egyesével kiválasztanod az alatta lévőeket. setting_aggregate_reblogs: Ne mutassunk megtolásokat olyan bejegyzésekhez, melyeket nemrég toltak meg (csak új megtolásokra lép életbe) - setting_always_send_emails: Alapesetben nem küldünk e-mail értesítéseket, ha aktívan használod a Mastodont + setting_always_send_emails: Alapesetben nem küldünk e-mail-értesítéseket, ha aktívan használod a Mastodont setting_default_sensitive: A kényes médiatartalmat alapesetben elrejtjük, de egyetlen kattintással előhozható setting_display_media_default: Kényes tartalomnak jelölt média elrejtése - setting_display_media_hide_all: Mindig minden média elrejtése - setting_display_media_show_all: Mindig mutasd a szenzitív tartalomként jelölt médiát + setting_display_media_hide_all: Média elrejtése mindig + setting_display_media_show_all: Média megjelenítése mindig setting_use_blurhash: A kihomályosítás az eredeti képből történik, de minden részletet elrejt setting_use_pending_items: Idővonal frissítése csak kattintásra automatikus görgetés helyett username: Betűk, számok és alávonások használhatók @@ -146,7 +146,7 @@ hu: name: Címke value: Tartalom indexable: Nyilvános bejegyzések szerepeltetése a keresési eredményekben - show_collections: Követők és követettek megjelnítése a profilban + show_collections: Követők és követettek megjelenítése a profilban unlocked: Új követők automatikus elfogadása account_alias: acct: A régi fiók fiókneve @@ -187,7 +187,7 @@ hu: data: Adatok display_name: Megjelenített név email: E-mail cím - expires_in: Elévül + expires_in: Elévülés dátuma fields: Profil metaadatai header: Fejléc honeypot: "%{label} (ne töltsd ki)" @@ -202,7 +202,7 @@ hu: phrase: Kulcsszó vagy kifejezés setting_advanced_layout: Speciális webes felület engedélyezése setting_aggregate_reblogs: Megtolások csoportosítása az idővonalakon - setting_always_send_emails: E-mail értesítések küldése mindig + setting_always_send_emails: E-mail-értesítések küldése mindig setting_auto_play_gif: GIF-ek automatikus lejátszása setting_boost_modal: Megerősítés kérése megtolás előtt setting_default_language: Bejegyzések nyelve diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index df108a2fec..2f2107b13c 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -149,9 +149,9 @@ nl: show_collections: Accounts die jij volgt en die jou volgen op je profiel tonen unlocked: Automatisch nieuwe volgers accepteren account_alias: - acct: Mastodon-adres van het oude account + acct: Fediverse-adres van het oude account account_migration: - acct: Mastodon-adres van het nieuwe account + acct: Fediverse-adres van het nieuwe account account_warning_preset: text: Tekst van preset title: Titel diff --git a/config/locales/th.yml b/config/locales/th.yml index 558552362f..69bae8767f 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1633,10 +1633,21 @@ th: preferences: การกำหนดลักษณะ profile: โปรไฟล์สาธารณะ relationships: การติดตามและผู้ติดตาม + severed_relationships: ความสัมพันธ์ที่ตัดขาด statuses_cleanup: การลบโพสต์แบบอัตโนมัติ strikes: การดำเนินการการกลั่นกรอง two_factor_authentication: การรับรองความถูกต้องด้วยสองปัจจัย webauthn_authentication: กุญแจความปลอดภัย + severed_relationships: + download: ดาวน์โหลด (%{count}) + event_type: + account_suspension: การระงับบัญชี (%{target_name}) + domain_block: การระงับเซิร์ฟเวอร์ (%{target_name}) + user_domain_block: คุณได้ปิดกั้น %{target_name} + lost_followers: ผู้ติดตามที่หายไป + lost_follows: การติดตามที่หายไป + purged: มีการล้างข้อมูลเกี่ยวกับเซิร์ฟเวอร์นี้โดยผู้ดูแลของเซิร์ฟเวอร์ของคุณ + type: เหตุการณ์ statuses: attached: audio: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 2a0f802a1f..af2b3b8698 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1626,13 +1626,26 @@ zh-HK: import: 匯入 import_and_export: 匯入及匯出 migrate: 帳戶遷移 + notifications: 電郵通知 preferences: 偏好設定 profile: 個人資料 relationships: 關注及追隨者 + severed_relationships: 已切斷關係 statuses_cleanup: 自動嘟文刪除 strikes: 審核警告 two_factor_authentication: 雙重認證 webauthn_authentication: 安全鑰匙 + severed_relationships: + download: 下載 (%{count}) + event_type: + account_suspension: 停權帳號 (%{target_name}) + domain_block: 停權伺服器 (%{target_name}) + user_domain_block: 你封鎖了 %{target_name} + lost_followers: 已流失追蹤者 + lost_follows: 已流失追蹤 + preamble: 當你封鎖網域或你的管理員決定暫停遠端伺服器,可能會令你失去追蹤中的對象和追蹤者。屆時你可以下載紀錄了被切斷關係的對象的清單進行檢查,或將其匯入到另一台伺服器上。 + purged: 有關此伺服器的資訊已被你伺服器的管理員清除。 + type: 事件 statuses: attached: audio: From bbf36836b651f2d69ee2b1988989e46f73862ff9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 12:07:47 +0100 Subject: [PATCH 302/954] Update formatjs monorepo (#29733) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/yarn.lock b/yarn.lock index 13ea8583d7..67a7876e1c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2287,9 +2287,9 @@ __metadata: languageName: node linkType: hard -"@formatjs/intl@npm:2.10.0": - version: 2.10.0 - resolution: "@formatjs/intl@npm:2.10.0" +"@formatjs/intl@npm:2.10.1": + version: 2.10.1 + resolution: "@formatjs/intl@npm:2.10.1" dependencies: "@formatjs/ecma402-abstract": "npm:1.18.2" "@formatjs/fast-memoize": "npm:2.2.0" @@ -2303,7 +2303,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/7566038b011116cee7069165a25836b3fb687948e61b041809a9d978ac6c0882ae8d81a624a415cfb8e43852d097cd1cbc3c6707e717928e39b75c252491a712 + checksum: 10c0/24eee77382d1efd226aee7590228d3ae80f66a8547a65295f8028986b15b6abbfea3e380f4a338ece0e841e1db6f36554ca48124d84c0830382e3a9d395b5d75 languageName: node linkType: hard @@ -5125,8 +5125,8 @@ __metadata: linkType: hard "babel-plugin-formatjs@npm:^10.5.1": - version: 10.5.13 - resolution: "babel-plugin-formatjs@npm:10.5.13" + version: 10.5.14 + resolution: "babel-plugin-formatjs@npm:10.5.14" dependencies: "@babel/core": "npm:^7.10.4" "@babel/helper-plugin-utils": "npm:^7.10.4" @@ -5139,7 +5139,7 @@ __metadata: "@types/babel__helper-plugin-utils": "npm:^7.10.0" "@types/babel__traverse": "npm:^7.1.7" tslib: "npm:^2.4.0" - checksum: 10c0/1ce0b69478dd3c92126a7e3440f1fad46feebebc9318e8bbb102dea91a60448da4a8511b3c8ffbf2c3675995fca6c8ce7f097c08907455b33a5f9185e39fb94e + checksum: 10c0/78d33f0304c7b6e36334b2f32bacd144cbbe08cb22318ff994e7adc7705b7f8208354c9af9f87b4390d11aee1ea81cfee9f224a57fe5265173b92ee7de921359 languageName: node linkType: hard @@ -14317,12 +14317,12 @@ __metadata: linkType: hard "react-intl@npm:^6.4.2": - version: 6.6.2 - resolution: "react-intl@npm:6.6.2" + version: 6.6.3 + resolution: "react-intl@npm:6.6.3" dependencies: "@formatjs/ecma402-abstract": "npm:1.18.2" "@formatjs/icu-messageformat-parser": "npm:2.7.6" - "@formatjs/intl": "npm:2.10.0" + "@formatjs/intl": "npm:2.10.1" "@formatjs/intl-displaynames": "npm:6.6.6" "@formatjs/intl-listformat": "npm:7.5.5" "@types/hoist-non-react-statics": "npm:^3.3.1" @@ -14336,7 +14336,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/78288a0fded816735812dca6dcfee3eaa8bb3af7e963ba47639b51cc700a102a526859ff647ca79a5ebcdc69d6d78da90daeeed15cc0b819c7a20a74b2e1469c + checksum: 10c0/8a924931668f1bf6364bb41c09fdb54972b8e3372f0768a31478dc3f8a846920caa4dc04ab3950195baa6dbf58a148f43a6a221d5795be2cbb6f4f374a5921d6 languageName: node linkType: hard From 45f8364cd110882a55bbef465064b8bd4d6b7f89 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 11:09:00 +0000 Subject: [PATCH 303/954] Update dependency typescript to v5.4.3 (#29744) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 67a7876e1c..7ef202e095 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17079,22 +17079,22 @@ __metadata: linkType: hard "typescript@npm:5, typescript@npm:^5.0.4": - version: 5.4.2 - resolution: "typescript@npm:5.4.2" + version: 5.4.3 + resolution: "typescript@npm:5.4.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/583ff68cafb0c076695f72d61df6feee71689568179fb0d3a4834dac343df6b6ed7cf7b6f6c801fa52d43cd1d324e2f2d8ae4497b09f9e6cfe3d80a6d6c9ca52 + checksum: 10c0/22443a8760c3668e256c0b34b6b45c359ef6cecc10c42558806177a7d500ab1a7d7aac1f976d712e26989ddf6731d2fbdd3212b7c73290a45127c1c43ba2005a languageName: node linkType: hard "typescript@patch:typescript@npm%3A5#optional!builtin, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin": - version: 5.4.2 - resolution: "typescript@patch:typescript@npm%3A5.4.2#optional!builtin::version=5.4.2&hash=5adc0c" + version: 5.4.3 + resolution: "typescript@patch:typescript@npm%3A5.4.3#optional!builtin::version=5.4.3&hash=5adc0c" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/fcf6658073d07283910d9a0e04b1d5d0ebc822c04dbb7abdd74c3151c7aa92fcddbac7d799404e358197222006ccdc4c0db219d223d2ee4ccd9e2b01333b49be + checksum: 10c0/6e51f8b7e6ec55b897b9e56b67e864fe8f44e30f4a14357aad5dc0f7432db2f01efc0522df0b6c36d361c51f2dc3dcac5c832efd96a404cfabf884e915d38828 languageName: node linkType: hard From 55e2c827bdc7f96fc746ce43ea303f9e25805099 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 11:09:05 +0000 Subject: [PATCH 304/954] Update DefinitelyTyped types (non-major) (#29743) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7ef202e095..a2bc439ee3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3679,13 +3679,13 @@ __metadata: linkType: hard "@types/pg@npm:^8.6.6": - version: 8.11.2 - resolution: "@types/pg@npm:8.11.2" + version: 8.11.4 + resolution: "@types/pg@npm:8.11.4" dependencies: "@types/node": "npm:*" pg-protocol: "npm:*" pg-types: "npm:^4.0.1" - checksum: 10c0/6d873af7f71785d5d4db49311c5c73628918b2b1ece83f17073c4470b2fce6bd24a37de23a42ea0221df4e1c7dc43ea035bb9d0b6274f86ec692b21503a9a55c + checksum: 10c0/81158ffa9d2f9b2b299a1650756b90fc418e0040e654d7d9ee46734a3c874d07b638af86d765e22e9c8246054c30a0274ee4dea58a0a7ed5c0c4aa01964a09ef languageName: node linkType: hard @@ -3697,9 +3697,9 @@ __metadata: linkType: hard "@types/prop-types@npm:*, @types/prop-types@npm:^15.7.5": - version: 15.7.11 - resolution: "@types/prop-types@npm:15.7.11" - checksum: 10c0/e53423cf9d510515ef8b47ff42f4f1b65a7b7b37c8704e2dbfcb9a60defe0c0e1f3cb1acfdeb466bad44ca938d7c79bffdd51b48ffb659df2432169d0b27a132 + version: 15.7.12 + resolution: "@types/prop-types@npm:15.7.12" + checksum: 10c0/1babcc7db6a1177779f8fde0ccc78d64d459906e6ef69a4ed4dd6339c920c2e05b074ee5a92120fe4e9d9f1a01c952f843ebd550bee2332fc2ef81d1706878f8 languageName: node linkType: hard @@ -3842,13 +3842,13 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7": - version: 18.2.66 - resolution: "@types/react@npm:18.2.66" + version: 18.2.70 + resolution: "@types/react@npm:18.2.70" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/56e4b841f2daf03a0b3268d4f2bcf5841167fe56742b9f1c076fad66587fb59191bdaba4d5727dbfbcff750d5e8797fdd4e57d8d9704b0bfc6ad31ee1e268a70 + checksum: 10c0/2107b1fa8963cabe33d981cf1c0e3b7534c9d12b98c1046cd9f7975851690a0780db011f6a1d637ae4e612ef00c94ebdbe76a9e2f9e0f3baa6aad3213932af41 languageName: node linkType: hard From 766c1fea2036e2360a9b0620b9d83cc4722620e8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 13:14:46 +0100 Subject: [PATCH 305/954] Update devDependencies (non-major) (#29746) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 79 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 32 deletions(-) diff --git a/yarn.lock b/yarn.lock index a2bc439ee3..5bf1095d8f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1578,7 +1578,7 @@ __metadata: languageName: node linkType: hard -"@csstools/css-parser-algorithms@npm:^2.5.0, @csstools/css-parser-algorithms@npm:^2.6.1": +"@csstools/css-parser-algorithms@npm:^2.6.1": version: 2.6.1 resolution: "@csstools/css-parser-algorithms@npm:2.6.1" peerDependencies: @@ -1587,14 +1587,14 @@ __metadata: languageName: node linkType: hard -"@csstools/css-tokenizer@npm:^2.2.3, @csstools/css-tokenizer@npm:^2.2.4": +"@csstools/css-tokenizer@npm:^2.2.4": version: 2.2.4 resolution: "@csstools/css-tokenizer@npm:2.2.4" checksum: 10c0/23997db5874514f4b951ebd215e1e6cc8baf03adf9a35fc6fd028b84cb52aa2dc053860722108c09859a9b37b455f62b84181fe15539cd37797ea699b9ff85f0 languageName: node linkType: hard -"@csstools/media-query-list-parser@npm:^2.1.7, @csstools/media-query-list-parser@npm:^2.1.9": +"@csstools/media-query-list-parser@npm:^2.1.9": version: 2.1.9 resolution: "@csstools/media-query-list-parser@npm:2.1.9" peerDependencies: @@ -1970,7 +1970,7 @@ __metadata: languageName: node linkType: hard -"@csstools/selector-specificity@npm:^3.0.1, @csstools/selector-specificity@npm:^3.0.2": +"@csstools/selector-specificity@npm:^3.0.2": version: 3.0.2 resolution: "@csstools/selector-specificity@npm:3.0.2" peerDependencies: @@ -1995,6 +1995,13 @@ __metadata: languageName: node linkType: hard +"@dual-bundle/import-meta-resolve@npm:^4.0.0": + version: 4.0.0 + resolution: "@dual-bundle/import-meta-resolve@npm:4.0.0" + checksum: 10c0/868b8314fc753b7767887108535afe3288de941d92bc8453164dbcb1abe886b171e338f6f7d02ff556256dee69c90e4ac6360e0c6a856a5ad7190274ab52de2e + languageName: node + linkType: hard + "@emotion/babel-plugin@npm:^11.11.0": version: 11.11.0 resolution: "@emotion/babel-plugin@npm:11.11.0" @@ -2192,8 +2199,8 @@ __metadata: linkType: hard "@formatjs/cli@npm:^6.1.1": - version: 6.2.7 - resolution: "@formatjs/cli@npm:6.2.7" + version: 6.2.8 + resolution: "@formatjs/cli@npm:6.2.8" peerDependencies: vue: ^3.3.4 peerDependenciesMeta: @@ -2201,7 +2208,7 @@ __metadata: optional: true bin: formatjs: bin/formatjs - checksum: 10c0/ee7b0873a734e02721ce1ee107ee60845bb30855f4ca686bfb6c5e9862353249d5d20748b18db93200aabc7a59875ff062f485c64d41cb8e61f1d43e2bb5eceb + checksum: 10c0/5d8f95434f4522eee7dd3acf54e5265289ec7e72812448cd7c7547bdedaba8927719800dfa2fc92fb82c609f34255367a80d18bf6c064540d5e11ec6b9d4603e languageName: node linkType: hard @@ -3311,8 +3318,8 @@ __metadata: linkType: hard "@testing-library/react@npm:^14.0.0": - version: 14.2.1 - resolution: "@testing-library/react@npm:14.2.1" + version: 14.2.2 + resolution: "@testing-library/react@npm:14.2.2" dependencies: "@babel/runtime": "npm:^7.12.5" "@testing-library/dom": "npm:^9.0.0" @@ -3320,7 +3327,7 @@ __metadata: peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 10c0/83b35cf8bf5640f1b63b32223ebc75799dc1a8e034d819120b26838fba0b0ab10bdbe6ad07dd8ae8287365f2b0c52dc9892a6fa11bb24d3e63ad97dfb7f2f296 + checksum: 10c0/ab36707f6701a4a56dd217e16e00d6326e0f760bb2e716245422c7500a0b94efcd351d0aa89c4fab2916e6ebc68c983cec6b3ae0804de813cafc913a612668f6 languageName: node linkType: hard @@ -9444,10 +9451,10 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.0": - version: 5.3.0 - resolution: "ignore@npm:5.3.0" - checksum: 10c0/dc06bea5c23aae65d0725a957a0638b57e235ae4568dda51ca142053ed2c352de7e3bc93a69b2b32ac31966a1952e9a93c5ef2e2ab7c6b06aef9808f6b55b571 +"ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": + version: 5.3.1 + resolution: "ignore@npm:5.3.1" + checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd languageName: node linkType: hard @@ -11150,6 +11157,13 @@ __metadata: languageName: node linkType: hard +"known-css-properties@npm:^0.30.0": + version: 0.30.0 + resolution: "known-css-properties@npm:0.30.0" + checksum: 10c0/8b487a6b33487affcec41eb392ceb77acf4d093558dde5c88b5ea06b9a3c81781876d7cb09872e0518b9602f27c8f4112c9ac333e02c90a91c8fbd12e202ed48 + languageName: node + linkType: hard + "language-subtag-registry@npm:^0.3.20": version: 0.3.22 resolution: "language-subtag-registry@npm:0.3.22" @@ -11641,10 +11655,10 @@ __metadata: languageName: node linkType: hard -"meow@npm:^13.1.0": - version: 13.1.0 - resolution: "meow@npm:13.1.0" - checksum: 10c0/2dac9dbf99a17ce29618fe5919072a9b28e2aedb9547f9b1f15d046d5501dd6c14fe1f35f7a5665d0ee7111c98c4d359fcf3f985463ec5896dd50177363f442d +"meow@npm:^13.2.0": + version: 13.2.0 + resolution: "meow@npm:13.2.0" + checksum: 10c0/d5b339ae314715bcd0b619dd2f8a266891928e21526b4800d49b4fba1cc3fff7e2c1ff5edd3344149fac841bc2306157f858e8c4d5eaee4d52ce52ad925664ce languageName: node linkType: hard @@ -13817,7 +13831,7 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.15, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": +"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": version: 6.0.16 resolution: "postcss-selector-parser@npm:6.0.16" dependencies: @@ -13857,7 +13871,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.33": +"postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.38": version: 8.4.38 resolution: "postcss@npm:8.4.38" dependencies: @@ -16428,13 +16442,14 @@ __metadata: linkType: hard "stylelint@npm:^16.0.2": - version: 16.2.1 - resolution: "stylelint@npm:16.2.1" + version: 16.3.0 + resolution: "stylelint@npm:16.3.0" dependencies: - "@csstools/css-parser-algorithms": "npm:^2.5.0" - "@csstools/css-tokenizer": "npm:^2.2.3" - "@csstools/media-query-list-parser": "npm:^2.1.7" - "@csstools/selector-specificity": "npm:^3.0.1" + "@csstools/css-parser-algorithms": "npm:^2.6.1" + "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/media-query-list-parser": "npm:^2.1.9" + "@csstools/selector-specificity": "npm:^3.0.2" + "@dual-bundle/import-meta-resolve": "npm:^4.0.0" balanced-match: "npm:^2.0.0" colord: "npm:^2.9.3" cosmiconfig: "npm:^9.0.0" @@ -16448,19 +16463,19 @@ __metadata: globby: "npm:^11.1.0" globjoin: "npm:^0.1.4" html-tags: "npm:^3.3.1" - ignore: "npm:^5.3.0" + ignore: "npm:^5.3.1" imurmurhash: "npm:^0.1.4" is-plain-object: "npm:^5.0.0" - known-css-properties: "npm:^0.29.0" + known-css-properties: "npm:^0.30.0" mathml-tag-names: "npm:^2.1.3" - meow: "npm:^13.1.0" + meow: "npm:^13.2.0" micromatch: "npm:^4.0.5" normalize-path: "npm:^3.0.0" picocolors: "npm:^1.0.0" - postcss: "npm:^8.4.33" + postcss: "npm:^8.4.38" postcss-resolve-nested-selector: "npm:^0.1.1" postcss-safe-parser: "npm:^7.0.0" - postcss-selector-parser: "npm:^6.0.15" + postcss-selector-parser: "npm:^6.0.16" postcss-value-parser: "npm:^4.2.0" resolve-from: "npm:^5.0.0" string-width: "npm:^4.2.3" @@ -16471,7 +16486,7 @@ __metadata: write-file-atomic: "npm:^5.0.1" bin: stylelint: bin/stylelint.mjs - checksum: 10c0/eeaba06885e542c832e5cffc07b2d0dabdc5a72e6ad4d6cb3d01dcc260c29a712b0b935cbd40e059abd68a100e0563fbc617fc4c9bef3b14ecaf6eea651d9d9d + checksum: 10c0/98bf770078d727eb7c3ec0932b09c9486481f2d086ea1f4232e00bd1bf58b6b5d3a8d6fc9802df05380cdb06b3d97c5a7c4f27adb221b2a5707ea9829c0ee350 languageName: node linkType: hard From dd061291b1e89b6c67e6dff06ad087abdf7821dc Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 25 Mar 2024 13:45:00 +0100 Subject: [PATCH 306/954] Change out-of-band hashtags design in web UI (#29732) --- app/javascript/styles/mastodon/components.scss | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 4bb3216e45..55792f22d2 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -9734,18 +9734,24 @@ noscript { margin-top: 16px; display: flex; flex-wrap: wrap; - font-size: 14px; - line-height: 18px; - gap: 4px; + font-size: 12px; + line-height: 16px; + gap: 6px; color: $darker-text-color; a { display: inline-flex; color: inherit; text-decoration: none; + padding: 4px 12px; + background: $ui-base-color; + border-radius: 4px; + font-weight: 500; - &:hover span { - text-decoration: underline; + &:hover, + &:focus, + &:active { + background: lighten($ui-base-color, 4%); } } From 29f9dc742eaca1898455e37e01fff087e4bf42a6 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 25 Mar 2024 14:27:38 +0100 Subject: [PATCH 307/954] Change design of notification about lost connections in web UI (#29731) --- .../notifications/components/notification.jsx | 27 ++++---- .../relationships_severance_event.jsx | 62 +++++++------------ app/javascript/mastodon/locales/en.json | 12 ++-- .../styles/mastodon/components.scss | 38 ++++++++++++ 4 files changed, 79 insertions(+), 60 deletions(-) diff --git a/app/javascript/mastodon/features/notifications/components/notification.jsx b/app/javascript/mastodon/features/notifications/components/notification.jsx index 5527f3d482..c091554628 100644 --- a/app/javascript/mastodon/features/notifications/components/notification.jsx +++ b/app/javascript/mastodon/features/notifications/components/notification.jsx @@ -12,7 +12,6 @@ import { HotKeys } from 'react-hotkeys'; import EditIcon from '@/material-icons/400-24px/edit.svg?react'; import FlagIcon from '@/material-icons/400-24px/flag-fill.svg?react'; -import HeartBrokenIcon from '@/material-icons/400-24px/heart_broken-fill.svg?react'; import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react'; import InsertChartIcon from '@/material-icons/400-24px/insert_chart.svg?react'; import PersonIcon from '@/material-icons/400-24px/person-fill.svg?react'; @@ -27,7 +26,7 @@ import { WithRouterPropTypes } from 'mastodon/utils/react_router'; import FollowRequestContainer from '../containers/follow_request_container'; -import RelationshipsSeveranceEvent from './relationships_severance_event'; +import { RelationshipsSeveranceEvent } from './relationships_severance_event'; import Report from './report'; const messages = defineMessages({ @@ -40,6 +39,7 @@ const messages = defineMessages({ update: { id: 'notification.update', defaultMessage: '{name} edited a post' }, adminSignUp: { id: 'notification.admin.sign_up', defaultMessage: '{name} signed up' }, adminReport: { id: 'notification.admin.report', defaultMessage: '{name} reported {target}' }, + relationshipsSevered: { id: 'notification.relationships_severance_event', defaultMessage: 'Lost connections with {name}' }, }); const notificationForScreenReader = (intl, message, timestamp) => { @@ -361,24 +361,23 @@ class Notification extends ImmutablePureComponent { } renderRelationshipsSevered (notification) { - const { intl, unread } = this.props; + const { intl, unread, hidden } = this.props; + const event = notification.get('event'); - if (!notification.get('event')) { + if (!event) { return null; } return ( -
-
- - - - - -
- - +
+
); diff --git a/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx b/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx index 23d0d2eecf..738159fc5a 100644 --- a/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx +++ b/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx @@ -2,60 +2,44 @@ import PropTypes from 'prop-types'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import ImmutablePropTypes from 'react-immutable-proptypes'; +import HeartBrokenIcon from '@/material-icons/400-24px/heart_broken-fill.svg?react'; +import { Icon } from 'mastodon/components/icon'; +import { domain } from 'mastodon/initial_state'; -import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; - -// This needs to be kept in sync with app/models/relationship_severance_event.rb +// This needs to be kept in sync with app/models/relationships_severance_event.rb const messages = defineMessages({ - account_suspension: { id: 'relationship_severance_notification.types.account_suspension', defaultMessage: 'Account has been suspended' }, - domain_block: { id: 'relationship_severance_notification.types.domain_block', defaultMessage: 'Domain has been suspended' }, - user_domain_block: { id: 'relationship_severance_notification.types.user_domain_block', defaultMessage: 'You blocked this domain' }, + account_suspension: { id: 'notification.relationships_severance_event.account_suspension', defaultMessage: 'An admin from {from} has suspended {target}, which means you can no longer receive updates from them or interact with them.' }, + domain_block: { id: 'notification.relationships_severance_event.domain_block', defaultMessage: 'An admin from {from} has blocked {target}, including {followersCount} of your followers and {followingCount, plural, one {# account} other {# accounts}} you follow.' }, + user_domain_block: { id: 'notification.relationships_severance_event.user_domain_block', defaultMessage: 'You have blocked {target}, removing {followersCount} of your followers and {followingCount, plural, one {# account} other {# accounts}} you follow.' }, }); -const RelationshipsSeveranceEvent = ({ event, hidden }) => { +export const RelationshipsSeveranceEvent = ({ type, target, followingCount, followersCount, hidden }) => { const intl = useIntl(); - if (hidden || !event) { + if (hidden) { return null; } return ( -
-
-
- - {' · '} - { event.get('purged') ? ( - - ) : ( - - )} -
- {intl.formatMessage(messages[event.get('type')])} -
+ + - +
+

{intl.formatMessage(messages[type], { from: {domain}, target: {target}, followingCount, followersCount })}

+
-
+ ); - }; RelationshipsSeveranceEvent.propTypes = { - event: ImmutablePropTypes.map.isRequired, + type: PropTypes.oneOf([ + 'account_suspension', + 'domain_block', + 'user_domain_block', + ]).isRequired, + target: PropTypes.string.isRequired, + followersCount: PropTypes.number.isRequired, + followingCount: PropTypes.number.isRequired, hidden: PropTypes.bool, }; - -export default RelationshipsSeveranceEvent; diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 1134b393a7..5aa3b5c90b 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -471,7 +471,11 @@ "notification.own_poll": "Your poll has ended", "notification.poll": "A poll you have voted in has ended", "notification.reblog": "{name} boosted your post", - "notification.severed_relationships": "Relationships with {name} severed", + "notification.relationships_severance_event": "Lost connections with {name}", + "notification.relationships_severance_event.account_suspension": "An admin from {from} has suspended {target}, which means you can no longer receive updates from them or interact with them.", + "notification.relationships_severance_event.domain_block": "An admin from {from} has blocked {target}, including {followersCount} of your followers and {followingCount, plural, one {# account} other {# accounts}} you follow.", + "notification.relationships_severance_event.learn_more": "Learn more", + "notification.relationships_severance_event.user_domain_block": "You have blocked {target}, removing {followersCount} of your followers and {followingCount, plural, one {# account} other {# accounts}} you follow.", "notification.status": "{name} just posted", "notification.update": "{name} edited a post", "notification_requests.accept": "Accept", @@ -590,12 +594,6 @@ "refresh": "Refresh", "regeneration_indicator.label": "Loading…", "regeneration_indicator.sublabel": "Your home feed is being prepared!", - "relationship_severance_notification.purged_data": "purged by administrators", - "relationship_severance_notification.relationships": "{count, plural, one {# relationship} other {# relationships}}", - "relationship_severance_notification.types.account_suspension": "Account has been suspended", - "relationship_severance_notification.types.domain_block": "Domain has been suspended", - "relationship_severance_notification.types.user_domain_block": "You blocked this domain", - "relationship_severance_notification.view": "View", "relative_time.days": "{number}d", "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago", "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago", diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 55792f22d2..e5cfe235da 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2165,6 +2165,44 @@ a.account__display-name { } } +.notification__relationships-severance-event { + display: flex; + gap: 16px; + color: $secondary-text-color; + text-decoration: none; + align-items: flex-start; + padding: 16px 32px; + border-bottom: 1px solid var(--background-border-color); + + &:hover { + color: $primary-text-color; + } + + .icon { + padding: 2px; + color: $highlight-text-color; + } + + &__content { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 8px; + flex-grow: 1; + font-size: 16px; + line-height: 24px; + + strong { + font-weight: 700; + } + + .link-button { + font-size: inherit; + line-height: inherit; + } + } +} + .notification__message { padding: 16px; padding-bottom: 0; From 0cea7a623be470c51d7a162265f44f5a3e149275 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 25 Mar 2024 14:39:06 +0100 Subject: [PATCH 308/954] Fix background and icon on notification requests in web UI (#29706) --- .../filtered_notifications_banner.jsx | 3 +- .../components/notification_request.jsx | 4 +-- app/javascript/mastodon/locales/en.json | 1 + .../styles/mastodon/components.scss | 36 +++++++++++-------- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx b/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx index adf58afbf0..ecf4b74e80 100644 --- a/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx +++ b/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.jsx @@ -41,7 +41,8 @@ export const FilteredNotificationsBanner = () => {
- {toCappedNumber(policy.getIn(['summary', 'pending_notifications_count']))} +
{toCappedNumber(policy.getIn(['summary', 'pending_notifications_count']))}
+
); diff --git a/app/javascript/mastodon/features/notifications/components/notification_request.jsx b/app/javascript/mastodon/features/notifications/components/notification_request.jsx index e24124ca6a..3a77ef4e2e 100644 --- a/app/javascript/mastodon/features/notifications/components/notification_request.jsx +++ b/app/javascript/mastodon/features/notifications/components/notification_request.jsx @@ -7,8 +7,8 @@ import { Link } from 'react-router-dom'; import { useSelector, useDispatch } from 'react-redux'; +import DeleteIcon from '@/material-icons/400-24px/delete.svg?react'; import DoneIcon from '@/material-icons/400-24px/done.svg?react'; -import VolumeOffIcon from '@/material-icons/400-24px/volume_off.svg?react'; import { acceptNotificationRequest, dismissNotificationRequest } from 'mastodon/actions/notifications'; import { Avatar } from 'mastodon/components/avatar'; import { IconButton } from 'mastodon/components/icon_button'; @@ -51,7 +51,7 @@ export const NotificationRequest = ({ id, accountId, notificationsCount }) => {
- +
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 5aa3b5c90b..881ed19e0e 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -298,6 +298,7 @@ "filter_modal.select_filter.title": "Filter this post", "filter_modal.title.status": "Filter a post", "filtered_notifications_banner.pending_requests": "Notifications from {count, plural, =0 {no one} one {one person} other {# people}} you may know", + "filtered_notifications_banner.private_mentions": "{count, plural, one {private mention} other {private mentions}}", "filtered_notifications_banner.title": "Filtered notifications", "firehose.all": "All", "firehose.local": "This server", diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index e5cfe235da..3704751eff 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -10005,10 +10005,10 @@ noscript { .filtered-notifications-banner { display: flex; align-items: center; - background: $ui-base-color; - border-bottom: 1px solid lighten($ui-base-color, 8%); - padding: 15px; - gap: 15px; + border: 1px solid var(--background-border-color); + border-top: 0; + padding: 24px 32px; + gap: 16px; color: $darker-text-color; text-decoration: none; @@ -10016,15 +10016,12 @@ noscript { &:active, &:focus { color: $secondary-text-color; - - .filtered-notifications-banner__badge { - background: $secondary-text-color; - } } .icon { width: 24px; height: 24px; + padding: 2px; } &__text { @@ -10040,13 +10037,24 @@ noscript { } &__badge { - background: $darker-text-color; - color: $ui-base-color; - border-radius: 100px; - padding: 2px 8px; + display: flex; + align-items: center; + border-radius: 999px; + background: var(--background-border-color); + color: $darker-text-color; + padding: 4px; + padding-inline-end: 8px; + gap: 6px; font-weight: 500; font-size: 11px; line-height: 16px; + + &__badge { + background: $ui-button-background-color; + color: $white; + border-radius: 100px; + padding: 2px 8px; + } } } @@ -10055,7 +10063,7 @@ noscript { align-items: center; gap: 16px; padding: 15px; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); &__link { display: flex; @@ -10103,7 +10111,7 @@ noscript { .icon-button { border-radius: 4px; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); padding: 5px; } } From 02ea16150647ac3baf0bb8a89203ccc7200b4a2f Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Tue, 26 Mar 2024 10:25:49 +0100 Subject: [PATCH 309/954] Support "system" theme setting (light/dark theme depending on user system preference) (#29748) Co-authored-by: Nishiki Liu --- app/helpers/application_helper.rb | 9 +++++ .../features/emoji/__tests__/emoji-test.js | 38 +++++++++--------- .../mastodon/features/emoji/emoji.js | 39 +++++++++++++++---- app/lib/themes.rb | 2 +- app/views/layouts/application.html.haml | 2 +- app/views/layouts/embedded.html.haml | 2 +- app/views/layouts/error.html.haml | 2 +- config/locales/en.yml | 1 + config/settings.yml | 2 +- 9 files changed, 65 insertions(+), 32 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 668afe7fde..d46d0674a4 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -160,6 +160,15 @@ module ApplicationHelper output.compact_blank.join(' ') end + def theme_style_tags(theme) + if theme == 'system' + concat stylesheet_pack_tag('mastodon-light', media: 'not all and (prefers-color-scheme: dark)', crossorigin: 'anonymous') + concat stylesheet_pack_tag('default', media: '(prefers-color-scheme: dark)', crossorigin: 'anonymous') + else + stylesheet_pack_tag theme, media: 'all', crossorigin: 'anonymous' + end + end + def cdn_host Rails.configuration.action_controller.asset_host end diff --git a/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js b/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js index 7b917ac43b..9d6ff5226a 100644 --- a/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js +++ b/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js @@ -22,23 +22,23 @@ describe('emoji', () => { it('does unicode', () => { expect(emojify('\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66')).toEqual( - '👩‍👩‍👦‍👦'); + '👩‍👩‍👦‍👦'); expect(emojify('👨‍👩‍👧‍👧')).toEqual( - '👨‍👩‍👧‍👧'); - expect(emojify('👩‍👩‍👦')).toEqual('👩‍👩‍👦'); + '👨‍👩‍👧‍👧'); + expect(emojify('👩‍👩‍👦')).toEqual('👩‍👩‍👦'); expect(emojify('\u2757')).toEqual( - '❗'); + '❗'); }); it('does multiple unicode', () => { expect(emojify('\u2757 #\uFE0F\u20E3')).toEqual( - '❗ #️⃣'); + '❗ #️⃣'); expect(emojify('\u2757#\uFE0F\u20E3')).toEqual( - '❗#️⃣'); + '❗#️⃣'); expect(emojify('\u2757 #\uFE0F\u20E3 \u2757')).toEqual( - '❗ #️⃣ ❗'); + '❗ #️⃣ ❗'); expect(emojify('foo \u2757 #\uFE0F\u20E3 bar')).toEqual( - 'foo ❗ #️⃣ bar'); + 'foo ❗ #️⃣ bar'); }); it('ignores unicode inside of tags', () => { @@ -46,16 +46,16 @@ describe('emoji', () => { }); it('does multiple emoji properly (issue 5188)', () => { - expect(emojify('👌🌈💕')).toEqual('👌🌈💕'); - expect(emojify('👌 🌈 💕')).toEqual('👌 🌈 💕'); + expect(emojify('👌🌈💕')).toEqual('👌🌈💕'); + expect(emojify('👌 🌈 💕')).toEqual('👌 🌈 💕'); }); it('does an emoji that has no shortcode', () => { - expect(emojify('👁‍🗨')).toEqual('👁‍🗨'); + expect(emojify('👁‍🗨')).toEqual('👁‍🗨'); }); it('does an emoji whose filename is irregular', () => { - expect(emojify('↙️')).toEqual('↙️'); + expect(emojify('↙️')).toEqual('↙️'); }); it('avoid emojifying on invisible text', () => { @@ -67,11 +67,11 @@ describe('emoji', () => { it('avoid emojifying on invisible text with nested tags', () => { expect(emojify('😇')) - .toEqual('😇'); + .toEqual('😇'); expect(emojify('😇')) - .toEqual('😇'); + .toEqual('😇'); expect(emojify('😇')) - .toEqual('😇'); + .toEqual('😇'); }); it('does not emojify emojis with textual presentation VS15 character', () => { @@ -79,19 +79,19 @@ describe('emoji', () => { .toEqual('✴︎'); }); - it('does an simple emoji properly', () => { + it('does a simple emoji properly', () => { expect(emojify('♀♂')) - .toEqual('♀♂'); + .toEqual('♀♂'); }); it('does an emoji containing ZWJ properly', () => { expect(emojify('💂‍♀️💂‍♂️')) - .toEqual('💂\u200D♀️💂\u200D♂️'); + .toEqual('💂\u200D♀️💂\u200D♂️'); }); it('keeps ordering as expected (issue fixed by PR 20677)', () => { expect(emojify('

💕 #foo test: foo.

')) - .toEqual('

💕 #foo test: foo.

'); + .toEqual('

💕 #foo test: foo.

'); }); }); }); diff --git a/app/javascript/mastodon/features/emoji/emoji.js b/app/javascript/mastodon/features/emoji/emoji.js index 5918a65ed7..e4aad302f6 100644 --- a/app/javascript/mastodon/features/emoji/emoji.js +++ b/app/javascript/mastodon/features/emoji/emoji.js @@ -17,8 +17,13 @@ const emojiFilenames = (emojis) => { const darkEmoji = emojiFilenames(['🎱', '🐜', '⚫', '🖤', '⬛', '◼️', '◾', '◼️', '✒️', '▪️', '💣', '🎳', '📷', '📸', '♣️', '🕶️', '✴️', '🔌', '💂‍♀️', '📽️', '🍳', '🦍', '💂', '🔪', '🕳️', '🕹️', '🕋', '🖊️', '🖋️', '💂‍♂️', '🎤', '🎓', '🎥', '🎼', '♠️', '🎩', '🦃', '📼', '📹', '🎮', '🐃', '🏴', '🐞', '🕺', '📱', '📲', '🚲', '🪮', '🐦‍⬛']); const lightEmoji = emojiFilenames(['👽', '⚾', '🐔', '☁️', '💨', '🕊️', '👀', '🍥', '👻', '🐐', '❕', '❔', '⛸️', '🌩️', '🔊', '🔇', '📃', '🌧️', '🐏', '🍚', '🍙', '🐓', '🐑', '💀', '☠️', '🌨️', '🔉', '🔈', '💬', '💭', '🏐', '🏳️', '⚪', '⬜', '◽', '◻️', '▫️', '🪽', '🪿']); -const emojiFilename = (filename) => { - const borderedEmoji = (document.body && document.body.classList.contains('theme-mastodon-light')) ? lightEmoji : darkEmoji; +/** + * @param {string} filename + * @param {"light" | "dark" } colorScheme + * @returns {string} + */ +const emojiFilename = (filename, colorScheme) => { + const borderedEmoji = colorScheme === "light" ? lightEmoji : darkEmoji; return borderedEmoji.includes(filename) ? (filename + '_border') : filename; }; @@ -92,12 +97,30 @@ const emojifyTextNode = (node, customEmojis) => { const { filename, shortCode } = unicodeMapping[unicode_emoji]; const title = shortCode ? `:${shortCode}:` : ''; - replacement = document.createElement('img'); - replacement.setAttribute('draggable', 'false'); - replacement.setAttribute('class', 'emojione'); - replacement.setAttribute('alt', unicode_emoji); - replacement.setAttribute('title', title); - replacement.setAttribute('src', `${assetHost}/emoji/${emojiFilename(filename)}.svg`); + replacement = document.createElement('picture'); + + const isSystemTheme = !!document.body?.classList.contains('theme-system'); + + if(isSystemTheme) { + let source = document.createElement('source'); + source.setAttribute('media', '(prefers-color-scheme: dark)'); + source.setAttribute('srcset', `${assetHost}/emoji/${emojiFilename(filename, "dark")}.svg`); + replacement.appendChild(source); + } + + let img = document.createElement('img'); + img.setAttribute('draggable', 'false'); + img.setAttribute('class', 'emojione'); + img.setAttribute('alt', unicode_emoji); + img.setAttribute('title', title); + + let theme = "light"; + + if(!isSystemTheme && !document.body?.classList.contains('theme-mastodon-light')) + theme = "dark"; + + img.setAttribute('src', `${assetHost}/emoji/${emojiFilename(filename, theme)}.svg`); + replacement.appendChild(img); } // Add the processed-up-to-now string and the emoji replacement diff --git a/app/lib/themes.rb b/app/lib/themes.rb index 243ffb9ab9..4010d84435 100644 --- a/app/lib/themes.rb +++ b/app/lib/themes.rb @@ -11,6 +11,6 @@ class Themes end def names - @conf.keys + ['system'] + @conf.keys end end diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 449657f8ca..0cd7fc9f44 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -27,7 +27,7 @@ %title= html_title = stylesheet_pack_tag 'common', media: 'all', crossorigin: 'anonymous' - = stylesheet_pack_tag current_theme, media: 'all', crossorigin: 'anonymous' + = theme_style_tags current_theme -# Needed for the wicg-inert polyfill. It needs to be on it's own