From 806e2a993a8de166b96aa046c214f10eb140362f Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 26 Mar 2026 10:58:47 +0100 Subject: [PATCH 01/20] Fix Webfinger endpoint not handling new AP ID scheme (#38391) --- .../well_known/webfinger_controller.rb | 18 +- app/lib/webfinger_resource.rb | 23 +-- spec/lib/webfinger_resource_spec.rb | 158 +++++++++--------- 3 files changed, 90 insertions(+), 109 deletions(-) diff --git a/app/controllers/well_known/webfinger_controller.rb b/app/controllers/well_known/webfinger_controller.rb index 72f0ea890f..9536b948f3 100644 --- a/app/controllers/well_known/webfinger_controller.rb +++ b/app/controllers/well_known/webfinger_controller.rb @@ -18,23 +18,7 @@ module WellKnown private def set_account - username = username_from_resource - - @account = begin - if username == Rails.configuration.x.local_domain || username == Rails.configuration.x.web_domain - Account.representative - else - Account.find_local!(username) - end - end - end - - def username_from_resource - resource_user = resource_param - username, domain = resource_user.split('@') - resource_user = "#{username}@#{Rails.configuration.x.local_domain}" if Rails.configuration.x.alternate_domains.include?(domain) - - WebfingerResource.new(resource_user).username + @account = WebfingerResource.new(resource_param).account end def resource_param diff --git a/app/lib/webfinger_resource.rb b/app/lib/webfinger_resource.rb index 95de496a6d..2d4c6ab2be 100644 --- a/app/lib/webfinger_resource.rb +++ b/app/lib/webfinger_resource.rb @@ -9,14 +9,14 @@ class WebfingerResource @resource = resource end - def username + def account case resource when %r{\A(https?://)?#{instance_actor_regexp}/?\Z} - Rails.configuration.x.local_domain + Account.representative when /\Ahttps?/i - username_from_url + account_from_url when /@/ - username_from_acct + account_from_acct else raise InvalidRequest end @@ -31,11 +31,11 @@ class WebfingerResource Regexp.union(hosts) end - def username_from_url + def account_from_url if account_show_page? - path_params[:username] + path_params.key?(:username) ? Account.find_local!(path_params[:username]) : Account.local.find(path_params[:id]) elsif instance_actor_page? - Rails.configuration.x.local_domain + Account.representative else raise ActiveRecord::RecordNotFound end @@ -53,10 +53,13 @@ class WebfingerResource Rails.application.routes.recognize_path(resource) end - def username_from_acct + def account_from_acct raise ActiveRecord::RecordNotFound unless domain_matches_local? - local_username + username = local_username + return Account.representative if username == Rails.configuration.x.local_domain || username == Rails.configuration.x.web_domain + + Account.find_local!(username) end def split_acct @@ -76,6 +79,6 @@ class WebfingerResource end def domain_matches_local? - TagManager.instance.local_domain?(local_domain) || TagManager.instance.web_domain?(local_domain) + TagManager.instance.local_domain?(local_domain) || TagManager.instance.web_domain?(local_domain) || Rails.configuration.x.alternate_domains.include?(local_domain) end end diff --git a/spec/lib/webfinger_resource_spec.rb b/spec/lib/webfinger_resource_spec.rb index 0b86b41c48..581fa7264b 100644 --- a/spec/lib/webfinger_resource_spec.rb +++ b/spec/lib/webfinger_resource_spec.rb @@ -11,133 +11,127 @@ RSpec.describe WebfingerResource do Rails.configuration.x.web_domain = before_web end - describe '#username' do + describe '#account' do + subject { described_class.new(resource).account } + describe 'with a URL value' do - it 'raises with a route whose controller is not AccountsController' do - resource = 'https://example.com/users/alice/other' + context 'with a route whose controller is not AccountsController' do + let(:resource) { 'https://example.com/users/alice/other' } - expect do - described_class.new(resource).username - end.to raise_error(ActiveRecord::RecordNotFound) + it 'raises an error' do + expect { subject }.to raise_error(ActiveRecord::RecordNotFound) + end end - it 'raises with a route whose action is not show' do - resource = 'https://example.com/users/alice' + context 'with a string that does not start with an URL' do + let(:resource) { 'website for http://example.com/users/alice.other' } - recognized = Rails.application.routes.recognize_path(resource) - allow(recognized).to receive(:[]).with(:controller).and_return('accounts') - allow(recognized).to receive(:[]).with(:username).and_return('alice') - allow(recognized).to receive(:[]).with(:action).and_return('create') - - allow(Rails.application.routes).to receive(:recognize_path).with(resource).and_return(recognized) - - expect do - described_class.new(resource).username - end.to raise_error(ActiveRecord::RecordNotFound) - expect(recognized).to have_received(:[]).exactly(3).times - - expect(Rails.application.routes).to have_received(:recognize_path) - .with(resource) - .at_least(:once) + it 'raises an error' do + expect { subject }.to raise_error(described_class::InvalidRequest) + end end - it 'raises with a string that doesnt start with URL' do - resource = 'website for http://example.com/users/alice/other' + context 'with a valid HTTPS route to an existing user' do + let(:account) { Fabricate(:account) } + let(:resource) { "https://example.com/users/#{account.username}" } - expect do - described_class.new(resource).username - end.to raise_error(described_class::InvalidRequest) + it { is_expected.to eq(account) } end - it 'finds the username in a valid https route' do - resource = 'https://example.com/users/alice' + context 'with a valid HTTPS route to an existing user using the new API scheme' do + let(:account) { Fabricate(:account) } + let(:resource) { "https://example.com/ap/users/#{account.id}" } - result = described_class.new(resource).username - expect(result).to eq 'alice' + it { is_expected.to eq(account) } end - it 'finds the username in a mixed case http route' do - resource = 'HTTp://exAMPLe.com/users/alice' + context 'with a valid HTTPS route to a non-existing user' do + let(:account) { Fabricate(:account) } + let(:resource) { 'https://example.com/users/alice' } - result = described_class.new(resource).username - expect(result).to eq 'alice' + it 'raises an error' do + expect { subject }.to raise_error(ActiveRecord::RecordNotFound) + end end - it 'finds the username in a valid http route' do - resource = 'http://example.com/users/alice' + context 'with a mixed case HTTP but valid route to an existing user' do + let(:account) { Fabricate(:account) } + let(:resource) { "HTTp://example.com/users/#{account.username}" } - result = described_class.new(resource).username - expect(result).to eq 'alice' + it { is_expected.to eq(account) } + end + + context 'with a valid HTTP route to an existing user' do + let(:account) { Fabricate(:account) } + let(:resource) { "http://example.com/users/#{account.username}" } + + it { is_expected.to eq(account) } end end describe 'with a username and hostname value' do - it 'raises on a non-local domain' do - resource = 'user@remote-host.com' + context 'with a non-local domain' do + let(:account) { Fabricate(:account) } + let(:resource) { "#{account.username}@remote-host.com" } - expect do - described_class.new(resource).username - end.to raise_error(ActiveRecord::RecordNotFound) + it 'raises an error' do + expect { subject }.to raise_error(ActiveRecord::RecordNotFound) + end end - it 'finds username for a local domain' do - Rails.configuration.x.local_domain = 'example.com' - resource = 'alice@example.com' + context 'with a valid handle for a local user with local domain' do + let(:account) { Fabricate(:account) } + let(:resource) { "#{account.username}@example.com" } - result = described_class.new(resource).username - expect(result).to eq 'alice' + before { Rails.configuration.x.local_domain = 'example.com' } + + it { is_expected.to eq(account) } end - it 'finds username for a web domain' do - Rails.configuration.x.web_domain = 'example.com' - resource = 'alice@example.com' + context 'with a valid handle for a local user with web domain' do + let(:account) { Fabricate(:account) } + let(:resource) { "#{account.username}@example.com" } - result = described_class.new(resource).username - expect(result).to eq 'alice' + before { Rails.configuration.x.web_domain = 'example.com' } + + it { is_expected.to eq(account) } end end describe 'with an acct value' do - it 'raises on a non-local domain' do - resource = 'acct:user@remote-host.com' + context 'with a non-local domain' do + let(:account) { Fabricate(:account) } + let(:resource) { "acct:#{account.username}@remote-host.com" } - expect do - described_class.new(resource).username - end.to raise_error(ActiveRecord::RecordNotFound) + it 'raises an error' do + expect { subject }.to raise_error(ActiveRecord::RecordNotFound) + end end - it 'raises on a nonsense domain' do - resource = 'acct:user@remote-host@remote-hostess.remote.local@remote' + context 'with a valid handle for a local user with local domain' do + let(:account) { Fabricate(:account) } + let(:resource) { "acct:#{account.username}@example.com" } - expect do - described_class.new(resource).username - end.to raise_error(ActiveRecord::RecordNotFound) + before { Rails.configuration.x.local_domain = 'example.com' } + + it { is_expected.to eq(account) } end - it 'finds the username for a local account if the domain is the local one' do - Rails.configuration.x.local_domain = 'example.com' - resource = 'acct:alice@example.com' + context 'with a valid handle for a local user with web domain' do + let(:account) { Fabricate(:account) } + let(:resource) { "acct:#{account.username}@example.com" } - result = described_class.new(resource).username - expect(result).to eq 'alice' - end + before { Rails.configuration.x.web_domain = 'example.com' } - it 'finds the username for a local account if the domain is the Web one' do - Rails.configuration.x.web_domain = 'example.com' - resource = 'acct:alice@example.com' - - result = described_class.new(resource).username - expect(result).to eq 'alice' + it { is_expected.to eq(account) } end end describe 'with a nonsense resource' do - it 'raises InvalidRequest' do - resource = 'df/:dfkj' + let(:resource) { 'df/:dfkj' } - expect do - described_class.new(resource).username - end.to raise_error(described_class::InvalidRequest) + it 'raises an error' do + expect { subject }.to raise_error(described_class::InvalidRequest) end end end From df479d598fbedb96b84c480c5d1d6ae7a95f4a15 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 26 Mar 2026 06:03:17 -0400 Subject: [PATCH 02/20] Expand coverage for `Tag.search_for` method (#38405) --- app/models/admin/tag_filter.rb | 2 +- app/models/tag.rb | 2 +- spec/models/tag_spec.rb | 28 ++++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/app/models/admin/tag_filter.rb b/app/models/admin/tag_filter.rb index 5e75757b23..a35c77bcad 100644 --- a/app/models/admin/tag_filter.rb +++ b/app/models/admin/tag_filter.rb @@ -32,7 +32,7 @@ class Admin::TagFilter when :status status_scope(value) when :name - Tag.search_for(value.to_s.strip, params[:limit], params[:offset], exclude_unlistable: false) + Tag.search_for(value, params[:limit], params[:offset], exclude_unlistable: false) when :order order_scope(value) else diff --git a/app/models/tag.rb b/app/models/tag.rb index b14dfce763..a5fbf2f683 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -128,7 +128,7 @@ class Tag < ApplicationRecord end def search_for(term, limit = 5, offset = 0, options = {}) - stripped_term = term.strip + stripped_term = term.to_s.strip options.reverse_merge!({ exclude_unlistable: true, exclude_unreviewed: false }) query = Tag.matches_name(stripped_term) diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb index 61ef531fe1..d0a06013d2 100644 --- a/spec/models/tag_spec.rb +++ b/spec/models/tag_spec.rb @@ -338,6 +338,23 @@ RSpec.describe Tag do expect(results).to eq [tag] end + it 'finds tag records from padded term queries' do + tag = Fabricate(:tag, name: 'MATCH') + _miss_tag = Fabricate(:tag, name: 'miss') + + results = described_class.search_for(' match ') + + expect(results) + .to contain_exactly(tag) + end + + it 'handles nil query' do + results = described_class.search_for(nil) + + expect(results) + .to be_empty + end + it 'finds the exact matching tag as the first item' do similar_tag = Fabricate(:tag, name: 'matchlater', reviewed_at: Time.now.utc) tag = Fabricate(:tag, name: 'match', reviewed_at: Time.now.utc) @@ -364,5 +381,16 @@ RSpec.describe Tag do expect(results).to eq [tag, unlisted_tag] end + + it 'excludes non reviewed tags via option' do + tag = Fabricate(:tag, name: 'match', reviewed_at: 5.days.ago) + unreviewed_tag = Fabricate(:tag, name: 'matchreviewed', reviewed_at: nil) + + results = described_class.search_for('match', 5, 0, exclude_unreviewed: true) + + expect(results) + .to include(tag) + .and not_include(unreviewed_tag) + end end end From 1fb5cb1e679d0df4a64effd3edaeb915d2dc539d Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Thu, 26 Mar 2026 11:17:08 +0100 Subject: [PATCH 03/20] Add unique indexes for Collection(Item) URIs (#38409) --- ...1755_add_unique_indexes_to_collections_and_items.rb | 10 ++++++++++ db/schema.rb | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20260325151755_add_unique_indexes_to_collections_and_items.rb diff --git a/db/migrate/20260325151755_add_unique_indexes_to_collections_and_items.rb b/db/migrate/20260325151755_add_unique_indexes_to_collections_and_items.rb new file mode 100644 index 0000000000..df8604ebf1 --- /dev/null +++ b/db/migrate/20260325151755_add_unique_indexes_to_collections_and_items.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +class AddUniqueIndexesToCollectionsAndItems < ActiveRecord::Migration[8.1] + disable_ddl_transaction! + + def change + add_index :collections, :uri, unique: true, where: 'uri IS NOT NULL', algorithm: :concurrently + add_index :collection_items, :uri, unique: true, where: 'uri IS NOT NULL', algorithm: :concurrently + end +end diff --git a/db/schema.rb b/db/schema.rb index 1a839c2493..878ddd9e42 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[8.1].define(version: 2026_03_23_105645) do +ActiveRecord::Schema[8.1].define(version: 2026_03_25_151755) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" @@ -374,6 +374,7 @@ ActiveRecord::Schema[8.1].define(version: 2026_03_23_105645) do t.index ["approval_uri"], name: "index_collection_items_on_approval_uri", unique: true, where: "(approval_uri IS NOT NULL)" t.index ["collection_id"], name: "index_collection_items_on_collection_id" t.index ["object_uri"], name: "index_collection_items_on_object_uri", unique: true, where: "(activity_uri IS NOT NULL)" + t.index ["uri"], name: "index_collection_items_on_uri", unique: true, where: "(uri IS NOT NULL)" end create_table "collection_reports", force: :cascade do |t| @@ -402,6 +403,7 @@ ActiveRecord::Schema[8.1].define(version: 2026_03_23_105645) do t.string "uri" t.index ["account_id"], name: "index_collections_on_account_id" t.index ["tag_id"], name: "index_collections_on_tag_id" + t.index ["uri"], name: "index_collections_on_uri", unique: true, where: "(uri IS NOT NULL)" end create_table "conversation_mutes", force: :cascade do |t| From 3ebd3952a1e0b7b88884d501af9414df81972ed8 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 26 Mar 2026 11:32:30 +0100 Subject: [PATCH 04/20] Add `formatted_note` and `formatted_fields` to `GET /api/v1/profile` (#38339) --- app/serializers/rest/profile_serializer.rb | 10 ++++++++++ spec/requests/api/v1/profiles_spec.rb | 2 ++ 2 files changed, 12 insertions(+) diff --git a/app/serializers/rest/profile_serializer.rb b/app/serializers/rest/profile_serializer.rb index b96daf87d4..79b620f0ac 100644 --- a/app/serializers/rest/profile_serializer.rb +++ b/app/serializers/rest/profile_serializer.rb @@ -2,9 +2,11 @@ class REST::ProfileSerializer < ActiveModel::Serializer include RoutingHelper + include FormattingHelper # Please update app/javascript/api_types/profile.ts when making changes to the attributes attributes :id, :display_name, :note, :fields, + :formatted_note, :formatted_fields, :avatar, :avatar_static, :avatar_description, :header, :header_static, :header_description, :locked, :bot, :hide_collections, :discoverable, :indexable, @@ -17,10 +19,18 @@ class REST::ProfileSerializer < ActiveModel::Serializer object.id.to_s end + def formatted_note + account_bio_format(object) + end + def fields object.fields.map(&:to_h) end + def formatted_fields + object.fields.map { |field| { name: field.name, value: account_field_value_format(field), verified_at: field.verified_at } } + end + def avatar object.avatar_file_name.present? ? full_asset_url(object.avatar_original_url) : nil end diff --git a/spec/requests/api/v1/profiles_spec.rb b/spec/requests/api/v1/profiles_spec.rb index 7d0d1a3622..0107b9c404 100644 --- a/spec/requests/api/v1/profiles_spec.rb +++ b/spec/requests/api/v1/profiles_spec.rb @@ -44,8 +44,10 @@ RSpec.describe 'Profile API' do 'indexable' => account.indexable, 'display_name' => account.display_name, 'fields' => [], + 'formatted_fields' => [], 'attribution_domains' => [], 'note' => account.note, + 'formatted_note' => account.note, 'show_featured' => account.show_featured, 'show_media' => account.show_media, 'show_media_replies' => account.show_media_replies, From 1dd604df207771f5646de842f5269cf5549dd638 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 11:35:06 +0100 Subject: [PATCH 05/20] New Crowdin Translations (automated) (#38408) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/be.json | 2 +- app/javascript/mastodon/locales/da.json | 2 +- app/javascript/mastodon/locales/de.json | 2 +- app/javascript/mastodon/locales/el.json | 2 +- app/javascript/mastodon/locales/es-AR.json | 2 +- app/javascript/mastodon/locales/es-MX.json | 2 +- app/javascript/mastodon/locales/es.json | 25 ++++++++ app/javascript/mastodon/locales/fi.json | 1 - app/javascript/mastodon/locales/fr-CA.json | 22 ++++++- app/javascript/mastodon/locales/fr.json | 22 ++++++- app/javascript/mastodon/locales/ga.json | 2 +- app/javascript/mastodon/locales/gl.json | 15 ++++- app/javascript/mastodon/locales/he.json | 19 ++++++ app/javascript/mastodon/locales/hu.json | 1 - app/javascript/mastodon/locales/is.json | 2 +- app/javascript/mastodon/locales/it.json | 2 +- app/javascript/mastodon/locales/nl.json | 26 +++++++++ app/javascript/mastodon/locales/pl.json | 63 ++++++++++++++++++++ app/javascript/mastodon/locales/pt-BR.json | 1 - app/javascript/mastodon/locales/pt-PT.json | 7 +++ app/javascript/mastodon/locales/sq.json | 2 +- app/javascript/mastodon/locales/sv.json | 1 + app/javascript/mastodon/locales/tr.json | 20 +++++++ app/javascript/mastodon/locales/vi.json | 2 +- app/javascript/mastodon/locales/zh-CN.json | 2 +- app/javascript/mastodon/locales/zh-TW.json | 4 +- config/locales/ar.yml | 9 --- config/locales/az.yml | 5 -- config/locales/be.yml | 9 --- config/locales/bg.yml | 9 --- config/locales/ca.yml | 9 --- config/locales/cs.yml | 9 --- config/locales/cy.yml | 9 --- config/locales/da.yml | 68 +++++++++++++++++++--- config/locales/de.yml | 37 +++++++++--- config/locales/el.yml | 68 +++++++++++++++++++--- config/locales/en-GB.yml | 9 --- config/locales/eo.yml | 9 --- config/locales/es-AR.yml | 68 +++++++++++++++++++--- config/locales/es-MX.yml | 68 +++++++++++++++++++--- config/locales/es.yml | 68 +++++++++++++++++++--- config/locales/et.yml | 9 --- config/locales/eu.yml | 9 --- config/locales/fa.yml | 9 --- config/locales/fi.yml | 9 --- config/locales/fo.yml | 9 --- config/locales/fr-CA.yml | 9 --- config/locales/fr.yml | 13 +---- config/locales/fy.yml | 9 --- config/locales/ga.yml | 9 --- config/locales/gd.yml | 9 --- config/locales/gl.yml | 10 +--- config/locales/he.yml | 9 --- config/locales/hu.yml | 9 --- config/locales/ia.yml | 9 --- config/locales/is.yml | 62 +++++++++++++++++--- config/locales/it.yml | 10 +--- config/locales/ja.yml | 9 --- config/locales/ko.yml | 9 --- config/locales/lad.yml | 9 --- config/locales/lt.yml | 5 -- config/locales/lv.yml | 9 --- config/locales/ms.yml | 5 -- config/locales/nan-TW.yml | 9 --- config/locales/nl.yml | 9 --- config/locales/nn.yml | 9 --- config/locales/pl.yml | 9 --- config/locales/pt-BR.yml | 61 ++++++++++++++++--- config/locales/pt-PT.yml | 9 --- config/locales/ru.yml | 9 --- config/locales/simple_form.da.yml | 2 + config/locales/simple_form.el.yml | 2 + config/locales/simple_form.es-AR.yml | 2 + config/locales/simple_form.es-MX.yml | 10 ++-- config/locales/simple_form.es.yml | 2 + config/locales/simple_form.fr.yml | 2 +- config/locales/simple_form.is.yml | 2 + config/locales/simple_form.sq.yml | 2 + config/locales/simple_form.vi.yml | 2 + config/locales/simple_form.zh-CN.yml | 2 + config/locales/simple_form.zh-TW.yml | 2 + config/locales/sk.yml | 5 -- config/locales/sl.yml | 9 --- config/locales/sq.yml | 68 +++++++++++++++++++--- config/locales/sv.yml | 9 --- config/locales/th.yml | 9 --- config/locales/tr.yml | 9 --- config/locales/uk.yml | 9 --- config/locales/vi.yml | 65 ++++++++++++++++++--- config/locales/zh-CN.yml | 65 ++++++++++++++++++--- config/locales/zh-TW.yml | 65 ++++++++++++++++++--- 91 files changed, 915 insertions(+), 497 deletions(-) diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 888834b3b7..4d00d75d8c 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -141,8 +141,8 @@ "account.unmute": "Не ігнараваць @{name}", "account.unmute_notifications_short": "Апавяшчаць", "account.unmute_short": "Не ігнараваць", + "account_edit.bio.add_label": "Апісаць сябе", "account_edit.bio.edit_label": "Змяніць апісанне", - "account_edit.bio.label": "хто я", "account_edit.bio.placeholder": "Коратка апішыце сябе, каб дапамагчы іншым пазнаць Вас.", "account_edit.bio.title": "Хто я", "account_edit.bio_modal.add_title": "Апісаць сябе", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 512f9cbdf9..855bfa64b8 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -141,8 +141,8 @@ "account.unmute": "Vis @{name} igen", "account.unmute_notifications_short": "Vis notifikationer igen", "account.unmute_short": "Vis igen", + "account_edit.bio.add_label": "Tilføj bio", "account_edit.bio.edit_label": "Rediger bio", - "account_edit.bio.label": "bio", "account_edit.bio.placeholder": "Tilføj en kort introduktion, så andre kan få et indtryk af, hvem du er.", "account_edit.bio.title": "Bio", "account_edit.bio_modal.add_title": "Tilføj bio", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 0346c0b017..8c83dfc1e3 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -141,8 +141,8 @@ "account.unmute": "Stummschaltung von @{name} aufheben", "account.unmute_notifications_short": "Stummschaltung der Benachrichtigungen aufheben", "account.unmute_short": "Stummschaltung aufheben", + "account_edit.bio.add_label": "Biografie hinzufügen", "account_edit.bio.edit_label": "Biografie bearbeiten", - "account_edit.bio.label": "Biografie", "account_edit.bio.placeholder": "Gib anderen einen Einblick über dich, damit sie wissen, wer du bist.", "account_edit.bio.title": "Über mich", "account_edit.bio_modal.add_title": "Biografie hinzufügen", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index a4e9077801..783cc969e8 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -141,8 +141,8 @@ "account.unmute": "Άρση σίγασης @{name}", "account.unmute_notifications_short": "Σίγαση ειδοποιήσεων", "account.unmute_short": "Κατάργηση σίγασης", + "account_edit.bio.add_label": "Προσθήκη βιογραφικού", "account_edit.bio.edit_label": "Επεξεργασία βιογραφικού", - "account_edit.bio.label": "βιογραφικό", "account_edit.bio.placeholder": "Προσθέστε μια σύντομη εισαγωγή για να βοηθήσετε άλλους να σας αναγνωρίσουν.", "account_edit.bio.title": "Βιογραφικό", "account_edit.bio_modal.add_title": "Προσθήκη βιογραφικού", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 7372b4baea..c072c2d1d5 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -141,8 +141,8 @@ "account.unmute": "Dejar de silenciar a @{name}", "account.unmute_notifications_short": "Dejar de silenciar notificaciones", "account.unmute_short": "Dejar de silenciar", + "account_edit.bio.add_label": "Agregar biografía", "account_edit.bio.edit_label": "Editar biografía", - "account_edit.bio.label": "biografía", "account_edit.bio.placeholder": "Agregá una breve introducción para ayudar a otras personas a identificarte.", "account_edit.bio.title": "Biografía", "account_edit.bio_modal.add_title": "Agregar biografía", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 9dd92e8585..91e12c1a6f 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -141,8 +141,8 @@ "account.unmute": "Dejar de silenciar a @{name}", "account.unmute_notifications_short": "Dejar de silenciar notificaciones", "account.unmute_short": "Dejar de silenciar", + "account_edit.bio.add_label": "Añadir biografía", "account_edit.bio.edit_label": "Editar biografía", - "account_edit.bio.label": "biografía", "account_edit.bio.placeholder": "Añade una breve introducción para ayudar a los demás a identificarte.", "account_edit.bio.title": "Biografía", "account_edit.bio_modal.add_title": "Añadir biografía", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 4d8f4caa28..1cbdf0bb77 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -141,27 +141,39 @@ "account.unmute": "Dejar de silenciar a @{name}", "account.unmute_notifications_short": "Dejar de silenciar notificaciones", "account.unmute_short": "Dejar de silenciar", + "account_edit.bio.add_label": "Añadir biografía", + "account_edit.bio.edit_label": "Editar biografía", "account_edit.bio.placeholder": "Añade una breve introducción para ayudar a los demás a identificarte.", "account_edit.bio.title": "Biografía", "account_edit.bio_modal.add_title": "Añadir biografía", "account_edit.bio_modal.edit_title": "Editar biografía", "account_edit.column_button": "Hecho", "account_edit.column_title": "Editar perfil", + "account_edit.custom_fields.add_label": "Añadir campo", + "account_edit.custom_fields.edit_label": "Editar campo", "account_edit.custom_fields.placeholder": "Añade tus pronombres, enlaces externos o cualquier otra cosa que quieras compartir.", "account_edit.custom_fields.reorder_button": "Reordenar campos", "account_edit.custom_fields.tip_content": "Puedes añadir credibilidad fácilmente a tu cuenta de Mastodon verificando los enlaces a tus propias webs.", "account_edit.custom_fields.tip_title": "Consejo: Añade enlaces verificados", "account_edit.custom_fields.title": "Campos personalizados", "account_edit.custom_fields.verified_hint": "¿Cómo añado un enlace verificado?", + "account_edit.display_name.add_label": "Añadir nombre para mostrar", + "account_edit.display_name.edit_label": "Editar nombre para mostrar", "account_edit.display_name.placeholder": "Tu nombre de usuario es el nombre que aparece en tu perfil y en las cronologías.", "account_edit.display_name.title": "Nombre para mostrar", + "account_edit.featured_hashtags.edit_label": "Añadir etiquetas", "account_edit.featured_hashtags.placeholder": "Ayuda a otros a identificar tus temas favoritos y a acceder rápidamente a ellos.", "account_edit.featured_hashtags.title": "Etiquetas destacadas", + "account_edit.field_actions.delete": "Eliminar campo", + "account_edit.field_actions.edit": "Editar campo", "account_edit.field_delete_modal.confirm": "¿Estás seguro de que quieres borrar este campo personalizado? La acción no se puede deshacer.", "account_edit.field_delete_modal.delete_button": "Borrar", "account_edit.field_delete_modal.title": "¿Borrar campo personalizado?", "account_edit.field_edit_modal.add_title": "Añadir campo personalizado", + "account_edit.field_edit_modal.discard_confirm": "Descartar", + "account_edit.field_edit_modal.discard_message": "Tiene cambios no guardados. ¿Seguro que quieres descartarlos?", "account_edit.field_edit_modal.edit_title": "Editar campo personalizado", + "account_edit.field_edit_modal.limit_warning": "Se ha superado el límite recomendado de caracteres. Es posible que los usuarios móviles no vean el campo completo.", "account_edit.field_edit_modal.link_emoji_warning": "Recomendamos no usar emojis personalizados combinados con enlaces. Los campos personalizados que contengan ambos solo se mostrarán como texto en vez de un enlace, para evitar confusiones.", "account_edit.field_edit_modal.name_hint": "Ej. \"Web personal\"", "account_edit.field_edit_modal.name_label": "Etiqueta", @@ -190,6 +202,8 @@ "account_edit.image_edit.alt_edit_button": "Editar texto alternativo", "account_edit.image_edit.remove_button": "Quitar imagen", "account_edit.image_edit.replace_button": "Sustituir imagen", + "account_edit.item_list.delete": "Eliminar {name}", + "account_edit.item_list.edit": "Editar {name}", "account_edit.name_modal.add_title": "Añadir nombre para mostrar", "account_edit.name_modal.edit_title": "Editar nombre para mostrar", "account_edit.profile_tab.button_label": "Personalizar", @@ -212,6 +226,10 @@ "account_edit.upload_modal.step_upload.dragging": "Suelta para subir", "account_edit.upload_modal.step_upload.header": "Elige una imagen", "account_edit.upload_modal.step_upload.hint": "Formato WEBP, PNG, GIF o JPG, hasta {limit}MB.{br}La imagen será escalada a {width}x{height}px.", + "account_edit.upload_modal.title_add.avatar": "Añadir foto de perfil", + "account_edit.upload_modal.title_add.header": "Añadir foto de portada", + "account_edit.upload_modal.title_replace.avatar": "Reemplazar foto de perfil", + "account_edit.upload_modal.title_replace.header": "Reemplazar foto de portada", "account_edit.verified_modal.details": "Añade credibilidad a tu perfil de Mastodon verificando enlaces a tus webs personales. Así es como funciona:", "account_edit.verified_modal.invisible_link.details": "Añade el enlace en el encabezado. La parte importante es rel=\"me\", que evita la suplantación de identidad en webs con contenido generado por usuarios. Incluso puedes utilizar un enlace con etiqueta en el encabezado de la página en vez de {tag}, pero el HTML debe ser accesible sin ejecutar JavaScript.", "account_edit.verified_modal.invisible_link.summary": "¿Cómo puedo hacer el enlace invisible?", @@ -220,10 +238,13 @@ "account_edit.verified_modal.step2.header": "Añade tu web como un campo personalizado", "account_edit.verified_modal.title": "Cómo añadir un enlace verificado", "account_edit_tags.add_tag": "Agregar #{tagName}", + "account_edit_tags.column_title": "Editar Etiquetas", "account_edit_tags.help_text": "Las etiquetas destacadas ayudan a los usuarios a descubrir e interactuar con tu perfil. Aparecen como filtros en la vista de actividad de tu página de perfil.", + "account_edit_tags.max_tags_reached": "Has alcanzado el número máximo de etiquetas destacadas.", "account_edit_tags.search_placeholder": "Introduce una etiqueta…", "account_edit_tags.suggestions": "Sugerencias:", "account_edit_tags.tag_status_count": "{count, plural, one {# publicación} other {# publicaciones}}", + "account_list.total": "{total, plural, one {# cuenta} other {# cuentas}}", "account_note.placeholder": "Haz clic para añadir nota", "admin.dashboard.daily_retention": "Tasa de retención de usuarios por día después del registro", "admin.dashboard.monthly_retention": "Tasa de retención de usuarios por mes después del registro", @@ -339,6 +360,8 @@ "collections.accounts.empty_description": "Añade hasta {count} cuentas que sigas", "collections.accounts.empty_title": "Esta colección está vacía", "collections.collection_description": "Descripción", + "collections.collection_language": "Idioma", + "collections.collection_language_none": "Ninguno", "collections.collection_name": "Nombre", "collections.collection_topic": "Tema", "collections.confirm_account_removal": "¿Estás seguro de que quieres eliminar esta cuenta de la colección?", @@ -662,7 +685,9 @@ "follow_suggestions.who_to_follow": "A quién seguir", "followed_tags": "Etiquetas seguidas", "followers.hide_other_followers": "Este usuario ha elegido no hacer visible sus otros seguidores", + "followers.title": "Siguiendo a {name}", "following.hide_other_following": "Este usuario ha elegido no hacer visible a quién más sigue", + "following.title": "Seguido por {name}", "footer.about": "Acerca de", "footer.about_mastodon": "Acerca de Mastodon", "footer.about_server": "Acerca de {domain}", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 0fa0d632f0..632f8f54c1 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -142,7 +142,6 @@ "account.unmute_notifications_short": "Kumoa ilmoitusten mykistys", "account.unmute_short": "Kumoa mykistys", "account_edit.bio.edit_label": "Muokkaa elämäkertaa", - "account_edit.bio.label": "elämäkerta", "account_edit.bio.placeholder": "Lisää lyhyt esittely, joka auttaa muita tunnistamaan sinut.", "account_edit.bio.title": "Elämäkerta", "account_edit.bio_modal.add_title": "Lisää elämäkerta", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 13923aa50c..bdac463c6b 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -141,27 +141,39 @@ "account.unmute": "Ne plus masquer @{name}", "account.unmute_notifications_short": "Ne plus masquer les notifications", "account.unmute_short": "Ne plus masquer", + "account_edit.bio.add_label": "Ajouter une présentation", + "account_edit.bio.edit_label": "Modifier la présentation", "account_edit.bio.placeholder": "Ajouter une courte introduction pour aider les autres à vous connaître.", "account_edit.bio.title": "Présentation", "account_edit.bio_modal.add_title": "Ajouter une présentation", "account_edit.bio_modal.edit_title": "Modifier la présentation", "account_edit.column_button": "Terminé", "account_edit.column_title": "Modifier le profil", + "account_edit.custom_fields.add_label": "Ajouter un champ", + "account_edit.custom_fields.edit_label": "Modifier le champ", "account_edit.custom_fields.placeholder": "Ajouter vos pronoms, vos sites, ou tout ce que vous voulez partager.", "account_edit.custom_fields.reorder_button": "Réorganiser les champs", "account_edit.custom_fields.tip_content": "Vous pouvez facilement ajouter de la crédibilité à votre compte Mastodon en vérifiant les liens vers tous les sites Web que vous possédez.", "account_edit.custom_fields.tip_title": "Astuce : ajout de liens vérifiés", "account_edit.custom_fields.title": "Champs personnalisés", "account_edit.custom_fields.verified_hint": "Comment ajouter un lien vérifié ?", + "account_edit.display_name.add_label": "Ajouter un nom public", + "account_edit.display_name.edit_label": "Modifier le nom public", "account_edit.display_name.placeholder": "Votre nom public est le nom qui apparaît sur votre profil et dans les fils d'actualités.", "account_edit.display_name.title": "Nom public", + "account_edit.featured_hashtags.edit_label": "Ajouter des hashtags", "account_edit.featured_hashtags.placeholder": "Aider les autres à identifier et à accéder rapidement à vos sujets préférés.", "account_edit.featured_hashtags.title": "Hashtags mis en avant", + "account_edit.field_actions.delete": "Supprimer le champ", + "account_edit.field_actions.edit": "Modifier le champ", "account_edit.field_delete_modal.confirm": "Voulez-vous vraiment supprimer ce champ personnalisé ? Cette action ne peut pas être annulée.", "account_edit.field_delete_modal.delete_button": "Supprimer", "account_edit.field_delete_modal.title": "Supprimer le champ personnalisé ?", "account_edit.field_edit_modal.add_title": "Ajouter un champ personnalisé", + "account_edit.field_edit_modal.discard_confirm": "Abandonner", + "account_edit.field_edit_modal.discard_message": "Vos modifications n’ont pas été enregistrées. Voulez-vous vraiment les abandonner ?", "account_edit.field_edit_modal.edit_title": "Modifier un champ personnalisé", + "account_edit.field_edit_modal.limit_warning": "Le nombre de caractères dépasse la limite recommandée. Le champ peut ne pas s'afficher entièrement sur les téléphones.", "account_edit.field_edit_modal.link_emoji_warning": "Nous déconseillons l'usage d'émoji personnalisé avec les URL. Les champs personnalisés contenant les deux seront affichés comme du texte et non un lien, afin d'éviter toute confusion.", "account_edit.field_edit_modal.name_hint": "Par exemple « Site Web personnel »", "account_edit.field_edit_modal.name_label": "Libellé", @@ -190,6 +202,8 @@ "account_edit.image_edit.alt_edit_button": "Modifier le texte alternatif", "account_edit.image_edit.remove_button": "Supprimer l’image", "account_edit.image_edit.replace_button": "Remplacer l'image", + "account_edit.item_list.delete": "Supprimer {name}", + "account_edit.item_list.edit": "Modifier {name}", "account_edit.name_modal.add_title": "Ajouter un nom public", "account_edit.name_modal.edit_title": "Modifier le nom public", "account_edit.profile_tab.button_label": "Personnaliser", @@ -212,6 +226,10 @@ "account_edit.upload_modal.step_upload.dragging": "Déposer pour téléverser", "account_edit.upload_modal.step_upload.header": "Choisir une image", "account_edit.upload_modal.step_upload.hint": "Format WebP, PNG, GIF ou JPEG, jusqu'à {limit} Mo.{br}L'image sera redimensionnée à {width} × {height} px.", + "account_edit.upload_modal.title_add.avatar": "Ajouter une photo de profil", + "account_edit.upload_modal.title_add.header": "Ajouter une photo de couverture", + "account_edit.upload_modal.title_replace.avatar": "Remplacer la photo de profil", + "account_edit.upload_modal.title_replace.header": "Remplacer la photo de couverture", "account_edit.verified_modal.details": "Ajouter de la crédibilité à votre profil Mastodon en vérifiant les liens vers vos sites Web personnels. Voici comment cela fonctionne :", "account_edit.verified_modal.invisible_link.details": "Ajouter le lien dans votre en-tête. La partie importante est « rel=\"me\" » qui empêche l'usurpation d'identité sur des sites Web ayant du contenu généré par d'autres utilisateur·rice·s. Vous pouvez aussi utiliser une balise link dans l'en-tête de la page au lieu de {tag}, mais le code HTML doit être accessible sans avoir besoin d'exécuter du JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Comment rendre le lien invisible ?", @@ -220,7 +238,9 @@ "account_edit.verified_modal.step2.header": "Ajouter votre site Web en tant que champ personnalisé", "account_edit.verified_modal.title": "Comment ajouter un lien vérifié ?", "account_edit_tags.add_tag": "Ajouter #{tagName}", + "account_edit_tags.column_title": "Modifier les hashtags", "account_edit_tags.help_text": "Les hashtags mis en avant aident les personnes à découvrir et interagir avec votre profil. Ils apparaissent comme des filtres dans la vue « Activité » de votre profil.", + "account_edit_tags.max_tags_reached": "Vous avez atteint le nombre maximum de hashtags mis en avant.", "account_edit_tags.search_placeholder": "Saisir un hashtag…", "account_edit_tags.suggestions": "Suggestions :", "account_edit_tags.tag_status_count": "{count, plural, one {# message} other {# messages}}", @@ -996,7 +1016,7 @@ "onboarding.profile.note_hint": "Vous pouvez @mentionner d'autres personnes ou #hashtags…", "onboarding.profile.title": "Configuration du profil", "onboarding.profile.upload_avatar": "Importer une photo de profil", - "onboarding.profile.upload_header": "Importer un entête de profil", + "onboarding.profile.upload_header": "Importer une image de couverture", "password_confirmation.exceeds_maxlength": "La confirmation du mot de passe dépasse la longueur maximale du mot de passe", "password_confirmation.mismatching": "Les deux mots de passe ne correspondent pas", "picture_in_picture.restore": "Remettre en place", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 951d25fa2f..d76f0f8d4f 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -141,27 +141,39 @@ "account.unmute": "Ne plus masquer @{name}", "account.unmute_notifications_short": "Réactiver les notifications", "account.unmute_short": "Ne plus masquer", + "account_edit.bio.add_label": "Ajouter une présentation", + "account_edit.bio.edit_label": "Modifier la présentation", "account_edit.bio.placeholder": "Ajouter une courte introduction pour aider les autres à vous connaître.", "account_edit.bio.title": "Présentation", "account_edit.bio_modal.add_title": "Ajouter une présentation", "account_edit.bio_modal.edit_title": "Modifier la présentation", "account_edit.column_button": "Terminé", "account_edit.column_title": "Modifier le profil", + "account_edit.custom_fields.add_label": "Ajouter un champ", + "account_edit.custom_fields.edit_label": "Modifier le champ", "account_edit.custom_fields.placeholder": "Ajouter vos pronoms, vos sites, ou tout ce que vous voulez partager.", "account_edit.custom_fields.reorder_button": "Réorganiser les champs", "account_edit.custom_fields.tip_content": "Vous pouvez facilement ajouter de la crédibilité à votre compte Mastodon en vérifiant les liens vers tous les sites Web que vous possédez.", "account_edit.custom_fields.tip_title": "Astuce : ajout de liens vérifiés", "account_edit.custom_fields.title": "Champs personnalisés", "account_edit.custom_fields.verified_hint": "Comment ajouter un lien vérifié ?", + "account_edit.display_name.add_label": "Ajouter un nom public", + "account_edit.display_name.edit_label": "Modifier le nom public", "account_edit.display_name.placeholder": "Votre nom public est le nom qui apparaît sur votre profil et dans les fils d'actualités.", "account_edit.display_name.title": "Nom public", + "account_edit.featured_hashtags.edit_label": "Ajouter des hashtags", "account_edit.featured_hashtags.placeholder": "Aider les autres à identifier et à accéder rapidement à vos sujets préférés.", "account_edit.featured_hashtags.title": "Hashtags mis en avant", + "account_edit.field_actions.delete": "Supprimer le champ", + "account_edit.field_actions.edit": "Modifier le champ", "account_edit.field_delete_modal.confirm": "Voulez-vous vraiment supprimer ce champ personnalisé ? Cette action ne peut pas être annulée.", "account_edit.field_delete_modal.delete_button": "Supprimer", "account_edit.field_delete_modal.title": "Supprimer le champ personnalisé ?", "account_edit.field_edit_modal.add_title": "Ajouter un champ personnalisé", + "account_edit.field_edit_modal.discard_confirm": "Abandonner", + "account_edit.field_edit_modal.discard_message": "Vos modifications n’ont pas été enregistrées. Voulez-vous vraiment les abandonner ?", "account_edit.field_edit_modal.edit_title": "Modifier un champ personnalisé", + "account_edit.field_edit_modal.limit_warning": "Le nombre de caractères dépasse la limite recommandée. Le champ peut ne pas s'afficher entièrement sur les téléphones.", "account_edit.field_edit_modal.link_emoji_warning": "Nous déconseillons l'usage d'émoji personnalisé avec les URL. Les champs personnalisés contenant les deux seront affichés comme du texte et non un lien, afin d'éviter toute confusion.", "account_edit.field_edit_modal.name_hint": "Par exemple « Site Web personnel »", "account_edit.field_edit_modal.name_label": "Libellé", @@ -190,6 +202,8 @@ "account_edit.image_edit.alt_edit_button": "Modifier le texte alternatif", "account_edit.image_edit.remove_button": "Supprimer l’image", "account_edit.image_edit.replace_button": "Remplacer l'image", + "account_edit.item_list.delete": "Supprimer {name}", + "account_edit.item_list.edit": "Modifier {name}", "account_edit.name_modal.add_title": "Ajouter un nom public", "account_edit.name_modal.edit_title": "Modifier le nom public", "account_edit.profile_tab.button_label": "Personnaliser", @@ -212,6 +226,10 @@ "account_edit.upload_modal.step_upload.dragging": "Déposer pour téléverser", "account_edit.upload_modal.step_upload.header": "Choisir une image", "account_edit.upload_modal.step_upload.hint": "Format WebP, PNG, GIF ou JPEG, jusqu'à {limit} Mo.{br}L'image sera redimensionnée à {width} × {height} px.", + "account_edit.upload_modal.title_add.avatar": "Ajouter une photo de profil", + "account_edit.upload_modal.title_add.header": "Ajouter une photo de couverture", + "account_edit.upload_modal.title_replace.avatar": "Remplacer la photo de profil", + "account_edit.upload_modal.title_replace.header": "Remplacer la photo de couverture", "account_edit.verified_modal.details": "Ajouter de la crédibilité à votre profil Mastodon en vérifiant les liens vers vos sites Web personnels. Voici comment cela fonctionne :", "account_edit.verified_modal.invisible_link.details": "Ajouter le lien dans votre en-tête. La partie importante est « rel=\"me\" » qui empêche l'usurpation d'identité sur des sites Web ayant du contenu généré par d'autres utilisateur·rice·s. Vous pouvez aussi utiliser une balise link dans l'en-tête de la page au lieu de {tag}, mais le code HTML doit être accessible sans avoir besoin d'exécuter du JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Comment rendre le lien invisible ?", @@ -220,7 +238,9 @@ "account_edit.verified_modal.step2.header": "Ajouter votre site Web en tant que champ personnalisé", "account_edit.verified_modal.title": "Comment ajouter un lien vérifié ?", "account_edit_tags.add_tag": "Ajouter #{tagName}", + "account_edit_tags.column_title": "Modifier les hashtags", "account_edit_tags.help_text": "Les hashtags mis en avant aident les personnes à découvrir et interagir avec votre profil. Ils apparaissent comme des filtres dans la vue « Activité » de votre profil.", + "account_edit_tags.max_tags_reached": "Vous avez atteint le nombre maximum de hashtags mis en avant.", "account_edit_tags.search_placeholder": "Saisir un hashtag…", "account_edit_tags.suggestions": "Suggestions :", "account_edit_tags.tag_status_count": "{count, plural, one {# message} other {# messages}}", @@ -996,7 +1016,7 @@ "onboarding.profile.note_hint": "Vous pouvez @mentionner d'autres personnes ou #hashtags…", "onboarding.profile.title": "Configuration du profil", "onboarding.profile.upload_avatar": "Importer une photo de profil", - "onboarding.profile.upload_header": "Importer un entête de profil", + "onboarding.profile.upload_header": "Importer une image de couverture", "password_confirmation.exceeds_maxlength": "La confirmation du mot de passe dépasse la longueur du mot de passe", "password_confirmation.mismatching": "Les deux mots de passe ne correspondent pas", "picture_in_picture.restore": "Remettre en place", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index c6b3b1371e..5f8ebf98b8 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -141,8 +141,8 @@ "account.unmute": "Díbhalbhaigh @{name}", "account.unmute_notifications_short": "Díbhalbhaigh fógraí", "account.unmute_short": "Díbhalbhaigh", + "account_edit.bio.add_label": "Cuir beathaisnéis leis", "account_edit.bio.edit_label": "Cuir beathaisnéis in eagar", - "account_edit.bio.label": "beathaisnéis", "account_edit.bio.placeholder": "Cuir réamhrá gearr leis chun cabhrú le daoine eile tú a aithint.", "account_edit.bio.title": "Beathaisnéis", "account_edit.bio_modal.add_title": "Cuir beathaisnéis leis", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 26b13a7d22..27ad0f4ff8 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -141,8 +141,8 @@ "account.unmute": "Deixar de silenciar a @{name}", "account.unmute_notifications_short": "Reactivar notificacións", "account.unmute_short": "Non silenciar", + "account_edit.bio.add_label": "Engadir biografía", "account_edit.bio.edit_label": "Editar biografía", - "account_edit.bio.label": "sobre ti", "account_edit.bio.placeholder": "Escribe unha breve presentación para que te coñezan mellor.", "account_edit.bio.title": "Sobre ti", "account_edit.bio_modal.add_title": "Engadir biografía", @@ -171,7 +171,9 @@ "account_edit.field_delete_modal.title": "Eliminar campo persoal?", "account_edit.field_edit_modal.add_title": "Engadir campo persoal", "account_edit.field_edit_modal.discard_confirm": "Desbotar", + "account_edit.field_edit_modal.discard_message": "Tes cambios sen gardar. Tes certeza de querer desbotalos?", "account_edit.field_edit_modal.edit_title": "Editar campo persoal", + "account_edit.field_edit_modal.limit_warning": "Superouse o límite de caracteres recomendado. Nos móbiles podería non verse a información completa.", "account_edit.field_edit_modal.link_emoji_warning": "Non recomendamos o uso de emojis persoais combinados con URLs. Os campos persoais que conteñen ambos móstranse só como texto e non como unha ligazón, para evitar a confusión de quen os lea.", "account_edit.field_edit_modal.name_hint": "Ex. \"Páxina web persoal\"", "account_edit.field_edit_modal.name_label": "Etiqueta", @@ -200,6 +202,8 @@ "account_edit.image_edit.alt_edit_button": "Editar descrición", "account_edit.image_edit.remove_button": "Retirar a imaxe", "account_edit.image_edit.replace_button": "Substituír a imaxe", + "account_edit.item_list.delete": "Eliminar {name}", + "account_edit.item_list.edit": "Editar {name}", "account_edit.name_modal.add_title": "Engadir nome público", "account_edit.name_modal.edit_title": "Editar o nome público", "account_edit.profile_tab.button_label": "Personalizar", @@ -222,6 +226,10 @@ "account_edit.upload_modal.step_upload.dragging": "Solta aquí para subir", "account_edit.upload_modal.step_upload.header": "Escoller unha imaxe", "account_edit.upload_modal.step_upload.hint": "Formato WEBP, PNG, GIF ou JPG, ata {limit}MB.{br}A imaxe será comprimida a {width}x{height}px.", + "account_edit.upload_modal.title_add.avatar": "Engadir foto do perfil", + "account_edit.upload_modal.title_add.header": "Engadir foto da cabeceira", + "account_edit.upload_modal.title_replace.avatar": "Substituír foto do perfil", + "account_edit.upload_modal.title_replace.header": "Substituír foto da cabeceira", "account_edit.verified_modal.details": "Engade maior credibilidade ao teu perfil Mastodon verificando as ligazóns ás túas páxinas web persoais. Funciona así:", "account_edit.verified_modal.invisible_link.details": "Engade a ligazón ao «header» da páxina web. A parte importante é rel=\"me\", que evita a suplantación en sitios web con contido creado polas usuarias. Tamén podes usar a etiqueta «link» na cabeceira da páxina no lugar de {tag}, pero o HTML ten que ser accesible sen usar JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Como fago visible a ligazón?", @@ -230,10 +238,13 @@ "account_edit.verified_modal.step2.header": "Engade a túa páxina como campo persoal", "account_edit.verified_modal.title": "Como engadir unha ligazón verificada", "account_edit_tags.add_tag": "Engadir #{tagName}", + "account_edit_tags.column_title": "Editar etiquetas", "account_edit_tags.help_text": "Os cancelos destacados axúdanlle ás usuarias a atopar e interactuar co teu perfil. Aparecen como filtros na túa páxina de perfil na vista Actividade.", + "account_edit_tags.max_tags_reached": "Acadaches o número máximo de cancelos destacados.", "account_edit_tags.search_placeholder": "Escribe un cancelo…", "account_edit_tags.suggestions": "Suxestións:", "account_edit_tags.tag_status_count": "{count, plural, one {# publicación} other {# publicacións}}", + "account_list.total": "{total, plural, one {# conta} other {# contas}}", "account_note.placeholder": "Preme para engadir nota", "admin.dashboard.daily_retention": "Ratio de retención de usuarias diaria após rexistrarse", "admin.dashboard.monthly_retention": "Ratio de retención de usuarias mensual após o rexistro", @@ -674,7 +685,9 @@ "follow_suggestions.who_to_follow": "A quen seguir", "followed_tags": "Cancelos seguidos", "followers.hide_other_followers": "Esta usuaria escolleu non mostrar as outras persoas que a seguen", + "followers.title": "Seguindo a {name}", "following.hide_other_following": "Esta usuaria escolleu non mostrar as outras persoas que segue", + "following.title": "Seguida por {name}", "footer.about": "Sobre", "footer.about_mastodon": "Sobre Mastodon", "footer.about_server": "Sobre {domain}", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index e56abf8fd6..39f6a7f60b 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -141,27 +141,38 @@ "account.unmute": "הפסקת השתקת @{name}", "account.unmute_notifications_short": "הפעלת הודעות", "account.unmute_short": "ביטול השתקה", + "account_edit.bio.edit_label": "עריכת ביוגרפיה", "account_edit.bio.placeholder": "הוסיפו הצגה קצרה כדי לעזור לאחרים לזהות אותך.", "account_edit.bio.title": "ביוגרפיה", "account_edit.bio_modal.add_title": "הוסיפו ביוגרפיה", "account_edit.bio_modal.edit_title": "עריכת ביוגרפיה", "account_edit.column_button": "סיום", "account_edit.column_title": "עריכת הפרופיל", + "account_edit.custom_fields.add_label": "הוספת שדה", + "account_edit.custom_fields.edit_label": "עריכת שדה", "account_edit.custom_fields.placeholder": "הוסיפו צורת פניה, קישורים חיצוניים וכל דבר שתרצו לשתף.", "account_edit.custom_fields.reorder_button": "הגדרת סדר השדות", "account_edit.custom_fields.tip_content": "ניתן להוסיף אמינות לחשבון המסטודון שלך על ידי וידוא קישורים לאתרים שבבעלותך.", "account_edit.custom_fields.tip_title": "טיפ: הוספת קישורים מוודאים", "account_edit.custom_fields.title": "שדות בהתאמה אישית", "account_edit.custom_fields.verified_hint": "כיצד תוסיפו קישורים מוודאים?", + "account_edit.display_name.add_label": "הוספת שם תצוגה", + "account_edit.display_name.edit_label": "עריכת שם תצוגה", "account_edit.display_name.placeholder": "שם התצוגה שלכן הוא איך שהשם יופיע בפרופיל ובצירי הזמנים.", "account_edit.display_name.title": "שם תצוגה", + "account_edit.featured_hashtags.edit_label": "הוספת תגיות", "account_edit.featured_hashtags.placeholder": "עזרו לאחרים לזהות ולגשת בקלות לנושאים החביבים עליכם.", "account_edit.featured_hashtags.title": "תגיות נבחרות", + "account_edit.field_actions.delete": "מחיקת שדה", + "account_edit.field_actions.edit": "עריכת שדה", "account_edit.field_delete_modal.confirm": "האם אתם בטוחיםות שברצונכן למחוק את השדה המיוחד הזה? פעולה זו לא ניתנת לביטול.", "account_edit.field_delete_modal.delete_button": "מחק", "account_edit.field_delete_modal.title": "מחיקת שדה מתואם אישית?", "account_edit.field_edit_modal.add_title": "הוסף שדה מותאם אישית", + "account_edit.field_edit_modal.discard_confirm": "השלך", + "account_edit.field_edit_modal.discard_message": "יש שינויים שלא נשמרו. לסלק אותם?", "account_edit.field_edit_modal.edit_title": "עריכת שדה מותאם אישית", + "account_edit.field_edit_modal.limit_warning": "עברת את מספר התווים המירבי המומלץ. משתמשים בנייד עלולים שלא לראות את השדה המלא.", "account_edit.field_edit_modal.link_emoji_warning": "אנו ממליצים נגד שימוש באמוג'י ייחודיים ביחד עם URL. שדות מיוחדים שמכילים את שניהם יופיעו כמלל בלבד ולא כקישור, כדי למנוע בלבול משתמשים.", "account_edit.field_edit_modal.name_hint": "למשל \"אתר אישי\"", "account_edit.field_edit_modal.name_label": "תווית", @@ -190,6 +201,8 @@ "account_edit.image_edit.alt_edit_button": "עריכת מלל חלופי", "account_edit.image_edit.remove_button": "הסרת תמונה", "account_edit.image_edit.replace_button": "החלפת תמונה", + "account_edit.item_list.delete": "מחיקת {name}", + "account_edit.item_list.edit": "עריכת {name}", "account_edit.name_modal.add_title": "הוספת שם תצוגה", "account_edit.name_modal.edit_title": "עריכת שם תצוגה", "account_edit.profile_tab.button_label": "התאמה אישית", @@ -212,6 +225,10 @@ "account_edit.upload_modal.step_upload.dragging": "גרור להעלאה", "account_edit.upload_modal.step_upload.header": "בחר/י תמונה", "account_edit.upload_modal.step_upload.hint": "תכנים בתקן WEBP, PNG, GIF או JPG, עד לגודל {limit} מ\"ב.{br}התמונה תתוקן לגודל {width} על {height} פיקסלים.", + "account_edit.upload_modal.title_add.avatar": "הוספת תמונת פרופיל", + "account_edit.upload_modal.title_add.header": "הוספת תמונת מסגרת", + "account_edit.upload_modal.title_replace.avatar": "החלפת תמונת פרופיל", + "account_edit.upload_modal.title_replace.header": "החלפת תמונת מסגרת", "account_edit.verified_modal.details": "הוספת אמינות לחשבון המסטודון על ידי הוספת קישורים מוודאים לאתרים אישיים. כך זה עובד:", "account_edit.verified_modal.invisible_link.details": "הוסיפו את הקישור בכותרת. החלק החשוב הוא rel=\"me\" שמונע התחזות על אתרים עם תוכן משתמשים. ניתן גם ליצור תגית link בכותרת העמוד במקום קישור {tag} אבל קוד ה־HTML חייב להופיע שם ללא הרצה של ג'אווהסקריפט.", "account_edit.verified_modal.invisible_link.summary": "כיצד לגרום לקישור להיות בלתי נראה?", @@ -220,7 +237,9 @@ "account_edit.verified_modal.step2.header": "הוסיפו את אתרכן בשדה המיוחד", "account_edit.verified_modal.title": "כיצד תוסיפו קישורים מוודאים", "account_edit_tags.add_tag": "הוספת #{tagName}", + "account_edit_tags.column_title": "עריכת תגיות", "account_edit_tags.help_text": "תגיות נבחרות עוזרות למשתמשים לגלות ולהשתמש בפרופיל שלך. הן יופיעו כסננים במבט הפעילויות על עמוד הפרופיל שלך.", + "account_edit_tags.max_tags_reached": "הגעת למספר התגיות הנבחרות המירבי.", "account_edit_tags.search_placeholder": "הזנת תגית…", "account_edit_tags.suggestions": "הצעות:", "account_edit_tags.tag_status_count": "{count, plural, one {הודעה אחת} two {הודעותיים} other {# הודעות}}", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 48fd189c40..7735fbe1ff 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -142,7 +142,6 @@ "account.unmute_notifications_short": "Értesítések némításának feloldása", "account.unmute_short": "Némitás feloldása", "account_edit.bio.edit_label": "Bemutatkozás szerkesztése", - "account_edit.bio.label": "bemutatkozás", "account_edit.bio.placeholder": "Adj meg egy rövid bemutatkozást, hogy mások könnyebben megtaláljanak.", "account_edit.bio.title": "Bemutatkozás", "account_edit.bio_modal.add_title": "Bemutatkozás hozzáadása", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 512102f6fa..9476dc6f92 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -141,8 +141,8 @@ "account.unmute": "Hætta að þagga niður í @{name}", "account.unmute_notifications_short": "Hætta að þagga í tilkynningum", "account.unmute_short": "Hætta að þagga niður", + "account_edit.bio.add_label": "Bættu við æviágripi", "account_edit.bio.edit_label": "Breyta æviágripi", - "account_edit.bio.label": "æviágrip", "account_edit.bio.placeholder": "Settu inn stutta kynningu á þér svo aðrir eigi betur með að auðkenna þig.", "account_edit.bio.title": "Æviágrip", "account_edit.bio_modal.add_title": "Bættu við æviágripi", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index f8bd1f1039..1c62bdc030 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -141,8 +141,8 @@ "account.unmute": "Riattiva @{name}", "account.unmute_notifications_short": "Riattiva notifiche", "account.unmute_short": "Attiva audio", + "account_edit.bio.add_label": "Aggiungi biografia", "account_edit.bio.edit_label": "Modifica la biografia", - "account_edit.bio.label": "biografia", "account_edit.bio.placeholder": "Aggiungi una breve introduzione per aiutare gli altri a identificarti.", "account_edit.bio.title": "Biografia", "account_edit.bio_modal.add_title": "Aggiungi biografia", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index d53f17eb65..6f573b080a 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -141,27 +141,38 @@ "account.unmute": "@{name} niet langer negeren", "account.unmute_notifications_short": "Meldingen niet langer negeren", "account.unmute_short": "Niet langer negeren", + "account_edit.bio.edit_label": "Biografie bewerken", "account_edit.bio.placeholder": "Vertel iets over jezelf, zodat anderen inzicht krijgen in wat voor persoon je bent.", "account_edit.bio.title": "Biografie", "account_edit.bio_modal.add_title": "Biografie toevoegen", "account_edit.bio_modal.edit_title": "Biografie bewerken", "account_edit.column_button": "Klaar", "account_edit.column_title": "Profiel bewerken", + "account_edit.custom_fields.add_label": "Veld toevoegen", + "account_edit.custom_fields.edit_label": "Veld bewerken", "account_edit.custom_fields.placeholder": "Voeg je voornaamwoorden, externe links of iets anders toe dat je wilt delen.", "account_edit.custom_fields.reorder_button": "Velden opnieuw ordenen", "account_edit.custom_fields.tip_content": "Je kunt gemakkelijk je Mastodon-account geloofwaardig maken door links naar websites die van jou zijn te laten verifiëren.", "account_edit.custom_fields.tip_title": "Tip: Geverifieerde links toevoegen", "account_edit.custom_fields.title": "Extra velden", "account_edit.custom_fields.verified_hint": "Hoe voeg ik een geverifieerde link toe?", + "account_edit.display_name.add_label": "Weergavenaam toevoegen", + "account_edit.display_name.edit_label": "Weergavenaam bewerken", "account_edit.display_name.placeholder": "Je weergavenaam wordt op jouw profiel en op tijdlijnen weergegeven.", "account_edit.display_name.title": "Weergavenaam", + "account_edit.featured_hashtags.edit_label": "Hashtags toevoegen", "account_edit.featured_hashtags.placeholder": "Geef anderen een overzicht van en snel toegang tot je favoriete onderwerpen.", "account_edit.featured_hashtags.title": "Uitgelichte hashtags", + "account_edit.field_actions.delete": "Veld verwijderen", + "account_edit.field_actions.edit": "Veld bewerken", "account_edit.field_delete_modal.confirm": "Weet je zeker dat je dit aangepaste veld wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", "account_edit.field_delete_modal.delete_button": "Verwijderen", "account_edit.field_delete_modal.title": "Aangepast veld verwijderen?", "account_edit.field_edit_modal.add_title": "Aangepast veld toevoegen", + "account_edit.field_edit_modal.discard_confirm": "Weggooien", + "account_edit.field_edit_modal.discard_message": "U heeft niet-opgeslagen wijzigingen. Weet u zeker dat u ze wilt weggooien?", "account_edit.field_edit_modal.edit_title": "Aangepast veld bewerken", + "account_edit.field_edit_modal.limit_warning": "Aanbevolen tekenlimiet overschreden. Mobiele gebruikers zien mogelijk uw veld niet volledig.", "account_edit.field_edit_modal.link_emoji_warning": "We raden aan om geen lokale emoji in combinatie met URL's te gebruiken. Aangepaste velden die beide bevatten worden alleen als tekst weergegeven, in plaats van als een link. Dit om verwarring voor de gebruiker te voorkomen.", "account_edit.field_edit_modal.name_hint": "Bijv. \"Persoonlijke website\"", "account_edit.field_edit_modal.name_label": "Label", @@ -190,6 +201,8 @@ "account_edit.image_edit.alt_edit_button": "Alt-tekst bewerken", "account_edit.image_edit.remove_button": "Afbeelding verwijderen", "account_edit.image_edit.replace_button": "Afbeelding vervangen", + "account_edit.item_list.delete": "{name} verwijderen", + "account_edit.item_list.edit": "{name} bewerken", "account_edit.name_modal.add_title": "Weergavenaam toevoegen", "account_edit.name_modal.edit_title": "Weergavenaam bewerken", "account_edit.profile_tab.button_label": "Aanpassen", @@ -212,6 +225,10 @@ "account_edit.upload_modal.step_upload.dragging": "Hierheen slepen om te uploaden", "account_edit.upload_modal.step_upload.header": "Kies een afbeelding", "account_edit.upload_modal.step_upload.hint": "WEBP-, PNG-, GIF- of JPG-formaat, tot max. {limit}MB.{br}Afbeelding wordt geschaald naar {width}x{height}px.", + "account_edit.upload_modal.title_add.avatar": "Profielfoto toevoegen", + "account_edit.upload_modal.title_add.header": "Omslagfoto toevoegen", + "account_edit.upload_modal.title_replace.avatar": "Profielfoto vervangen", + "account_edit.upload_modal.title_replace.header": "Omslagfoto vervangen", "account_edit.verified_modal.details": "Maak je Mastodonprofiel geloofwaardig door links naar persoonlijke websites te verifiëren. Zo werkt het:", "account_edit.verified_modal.invisible_link.details": "Voeg de link aan de HTML van je website toe. Het belangrijkste onderdeel is rel=\"me\", waarmee wordt voorkomen dat websites met user-generated content geïmpersoneerd kunnen worden. Je kunt zelfs een -tag gebruiken binnen de -tag van je website in plaats van {tag}, maar de HTML moet zonder JavaScript toegankelijk zijn.", "account_edit.verified_modal.invisible_link.summary": "Hoe maak ik de link onzichtbaar?", @@ -220,10 +237,13 @@ "account_edit.verified_modal.step2.header": "Voeg je website toe als een aangepast veld", "account_edit.verified_modal.title": "Hoe voeg je een geverifieerde link toe", "account_edit_tags.add_tag": "#{tagName} toevoegen", + "account_edit_tags.column_title": "Labels bewerken", "account_edit_tags.help_text": "Uitgelichte hashtags helpen gebruikers je profiel te ontdekken en om er interactie mee te communiceren. Ze verschijnen als filters op je Profielpagina onder het tabblad Activiteit.", + "account_edit_tags.max_tags_reached": "Maximum aantal uitgelichte hashtags bereikt.", "account_edit_tags.search_placeholder": "Voer een hashtag in…", "account_edit_tags.suggestions": "Suggesties:", "account_edit_tags.tag_status_count": "{count, plural, one {# bericht} other {# berichten}}", + "account_list.total": "{total, plural, one {# account} other {# accounts}}", "account_note.placeholder": "Klik om een opmerking toe te voegen", "admin.dashboard.daily_retention": "Retentiegraad van gebruikers per dag, vanaf registratie", "admin.dashboard.monthly_retention": "Retentiegraad van gebruikers per maand, vanaf registratie", @@ -618,6 +638,10 @@ "featured_carousel.header": "{count, plural, one {Vastgezet bericht} other {Vastgezette berichten}}", "featured_carousel.slide": "Bericht {current, number} van {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "De laatste tijd heb over {items} gepost. Deze toevoegen als uitgelichte hashtags?", + "featured_tags.suggestions.add": "Toevoegen", + "featured_tags.suggestions.added": "Je kunt je uitgelichte hashtags beheren onder Profiel bewerken > Uitgelichte hashtags.", + "featured_tags.suggestions.dismiss": "Nee, bedankt", "filter_modal.added.context_mismatch_explanation": "Deze filtercategorie is niet van toepassing op de context waarin je dit bericht hebt benaderd. Als je wilt dat het bericht ook in deze context wordt gefilterd, moet je het filter bewerken.", "filter_modal.added.context_mismatch_title": "Context komt niet overeen!", "filter_modal.added.expired_explanation": "Deze filtercategorie is verlopen. Je moet de vervaldatum wijzigen om de categorie toe te kunnen passen.", @@ -660,7 +684,9 @@ "follow_suggestions.who_to_follow": "Wie te volgen", "followed_tags": "Gevolgde hashtags", "followers.hide_other_followers": "Deze gebruiker heeft ervoor gekozen diens andere volgers niet zichtbaar te maken", + "followers.title": "{name} volgen", "following.hide_other_following": "Deze gebruiker heeft ervoor gekozen de rest van diens gevolgde accounts niet zichtbaar te maken", + "following.title": "Gevolgd door {name}", "footer.about": "Over", "footer.about_mastodon": "Over Mastodon", "footer.about_server": "Over {domain}", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 88b21f47ca..c3642f25c0 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -14,9 +14,16 @@ "about.powered_by": "Zdecentralizowane media społecznościowe napędzane przez {mastodon}", "about.rules": "Regulamin serwera", "account.account_note_header": "Notatka", + "account.activity": "Aktywność", + "account.add_note": "Dodaj osobistą notkę", "account.add_or_remove_from_list": "Dodaj lub usuń z list", + "account.badges.admin": "Admin", + "account.badges.blocked": "Zablokowane", "account.badges.bot": "Bot", + "account.badges.domain_blocked": "Zablokowana domena", "account.badges.group": "Grupa", + "account.badges.muted": "Wyciszone", + "account.badges.muted_until": "Wyciszone do {until}", "account.block": "Blokuj @{name}", "account.block_domain": "Blokuj wszystko z {domain}", "account.block_short": "Zablokuj", @@ -27,6 +34,7 @@ "account.direct": "Napisz bezpośrednio do @{name}", "account.disable_notifications": "Przestań powiadamiać mnie o wpisach @{name}", "account.domain_blocking": "Blokowanie domeny", + "account.edit_note": "Edytuj osobistą notkę", "account.edit_profile": "Edytuj profil", "account.edit_profile_short": "Edytuj", "account.enable_notifications": "Powiadamiaj mnie o wpisach @{name}", @@ -36,9 +44,17 @@ "account.familiar_followers_two": "To konto jest obserwowane przez {name1} i {name2}", "account.featured": "Wyróżnione", "account.featured.accounts": "Profile", + "account.featured.collections": "Kolekcje", "account.featured.hashtags": "Tagi", "account.featured_tags.last_status_at": "Ostatni post {date}", "account.featured_tags.last_status_never": "Brak postów", + "account.field_overflow": "Pokaż całą zawartość", + "account.filters.all": "Wszystkie aktywności", + "account.filters.boosts_toggle": "Pokaż ulepszenia", + "account.filters.posts_boosts": "Posty i ulepszenia", + "account.filters.posts_only": "Posty", + "account.filters.posts_replies": "Posty i odpowiedzi", + "account.filters.replies_toggle": "Pokaż odpowiedzi", "account.follow": "Obserwuj", "account.follow_back": "Również obserwuj", "account.follow_back_short": "Również obserwuj", @@ -63,6 +79,24 @@ "account.locked_info": "To konto jest prywatne. Właściciel ręcznie wybiera kto może go obserwować.", "account.media": "Multimedia", "account.mention": "Wspomnij o @{name}", + "account.menu.add_to_list": "Dodaj do listy…", + "account.menu.block": "Zablokuj konto", + "account.menu.block_domain": "Zablokuj {domain}", + "account.menu.copied": "Skopiowano link do konta do schowka", + "account.menu.copy": "Skopiuj link", + "account.menu.direct": "Prywatna wzmianka", + "account.menu.hide_reblogs": "Ukryj ulepszenia na osi czasu", + "account.menu.mention": "Wzmianka", + "account.menu.mute": "Wycisz konta", + "account.menu.note.description": "Widoczne tylko dla Ciebie", + "account.menu.open_original_page": "Zobacz na {domain}", + "account.menu.remove_follower": "Usuń obserwującego", + "account.menu.report": "Zgłoś konto", + "account.menu.share": "Udostępnij...", + "account.menu.show_reblogs": "Pokaż ulepszenia na osi czasu", + "account.menu.unblock": "Odblokuj konto", + "account.menu.unblock_domain": "Odblokuj {domain}", + "account.menu.unmute": "Odcisz konto", "account.moved_to": "{name} jako swoje nowe konto wskazał/a:", "account.mute": "Wycisz @{name}", "account.mute_notifications_short": "Wycisz powiadomienia", @@ -90,6 +124,35 @@ "account.unmute": "Nie wyciszaj @{name}", "account.unmute_notifications_short": "Nie wyciszaj powiadomień", "account.unmute_short": "Nie wyciszaj", + "account_edit.bio_modal.add_title": "Szczegóły profilu", + "account_edit.bio_modal.edit_title": "Edytuj szczegóły profilu", + "account_edit.column_button": "Gotowe", + "account_edit.column_title": "Edytuj profil", + "account_edit.custom_fields.add_label": "Dodaj pole", + "account_edit.custom_fields.edit_label": "Edytuj pole", + "account_edit.custom_fields.placeholder": "Dodaj swoje zaimki, linki zewnętrzne lub cokolwiek innego, które chcesz udostępnić.", + "account_edit.custom_fields.reorder_button": "Zmień kolejność pól", + "account_edit.custom_fields.tip_content": "Możesz z łatwością zwiększyć wiarygodność swojego konta Mastodon poprzez weryfikację linków do wszelkich stron internetowych, które posiadasz.", + "account_edit.custom_fields.tip_title": "Wskazówka: Dodawanie zweryfikowanych linków", + "account_edit.custom_fields.title": "Pola niestandardowe", + "account_edit.custom_fields.verified_hint": "Jak dodać zweryfikowany link?", + "account_edit.display_name.add_label": "Dodaj nazwę wyświetlaną", + "account_edit.display_name.edit_label": "Edytuj nazwę wyświetlaną", + "account_edit.display_name.placeholder": "Twoja nazwa wyświetlana jest jak Twoja nazwa pojawia się na Twoim profilu i na osi czasu.", + "account_edit.display_name.title": "Wyświetlana nazwa", + "account_edit.featured_hashtags.edit_label": "Dodaj hashtagi", + "account_edit.featured_hashtags.placeholder": "Pomóż innym zidentyfikować i mieć szybki dostęp do Twoich ulubionych tematów.", + "account_edit.featured_hashtags.title": "Wyróżnione hashtagi", + "account_edit.field_actions.delete": "Usuń pole", + "account_edit.field_actions.edit": "Edytuj pole", + "account_edit.field_delete_modal.confirm": "Czy na pewno chcesz usunąć to pole niestandardowe? Tej czynności nie można cofnąć.", + "account_edit.field_delete_modal.delete_button": "Usuń", + "account_edit.field_delete_modal.title": "Usuń pole niestandardowe ", + "account_edit.field_edit_modal.add_title": "Dodaj pole niestandardowe", + "account_edit.field_edit_modal.discard_confirm": "Odrzuć", + "account_edit.field_edit_modal.discard_message": "Masz niezapisane zmiany. Czy na pewno chcesz je odrzucić?", + "account_edit.field_edit_modal.edit_title": "Edytuj dodatkowe pole", + "account_edit.field_edit_modal.limit_warning": "Przekroczono limit zalecanych znaków. Użytkownicy mobilni mogą nie widzieć Twojego pola w całości.", "account_note.placeholder": "Kliknij, aby dodać notatkę", "admin.dashboard.daily_retention": "Wskaźnik utrzymania użytkowników według dni od rejestracji", "admin.dashboard.monthly_retention": "Wskaźnik utrzymania użytkowników według miesięcy od rejestracji", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index b0b49bc117..0d067c6d8c 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -142,7 +142,6 @@ "account.unmute_notifications_short": "Ativar som de notificações", "account.unmute_short": "Desativar silêncio", "account_edit.bio.edit_label": "Editar Biografia", - "account_edit.bio.label": "biografia", "account_edit.bio.placeholder": "Insira uma breve introdução para ajudar os outros a lhe identificar.", "account_edit.bio.title": "Bio", "account_edit.bio_modal.add_title": "Adicionar biografia", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 62339bf622..b31772b7af 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -141,12 +141,16 @@ "account.unmute": "Desocultar @{name}", "account.unmute_notifications_short": "Desocultar notificações", "account.unmute_short": "Desocultar", + "account_edit.bio.add_label": "Adicionar biografia", + "account_edit.bio.edit_label": "Editar biografia", "account_edit.bio.placeholder": "Adicione uma breve apresentação para ajudar os outros a identificá-lo.", "account_edit.bio.title": "Bio", "account_edit.bio_modal.add_title": "Adicionar biografia", "account_edit.bio_modal.edit_title": "Editar biografia", "account_edit.column_button": "Concluído", "account_edit.column_title": "Editar Perfil", + "account_edit.custom_fields.add_label": "Adicionar campo", + "account_edit.custom_fields.edit_label": "Editar campo", "account_edit.custom_fields.placeholder": "Adicione os seus pronomes, hiperligações externas ou qualquer outra coisa que queira partilhar.", "account_edit.custom_fields.reorder_button": "Reordenar campos", "account_edit.custom_fields.tip_content": "Pode adicionar facilmente credibilidade à sua conta Mastodon, verificando ligações para qualquer website que possua.", @@ -157,10 +161,13 @@ "account_edit.display_name.title": "Nome a mostrar", "account_edit.featured_hashtags.placeholder": "Ajude à sua identificação por outros e tenha acesso rápido aos seus tópicos favoritos.", "account_edit.featured_hashtags.title": "Etiquetas em destaque", + "account_edit.field_actions.delete": "Eliminar campo", + "account_edit.field_actions.edit": "Editar campo", "account_edit.field_delete_modal.confirm": "Tem certeza de que deseja excluir este campo personalizado? Esta ação não pode ser desfeita.", "account_edit.field_delete_modal.delete_button": "Excluir", "account_edit.field_delete_modal.title": "Excluir campo personalizado?", "account_edit.field_edit_modal.add_title": "Adicionar campo personalizado", + "account_edit.field_edit_modal.discard_confirm": "Descartar", "account_edit.field_edit_modal.edit_title": "Editar campo personalizado", "account_edit.field_edit_modal.link_emoji_warning": "Não recomendamos o uso de emojis personalizados em combinação com URLs. Campos personalizados que contenham ambos serão exibidos apenas como texto, em vez de como hiperligação, para evitar confusão aos utilizadores.", "account_edit.field_edit_modal.name_hint": "Ex.: \"Site pessoal\"", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index b65762ddf6..4965eaac16 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -141,8 +141,8 @@ "account.unmute": "Ktheji zërin @{name}", "account.unmute_notifications_short": "Shfaqi njoftimet", "account.unmute_short": "Çheshtoje", + "account_edit.bio.add_label": "Shtoni jetëshkrim", "account_edit.bio.edit_label": "Përpunoni jetëshkrim", - "account_edit.bio.label": "jetëshkrim", "account_edit.bio.placeholder": "Shtoni një hyrje të shkurtër për të ndihmuar të tjerët t’ju identifikojnë.", "account_edit.bio.title": "Jetëshkrim", "account_edit.bio_modal.add_title": "Shtoni jetëshkrim", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 9b0dae15ec..e8af5b7078 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -134,6 +134,7 @@ "account.unmute": "Sluta tysta @{name}", "account.unmute_notifications_short": "Aktivera aviseringsljud", "account.unmute_short": "Avtysta", + "account_edit.bio.add_label": "Lägg till biografi", "account_edit.bio.placeholder": "Lägg till en kort introduktion för att hjälpa andra att identifiera dig.", "account_edit.bio.title": "Biografi", "account_edit.bio_modal.add_title": "Lägg till biografi", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index c30e20c867..4f13dec3c3 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -141,27 +141,39 @@ "account.unmute": "@{name} adlı kişinin sesini aç", "account.unmute_notifications_short": "Bildirimlerin sesini aç", "account.unmute_short": "Susturmayı kaldır", + "account_edit.bio.add_label": "Kişisel bilgi ekle", + "account_edit.bio.edit_label": "Kişisel bilgiyi düzenle", "account_edit.bio.placeholder": "Diğerlerinin sizi tanımasına yardımcı olmak için kısa bir tanıtım ekleyin.", "account_edit.bio.title": "Kişisel bilgiler", "account_edit.bio_modal.add_title": "Kişisel bilgi ekle", "account_edit.bio_modal.edit_title": "Kişisel bilgiyi düzenle", "account_edit.column_button": "Tamamlandı", "account_edit.column_title": "Profili Düzenle", + "account_edit.custom_fields.add_label": "Alan ekle", + "account_edit.custom_fields.edit_label": "Alanı düzenle", "account_edit.custom_fields.placeholder": "Zamirlerinizi, harici bağlantılarınızı veya paylaşmak istediğiniz diğer bilgileri ekleyin.", "account_edit.custom_fields.reorder_button": "Alanları yeniden sırala", "account_edit.custom_fields.tip_content": "Sahip olduğunuz web sitelerine bağlantıları doğrulayarak Mastodon hesabınıza kolayca güvenilirlik katabilirsiniz.", "account_edit.custom_fields.tip_title": "İpucu: Doğrulanmış bağlantılar ekleme", "account_edit.custom_fields.title": "Özel alanlar", "account_edit.custom_fields.verified_hint": "Doğrulanmış bir bağlantı nasıl eklerim?", + "account_edit.display_name.add_label": "Görüntülenecek ad ekle", + "account_edit.display_name.edit_label": "Görüntülenecek adı düzenle", "account_edit.display_name.placeholder": "Görünen adınız profilinizde ve zaman akışlarında adınızın nasıl göründüğüdür.", "account_edit.display_name.title": "Görünen ad", + "account_edit.featured_hashtags.edit_label": "Etiket ekle", "account_edit.featured_hashtags.placeholder": "Başkalarının favori konularınızı tanımlamasına ve bunlara hızlı bir şekilde erişmesine yardımcı olun.", "account_edit.featured_hashtags.title": "Öne çıkan etiketler", + "account_edit.field_actions.delete": "Alanı sil", + "account_edit.field_actions.edit": "Alanı düzenle", "account_edit.field_delete_modal.confirm": "Bu özel alanı silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.", "account_edit.field_delete_modal.delete_button": "Sil", "account_edit.field_delete_modal.title": "Özel alanı sil?", "account_edit.field_edit_modal.add_title": "Özel alan ekle", + "account_edit.field_edit_modal.discard_confirm": "Yoksay", + "account_edit.field_edit_modal.discard_message": "Kaydedilmemiş değişiklikleriniz var. Bunları silmek istediğinizden emin misiniz?", "account_edit.field_edit_modal.edit_title": "Özel alanı düzenle", + "account_edit.field_edit_modal.limit_warning": "Önerilen karakter sınırı aşıldı. Mobil kullanıcılar sahayı tam olarak görmeyebilirler.", "account_edit.field_edit_modal.link_emoji_warning": "Url'lerle birlikte özel emoji kullanmamanızı öneririz. Her ikisini de içeren özel alanlar, kullanıcıların kafasını karıştırmamak için bağlantı yerine yalnızca metin olarak görüntülenir.", "account_edit.field_edit_modal.name_hint": "Örn. \"Kişisel web sitesi\"", "account_edit.field_edit_modal.name_label": "Etiket", @@ -190,6 +202,8 @@ "account_edit.image_edit.alt_edit_button": "Alternatif metni düzenle", "account_edit.image_edit.remove_button": "Görseli kaldır", "account_edit.image_edit.replace_button": "Görseli değiştir", + "account_edit.item_list.delete": "{name} sil", + "account_edit.item_list.edit": "{name} düzenle", "account_edit.name_modal.add_title": "Görünen ad ekle", "account_edit.name_modal.edit_title": "Görünen adı düzenle", "account_edit.profile_tab.button_label": "Özelleştir", @@ -212,6 +226,10 @@ "account_edit.upload_modal.step_upload.dragging": "Yüklemek için bırakın", "account_edit.upload_modal.step_upload.header": "Bir resim seç", "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF veya JPG formatında, en fazla {limit} MB.{br}Görsel {width}x{height} piksel boyutuna getirilir.", + "account_edit.upload_modal.title_add.avatar": "Profil fotoğrafı ekle", + "account_edit.upload_modal.title_add.header": "Kapak fotoğrafı ekle", + "account_edit.upload_modal.title_replace.avatar": "Profil fotoğrafını değiştir", + "account_edit.upload_modal.title_replace.header": "Kapak fotoğrafını değiştirin", "account_edit.verified_modal.details": "Kişisel web sitelerine bağlantıları doğrulayarak Mastodon profilinize güvenilirlik katın. İşte böyle çalışıyor:", "account_edit.verified_modal.invisible_link.details": "Bağlantıyı başlığınıza ekleyin. Önemli olan kısım, kullanıcı tarafından oluşturulan içeriğe sahip web sitelerinde kimlik sahtekarlığını önleyen rel=\"me\" özniteliğidir. {tag} yerine sayfanın başlığında bir bağlantı etiketi bile kullanabilirsiniz, ancak HTML, JavaScript çalıştırılmadan erişilebilir olmalıdır.", "account_edit.verified_modal.invisible_link.summary": "Bağlantıyı nasıl görünmez hale getirebilirim?", @@ -220,7 +238,9 @@ "account_edit.verified_modal.step2.header": "Web sitenizi özel bir alan olarak ekleyin", "account_edit.verified_modal.title": "Doğrulanmış bir bağlantı nasıl eklenir", "account_edit_tags.add_tag": "#{tagName} ekle", + "account_edit_tags.column_title": "Etiketleri Düzenle", "account_edit_tags.help_text": "Öne çıkan etiketler kullanıcıların profilinizi keşfetmesine ve etkileşim kurmasına yardımcı olur. Profil sayfanızın Etkinlik görünümünde filtreler olarak görünürler.", + "account_edit_tags.max_tags_reached": "Azami öne çıkan etiket sayısına ulaştınız.", "account_edit_tags.search_placeholder": "Bir etiket girin…", "account_edit_tags.suggestions": "Öneriler:", "account_edit_tags.tag_status_count": "{count, plural, one {# gönderi} other {# gönderi}}", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index af8f7d186e..c68db5734c 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -141,8 +141,8 @@ "account.unmute": "Bỏ phớt lờ @{name}", "account.unmute_notifications_short": "Bỏ phớt lờ thông báo", "account.unmute_short": "Bỏ phớt lờ", + "account_edit.bio.add_label": "Thêm giới thiệu", "account_edit.bio.edit_label": "Sửa giới thiệu", - "account_edit.bio.label": "giới thiệu", "account_edit.bio.placeholder": "Thêm một dòng giới thiệu để giúp mọi người nhận ra bạn.", "account_edit.bio.title": "Giới thiệu", "account_edit.bio_modal.add_title": "Thêm giới thiệu", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 9cf0de1a1a..482455e55b 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -141,8 +141,8 @@ "account.unmute": "不再隐藏 @{name}", "account.unmute_notifications_short": "恢复通知", "account.unmute_short": "取消隐藏", + "account_edit.bio.add_label": "添加个人简介", "account_edit.bio.edit_label": "编辑个人简介", - "account_edit.bio.label": "简介", "account_edit.bio.placeholder": "添加一段简短介绍,帮助其他人认识你。", "account_edit.bio.title": "简介", "account_edit.bio_modal.add_title": "添加个人简介", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 15256077de..8552ab635f 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -141,8 +141,8 @@ "account.unmute": "解除靜音 @{name}", "account.unmute_notifications_short": "解除靜音推播通知", "account.unmute_short": "解除靜音", + "account_edit.bio.add_label": "新增個人簡介", "account_edit.bio.edit_label": "編輯個人簡介", - "account_edit.bio.label": "個人簡介", "account_edit.bio.placeholder": "加入一段簡短介紹以幫助其他人識別您。", "account_edit.bio.title": "個人簡介", "account_edit.bio_modal.add_title": "新增個人簡介", @@ -639,7 +639,7 @@ "featured_carousel.header": "{count, plural, other {# 則釘選嘟文}}", "featured_carousel.slide": "{max, number} 則嘟文中之第 {current, number} 則", "featured_tags.more_items": "+{count}", - "featured_tags.suggestions": "最近您曾發有關 {items} 之嘟文。是否新增其為推薦主題標籤?", + "featured_tags.suggestions": "最近您曾發過有關 {items} 之嘟文。是否新增其為推薦主題標籤?", "featured_tags.suggestions.add": "新增", "featured_tags.suggestions.added": "於 編輯個人檔案 > 推薦主題標籤 隨時管理您的推薦主題標籤。", "featured_tags.suggestions.dismiss": "不需要,謝謝", diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 218b12a065..91a16c83f6 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -1761,15 +1761,6 @@ ar: failed_sign_in_html: فشل محاولة تسجيل الدخول مع %{method} من %{ip} (%{browser}) successful_sign_in_html: تم تسجيل الدخول بنجاح مع %{method} من %{ip} (%{browser}) title: تاريخ المصادقة - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: إرسال إشعارات التفضيلات بالبريد الإلكتروني - follow: إرسال إشعارات المتابعة بالبريد الإلكتروني - follow_request: إرسال إشعارات الطلبات بالبريد الإلكتروني - mention: إشعارات رسائل البريد عندما يَذكُرك أحدهم - reblog: رسائل البريد الخاصة بالمنشورات المعاد نشرها media_attachments: validations: images_and_video: ليس بالإمكان إرفاق فيديو في منشور يحتوي مسبقا على صور diff --git a/config/locales/az.yml b/config/locales/az.yml index fb1282ab94..ea5304929b 100644 --- a/config/locales/az.yml +++ b/config/locales/az.yml @@ -211,11 +211,6 @@ az: otp: iki faktorlu kimlik doğrulama tətbiqi password: parol description_html: Əgər tanımadığınız bir fəaliyyəti görsəniz, parolunuzu dəyişdirməyi və iki faktorlu kimlik doğrulamanı fəallaşdırmağı düşünə bilərsiniz - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - reblog: təkrar paylaşma bildirişi e-poçtları migrations: incoming_migrations: Fərqli bir hesabdan daşı incoming_migrations_html: Başqa bir hesabdan bu hesaba daşımaq üçün əvvəlcə bir hesab alias-ı yaratmalısınız. diff --git a/config/locales/be.yml b/config/locales/be.yml index 7a30f3a6ec..70f032c2fc 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1734,15 +1734,6 @@ be: failed_sign_in_html: Няўдалая спроба ўваходу праз %{method} з %{ip} (%{browser}) successful_sign_in_html: Паспяховы ўваход праз %{method} з %{ip} (%{browser}) title: Гісторыя ўваходаў - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: апавяшчэнні на пошту пра упадабанае - follow: апавяшчэнні на пошту пра падпіскі - follow_request: апавяшчэнні на пошту пра запыты на падпіску - mention: апавяшчэнні на пошту пра згадванні - reblog: апавяшчэнні на пошту пра пашырэнні media_attachments: validations: images_and_video: Немагчыма далучыць відэа да допісу, які ўжо змяшчае выявы diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 35ef73d521..84e88b3cad 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1598,15 +1598,6 @@ bg: failed_sign_in_html: Неуспешен опит за влизане с %{method} от %{ip} (%{browser}) successful_sign_in_html: Успешно влизане с %{method} от %{ip} (%{browser}) title: Историята на удостоверяване - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: е-писма за известия с любими - follow: е-писма с известия за последване - follow_request: е-писма със заявки за следване - mention: е-писма с известия за споменаване - reblog: е-писма с известия за подсилване media_attachments: validations: images_and_video: Не мога да прикача видеоклип към публикация, която вече съдържа изображения diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 6ac65afd6f..e0bac6c6c3 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1613,15 +1613,6 @@ ca: failed_sign_in_html: Intent d'inici de sessió errat amb %{method} des de %{ip} (%{browser}) successful_sign_in_html: Inici de sessió exitós amb %{method} des de %{ip} (%{browser}) title: Historial d'autenticació - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: notificacions dels favorits per correu electrònic - follow: notificacions dels seguiments per correu electrònic - follow_request: correus electrònics de peticions de seguiment - mention: correus electrònics de notificacions de mencions - reblog: correus electrònics de notificacions d'impulsos media_attachments: validations: images_and_video: No es pot adjuntar un vídeo a una publicació que ja contingui imatges diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 6b2bfd4539..a090b663a3 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1726,15 +1726,6 @@ cs: failed_sign_in_html: Neúspěšný pokus o přihlášení %{method} z %{ip} (%{browser}) successful_sign_in_html: Úspěšné přihlášení %{method} z %{ip} (%{browser}) title: Historie přihlášení - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: e-mailové oznámení při oblíbení - follow: e-mailové oznámení při sledování - follow_request: e-mail při žádost o sledování - mention: e-mailové oznámení při zmínění - reblog: e-mailové oznámení při boostu media_attachments: validations: images_and_video: K příspěvku, který již obsahuje obrázky, nelze připojit video diff --git a/config/locales/cy.yml b/config/locales/cy.yml index a81826d7c2..2bf693f5ea 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1814,15 +1814,6 @@ cy: failed_sign_in_html: Ymgais mewngofnodi wedi methu gyda %{method} gan %{ip} (%{browser}) successful_sign_in_html: Mewngofnodi llwyddiannus gyda %{method} o %{ip} (%{browser}) title: Hanes dilysu - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: e-bost hysbysu hoffi - follow: e-byst hysbysu dilyn - follow_request: e-byst ceisiadau dilyn - mention: e-byst hysbysu crybwylliadau - reblog: e-byst hysbysiadau hybu media_attachments: validations: images_and_video: Methu atodi fideo i bostiad sydd eisoes yn cynnwys delweddau diff --git a/config/locales/da.yml b/config/locales/da.yml index ca3d45aca3..9b2ef173b7 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -762,6 +762,7 @@ da: categories: administration: Administration devops: DevOps + email: E-mail invites: Invitationer moderation: Moderering special: Speciel @@ -790,6 +791,8 @@ da: manage_blocks_description: Tillader brugere at blokere e-mailudbydere og IP-adresser manage_custom_emojis: Administrere tilpassede emojier manage_custom_emojis_description: Tillader brugere at administrere tilpassede emojier på serveren + manage_email_subscriptions: Administrer e-mail-abonnementer + manage_email_subscriptions_description: Giv brugere mulighed for at abonnere på andre brugere med denne tilladelse via e-mail manage_federation: Administrere federation manage_federation_description: Tillader brugere at blokere eller tillade federation med andre domæner og styre leverbarhed manage_invites: Administrere invitationer @@ -1418,6 +1421,38 @@ da: basic_information: Oplysninger hint_html: "Tilpas, hvad folk ser på din offentlige profil og ved siden af dine indlæg. Andre personer er mere tilbøjelige til at følge dig tilbage og interagere med dig, når du har en udfyldt profil og et profilbillede." other: Andre + email_subscription_mailer: + confirmation: + action: Bekræft e-mailadresse + instructions_to_confirm: Bekræft, at du gerne vil modtage e-mails fra %{name} (@%{acct}), når vedkommende offentliggør nye indlæg. + instructions_to_ignore: Hvis du ikke ved, hvorfor du har modtaget denne e-mail, kan du slette den. Du bliver ikke tilmeldt, hvis du ikke klikker på linket ovenfor. + subject: Bekræft din e-mailadresse + title: Modtag e-mail opdateringer fra %{name}? + notification: + create_account: Opret en Mastodon-konto + footer: + privacy_html: E-mails sendes fra %{domain}, en server drevet af Mastodon. For at få mere at vide om, hvordan denne server behandler dine personoplysninger, kan du læse privatlivspolitikken. + reason_for_email_html: Du modtager denne e-mail, fordi du har valgt at modtage e-mailopdateringer fra %{name}. Ønsker du ikke at modtage disse e-mails? Afmeld + interact_with_this_post: + one: Interagér med dette indlæg, og find flere lignende indlæg. + other: Interagér med disse indlæg, og find flere. + subject: + one: 'Nyt indlæg: "%{excerpt}"' + other: Nye indlæg fra %{name} + title: + one: 'Nyt indlæg: "%{excerpt}"' + other: Nye indlæg fra %{name} + email_subscriptions: + active: Aktive + confirmations: + show: + changed_your_mind: Har du skiftet mening? + success_html: Du vil nu begynde at modtage e-mails, når %{name} offentliggør nye indlæg. Tilføj %{sender} til dine kontakter, så disse indlæg ikke ender i din spam-mappe. + title: Du er tilmeldt + unsubscribe: Afmeld + inactive: Inaktive + status: Status + subscribers: Abonnenter emoji_styles: auto: Auto native: Indbygget @@ -1652,15 +1687,6 @@ da: failed_sign_in_html: Mislykket indlogning med %{method} fra %{ip} (%{browser}) successful_sign_in_html: Gennemført indlogning med %{method} fra %{ip} (%{browser}) title: Godkendelseshistorik - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: e-mailnotifikationer om favoritmarkeringer - follow: e-mailnotifikationer om nye følgere - follow_request: e-mailnotifikationer om følgeanmodninger - mention: e-mailnotifikationer om omtaler - reblog: e-mailnotifikationer om fremhævelser media_attachments: validations: images_and_video: En video kan ikke vedhæftes et indlæg med billedindhold @@ -1798,6 +1824,8 @@ da: posting_defaults: Standarder for indlæg public_timelines: Offentlige tidslinjer privacy: + email_subscriptions: Send indlæg via e-mail + email_subscriptions_hint_html: Tilføj en tilmeldingsformular til din profil, som vises for brugere, der ikke er logget ind. Når besøgende indtaster deres e-mailadresse og tilmelder sig, sender Mastodon e-mailopdateringer om dine offentlige indlæg. hint_html: "Tilpas hvordan din profil og dine indlæg kan findes. En række funktioner i Mastodon kan hjælpe dig med at nå ud til et bredere publikum, hvis du aktiverer dem. Tjek indstillingerne herunder for at sikre, at de passer til dit brugsscenarie." privacy: Privatliv privacy_hint_html: Styr, hvor meget du vil afsløre til gavn for andre. Folk opdager interessante profiler og apps ved at gennemse andres følgere og se, hvilke apps de sender fra, men du foretrækker måske at holde det skjult. @@ -2061,6 +2089,28 @@ da: resume_app_authorization: Genoptag godkendelse af applikation role_requirement: "%{domain} kræver, at du konfigurerer tofaktorgodkendelse, før du kan bruge Mastodon." webauthn: Sikkerhedsnøgler + unsubscriptions: + create: + action: Gå til serverens hjemmeside + email_subscription: + confirmation_html: Du vil ikke længere modtage e-mails fra %{name}. + title: Du er afmeldt + user: + confirmation_html: Du vil ikke længere modtage %{type} fra Mastodon på %{domain}. + notification_emails: + favourite: e-mail-notifikationer om favoritmarkeringer + follow: e-mail-notifikationer om nye følgere + follow_request: e-mail-notifikationer om følgeanmodninger + mention: e-mail-notifikationer om omtaler + reblog: e-mail-notifikationer om fremhævelser + show: + action: Afmeld + email_subscription: + confirmation_html: Du vil ikke længere modtage e-mails, når denne konto offentliggør nye indlæg. + title: Afmeld fra %{name}? + user: + confirmation_html: Du vil ikke længere modtage %{type} fra Mastodon på %{domain}. + title: Afmeld fra %{type}? user_mailer: announcement_published: description: 'Administratorerne på %{domain} udsender en annoncering:' diff --git a/config/locales/de.yml b/config/locales/de.yml index f95f2f7940..f0203268a2 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -762,6 +762,7 @@ de: categories: administration: Administration devops: DevOps + email: E-Mail invites: Einladungen moderation: Moderation special: Besonderheit @@ -790,6 +791,7 @@ de: manage_blocks_description: E-Mail-Provider und IP-Adressen sperren manage_custom_emojis: Emojis manage_custom_emojis_description: Spezielle Emojis dieses Servers verwalten + manage_email_subscriptions: E-Mail-Benachrichtigungen verwalten manage_federation: Föderation manage_federation_description: Domains anderer Mastodon-Server sperren/zulassen – und Zustellbarkeit kontrollieren manage_invites: Einladungen @@ -1418,6 +1420,28 @@ de: basic_information: Allgemeine Informationen hint_html: "Bestimme, was andere auf deinem öffentlichen Profil und neben deinen Beiträgen sehen können. Wenn du ein Profilbild festlegst und dein Profil vervollständigst, werden andere eher mit dir interagieren und dir folgen." other: Andere + email_subscription_mailer: + confirmation: + action: E-Mail-Adresse bestätigen + subject: Bestätige deine E-Mail-Adresse + title: E-Mail-Benachrichtigungen von %{name} erhalten? + notification: + create_account: Mastodon-Konto erstellen + subject: + one: 'Neuer Beitrag: „%{excerpt}“' + other: Neue Beiträge von %{name} + title: + one: 'Neuer Beitrag: „%{excerpt}“' + other: Neue Beiträge von %{name} + email_subscriptions: + active: Aktiviert + confirmations: + show: + changed_your_mind: Meinung geändert? + unsubscribe: Abbestellen + inactive: Deaktiviert + status: Status + subscribers: Abonnent*innen emoji_styles: auto: Automatisch native: Nativ @@ -1652,15 +1676,6 @@ de: failed_sign_in_html: Fehlgeschlagener Anmeldeversuch mit %{method} von %{ip} (%{browser}) successful_sign_in_html: Erfolgreiches Anmelden mit %{method} von %{ip} (%{browser}) title: Anmeldeverlauf - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: E-Mail-Benachrichtigungen bei Favoriten - follow: E-Mail-Benachrichtigungen bei Followern - follow_request: E-Mail-Benachrichtigungen bei Follower-Anfragen - mention: E-Mail-Benachrichtigungen bei Erwähnungen - reblog: E-Mail-Benachrichtigungen bei geteilten Beiträgen media_attachments: validations: images_and_video: Es kann kein Video an einen Beitrag angehängt werden, der bereits Bilder enthält @@ -1798,6 +1813,7 @@ de: posting_defaults: Standardeinstellungen für Beiträge public_timelines: Öffentliche Timelines privacy: + email_subscriptions: Sende Beiträge per E-Mail hint_html: "Bestimme selbst, wie dein Profil und deine Beiträge gefunden werden sollen. Zahlreiche Mastodon-Funktionen können dir für eine größere Reichweite behilflich sein. Nimm dir einen Moment Zeit, um diese Einstellungen zu überprüfen." privacy: Datenschutz privacy_hint_html: Bestimme, wie viele Informationen du für andere preisgeben möchtest. Viele Menschen entdecken interessante Profile und coole Apps, indem sie die Follower anderer Profile durchstöbern und die Apps sehen, über die Beiträge veröffentlicht wurden – möglicherweise möchtest du diese Informationen ausblenden. @@ -2061,6 +2077,9 @@ de: resume_app_authorization: Autorisierung der App fortsetzen role_requirement: "%{domain} verlangt das Einrichten einer Zwei-Faktor-Authentisierung, bevor du Mastodon verwenden kannst." webauthn: Sicherheitsschlüssel + unsubscriptions: + show: + action: Abbestellen user_mailer: announcement_published: description: 'Ankündigung der Administrator*innen von %{domain}:' diff --git a/config/locales/el.yml b/config/locales/el.yml index 5b834356fb..9239f1d93a 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -762,6 +762,7 @@ el: categories: administration: Διαχείριση devops: DevOps + email: Email invites: Προσκλήσεις moderation: Συντονισμός special: Ειδικός @@ -790,6 +791,8 @@ el: manage_blocks_description: Επιτρέπει στους χρήστες να αποκλείουν παρόχους email και διευθύνσεις IP manage_custom_emojis: Διαχείριση Προσαρμοσμένων Emojis manage_custom_emojis_description: Επιτρέπει στους χρήστες να διαχειρίζονται προσαρμοσμένα emojis στον διακομιστή + manage_email_subscriptions: Διαχείριση Συνδρομών Email + manage_email_subscriptions_description: Να επιτρέπεται στους χρήστες να εγγράφονται σε χρήστες με αυτήν την άδεια μέσω ηλεκτρονικού ταχυδρομείου manage_federation: Διαχείριση Ομοσπονδίας manage_federation_description: Επιτρέπει στους χρήστες να αποκλείουν ή να επιτρέπουν τις συναλλαγές με άλλους τομείς και να ελέγχουν την παράδοση manage_invites: Διαχείριση Προσκλήσεων @@ -1418,6 +1421,38 @@ el: basic_information: Βασικές πληροφορίες hint_html: "Προσάρμοσε τί βλέπουν άτομα στο δημόσιο προφίλ σου και δίπλα στις αναρτήσεις σου. Είναι πιο πιθανό άλλα άτομα να σε ακολουθήσουν πίσω και να αλληλεπιδράσουν μαζί σου αν έχεις ολοκληρωμένο προφίλ και εικόνα προφίλ." other: Άλλο + email_subscription_mailer: + confirmation: + action: Επιβεβαιώστε τη διεύθυνση email + instructions_to_confirm: Επιβεβαιώστε ότι θα θέλατε να λαμβάνετε email από %{name} (@%{acct}) όταν δημοσιεύει νέες αναρτήσεις. + instructions_to_ignore: Αν δεν είστε σίγουροι γιατί λάβατε αυτό το email, μπορείτε να το διαγράψετε. Δεν θα εγγραφείτε αν δεν κάνετε κλικ στον παραπάνω σύνδεσμο. + subject: Επιβεβαιώστε τη διεύθυνση email σας + title: Να λαμβάνετε ενημερώσεις μέσω email από %{name}; + notification: + create_account: Δημιουργήστε έναν λογαριασμό Mastodon + footer: + privacy_html: Τα email στέλνονται από το %{domain}, έναν διακομιστή που βασίζεται στο Mastodon. Για να καταλάβετε πώς ο διακομιστής αυτός επεξεργάζεται τα προσωπικά σας δεδομένα, ανατρέξτε στην Πολιτική Απορρήτου. + reason_for_email_html: Λαμβάνετε αυτό το email επειδή έχετε κάνει εγγραφή για ενημερώσεις από %{name}. Δεν θέλετε να λαμβάνετε τέτοια email; Κατάργηση συνδρομής + interact_with_this_post: + one: Αλληλεπιδράστε με αυτήν την ανάρτηση και ανακαλύψτε περισσότερες σαν αυτήν. + other: Αλληλεπιδράστε με αυτές τις αναρτήσεις και ανακαλύψτε περισσότερες. + subject: + one: 'Νέα ανάρτηση: "%{excerpt}"' + other: Νέες αναρτήσεις από %{name} + title: + one: 'Νέα ανάρτηση: "%{excerpt}"' + other: Νέες αναρτήσεις από %{name} + email_subscriptions: + active: Ενεργή + confirmations: + show: + changed_your_mind: Αλλάξατε γνώμη; + success_html: Τώρα θα αρχίσετε να λαμβάνετε email όταν ο χρήστης %{name} δημοσιεύει νέες αναρτήσεις. Προσθέστε το %{sender} στις επαφές σας, έτσι ώστε αυτές οι αναρτήσεις να μην καταλήγουν στο φάκελο Ανεπιθύμητα. + title: Έχετε εγγραφεί + unsubscribe: Κατάργηση συνδρομής + inactive: Ανενεργή + status: Κατάσταση + subscribers: Συνδρομητές emoji_styles: auto: Αυτόματο native: Εγγενές @@ -1652,15 +1687,6 @@ el: failed_sign_in_html: Αποτυχημένη προσπάθεια σύνδεσης με %{method} από %{ip} (%{browser}) successful_sign_in_html: Επιτυχής σύνδεση με %{method} από %{ip} (%{browser}) title: Ιστορικό ελέγχου ταυτότητας - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: ειδοποιήσεις email για αγαπημένα - follow: ειδοποιήσεις email για ακολουθήσεις - follow_request: email για αιτήματα ακολούθησης - mention: ειδοποιήσεις email για επισημάνσεις - reblog: ειδοποιήσεις email για ενίσχυση media_attachments: validations: images_and_video: Δεν γίνεται να προσθέσεις βίντεο σε ανάρτηση που ήδη περιέχει εικόνες @@ -1798,6 +1824,8 @@ el: posting_defaults: Προεπιλογές ανάρτησης public_timelines: Δημόσιες ροές privacy: + email_subscriptions: Αποστολή αναρτήσεων μέσω email + email_subscriptions_hint_html: Προσθέστε μια φόρμα εγγραφής μέσω email στο προφίλ σας που εμφανίζεται για αποσυνδεδεμένους χρήστες. Όταν οι επισκέπτες εισαγάγουν τη διεύθυνση email τους και επιλέξουν εγγραφή, το Mastodon θα στέλνει ενημερώσεις email για τις δημόσιες αναρτήσεις σας. hint_html: "Προσάρμοσε πώς θες το προφίλ και οι αναρτήσεις σου να ανακαλύπτονται.. Μια ποικιλία δυνατοτήτων στο Mastodon μπορούν να σε βοηθήσουν να απευθυνθείς σε μεγαλύτερο κοινό όταν ενεργοποιηθούν. Αφιέρωσε μερικά λεπτά για να εξετάσεις τις ρυθμίσεις και να σιγουρευτείς ότι σου ταιριάζουν." privacy: Απόρρητο privacy_hint_html: "'Έλεγξε πόσο θες να αποκαλύπτεις προς όφελος των άλλων. Οι άνθρωποι ανακαλύπτουν ενδιαφέροντα προφίλ και εφαρμογές με την περιήγηση των ακολούθων άλλων ατόμων και βλέποντας από ποιες εφαρμογές δημοσιεύουν, αλλά μπορεί να προτιμάς να το κρατάς κρυφό." @@ -2061,6 +2089,28 @@ el: resume_app_authorization: Συνέχιση εξουσιοδότησης εφαρμογής role_requirement: Το %{domain} απαιτεί να ρυθμίσετε τον έλεγχο ταυτότητας δύο παραγόντων πριν χρησιμοποιήσετε το Mastodon. webauthn: Κλειδιά ασφαλείας + unsubscriptions: + create: + action: Μετάβαση στην αρχική σελίδα του διακομιστή + email_subscription: + confirmation_html: Δεν θα λαμβάνετε πλέον email από %{name}. + title: Έχετε καταργήσει τη συνδρομή + user: + confirmation_html: Δεν θα λαμβάνετε πλέον %{type} από το Mastodon στο %{domain}. + notification_emails: + favourite: ειδοποιήσεις email για αγαπημένα + follow: ειδοποιήσεις email για ακολουθήσεις + follow_request: email για αιτήματα ακολούθησης + mention: ειδοποιήσεις email για επισημάνσεις + reblog: ειδοποιήσεις email για ενισχύσεις + show: + action: Κατάργηση συνδρομής + email_subscription: + confirmation_html: Θα σταματήσετε να λαμβάνετε email όταν αυτός ο λογαριασμός δημοσιεύει νέες αναρτήσεις. + title: Κατάργηση συνδρομής από %{name}; + user: + confirmation_html: Θα σταματήσετε να λαμβάνετε %{type} από το Mastodon στο %{domain}. + title: Κατάργηση συνδρομής από %{type}; user_mailer: announcement_published: description: 'Οι διαχειριστές του %{domain} κάνουν μια ανακοίνωση:' diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 81843c2c4d..1e970f3bc6 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -1648,15 +1648,6 @@ en-GB: failed_sign_in_html: Failed login attempt with %{method} from %{ip} (%{browser}) successful_sign_in_html: Successful login with %{method} from %{ip} (%{browser}) title: Authentication history - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: favourite notification emails - follow: follow notification emails - follow_request: follow request emails - mention: mention notification emails - reblog: boost notification emails media_attachments: validations: images_and_video: Cannot attach a video to a post that already contains images diff --git a/config/locales/eo.yml b/config/locales/eo.yml index d9712beb53..195b95f07e 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1589,15 +1589,6 @@ eo: failed_sign_in_html: Malsukcese ensalutprovo per %{method} de %{ip} (%{browser}) successful_sign_in_html: Sukcese ensaluto per %{method} de %{ip} (%{browser}) title: Aŭtentiga historio - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: sciigoj retpoŝtaj de ŝatataj - follow: sciigoj retpoŝtaj de sekvoj - follow_request: retpoŝtajn petoj de sekvado - mention: sciigoj retpoŝtaj de mencioj - reblog: sciigoj retpoŝtaj de diskonigoj media_attachments: validations: images_and_video: Aldoni videon al mesaĝo, kiu jam havas bildojn ne eblas diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 248c3db979..dc3535a4f0 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -762,6 +762,7 @@ es-AR: categories: administration: Administración devops: Operadores de desarrollo + email: Correo electrónico invites: Invitaciones moderation: Moderación special: Especial @@ -790,6 +791,8 @@ es-AR: manage_blocks_description: Permite a los usuarios bloquear proveedores de correo electrónico y direcciones IP manage_custom_emojis: Administrar emojis personalizados manage_custom_emojis_description: Permite a los usuarios administrar emojis personalizados en el servidor + manage_email_subscriptions: Administrar suscripciones de correo electrónico + manage_email_subscriptions_description: Permitir a los usuarios suscribirse a usuarios con este permiso por correo electrónico manage_federation: Administrar Federación manage_federation_description: Permite a los usuarios bloquear o permitir la federación con otros dominios y controlar las entregas manage_invites: Administrar invitaciones @@ -1418,6 +1421,38 @@ es-AR: basic_information: Información básica hint_html: "Personalizá lo que la gente ve en tu perfil público y junto a tus publicaciones. Es más probable que otras personas te sigan e interactúen con vos cuando tengas un perfil completo y una foto de perfil." other: Otros + email_subscription_mailer: + confirmation: + action: Confirmar dirección de correo electrónico + instructions_to_confirm: Confirmá que querés recibir correos electrónicos de %{name} (@%{acct}) cuando publique algo nuevo. + instructions_to_ignore: Si no estás seguro de por qué recibiste este correo electrónico, podés eliminarlo. Si no hacés clic en el enlace de arriba, no te vas a suscribir. + subject: Confirmá tu dirección de correo electrónico + title: "¿Obtener actualizaciones por correo electrónico de %{name}?" + notification: + create_account: Crear una cuenta de Mastodon + footer: + privacy_html: Los correos electrónicos son enviados desde %{domain}, un servidor de Mastodon. Para conocer cómo este servidor procesa tus datos personales, consultá la Política de Privacidad. + reason_for_email_html: Estás recibiendo este correo porque optaste recibir actualizaciones por correo electrónico de %{name}. ¿No querés recibir estos correos? Desuscribite + interact_with_this_post: + one: Interactuá con esta publicación y descubrí otras similares. + other: Interactuá con estas publicaciones y descubrí otras similares. + subject: + one: 'Nueva publicación: «%{excerpt}»' + other: Nuevos publicaciones de %{name} + title: + one: 'Nueva publicación: «%{excerpt}»' + other: Nuevos mensajes de %{name} + email_subscriptions: + active: Activa + confirmations: + show: + changed_your_mind: "¿Cambiaste de opinión?" + success_html: Ahora vas a empezar a recibir correos electrónicos cuando %{name} publique algo nuevo. Agregá a %{sender} a tus contactos para que estas publicaciones no terminen en tu carpeta de spam o correo no deseado. + title: Te suscribiste + unsubscribe: Desuscribirse + inactive: Inactiva + status: Estado + subscribers: Suscriptores emoji_styles: auto: Automático native: Nativo @@ -1652,15 +1687,6 @@ es-AR: failed_sign_in_html: Intento de inicio de sesión fallido con %{method} desde %{ip} (%{browser}) successful_sign_in_html: Inicio de sesión exitoso con %{method} desde %{ip} (%{browser}) title: Historial de autenticación - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: notificaciones de favoritos por correo electrónico - follow: notificaciones de seguidores por correo electrónico - follow_request: notificaciones de solicitudes de seguimiento por correo electrónico - mention: notificaciones de menciones por correo electrónico - reblog: notificaciones de adhesiones por correo electrónico media_attachments: validations: images_and_video: No se puede adjuntar un video a un mensaje que ya contenga imágenes @@ -1798,6 +1824,8 @@ es-AR: posting_defaults: Configuración predeterminada de mensajes public_timelines: Líneas temporales públicas privacy: + email_subscriptions: Enviar mensajes por correo electrónico + email_subscriptions_hint_html: Agregá un formulario de registro por correo electrónico a tu perfil, que aparece para los usuarios que no iniciaron sesión. Cuando los visitantes ingresen su dirección de correo electrónico y opten por ello, Mastodon enviará actualizaciones por correo electrónico para tus mensajes públicos. hint_html: "Personalizá cómo querés que sean encontrados tu perfil y tus mensajes. Una variedad de funciones en Mastodon pueden ayudarte a alcanzar una mayor audiencia al estar activada. Tomate un momento para revisar esta configuración para asegurarte de que se ajusta a tu caso." privacy: Privacidad privacy_hint_html: Controlá cuánto querés revelar a los demás. La gente descubre perfiles interesantes y aplicaciones copadas explorando los seguimientos de otras personas y viendo qué aplicaciones usan, pero puede que prefieras mantener esto oculto. @@ -2061,6 +2089,28 @@ es-AR: resume_app_authorization: Reanudar autorización de aplicación role_requirement: "%{domain} requiere que configurés la autenticación de dos factores antes de poder usar Mastodon." webauthn: Llaves de seguridad + unsubscriptions: + create: + action: Ir a la página de inicio del servidor + email_subscription: + confirmation_html: Ya no recibirás correos electrónicos de %{name}. + title: Te desuscribiste + user: + confirmation_html: Ya no recibirás %{type} de Mastodon en %{domain}. + notification_emails: + favourite: correos de notificación de favoritos + follow: correos de notificación de nuevos seguidores + follow_request: correos de notificación de solicitudes de seguimiento + mention: correos de notificación de menciones + reblog: correos de notificación de adhesiones + show: + action: Desuscribirse + email_subscription: + confirmation_html: Vas a dejar de recibir correos cuando esta cuenta publique algo nuevo. + title: "¿Desuscribirse de %{name}?" + user: + confirmation_html: Vas a dejar de recibir %{type} de Mastodon en %{domain}. + title: "¿Desuscribirse de %{type}?" user_mailer: announcement_published: description: 'Los administradores de %{domain} están haciendo un anuncio:' diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 48e19919f0..3b1237bdf8 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -762,6 +762,7 @@ es-MX: categories: administration: Administración devops: DevOps + email: Correo electrónico invites: Invitaciones moderation: Moderación special: Especial @@ -790,6 +791,8 @@ es-MX: manage_blocks_description: Permite a los usuarios bloquear proveedores de correo electrónico y direcciones IP manage_custom_emojis: Administrar Emojis Personalizados manage_custom_emojis_description: Permite a los usuarios gestionar emojis personalizados en el servidor + manage_email_subscriptions: Gestionar suscripciones por correo electrónico + manage_email_subscriptions_description: Permitir a los usuarios suscribirse a otros usuarios con este permiso por correo electrónico manage_federation: Administrar Federación manage_federation_description: Permite a los usuarios bloquear o permitir la federación con otros dominios, y controlar la entregabilidad manage_invites: Administrar Invitaciones @@ -1418,6 +1421,38 @@ es-MX: basic_information: Información básica hint_html: "Personaliza lo que la gente ve en tu perfil público junto a tus publicaciones. Es más probable que otras personas te sigan e interactúen contigo cuando completes tu perfil y agregues una foto." other: Otro + email_subscription_mailer: + confirmation: + action: Confirmar dirección de correo electrónico + instructions_to_confirm: Confirma que deseas recibir correos electrónicos de %{name} (@%{acct}) cuando haga una nueva publicación. + instructions_to_ignore: Si no estás seguro de por qué has recibido este correo electrónico, puedes borrarlo. No te suscribirás si no haces clic en el enlace de arriba. + subject: Confirma tu dirección de correo electrónico + title: "¿Deseas recibir actualizaciones por correo electrónico de %{name}?" + notification: + create_account: Crear una cuenta de Mastodon + footer: + privacy_html: Los correos electrónicos se envían desde %{domain} un servidor que utiliza Mastodon. Para saber cómo este servidor procesa tus datos personales, consulta la Política de privacidad. + reason_for_email_html: Recibes este correo electrónico porque te has suscrito a las actualizaciones por correo electrónico de %{name}. ¿No quieres recibir estos correos electrónicos? Cancelar suscripción + interact_with_this_post: + one: Interactúa con esta publicación y descubre otras similares. + other: Interactúa con estas publicaciones y descubre más. + subject: + one: 'Nueva publicación: "%{excerpt}"' + other: Nuevas publicaciones de %{name} + title: + one: 'Nueva publicación: "%{excerpt}"' + other: Nuevas publicaciones de %{name} + email_subscriptions: + active: Activa + confirmations: + show: + changed_your_mind: "¿Has cambiado de opinión?" + success_html: A partir de ahora, recibirás correos electrónicos cada vez que %{name} haga nuevas publicaciones. Añade a %{sender} a tus contactos para que estas publicaciones no terminen en tu carpeta de spam. + title: Ya estás registrado + unsubscribe: Cancelar suscripción + inactive: Inactiva + status: Estado + subscribers: Suscriptores emoji_styles: auto: Automático native: Nativo @@ -1652,15 +1687,6 @@ es-MX: failed_sign_in_html: Intento de inicio de sesión fallido con %{method} de %{ip} (%{browser}) successful_sign_in_html: Inicio de sesión exitoso con %{method} desde %{ip} (%{browser}) title: Historial de autenticación - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: correos de notificación de favoritos - follow: correos electrónicos de notificación de seguimiento - follow_request: correos electrónicos de solicitud de seguimiento - mention: correos de notificación de menciones - reblog: correos de notificación de impulsos media_attachments: validations: images_and_video: No se puede adjuntar un video a una publicación que ya contenga imágenes @@ -1798,6 +1824,8 @@ es-MX: posting_defaults: Configuración por defecto de publicaciones public_timelines: Líneas de tiempo públicas privacy: + email_subscriptions: Enviar publicaciones por correo electrónico + email_subscriptions_hint_html: Añade un formulario de suscripción por correo electrónico a tu perfil que se muestre a los usuarios que no hayan iniciado sesión. Cuando los visitantes introduzcan su dirección de correo electrónico y se suscriban, Mastodon les enviará actualizaciones por correo electrónico de tus publicaciones públicas. hint_html: "Personaliza cómo te gustaría que tu perfil y tus publicaciones sean encontradas. En Mastodon tienes a tu disposición distintas características que pueden ayudarte a llegar a una audiencia más amplia cuando se encuentran activadas. Toma un momento para revisar estos ajustes para asegurarte si cumplen tus necesidades." privacy: Privacidad privacy_hint_html: Controla cuánto quieres compartir para el beneficio de otros. Las personas descubren perfiles interesantes y aplicaciones geniales al navegar por los seguidores de otras personas y viendo desde cuáles aplicaciones publican, pero también puedes preferir mantenerlo oculto. @@ -2061,6 +2089,28 @@ es-MX: resume_app_authorization: Reanudar autorización de aplicación role_requirement: "%{domain} requiere que configures la autenticación de dos pasos antes de poder utilizar Mastodon." webauthn: Claves de seguridad + unsubscriptions: + create: + action: Ir a la página de inicio del servidor + email_subscription: + confirmation_html: Ya no recibirás correos electrónicos de %{name}. + title: Ya no estás suscrito + user: + confirmation_html: Ya no recibirás %{type} de Mastodon en %{domain}. + notification_emails: + favourite: correos electrónicos de notificación de favoritos + follow: correos electrónicos de notificación de seguimiento + follow_request: correos electrónicos de solicitud de seguimiento + mention: correos de notificación de menciones + reblog: correos de notificación de impulsos + show: + action: Cancelar suscripción + email_subscription: + confirmation_html: Dejarás de recibir correos electrónicos cuando esta cuenta haga nuevas publicaciones. + title: "¿Deseas cancelar suscripción a %{name}?" + user: + confirmation_html: Dejarás de recibir %{type} de Mastodon en %{domain}. + title: "¿Deseas cancelar suscripción a %{type}?" user_mailer: announcement_published: description: 'Los administradores de %{domain} están haciendo un anuncio:' diff --git a/config/locales/es.yml b/config/locales/es.yml index 15c7d44ba5..90f631b49a 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -762,6 +762,7 @@ es: categories: administration: Administración devops: DevOps + email: Correo electrónico invites: Invitaciones moderation: Moderación special: Especial @@ -790,6 +791,8 @@ es: manage_blocks_description: Permite a los usuarios bloquear proveedores de correo electrónico y direcciones IP manage_custom_emojis: Administrar Emojis Personalizados manage_custom_emojis_description: Permite a los usuarios gestionar emojis personalizados en el servidor + manage_email_subscriptions: Administrar suscripciones de correo electrónico + manage_email_subscriptions_description: Permitir a los usuarios suscribirse a usuarios con este permiso por correo electrónico manage_federation: Administrar Federación manage_federation_description: Permite a los usuarios bloquear o permitir la federación con otros dominios, y controlar la entregabilidad manage_invites: Administrar Invitaciones @@ -1418,6 +1421,38 @@ es: basic_information: Información básica hint_html: "Personaliza lo que la gente ve en tu perfil público junto a tus publicaciones. Es más probable que otras personas te sigan e interactúen contigo cuando completas tu perfil y foto." other: Otros + email_subscription_mailer: + confirmation: + action: Confirmar dirección de correo electrónico + instructions_to_confirm: Confirma que quieres recibir correos electrónicos de %{name} (@%{acct}) cuando publique algo nuevo. + instructions_to_ignore: Si no estás seguro de por qué recibiste este correo electrónico, puedes eliminarlo. No te suscribirás si no haces clic en el enlace de arriba. + subject: Confirme tu dirección de correo electrónico + title: "¿Obtener actualizaciones por correo electrónico de %{name}?" + notification: + create_account: Crear una cuenta de Mastodon + footer: + privacy_html: Los correos electrónicos son enviados desde %{domain}, un servidor de Mastodon. Para conocer cómo este servidor procesa tus datos personales, consulta la Política de Privacidad. + reason_for_email_html: Estás recibiendo este correo porque has optado por recibir actualizaciones por correo electrónico de %{name}. ¿No quieres recibir estos correos? Cancela la suscripción + interact_with_this_post: + one: Interactúa con esta publicación y descubre otras similares. + other: Interactúa con estas publicaciones y descubre otras similares. + subject: + one: 'Nueva publicación: "%{excerpt}"' + other: Nuevas publicaciones de %{name} + title: + one: 'Nueva publicación: "%{excerpt}"' + other: Nuevas publicaciones de %{name} + email_subscriptions: + active: Activa + confirmations: + show: + changed_your_mind: "¿Cambiaste de opinión?" + success_html: Ahora empezarás a recibir correos electrónicos cuando %{name} publique algo nuevo. Añade %{sender} a tus contactos para que estas publicaciones no terminen en tu carpeta de Spam. + title: Estás suscrito + unsubscribe: Cancelar suscripición + inactive: Inactiva + status: Estado + subscribers: Suscriptores emoji_styles: auto: Automático native: Nativo @@ -1652,15 +1687,6 @@ es: failed_sign_in_html: Intento de inicio de sesión fallido con %{method} de %{ip} (%{browser}) successful_sign_in_html: Inicio de sesión exitoso con %{method} desde %{ip} (%{browser}) title: Historial de autenticación - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: correos de notificación de favoritos - follow: correos de notificación de nuevos seguidores - follow_request: correos de notificación de solicitud de seguidor - mention: correos de notificación de menciones - reblog: correos de notificación de impulsos media_attachments: validations: images_and_video: No se puede adjuntar un video a una publicación que ya contenga imágenes @@ -1798,6 +1824,8 @@ es: posting_defaults: Configuración por defecto de publicaciones public_timelines: Líneas de tiempo públicas privacy: + email_subscriptions: Enviar mensajes por correo electrónico + email_subscriptions_hint_html: Añade un formulario de registro por correo electrónico a tu perfil, que aparece para los usuarios que no han iniciado sesión. Cuando los visitantes ingresen su dirección de correo electrónico y opten por ello, Mastodon enviará actualizaciones por correo electrónico para tus publicaciones públicas. hint_html: "Personaliza el descubrimiento de tu perfil y tus publicaciones. En Mastodon tienes distintas características que te ayudarán a alcanzar una mayor audiencia si las activas. Tómate un momento para revisar estas configuraciones y asegurarte de que cumplen tus necesidades." privacy: Privacidad privacy_hint_html: Controla cuánto deseas revelar a los demás. Las personas descubren perfiles y aplicaciones interesantes navegando por los seguidores de otras personas y viendo desde qué aplicaciones publican, pero puede que prefieras mantenerlo oculto. @@ -2061,6 +2089,28 @@ es: resume_app_authorization: Reanudar autorización de aplicación role_requirement: "%{domain} requiere que establezcas la autenticación en dos pasos para poder usar Mastodon." webauthn: Claves de seguridad + unsubscriptions: + create: + action: Ir a la página de inicio del servidor + email_subscription: + confirmation_html: Ya no recibirás correos electrónicos de %{name}. + title: Ya no estás suscrito + user: + confirmation_html: Ya no recibirás %{type} de Mastodon en %{domain}. + notification_emails: + favourite: correos de notificación de favoritos + follow: correos de notificación de nuevos seguidores + follow_request: correos de notificación de solicitudes de seguimiento + mention: correos de notificación de menciones + reblog: correos de notificación de impulsos + show: + action: Cancelar suscripción + email_subscription: + confirmation_html: Dejarás de recibir correos cuando esta cuenta publique algo nuevo. + title: "¿Darse de baja de %{name}?" + user: + confirmation_html: Dejarás de recibir %{type} de Mastodon en %{domain}. + title: "¿Darse de baja de %{type}?" user_mailer: announcement_published: description: 'Los administradores de %{domain} están haciendo un anuncio:' diff --git a/config/locales/et.yml b/config/locales/et.yml index 91b227b5aa..8a6e8b39bc 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -1633,15 +1633,6 @@ et: failed_sign_in_html: Nurjunud sisenemine meetodiga %{method} aadressilt %{ip} (%{browser}) successful_sign_in_html: Edukas sisenemine meetodiga %{method} aadressilt %{ip} (%{browser}) title: Autentimise ajalugu - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: lemmikuks märkimise teavituskirjade - follow: jälgimiste teavituskirjade - follow_request: jälgimistaotluste teavituskirjade - mention: mainimiste teavituskirjade - reblog: jagamiste teavituskirjade media_attachments: validations: images_and_video: Ei saa lisada video postitusele, milles on juba pildid diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 41a6d57895..85b6eb08f5 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -1535,15 +1535,6 @@ eu: failed_sign_in_html: Huts egindako saioa hasteko saiakera %{method} erabiliz %{ip} IPtik (%{browser}) successful_sign_in_html: Saioa hasiera arrakastatsua %{method} erabiliz %{ip} IPtik (%{browser}) title: Autentifikazioen historia - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: zure argitalpena gogoko egin dutenaren jakinarazpen e-mailak - follow: jarraitu jakinarazpen-mezu elektronikoak - follow_request: jarraipen-eskaeren jakinarazpen e-mailak - mention: aipamenen jakinarazpen e-mailak - reblog: bultzaden jakinarazpen e-mailak media_attachments: validations: images_and_video: Ezin da irudiak dituen bidalketa batean bideo bat erantsi diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 1fd310cb8f..50e5a8576f 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -1629,15 +1629,6 @@ fa: failed_sign_in_html: تلاش‌های شکست‌خوردهٔ ورود با %{method} از %{ip} (%{browser}) successful_sign_in_html: ورودهای موفق با %{method} از %{ip} (%{browser}) title: تاریخچهٔ تأیید هویت - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: رایانامه‌های آگاهی برگزیدن - follow: رایانامه‌های آگاهی پی‌گیری - follow_request: رایانامه‌های درخواست پی‌گیری - mention: رایانامه‌های آگاهی اشاره - reblog: رایانامه‌های آگاهی تقویت media_attachments: validations: images_and_video: نمی‌توان برای نوشته‌ای که تصویر دارد ویدیو بارگذاری کرد diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 782d59c315..d0828dfbce 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1652,15 +1652,6 @@ fi: failed_sign_in_html: Epäonnistunut kirjautumisyritys %{method} IP-osoitteesta %{ip} (%{browser}) successful_sign_in_html: Onnistunut kirjautuminen %{method} IP-osoitteesta %{ip} (%{browser}) title: Todennushistoria - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: sähköposti-ilmoituksia suosikkeihin lisäämisistä - follow: sähköposti-ilmoituksia seuraamisista - follow_request: sähköposti-ilmoituksia seurantapyynnöistä - mention: sähköposti-ilmoituksia maininnoista - reblog: sähköposti-ilmoituksia tehostuksista media_attachments: validations: images_and_video: Videota ei voi liittää tilapäivitykseen, jossa on jo kuvia diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 49e768f4a3..057afbec78 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1648,15 +1648,6 @@ fo: failed_sign_in_html: Miseydnað innritanarroynd við %{method} frá %{ip} (%{browser}) successful_sign_in_html: Eydnað innritan við %{method} frá %{ip} (%{browser}) title: Samgildissøga - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: yndisfráboðanarteldupostar - follow: fylg fráboðanarteldupostar - follow_request: fylg umbønir um teldupost - mention: nevn fráboðanarteldupostar - reblog: framhevja fráboðanarpostar media_attachments: validations: images_and_video: Kann ikki viðfesta sjónfílu til ein post, sum longu inniheldur myndir diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index dca8edc581..c255371b9b 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -1655,15 +1655,6 @@ fr-CA: failed_sign_in_html: Tentative de connexion échouée avec %{method} de %{ip} (%{browser}) successful_sign_in_html: Connexion réussie avec %{method} de %{ip} (%{browser}) title: Historique d'authentification - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: e-mails de notifications de favoris - follow: e-mails de notifications d’abonnements - follow_request: e-mails de demandes d’abonnements - mention: e-mails de notifications de mentions - reblog: e-mails de notifications de partages media_attachments: validations: images_and_video: Impossible de joindre une vidéo à un message contenant déjà des images diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 7b7968b7ce..b8fe93c5e0 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -80,7 +80,7 @@ fr: enabled_msg: Le compte de %{username} a été dégelé avec succès followers: Abonné·e·s follows: Abonnements - header: Entête + header: Image de couverture inbox_url: URL d’entrée invite_request_text: Raisons de l’adhésion invited_by: Invité par @@ -128,7 +128,7 @@ fr: remote_suspension_irreversible: Les données de ce compte ont été supprimées définitivement. remote_suspension_reversible_hint_html: Ce compte a été suspendu par son serveur d'accueil, et les données rattachées seront supprimées le %{date}. Jusqu'à cette date, il peut être restauré sans aucune perte par le serveur distant. Si vous souhaitez supprimer immédiatement toutes les données de ce compte, vous pouvez le faire ci-dessous. remove_avatar: Supprimer l’avatar - remove_header: Supprimer l’entête + remove_header: Supprimer l'image de couverture removed_avatar_msg: L’avatar de %{username} a été supprimé avec succès removed_header_msg: L’image d’en-tête de %{username} a été supprimée avec succès resend_confirmation: @@ -1655,15 +1655,6 @@ fr: failed_sign_in_html: Tentative de connexion échouée avec %{method} de %{ip} (%{browser}) successful_sign_in_html: Connexion réussie avec %{method} de %{ip} (%{browser}) title: Historique d'authentification - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: e-mails de notifications de favoris - follow: e-mails de notifications d’abonnements - follow_request: e-mails de demandes d’abonnements - mention: e-mails de notifications de mentions - reblog: e-mails de notifications de partages media_attachments: validations: images_and_video: Impossible de joindre une vidéo à un message contenant déjà des images diff --git a/config/locales/fy.yml b/config/locales/fy.yml index c017132e75..55381b4ba6 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -1594,15 +1594,6 @@ fy: failed_sign_in_html: Mislearre oanmeldbesykjen mei %{method} fan %{ip} (%{browser}) successful_sign_in_html: Mei sukses oanmeld mei %{method} fan %{ip} (%{browser}) title: Oanmeldskiednis - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: e-mailmeldingen foar favoriten - follow: e-mailmeldingen foar nije folgers - follow_request: e-mailmeldingen foar folchfersiken - mention: e-mailmeldingen foar fermeldingen - reblog: e-mailmeldingen foar boosts media_attachments: validations: images_and_video: In fideo kin net oan in berjocht mei ôfbyldingen keppele wurde diff --git a/config/locales/ga.yml b/config/locales/ga.yml index d75af42526..00909fdcd2 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -1777,15 +1777,6 @@ ga: failed_sign_in_html: Theip ar iarracht síniú isteach le %{method} ó %{ip} (%{browser}) successful_sign_in_html: D'éirigh le síniú isteach le %{method} ó %{ip} (%{browser}) title: Stair fíordheimhnithe - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: ríomhphoist fógra is fearr leat - follow: leanúint ríomhphoist fógra - follow_request: lean ríomhphoist iarratais - mention: trácht ar ríomhphoist fógra - reblog: ríomhphoist fógraí a threisiú media_attachments: validations: images_and_video: Ní féidir físeán a cheangal le postáil a bhfuil íomhánna ann cheana féin diff --git a/config/locales/gd.yml b/config/locales/gd.yml index fc11600ca4..7eaf6a9852 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -1707,15 +1707,6 @@ gd: failed_sign_in_html: Oidhirp clàraidh a-steach nach deach leis le %{method} o %{ip} (%{browser}) successful_sign_in_html: Oidhirp clàraidh a-steach a shoirbhich leis le %{method} o %{ip} (%{browser}) title: Eachdraidh an dearbhaidh - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: puist-d le brathan mu annsachdan - follow: puist-d le brathan mu leantainn - follow_request: puist-d le brathan mu iarrtasan leantainn - mention: puist-d le brathan mu iomraidhean - reblog: puist-d le brathan mu bhrosnachaidhean media_attachments: validations: images_and_video: Chan urrainn dhut video a cheangal ri post sa bheil dealbh mu thràth diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 307029de98..57e6a5fc9c 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -762,6 +762,7 @@ gl: categories: administration: Administración devops: DevOps + email: Correo electrónico invites: Convites moderation: Moderación special: Especial @@ -1652,15 +1653,6 @@ gl: failed_sign_in_html: Intento de acceso errado con %{method} desde %{ip} (%{browser}) successful_sign_in_html: Acceso correcto con %{method} desde %{ip} (%{browser}) title: Historial de autenticación - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: notificacións de favorecidas - follow: notificacións de seguimentos - follow_request: notificacións de solicitudes de seguimento - mention: notificacións de mencións - reblog: notificacións de promocións media_attachments: validations: images_and_video: Non podes anexar un vídeo a unha publicación que xa contén imaxes diff --git a/config/locales/he.yml b/config/locales/he.yml index 2fe1446b4e..3732077701 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1734,15 +1734,6 @@ he: failed_sign_in_html: נסיון כניסה כושל בשיטת %{method} מכתובת %{ip} (%{browser}) successful_sign_in_html: נסיון כניסה מוצלח בשיטה %{method} מכתובת %{ip} (%{browser}) title: הסטוריית אימותים - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: הודעות דואל לגבי חיבובים - follow: הודעות דואל לגבי עוקבים חדשים - follow_request: הודעות דואל לגבי בקשות מעקב - mention: הודעות דואל לגבי איזכורים - reblog: הודעות דואל לגבי הידהודים media_attachments: validations: images_and_video: לא ניתן להוסיף וידאו להודעה שכבר מכילה תמונות diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 921f05f2b8..d633054b17 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1652,15 +1652,6 @@ hu: failed_sign_in_html: Bejelentkezés meghiúsult ezzel %{method} innen %{ip} (%{browser}) successful_sign_in_html: Sikeres bejelentkezés ezzel %{method} innen %{ip} (%{browser}) title: Hitelesítési történet - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: kedvencnek jelölés értesítő e-mailjei - follow: követés értesítő e-mailjei - follow_request: követési kérések e-mailjei - mention: megemlítés értesítő e-mailjei - reblog: megtolás értesítő e-mailjei media_attachments: validations: images_and_video: Nem csatolhatsz videót olyan bejegyzéshez, amelyhez már csatoltál képet diff --git a/config/locales/ia.yml b/config/locales/ia.yml index f090d52469..babee4f9aa 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -1619,15 +1619,6 @@ ia: failed_sign_in_html: Tentativa de authentication fallite con %{method} ab %{ip} (%{browser}) successful_sign_in_html: Apertura de session succedite con %{method} desde %{ip} (%{browser}) title: Historia de authentication - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: notificationes de favorites in e-mail - follow: notificationes de sequimento in e-mail - follow_request: requestas de sequimento in e-mail - mention: notificationes de mentiones in e-mail - reblog: notificationes de impulsos in e-mail media_attachments: validations: images_and_video: Impossibile annexar un video a un message que jam contine imagines diff --git a/config/locales/is.yml b/config/locales/is.yml index 77a4feb512..ccaac522ca 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -762,6 +762,7 @@ is: categories: administration: Stjórnun devops: DevOps + email: Tölvupóstur invites: Boðsgestir moderation: Umsjón special: Sérstakt @@ -790,6 +791,8 @@ is: manage_blocks_description: Leyfir notendum að loka á tölvupóstþjónustur og IP-vistföng manage_custom_emojis: Sýsla með sérsniðin lyndistákn manage_custom_emojis_description: Leyfir notendum að sýsla með sérsniðin lyndistákn á netþjóninum + manage_email_subscriptions: Sýsla með tölvupóstáskriftir + manage_email_subscriptions_description: Leyfa notendum að gerast áskrifendur að tölvupósti frá notendum með þessa heimild manage_federation: Sýsla með netþjónasambönd manage_federation_description: Leyfir notendum að loka á eða leyfa samþættingu við önnur lén (federation) og stýra afhendingu skilaboða manage_invites: Sýsla með boðsgesti @@ -1422,6 +1425,33 @@ is: basic_information: Grunnupplýsingar hint_html: "Sérsníddu hvað fólk sér á opinbera notandasniðinu þínu og næst færslunum þínum. Annað fólk er líklegra til að fylgjast með þér og eiga í samskiptum við þig ef þú fyllir út notandasniðið og setur auðkennismynd." other: Annað + email_subscription_mailer: + confirmation: + action: Staðfestu tölvupóstfangið + instructions_to_confirm: Staðfestu að þú viljir fá tölvupósta frá %{name} (@%{acct}) þegar viðkomandi birtir nýjar færslur. + subject: Staðfestu tölvupóstfangið þitt + title: Fá tilkynningar í tölvupósti frá %{name}? + notification: + create_account: Búa til nýjan Mastodon-aðgang + interact_with_this_post: + one: Eigðu í samskiptum við þessa færslu og finndu fleiri í sama dúr. + other: Eigðu í samskiptum við þessar færslur og finndu fleiri í sama dúr. + subject: + one: 'Ný færsla: "%{excerpt}"' + other: Nýjar færslur frá %{name} + title: + one: 'Ný færsla: "%{excerpt}"' + other: Nýjar færslur frá %{name} + email_subscriptions: + active: Virkur + confirmations: + show: + changed_your_mind: Skiptirðu um skoðun? + title: Þú hefur skráð þig + unsubscribe: Hætta í áskrift + inactive: Óvirkur + status: Staða + subscribers: Áskrifendur emoji_styles: auto: Sjálfvirkt native: Innbyggt @@ -1656,15 +1686,6 @@ is: failed_sign_in_html: Misheppnuð tilraun til innskráningar með %{method} frá %{ip} (%{browser}) successful_sign_in_html: Vel heppnuð tilraun til innskráningar með %{method} frá %{ip} (%{browser}) title: Auðkenningarferill - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: tilkynningum í tölvupósti um eftirlæti - follow: tilkynningum í tölvupósti um fylgjendur - follow_request: tilkynningum í tölvupósti um beiðnir um að fylgjast með - mention: tilkynningum í tölvupósti um tilvísanir - reblog: tilkynningum í tölvupósti um endurbirtingar media_attachments: validations: images_and_video: Ekki er hægt að hengja myndskeið við færslu sem þegar inniheldur myndir @@ -1802,6 +1823,7 @@ is: posting_defaults: Sjálfgefin gildi við gerð færslna public_timelines: Opinberar tímalínur privacy: + email_subscriptions: Senda færslur með tölvupósti hint_html: "Sérsníddu hvernig þú vilt að finna megi notandasnið þitt og færslur. Ýmsir eiginleikar í Mastodon geta hjálpað þér að ná til breiðari áheyrendahóps, séu þeir virkjaðir. Taktu þér tíma til að yfirfara þessar stillingar svo að þær henti þér." privacy: Gagnaleynd privacy_hint_html: Stýrðu því hve miklar upplýsingar þú birtir sem gætu gagnast öðrum. Fólk uppgötvar áhugaverða notendur og sniðug forrit með því að skoða hvað annað fólk fylgist með og hvaða forrit það notar til að birta færslur, en hinsvegar er þér frjálst að halda þessu leyndu. @@ -2065,6 +2087,28 @@ is: resume_app_authorization: Halda áfram með auðkenningu forrits role_requirement: "%{domain} krefst þess að þú setjir upp tveggja-þátta auðkenningu áður en þú getur notað Mastodon." webauthn: Öryggislyklar + unsubscriptions: + create: + action: Fara á heimasíðu netþjónsins + email_subscription: + confirmation_html: Þú munt ekki lengur fá tölvupósta frá %{name}. + title: Þú hefur sagt upp áskrift + user: + confirmation_html: Þú munt ekki lengur fá %{type} frá Mastodon á %{domain}. + notification_emails: + favourite: tölvupóst um eftirlæti + follow: tölvupóst um fylgjendur + follow_request: tölvupóst um fylgjendabeiðnir + mention: tölvupóst um tilvísanir í þig + reblog: tölvupóst um endurbirtingar + show: + action: Hætta í áskrift + email_subscription: + confirmation_html: Þú munt ekki lengur fá tölvupóst þegar þessi aðili birtir nýjar færslur. + title: Afpanta áskrift að %{name}? + user: + confirmation_html: Þú munt ekki lengur fá %{type} frá Mastodon á %{domain}. + title: Afpanta áskrift að %{type}? user_mailer: announcement_published: description: 'Stjórnendur %{domain} eru að senda frá sér yfirlýsingu:' diff --git a/config/locales/it.yml b/config/locales/it.yml index ed80d9b377..1083640095 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -762,6 +762,7 @@ it: categories: administration: Amministrazione devops: DevOps + email: Email invites: Inviti moderation: Moderazione special: Speciale @@ -1652,15 +1653,6 @@ it: failed_sign_in_html: Tentativo di accesso fallito con %{method} da %{ip} (%{browser}) successful_sign_in_html: Accesso riuscito con %{method} da %{ip} (%{browser}) title: Cronologia delle autenticazioni - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: e-mail di notifica preferite - follow: segui le e-mail di notifica - follow_request: segui le e-mail di richiesta - mention: menziona le e-mail di notifica - reblog: e-mail di notifica per le condivisioni media_attachments: validations: images_and_video: Impossibile allegare video a un post che contiene già immagini diff --git a/config/locales/ja.yml b/config/locales/ja.yml index df8967eebe..b058bfdacf 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1557,15 +1557,6 @@ ja: failed_sign_in_html: "%{ip} (%{browser}) から%{method}を利用したサインインに失敗しました。" successful_sign_in_html: "%{ip} (%{browser}) から%{method}を利用したサインインに成功しました" title: 認証履歴 - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: お気に入りの通知メール - follow: フォローの通知メール - follow_request: フォローリクエストの通知メール - mention: 返信の通知メール - reblog: ブーストの通知メール media_attachments: validations: images_and_video: 既に画像が追加されているため、動画を追加することはできません diff --git a/config/locales/ko.yml b/config/locales/ko.yml index ae7d13ff0f..179956c433 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1593,15 +1593,6 @@ ko: failed_sign_in_html: 실패한 로그인 시도 %{method} %{ip} (%{browser}) successful_sign_in_html: 성공한 로그인 시도 %{method} %{ip} (%{browser}) title: 인증 이력 - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: 좋아요 알림 이메일 - follow: 팔로우 알림 이메일 - follow_request: 팔로우 요청 이메일 - mention: 멘션 알림 이메일 - reblog: 부스트 알림 이메일 media_attachments: validations: images_and_video: 이미 사진이 첨부된 게시물엔 동영상을 첨부할 수 없습니다. diff --git a/config/locales/lad.yml b/config/locales/lad.yml index 78eadbb953..04a09327c0 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -1502,15 +1502,6 @@ lad: failed_sign_in_html: Prova de inisiasyon de sesion no reushida kon %{method} de %{ip} (%{browser}) successful_sign_in_html: Prova de sesion reushida kon %{method} dizde %{ip} (%{browser}) title: Estoria de autentifikasyon - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: avizos de favoritos por posta - follow: avizos de segidores por posta - follow_request: avizos de solisitasyones de segimyento por posta - mention: avizos de enmentaduras por posta - reblog: avizos de repartajasyones por posta media_attachments: validations: images_and_video: No se puede adjuntar un video a un estado ke ya kontenga imajes diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 8ce2304a40..006668fbe8 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -1073,11 +1073,6 @@ lt: description_html: Jei pastebėjei neatpažįstamą veiklą, apsvarstyk galimybę pakeisti slaptažodį ir įjungti dvigubą tapatybės nustatymą. empty: Tapatybės nustatymas istorijos nėra title: Tapatybės nustatymo istorija - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - reblog: dalintis pranešimų el. pašto laiškais media_attachments: validations: images_and_video: Negalima pridėti video prie statuso, kuris jau turi nuotrauką diff --git a/config/locales/lv.yml b/config/locales/lv.yml index fb96e9400a..89f5c43a21 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -1595,15 +1595,6 @@ lv: failed_sign_in_html: Neizdevies pieteikšanās mēģinājums ar %{method} no %{ip} (%{browser}) successful_sign_in_html: Sekmīga pieteikšanās ar %{method} no %{ip} (%{browser}) title: Autentifikācijas vēsture - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: izlases paziņojumu e-pasta ziņojumi - follow: sekošanas paziņojumu e-pasta ziņojumi - follow_request: sekošanas pieprasījumu e-pasta ziņojumi - mention: pieminēšanas paziņojumu e-pasta ziņojumi - reblog: pastiprinājumu paziņojumu e-pasta ziņojumi media_attachments: validations: images_and_video: Nevar pievienot videoklipu tādai ziņai, kura jau satur attēlus diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 21470409e2..afd74144a0 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -1278,11 +1278,6 @@ ms: failed_sign_in_html: Percubaan log masuk gagal dengan %{method} daripada %{ip} (%{browser}) successful_sign_in_html: Log masuk yang berjaya dengan %{method} daripada %{ip} (%{browser}) title: Sejarah pengesahan - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: emel pemberitahuan sukaan media_attachments: validations: images_and_video: Tidak boleh melampirkan video pada pos yang sudah mengandungi imej diff --git a/config/locales/nan-TW.yml b/config/locales/nan-TW.yml index deba967257..a69d14d3b8 100644 --- a/config/locales/nan-TW.yml +++ b/config/locales/nan-TW.yml @@ -1611,15 +1611,6 @@ nan-TW: failed_sign_in_html: Uì %{ip} (%{browser}) 用 %{method} 試登入失敗 successful_sign_in_html: Uì %{ip} (%{browser}) 用 %{method} 登入成功 title: 認證歷史 - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: 收藏通知電子批 - follow: 跟tuè通知電子批 - follow_request: 跟tuè請求電子批 - mention: 提起通知電子批 - reblog: 轉送通知電子批 media_attachments: validations: images_and_video: Bē當佇有影像ê PO文內底加影片 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 8549e7e17c..1fcbd0206c 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1652,15 +1652,6 @@ nl: failed_sign_in_html: Mislukte inlogpoging met %{method} van %{ip} (%{browser}) successful_sign_in_html: Succesvol ingelogd met %{method} van %{ip} (%{browser}) title: Inloggeschiedenis - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: e-mailmeldingen voor favorieten - follow: e-mailmeldingen voor nieuwe volgers - follow_request: e-mailmeldingen voor volgverzoeken - mention: e-mailmeldingen voor vermeldingen - reblog: e-mailmeldingen voor boosts media_attachments: validations: images_and_video: Een video kan niet aan een bericht met afbeeldingen worden gekoppeld diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 04c021d5cc..b2564b118a 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -1650,15 +1650,6 @@ nn: failed_sign_in_html: Mislykket innloggingsforsøk med %{method} fra %{ip} (%{browser}) successful_sign_in_html: Vellykket innlogging med %{method} fra %{ip} (%{browser}) title: Autentiseringshistorikk - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: e-postar om favorittmarkeringar - follow: e-postar om nye fylgjarar - follow_request: e-postar om fylgjeførespurnadar - mention: e-postar om omtaler - reblog: e-postar om framhevingar media_attachments: validations: images_and_video: Kan ikkje leggja ved video til status som allereie inneheld bilete diff --git a/config/locales/pl.yml b/config/locales/pl.yml index af03c4f7cf..2b258ab495 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1686,15 +1686,6 @@ pl: failed_sign_in_html: Próba logowania zakończona niepowodzeniem przy pomocy %{method} z %{ip} (%{browser}) successful_sign_in_html: Pomyślne logowanie przy pomocy %{method} z %{ip} (%{browser}) title: Historia uwierzytelniania - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: powiadomień mejlowych o polubieniach - follow: powiadomień mejlowych o obserwujących - follow_request: mejli o prośbach o możliwość obserwowania - mention: powiadomień mejlowych o wspomnieniach - reblog: powiadomień mejlowych o podbiciach media_attachments: validations: images_and_video: Nie możesz załączyć pliku wideo do wpisu, który zawiera już zdjęcia diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 2b4a820851..b0f42b31e3 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -762,6 +762,7 @@ pt-BR: categories: administration: Administração devops: DevOps + email: E-mail invites: Convites moderation: Moderação special: Especial @@ -778,6 +779,8 @@ pt-BR: administrator_description: Usuários com essa permissão irão ignorar todas as permissões delete_user_data: Apagar Dados de Usuário delete_user_data_description: Permitir aos usuários apagar os dados de outros usuários instantaneamente + invite_bypass_approval: Convidar usuário sem revisão + invite_bypass_approval_description: Permitir pessoas convidadas para esse servidor por esses usuários para dispensar aprovação por moderação invite_users: Convidar Usuários invite_users_description: Permite que os usuários convidem novas pessoas para o servidor manage_announcements: Gerenciar Avisos @@ -788,6 +791,8 @@ pt-BR: manage_blocks_description: Permite aos usuários bloquear provedores de e-mail e endereços IP manage_custom_emojis: Gerenciar Emojis Personalizados manage_custom_emojis_description: Permite aos usuários gerenciar emojis personalizados no servidor + manage_email_subscriptions: Gerenciar assinaturas do correio eletrônico + manage_email_subscriptions_description: Permitir que usuários se inscrevam com essa permissão por e-mail manage_federation: Gerenciar Federação manage_federation_description: Permite aos usuários bloquear ou permitir federação com outros domínios e controlar a entregabilidade manage_invites: Gerenciar convites @@ -1278,6 +1283,7 @@ pt-BR: progress: confirm: Confirmar e-mail details: Suas informações + list: Progresso do cadastro review: Nossa avaliação rules: Aceitar regras providers: @@ -1293,6 +1299,7 @@ pt-BR: invited_by: 'Você pode juntar-se a %{domain} graças ao convite que recebeu de:' preamble: Estes são definidos e aplicados pelos moderadores de %{domain}. preamble_invited: Antes de prosseguir, considere as regras de base definidas pelos moderadores de %{domain}. + read_more: Ler mais title: Algumas regras básicas. title_invited: Você recebeu convite. security: Segurança @@ -1414,6 +1421,38 @@ pt-BR: basic_information: Informações básicas hint_html: "Personalize o que as pessoas veem no seu perfil público e ao lado de suas publicações. É mais provável que outras pessoas o sigam de volta e interajam com você quando você tiver um perfil preenchido e uma foto de perfil." other: Outro + email_subscription_mailer: + confirmation: + action: Confirmar endereço de e-mail + instructions_to_confirm: Confirme que você gostaria de receber e-mails do %{name} (@%{acct}) quando postarem novas publicações. + instructions_to_ignore: Se você não tem certeza por que recebeu esse e-mail, você pode excluir. Você não será inscrito se não clicar no link acima. + subject: Confirme seu endereço de e-mail + title: Obter atualizações de e-mail do %{name}? + notification: + create_account: Criar uma conta Mastodon + footer: + privacy_html: E-mails são enviados do %{domain}, Um servidor alimentado pelo Mastodon. Para entender como esse servidor processa seus dados pessoais, consulte a Política de privacidade. + reason_for_email_html: Você está recebendo esse e-mail porque você optou por receber atualizações do %{name}. Não quer receber esses e-mails? Cancelar + interact_with_this_post: + one: Interaja com essa publicação e descubra mais como essa. + other: Interaja com essas publicações e descubra mais. + subject: + one: Nova publicação "%{excerpt}" + other: Novas publicações do %{name} + title: + one: 'Nova publicação: "%{excerpt}"' + other: Novas publicações do %{name} + email_subscriptions: + active: Ativo + confirmations: + show: + changed_your_mind: Mudou de ideia? + success_html: Agora você começará a receber e-mails quando %{name} publicar novas postagens. Adicione %{sender} para seus contatos para que essas publicações não apareçam em sua caixa de Spam. + title: Você está registrado + unsubscribe: Cancelar inscrição + inactive: Inativo + status: Situação + subscribers: Inscritos emoji_styles: auto: Automático native: Nativo @@ -1648,15 +1687,6 @@ pt-BR: failed_sign_in_html: Falha na tentativa de login com %{method} de %{ip} (%{browser}) successful_sign_in_html: Login bem-sucedido com %{method} de %{ip} (%{browser}) title: Histórico de autenticação - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: emails de notificação favoritos - follow: seguir emails de notificação - follow_request: emails de seguidores pendentes - mention: emails de notificação de menções - reblog: emails de notificação de impulsos media_attachments: validations: images_and_video: Não foi possível anexar um vídeo a uma publicação que já contém imagens @@ -1795,6 +1825,8 @@ pt-BR: posting_defaults: Padrões de publicação public_timelines: Linhas públicas privacy: + email_subscriptions: Enviar publicações por e-mail + email_subscriptions_hint_html: Adicione um formulário de inscrição por e-mail ao seu perfil, que será exibido para usuários que não estiverem conectados. Quando os visitantes inserirem seu endereço de e-mail e se inscreverem, o Mastodon enviará atualizações por e-mail sobre suas publicações públicas. hint_html: "Personalize como você quer que seu perfil e suas publicações sejam encontrados. Uma variedade de funcionalidades no Mastodon pode ajudar a alcançar um público mais amplo quando habilitado. Reserve um momento para revisar estas configurações para garantir que atendem ao seu caso de uso." privacy: Privacidade privacy_hint_html: Controle o quanto você deseja revelar para o benefício de outros. As pessoas descobrem perfis interessantes e aplicativos legais navegando pelos seguidores de outras pessoas e vendo de quais aplicativos eles publicam, mas você pode preferir manter isso oculto. @@ -2058,6 +2090,17 @@ pt-BR: resume_app_authorization: Retomar autorização de aplicativo role_requirement: "%{domain} exige que você configure a autenticação de dois fatores antes de poder utilizar o Mastodon." webauthn: Chaves de segurança + unsubscriptions: + create: + action: Acesse a página inicial do servidor + email_subscription: + confirmation_html: Você não receberá mais e-mails do %{name}. + title: Você não está registrado + user: + confirmation_html: Você não receberá mais %{type} do Mastodon no %{domain}. + notification_emails: + favourite: e-mails de notificações de favoritos + follow: receber e-mails de notificação user_mailer: announcement_published: description: 'Os administradores do %{domain} estão fazendo um anúncio:' diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 21550b348d..36ba06e400 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -1648,15 +1648,6 @@ pt-PT: failed_sign_in_html: Tentativa falhada de início de sessão com %{method} de %{ip} (%{browser}) successful_sign_in_html: Sessão corretamente iniciada com %{method} de %{ip} (%{browser}) title: Histórico de autenticação - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: e-mails de notificação de favoritos - follow: e-mails de notificação de seguidor - follow_request: e-mails de pedido de seguidor - mention: e-mails de notificação de menção - reblog: e-mails de notificação de partilhas media_attachments: validations: images_and_video: Não é possível anexar um vídeo a uma publicação que já contém imagens diff --git a/config/locales/ru.yml b/config/locales/ru.yml index c56574643b..78dcda366f 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1672,15 +1672,6 @@ ru: failed_sign_in_html: Неудачная попытка входа при помощи %{method} с IP-адреса %{ip} (%{browser}) successful_sign_in_html: Вход при помощи %{method} с IP-адреса %{ip} (%{browser}) title: История входов - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: уведомлений о добавлении ваших постов в избранное - follow: уведомлений о новых подписчиках - follow_request: уведомлений о новых запросах на подписку - mention: уведомлений о новых упоминаниях - reblog: уведомлений о продвижении ваших постов media_attachments: validations: images_and_video: Нельзя добавить видео к посту с изображениями diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 4a236d374a..32a3a54f8d 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -134,6 +134,7 @@ da: otp: 'Angiv tofaktorkoden generet af din mobil-app eller brug en af dine gendannelseskoder:' webauthn: Er det en USB-nøgle, så sørg for at isætte den og, om nødvendigt, åbne den manuelt. settings: + email_subscriptions: Deaktivering bevarer eksisterende abonnenter, men stopper udsendelsen af e-mails. indexable: Din profilside kan fremgå i søgeresultater på Google, Bing mv. show_application: Du vil dog altid kunne se, hvilken app, der offentliggjorde dit indlæg. tag: @@ -356,6 +357,7 @@ da: hint: Yderligere oplysninger text: Regel settings: + email_subscriptions: Aktivér e-mail-tilmeldinger indexable: Inkludér profilside i søgemaskiner show_application: Vis, fra hvilken app et indlæg er sendt tag: diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 1477f1e2b1..7a7e929ae1 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -134,6 +134,7 @@ el: otp: 'Βάλε τον κωδικό δυο παραγόντων (2FA) από την εφαρμογή του τηλεφώνου σου ή χρησιμοποίησε κάποιον από τους κωδικούς ανάκτησης σου:' webauthn: Αν πρόκειται για ένα κλειδί USB βεβαιωθείτε ότι είναι συνδεδεμένο και αν απαιτείται πατήστε το ελαφρά. settings: + email_subscriptions: Η απενεργοποίηση διατηρεί τους υπάρχοντες συνδρομητές αλλά σταματά την αποστολή email. indexable: Η σελίδα του προφίλ σου μπορεί να εμφανιστεί στα αποτελέσματα αναζήτησης στο Google, Bing και άλλες. show_application: Θα είσαι πάντα σε θέση να δεις ποια εφαρμογή δημοσίευσε την ανάρτησή σου όπως και να 'χει. tag: @@ -356,6 +357,7 @@ el: hint: Επιπρόσθετες πληροφορίες text: Κανόνας settings: + email_subscriptions: Ενεργοποίηση εγγραφών μέσω email indexable: Συμπερίληψη σελίδας προφίλ στις μηχανές αναζήτησης show_application: Εμφάνιση από ποια εφαρμογή έστειλες μία ανάρτηση tag: diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index 62961d7817..d9eeec211b 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -134,6 +134,7 @@ es-AR: 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:' webauthn: Si es una llave USB, asegurate de insertarla y, de ser necesario, tocarla. settings: + email_subscriptions: Deshabilitar retiene a los suscriptores existentes, pero detiene el envío de correos electrónicos. indexable: Tu página de perfil podría aparecer en los resultados de búsqueda en Google, Bing y otros motores de búsqueda. show_application: Sin embargo, siempre podrás ver desde qué aplicación se envió tu mensaje. tag: @@ -356,6 +357,7 @@ es-AR: hint: Información adicional text: Regla settings: + email_subscriptions: Habilitar suscripciones por correo electrónico indexable: Incluir la página de perfil en los motores de búsqueda show_application: Mostrar desde qué aplicación enviaste un mensaje tag: diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index c110d76ee6..b90f40d68c 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -37,11 +37,11 @@ es-MX: starts_at: Opcional. En caso de que su anuncio esté vinculado a un intervalo de tiempo específico text: Puedes usar la sintaxis de publicaciones. Por favor ten en cuenta el espacio que ocupará el anuncio en la pantalla del usuario appeal: - text: Sólo puede apelar una amonestación a la vez + text: Solo se puede apelar una amonestación una vez defaults: autofollow: Los usuarios que se registren mediante la invitación te seguirán automáticamente avatar: WEBP, PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px - bot: Esta cuenta ejecuta principalmente acciones automatizadas y podría no ser monitorizada + bot: Indica a los demás que la cuenta realiza principalmente acciones automatizadas y que es posible que no esté supervisada context: Uno o múltiples contextos en los que debe aplicarse el filtro current_password: Por razones de seguridad por favor ingrese la contraseña de la cuenta actual current_username: Para confirmar, por favor ingrese el nombre de usuario de la cuenta actual @@ -53,9 +53,9 @@ es-MX: locale: El idioma de la interfaz de usuario, correos y notificaciones push password: Usa al menos 8 caracteres phrase: Se aplicará sin importar las mayúsculas o los avisos de contenido de una publicación - scopes: Qué APIs de la aplicación tendrán acceso. Si seleccionas el alcance de nivel mas alto, no necesitas seleccionar las individuales. + scopes: A qué API tendrá acceso la aplicación. Si seleccionas un ámbito de nivel superior, no es necesario que selecciones ámbitos individuales. setting_advanced_layout: Mostrar Mastodon en un diseño de varias columnas, lo que te permite ver la cronología, las notificaciones y una tercera columna de tu elección. No se recomienda para pantallas pequeñas. - setting_aggregate_reblogs: No mostrar nuevos impulsos para las publicaciones que han sido recientemente impulsadas (sólo afecta a las publicaciones recibidas recientemente) + setting_aggregate_reblogs: No mostrar nuevos impulsos para las publicaciones que se hayan impulsado recientemente (solo afecta a los impulsos recibidos recientemente) setting_always_send_emails: Normalmente las notificaciones por correo electrónico no se enviarán cuando estés usando Mastodon activamente setting_boost_modal: Cuando está habilitado, impulsar abrirá primero un cuadro de confirmación en el que podrás cambiar la visibilidad de tu impulso. setting_default_quote_policy_private: Las publicaciones solo para seguidores hechas en Mastodon no pueden ser citadas por otros usuarios. @@ -134,6 +134,7 @@ es-MX: 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:' webauthn: Si es una tecla USB, asegúrese de insertarla y, si es necesario, púlsela. settings: + email_subscriptions: Al desactivar la función, se conservan los suscriptores actuales, pero se deja de enviar correos electrónicos. indexable: Tu página de perfil puede aparecer en los resultados de búsqueda en Google, Bing, entre otros. show_application: Siempre podrás ver desde cuál aplicación realizaste una publicación. tag: @@ -356,6 +357,7 @@ es-MX: hint: Información adicional text: Norma settings: + email_subscriptions: Habilitar suscripciones por correo electrónico indexable: Incluir la página de perfil en los motores de búsqueda show_application: Mostrar desde cuál aplicación enviaste una publicación tag: diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 30da06b1d7..056e85b1a1 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -134,6 +134,7 @@ es: 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:' webauthn: Si es una tecla USB, asegúrese de insertarla y, si es necesario, púlsela. settings: + email_subscriptions: Deshabilitar retiene a los suscriptores existentes pero detiene el envío de correos electrónicos. indexable: Puede que tu página de perfil aparezca en los resultados de búsqueda en Google, Bing y otros. show_application: Tú siempre podrás ver desde qué aplicación se ha publicado tu publicación. tag: @@ -356,6 +357,7 @@ es: hint: Información adicional text: Norma settings: + email_subscriptions: Habilitar registros de correo electrñonico indexable: Incluye la página de perfil en los buscadores show_application: Mostrar desde qué aplicación enviaste una publicación tag: diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 4375b37d3d..846533bddb 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -225,7 +225,7 @@ fr: expires_in: Expire après fields: Métadonnées du profil filter_action: Action du filtre - header: Image d’en-tête + header: Photo de couverture honeypot: "%{label} (ne pas remplir)" inbox_url: URL de la boîte de relais irreversible: Supprimer plutôt que masquer diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index 34121f6e8c..a1540d0712 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -134,6 +134,7 @@ is: otp: 'Settu inn tveggja-þátta kóðann sem farsímaforritið útbjó eða notaðu einn af endurheimtukóðunum þínum:' webauthn: Ef þetta er USB-lykill, gakktu úr skugga um að honum sé stungið í samband og ef þörf þykir að ýta á hann. settings: + email_subscriptions: Sé þetta gert óvirkt haldast fyrirliggjandi áskrifendur en sending tölvupósta stöðvast. indexable: Síðan með notandasniðinu þínu gæti birst í leitarniðurstöðum Google, Bing og fleiri. show_application: Þú munt alltaf geta séð hvaða forrit birti færsluna þína. tag: @@ -356,6 +357,7 @@ is: hint: Viðbótarupplýsingar text: Regla settings: + email_subscriptions: Virkja áskriftir í tölvupósti indexable: Hafa notandasnið með í leitarvélum show_application: Birta úr hvaða forriti þú sendir færslu tag: diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index b36bdb59ec..5d7b7b6757 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -133,6 +133,7 @@ sq: otp: 'Jepni kodin dyfaktorësh të prodhuar nga aplikacioni i telefonit tuaj ose përdorni një nga kodet tuaj të rikthimeve:' webauthn: Nëse është një diskth USB, sigurohuni se e keni futur dhe, në qoftë e nevojshme, prekeni. settings: + email_subscriptions: Çaktivzimi i mban pajtimtarët ekzistues, por resht dërgim email-esh. indexable: Faqja e profilit tuaj mund të shfaqet në përfundime kërkimi në Google, Bing dhe të tjerë. show_application: Pavarësisht nga kjo, do të jeni përherë në gjendje të shihni cili aplikacion botoi postimin tuaj. tag: @@ -355,6 +356,7 @@ sq: hint: Informacion shtesë text: Rregull settings: + email_subscriptions: Aktivizo regjistrime me email indexable: Përfshi faqe profili në motorë kërkimesh show_application: Shfaq prej cilit aplikacion dërguat një postim tag: diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index bb43d41c1e..04c1a977ea 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -134,6 +134,7 @@ vi: otp: 'Nhập mã xác thực 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:' webauthn: Nếu đây là USB key, hãy cắm vào và thử xoay chiều. settings: + email_subscriptions: Việc vô hiệu hóa sẽ giữ lại những người đăng ký hiện có nhưng ngừng gửi email. indexable: Trang của bạn có thể xuất hiện trong kết quả tìm kiếm trên Google, Bing và các nơi khác. show_application: Bạn luôn có thể xem ứng dụng đã đăng tút của mình. tag: @@ -355,6 +356,7 @@ vi: hint: Thông tin thêm text: Nội quy settings: + email_subscriptions: Bật đăng ký đọc email indexable: Hiện hồ sơ trong công cụ tìm kiếm show_application: Hiện ứng dụng dùng để đăng tút tag: diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index c2e16f2459..03f8cf63f9 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -134,6 +134,7 @@ zh-CN: otp: 输入你手机应用上生成的双因素认证代码,或者任意一个恢复代码: webauthn: 如果是 USB 密钥,请确保将其插入,如有必要,请点击它。 settings: + email_subscriptions: 禁用会保留现有的订阅者,而停止发送电子邮件。 indexable: 你的个人资料可能会出现在Google、Bing等的搜索结果中。 show_application: 无论如何,你始终可以看到是哪个应用发布了你的嘟文。 tag: @@ -355,6 +356,7 @@ zh-CN: hint: 补充信息 text: 规则 settings: + email_subscriptions: 启用邮件订阅 indexable: 允许搜索引擎索引个人资料 show_application: 显示你发嘟使用的应用 tag: diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index fcc6694b89..9cea1c15a7 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -134,6 +134,7 @@ zh-TW: otp: 請輸入產生自您手機 App 的兩階段驗證碼,或輸入其中一個備用驗證碼: webauthn: 若它是 USB 安全金鑰,請確認已正確插入,如有需要請觸擊。 settings: + email_subscriptions: 停用將保留既有訂閱者,但會停止寄送電子郵件。 indexable: 個人檔案可能出現於 Google、Bing、或其他搜尋引擎。 show_application: 將總是顯示您發嘟文之應用程式 tag: @@ -355,6 +356,7 @@ zh-TW: hint: 其他資訊 text: 規則 settings: + email_subscriptions: 啟用電子郵件訂閱註冊 indexable: 於搜尋引擎中包含個人檔案頁面 show_application: 顯示您發嘟文之應用程式 tag: diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 25bc48a198..a3f9b5cd8a 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -1080,11 +1080,6 @@ sk: password: heslom webauthn: bezpečnostnými kľúčmi title: História overení - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - reblog: e-mailové upozornenia na zdieľania media_attachments: validations: images_and_video: K príspevku ktorý už obsahuje obrázky nemôžeš priložiť video diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 8e2372a4cc..ed5f5f4ca8 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1684,15 +1684,6 @@ sl: failed_sign_in_html: Spodletela prijava z metodo %{method} iz %{ip} (%{browser}) successful_sign_in_html: Uspešna prijava z metodo %{method} iz %{ip} (%{browser}) title: Zgodovina overjanja - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: e-sporočil z obvestili o priljubljenosti - follow: e-sporočil z obvestili o sledenju - follow_request: e-sporočil o zahtevah za sledenje - mention: e-sporočil z obvestili o omembah - reblog: e-sporočil z obvestili o izpostavljanju media_attachments: validations: images_and_video: Videoposnetka ni mogoče priložiti objavi, ki že vsebuje slike diff --git a/config/locales/sq.yml b/config/locales/sq.yml index dc52f54b24..910daa74db 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -757,6 +757,7 @@ sq: other: "%{count} përdorues" categories: administration: Administrim + email: Email invites: Ftesa moderation: Moderim special: Special @@ -785,6 +786,8 @@ sq: manage_blocks_description: U lejon përdoruesve të bllkojnë shërbime email dhe adresa IP manage_custom_emojis: Të Administrojë Emoxhi Vetjake manage_custom_emojis_description: U lejon përdoruesve të administrojnë te shërbyesi emoxhi vetjake + manage_email_subscriptions: Administroni Pajtime Me Email + manage_email_subscriptions_description: Lejojini përdoruesit të pajtohen me email te përdorues me këtë leje manage_federation: Të Administrojë Federim manage_federation_description: U lejon përdoruesve të bllokojnë ose lejojnë federim me përkatësi të tjera dhe të kontrollojnë shpërndarjen manage_invites: Të Administrojë Ftesa @@ -1407,6 +1410,38 @@ sq: basic_information: Hollësi elementare hint_html: "Përshtatni ç’shohin njerëzit në profilin tuaj publik dhe në krah të postimeve tuaja. Personat e tjerë ka më shumë gjasa t’ju ndjekin dhe ndërveprojnë me ju, kur keni të plotësuar profilin dhe një foto profili." other: Tjetër + email_subscription_mailer: + confirmation: + action: Ripohoni adresë email + instructions_to_confirm: Ripohoni se do të donit të merrni email -e nga %{name} (@%{acct}), kur boton postime të reja. + instructions_to_ignore: Nëse s’jeni i sigurt pse e morët këtë email, mund ta fshini. S’do të pajtoheni, po qe se nuk klikoni mbi lidhjen më sipër. + subject: Ripohoni adresën tuaj email + title: Të merren përditësime me email nga %{name}? + notification: + create_account: Krijoni një llogari Mastodon + footer: + privacy_html: Email-et dërgohen nga %{domain}, një shërbyes i bazuar në Mastodon. Që të kuptoni se si ky shërbyes përpunon të dhënat tuaja personale, referojuni Rregullave të Privatësisë. + reason_for_email_html: Po e merrni këtë email ngaqë keni zgjedhur përditësime me email nga %{name}. S’doni t’i merrni këta email-e? Shpajtohuni + interact_with_this_post: + one: Ndërveproni me këtë postim dhe zbuloni më tepër si ai. + other: Ndërveproni me këto postime dhe zbuloni më tepër. + subject: + one: 'Postim i ri: “%{excerpt}”' + other: Postime të reja nga %{name} + title: + one: 'Postim i ri: “%{excerpt}”' + other: Postime të reja nga %{name} + email_subscriptions: + active: Aktiv + confirmations: + show: + changed_your_mind: Ndërruat mendje? + success_html: Tani do të filloni të merrni email-e, kur %{name} boton postime të reja. Shtojeni %{sender} te kontaktet tuaj, që këto postime të mos përfundojnë te dosja juaj e Të padëshiruarve. + title: U regjistruat + unsubscribe: Shpajtohuni + inactive: Joaktiv + status: Gjendje + subscribers: Pajtimtarë errors: '400': Kërkesa që parashtruar qe e pavlefshme ose e keqformuar. '403': S’keni leje të shihni këtë faqe. @@ -1637,15 +1672,6 @@ sq: failed_sign_in_html: Dështoi përpjekje hyrjeje me %{method} nga %{ip} (%{browser}) successful_sign_in_html: Hyrje e suksesshme me %{method} nga %{ip} (%{browser}) title: Historik mirëfilltësimesh - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: email-e njoftimesh parapëlqimesh - follow: email-e njoftimesh ndjekjeje - follow_request: email-e kërkesash ndjekjeje - mention: email-e njoftimesh përmendjesh - reblog: email-e njoftimesh përforcimesh media_attachments: validations: images_and_video: S’mund të bashkëngjitet video te një gjendje që përmban figura tashmë @@ -1783,6 +1809,8 @@ sq: posting_defaults: Parazgjedhje postimesh public_timelines: Rrjedha kohore publike privacy: + email_subscriptions: Dërgo postime me email + email_subscriptions_hint_html: Shtoni te profili juaj një fotmular regjistrimi me email, që u shfaqet përdoruesve jo të futur në llogari. Kur vizitorët japin adresën e tyre email dhe zgjedhin, Mastodon-i do të dërgojë përditësime me email për postimet tuaja publike. hint_html: "Përshtatni mënyrën se si dëshironi të gjenden prej të tjerëve profili dhe postimet tuaja. Një larmi veçorish të Mastodon-it mund t’ju ndihmojnë të shtriheni në një publik më të gjerë, kur aktivizohen. Ndaluni një çast t’i shqyrtoni këto rregullime, për t’u siguruar se i përshtaten rastit tuaj." privacy: Privatësi privacy_hint_html: Kontrolloni sa doni të tregoni prej vetes për të mirën e të tjerëve. Njerëzit zbulojnë profile interensante dhe aplikacione të lezetshme duke shfletuar ndjekjet e personave të tjerë dhe duke parë se prej cilëve aplikacione postuan, por mund të parapëlqeni ta mbani të fshehur këtë. @@ -2045,6 +2073,28 @@ sq: resume_app_authorization: Rinis autorizim aplikacioni role_requirement: "%{domain} lyp që të ujdisni Mirëfilltësim Dyfaktorësh, para se të përdorni Mastodon-in." webauthn: Kyçe sigurie + unsubscriptions: + create: + action: Kalo te faqja hyrëse e shërbyesit + email_subscription: + confirmation_html: S’do të merrni më email-e nga %{name}. + title: U shpajtuat + user: + confirmation_html: S’do të merrni më %{type} nga Mastodon-i në %{domain}. + notification_emails: + favourite: email-e njoftimesh parapëlqimesh + follow: email-e njoftimesh ndjekjeje + follow_request: email-e kërkesash ndjekjeje + mention: email-e njoftimesh përmendjesh + reblog: email-e njoftimesh përforcimesh + show: + action: Shpajtohuni + email_subscription: + confirmation_html: Do të reshtni së marri email-e, kur kjo llogari të botojë postime të reja. + title: Të bëhet shpajtim nga %{name}? + user: + confirmation_html: Do të reshtni së marri %{type} nga Mastodon-i në %{domain}. + title: Të bëhet shpajtim nga %{type}? user_mailer: announcement_published: description: 'Përgjegjësit e %{domain} po bëjnë një njoftim:' diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 3180a0ba98..0a26249b7d 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -1649,15 +1649,6 @@ sv: failed_sign_in_html: Misslyckat inloggningsförsök med %{method} från %{ip} (%{browser}) successful_sign_in_html: Lyckad inloggning med %{method} från %{ip} (%{browser}) title: Autentiseringshistorik - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: aviseringsmejl för favoriserade inlägg - follow: aviseringsmejl för följda inlägg - follow_request: aviseringsmejl för följdförfrågningar - mention: aviseringsmejl för inlägg där du nämns - reblog: aviseringsmejl för förhöjda inlägg media_attachments: validations: images_and_video: Det går inte att bifoga en video till ett inlägg som redan innehåller bilder diff --git a/config/locales/th.yml b/config/locales/th.yml index a90f1a2555..905ecad4ab 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1507,15 +1507,6 @@ th: failed_sign_in_html: ความพยายามในการลงชื่อเข้าด้วย %{method} จาก %{ip} (%{browser}) ล้มเหลว successful_sign_in_html: ลงชื่อเข้าด้วย %{method} จาก %{ip} (%{browser}) สำเร็จ title: ประวัติการรับรองความถูกต้อง - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: อีเมลการแจ้งเตือนการชื่นชอบ - follow: อีเมลการแจ้งเตือนการติดตาม - follow_request: อีเมลคำขอติดตาม - mention: อีเมลการแจ้งเตือนการกล่าวถึง - reblog: อีเมลการแจ้งเตือนการดัน media_attachments: validations: images_and_video: ไม่สามารถแนบวิดีโอกับโพสต์ที่มีภาพอยู่แล้ว diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 1ad87c39d3..c930f08e45 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1652,15 +1652,6 @@ tr: failed_sign_in_html: "%{method} yöntemiyle %{ip} (%{browser}) adresinden başarısız oturum açma girişimi" successful_sign_in_html: "%{method} yöntemiyle %{ip} (%{browser}) adresinden başarılı oturum açma" title: Kimlik doğrulama geçmişi - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: favori bildirim e-postaları - follow: takip bildirim e-postaları - follow_request: takip isteği bildirim e-postaları - mention: bahsetme bildirim e-postaları - reblog: öne çıkanlar bildirim e-postaları media_attachments: validations: images_and_video: Zaten resim içeren bir duruma video eklenemez diff --git a/config/locales/uk.yml b/config/locales/uk.yml index e5ddc13b1f..431b6e18a5 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1569,15 +1569,6 @@ uk: failed_sign_in_html: Не вдалося увійти з %{method} з %{ip} (%{browser}) successful_sign_in_html: Успішний вхід з %{method} з %{ip} (%{browser}) title: Історія входів - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: отримувати сповіщення про вподобання електронною поштою - follow: отримувати сповіщення про підписки електронною поштою - follow_request: отримувати сповіщення про запити на стеження електронною поштою - mention: отримувати сповіщення про згадки електронною поштою - reblog: отримувати сповіщення про поширення електронною поштою media_attachments: validations: images_and_video: Не можна додати відео до допису з зображеннями diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 02862dcd73..976fb782ce 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -747,6 +747,7 @@ vi: categories: administration: Quản trị viên devops: Nhà phát triển + email: Email invites: Lời mời moderation: Kiểm duyệt special: Đặc biệt @@ -774,6 +775,8 @@ vi: manage_blocks_description: Cho phép người dùng tự chặn các nhà cung cấp email và địa chỉ IP manage_custom_emojis: Quản lý emoji manage_custom_emojis_description: Cho phép quản lý các emoji tùy chỉnh trên máy chủ + manage_email_subscriptions: Quản lý đăng ký đọc qua email + manage_email_subscriptions_description: Cho phép người dùng đăng ký nhận thông báo qua email từ những người dùng có quyền này manage_federation: Quản lý liên hợp manage_federation_description: Cho phép chặn hoặc liên hợp với các máy chủ khác và kiểm soát khả năng phân phối manage_invites: Quản lý lời mời @@ -1397,6 +1400,35 @@ vi: basic_information: Thông tin cơ bản hint_html: Mọi người sẽ muốn theo dõi và tương tác với bạn hơn nếu bạn có ảnh đại diện và hồ sơ hoàn chỉnh. other: Khác + email_subscription_mailer: + confirmation: + action: Xác nhận địa chỉ email + instructions_to_confirm: Xác nhận bạn muốn nhận email từ %{name} (@%{acct}) khi họ đăng tút mới. + instructions_to_ignore: Nếu bạn không chắc tại sao mình nhận được email này, bạn có thể xóa nó. Bạn sẽ không được đăng ký nếu không nhấn vào liên kết ở trên. + subject: Xác nhận địa chỉ email của bạn + title: Nhận cập nhật qua email từ %{name}? + notification: + create_account: Tạo một tài khoản Mastodon + footer: + privacy_html: Các email sẽ được gửi từ %{domain}, một máy chủ vận hành nhờ Mastodon. Để hiểu cách máy chủ này xử lý dữ liệu cá nhân của bạn, vui lòng tham khảo Chính sách bảo mật. + reason_for_email_html: Bạn nhận được email này vì bạn đã đăng ký nhận tút mới qua email từ %{name}. Không muốn nhận email này? Hủy đăng ký đọc + interact_with_this_post: + other: Hãy tương tác với những tút này và khám phá thêm nhiều điều thú vị. + subject: + other: Tút mới từ %{name} + title: + other: Những tút mới từ %{name} + email_subscriptions: + active: Hoạt động + confirmations: + show: + changed_your_mind: Thay đổi ý định? + success_html: Bạn sẽ bắt đầu nhận được email khi %{name} đăng tút mới. Thêm %{sender} vào danh bạ của bạn để những tút này không bị chuyển vào thư mục Spam. + title: Bạn đã đăng ký đọc + unsubscribe: Hủy đăng ký đọc + inactive: Không hoạt động + status: Trạng thái + subscribers: Người đăng ký đọc emoji_styles: auto: Tự động native: Nguyên bản @@ -1611,15 +1643,6 @@ vi: failed_sign_in_html: Đăng nhập thất bại bằng %{method} từ %{ip} (%{browser}) successful_sign_in_html: Đăng nhập bằng %{method} từ %{ip} (%{browser}) title: Lịch sử đăng nhập - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: email thông báo lượt thích - follow: email thông báo người theo dõi mới - follow_request: email thông báo yêu cầu theo dõi - mention: email thông báo lượt nhắc đến - reblog: email thông báo lượt đăng lại media_attachments: validations: images_and_video: Không thể đính kèm video vào tút đã chứa hình ảnh @@ -1757,6 +1780,8 @@ vi: posting_defaults: Mặc định cho tút public_timelines: Bảng tin privacy: + email_subscriptions: Gửi tút qua email + email_subscriptions_hint_html: Thêm biểu mẫu đăng ký email vào hồ sơ của bạn, biểu mẫu này sẽ hiển thị cho cả người dùng chưa đăng nhập. Khi khách truy cập nhập địa chỉ email của họ và chọn đăng ký, Mastodon sẽ gửi thông báo qua email về các tút công khai của bạn. hint_html: Tùy chỉnh cách mọi người tìm thấy hồ sơ và tút của bạn. privacy: Riêng tư privacy_hint_html: Kiểm soát mức độ tiết lộ chi tiết. Mọi người khám phá các hồ sơ thú vị và các ứng dụng thú vị bằng cách xem bạn theo dõi ai và bạn đăng bằng ứng dụng nào, nhưng có thể bạn muốn ẩn nó đi. @@ -2016,6 +2041,28 @@ vi: resume_app_authorization: Tiếp tục xác thực bằng ứng dụng role_requirement: "%{domain} yêu cầu bạn thiết lập Xác thụec 2 bước trước khi sử dụng Mastodon." webauthn: Khóa bảo mật + unsubscriptions: + create: + action: Đến trang chủ máy chủ + email_subscription: + confirmation_html: Bạn sẽ không còn nhận được email từ %{name}. + title: Bạn đã hủy đăng ký đọc + user: + confirmation_html: Bạn sẽ không còn nhận %{type} từ Mastodon trên %{domain}. + notification_emails: + favourite: email thông báo lượt thích + follow: email thông báo người theo dõi mới + follow_request: email thông báo yêu cầu theo dõi + mention: email thông báo lượt nhắc đến + reblog: email thông báo lượt đăng lại + show: + action: Hủy đăng ký đọc + email_subscription: + confirmation_html: Bạn sẽ ngừng nhận email khi tài khoản này đăng tút mới. + title: Hủy đăng ký đọc %{name}? + user: + confirmation_html: Bạn sẽ không còn nhận %{type} từ Mastodon trên %{domain}. + title: Hủy đăng ký đọc %{type}? user_mailer: announcement_published: description: 'Quản trị viên %{domain} gửi một thông báo:' diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 80ead9ee79..f0e5517565 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -747,6 +747,7 @@ zh-CN: categories: administration: 管理 devops: 开发运维 + email: 电子邮件 invites: 邀请 moderation: 审核 special: 特殊 @@ -774,6 +775,8 @@ zh-CN: manage_blocks_description: 允许用户屏蔽邮箱域名与IP地址 manage_custom_emojis: 管理自定义表情 manage_custom_emojis_description: 允许用户管理站点上的自定义表情 + manage_email_subscriptions: 管理邮件订阅 + manage_email_subscriptions_description: 允许其他用户通过电子邮件订阅具备此权限的用户 manage_federation: 管理联合 manage_federation_description: 允许用户禁止或允许本站同其他站点的联合,并控制消息投递能力 manage_invites: 管理邀请 @@ -1397,6 +1400,35 @@ zh-CN: basic_information: 基本信息 hint_html: "自定义公开资料和嘟文旁边显示的内容。当你填写完整的个人资料并设置了头像时,其他人更有可能关注你并与你互动。" other: 其他 + email_subscription_mailer: + confirmation: + action: 确认电子邮件地址 + instructions_to_confirm: 确认你确实想要在 %{name}(@%{acct})发布新嘟文时收到电子邮件通知。 + instructions_to_ignore: 如果你不知道为什么收到这封电子邮件,可以直接删除。如果你不点击上方链接,则不会为你订阅。 + subject: 确认你的电子邮件地址 + title: 要接收来自 %{name} 的电子邮件推送吗? + notification: + create_account: 创建 Mastodon 账号 + footer: + privacy_html: 电子邮件发送自 %{domain},由 Mastodon 驱动的社区实例。要了解本站如何处理你的个人信息,请参见隐私政策。 + reason_for_email_html: 你收到此邮件是因为你先前订阅了来自 %{name} 的嘟文邮件通知。不想收到这些电子邮件?可以取消订阅 + interact_with_this_post: + other: 和嘟文互动,探索更多相关内容。 + subject: + other: 来自 %{name} 的新嘟文 + title: + other: 来自 %{name} 的新嘟文 + email_subscriptions: + active: 已生效 + confirmations: + show: + changed_your_mind: 改变主意了吗? + success_html: 现在开始当 %{name} 发布新嘟文时你会收到邮件提醒。记得将 %{sender} 添加到邮箱联系人中,以免嘟文推送被丢入垃圾邮件文件夹。 + title: 你已成功订阅 + unsubscribe: 取消订阅 + inactive: 未生效 + status: 状态 + subscribers: 订阅者 emoji_styles: auto: 自动 native: 原生 @@ -1611,15 +1643,6 @@ zh-CN: failed_sign_in_html: 失败的 %{method} 登录尝试,来自 %{ip} (%{browser}) successful_sign_in_html: 通过 %{method} 成功登录,来自 %{ip} (%{browser}) title: 认证历史 - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: 嘟文被喜欢邮件通知 - follow: 账号被关注邮件通知 - follow_request: 关注请求邮件通知 - mention: 账号被提及邮件通知 - reblog: 嘟文被转嘟邮件通知 media_attachments: validations: images_and_video: 无法在嘟文中同时插入视频和图片 @@ -1757,6 +1780,8 @@ zh-CN: posting_defaults: 发布默认值 public_timelines: 公共时间线 privacy: + email_subscriptions: 通过电子邮件发送嘟文 + email_subscriptions_hint_html: 在你的个人资料中添加电子邮件订阅表单,此表单会显示给未登录的用户。当访客输入电子邮件地址并主动加入时,Mastodon 将在你更新公开嘟文时为这些访客发送电子邮件通知。 hint_html: "自定义你希望如何找到你的个人资料和嘟文。启用Mastodon中的各种功能可以帮助你扩大受众范围。请花点时间查看这些设置,确保它们适合你的使用情况。" privacy: 隐私 privacy_hint_html: 控制你愿意向他人透露多少信息。通过浏览他人的关注列表和查看他们发嘟所用的应用,人们可以发现有趣的用户和酷炫的应用,但你可能更喜欢将其隐藏起来。 @@ -2016,6 +2041,28 @@ zh-CN: resume_app_authorization: 恢复应用程序授权 role_requirement: "%{domain} 要求你设置双因素认证以使用 Mastodon。" webauthn: 安全密钥 + unsubscriptions: + create: + action: 转到服务器主页 + email_subscription: + confirmation_html: 你将不会再收到来自 %{name} 的电子邮件。 + title: 你已取消订阅 + user: + confirmation_html: 你将不会再收到 %{domain} 上的 Mastodon 的%{type}。 + notification_emails: + favourite: 嘟文被喜欢邮件通知 + follow: 账号被关注邮件通知 + follow_request: 关注请求邮件通知 + mention: 账号被提及邮件通知 + reblog: 嘟文被转嘟邮件通知 + show: + action: 取消订阅 + email_subscription: + confirmation_html: 你将不再收到此账号发布新嘟文时的通知邮件。 + title: 取消订阅%{name}? + user: + confirmation_html: 你将停止接收 %{domain} 上的 Mastodon 的%{type}。 + title: 取消订阅%{type}? user_mailer: announcement_published: description: "%{domain}管理员发布了一则公告:" diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 8d3cfc6ee6..ecffe7aefe 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -747,6 +747,7 @@ zh-TW: categories: administration: 管理員 devops: DevOps + email: 電子郵件 invites: 邀請 moderation: 站務 special: 特殊 @@ -774,6 +775,8 @@ zh-TW: manage_blocks_description: 允許使用者封鎖電子郵件提供商與 IP 位址 manage_custom_emojis: 管理自訂 emoji 表情符號 manage_custom_emojis_description: 允許使用者管理伺服器上之自訂 emoji 表情符號 + manage_email_subscriptions: 管理電子郵件訂閱 + manage_email_subscriptions_description: 此權限允許使用者透過電子郵件訂閱其他使用者動態 manage_federation: 管理聯邦宇宙 manage_federation_description: 允許使用者封鎖或允許與其他網域的聯邦宇宙,並控制傳遞能力 manage_invites: 管理邀請 @@ -1399,6 +1402,35 @@ zh-TW: basic_information: 基本資訊 hint_html: "自訂人們能於您個人檔案及嘟文旁所見之內容。當您完成填寫個人檔案及設定大頭貼後,其他人們比較願意跟隨您並與您互動。" other: 其他 + email_subscription_mailer: + confirmation: + action: 確認電子郵件地址 + instructions_to_confirm: 確認您想要收到來自 %{name} (@%{acct}) 發表新嘟文時的電子郵件。 + instructions_to_ignore: 您若不確定為何您收到此電子郵件,您可以刪除它。您若不點擊上方連結,將不會訂閱。 + subject: 確認您的電子郵件地址 + title: 是否想要收到來自 %{name} 之電子郵件通訊? + notification: + create_account: 建立 Mastodon 帳號 + footer: + privacy_html: 這些電子郵件由 Mastodon 伺服器 %{domain} 寄出。欲了解這台伺服器如何處理您的個人資料,請參考 隱私權政策。 + reason_for_email_html: 您正收到這封電子郵件,因為您選擇收到來自 %{name} 之電子郵件通訊。不想再收到這些電子郵件?取消訂閱 + interact_with_this_post: + other: 與此嘟文互動並且發現更多類似嘟文。 + subject: + other: 來自 %{name} 之新嘟文 + title: + other: 來自 %{name} 之新嘟文 + email_subscriptions: + active: 生效中 + confirmations: + show: + changed_your_mind: 改變主意了嗎? + success_html: 您將開始收到當 %{name} 發表新嘟文之電子郵件。請新增 %{sender} 至您的通訊錄使這些嘟文不被分類至垃圾信件夾。 + title: 已完成註冊 + unsubscribe: 取消訂閱 + inactive: 已停用 + status: 狀態 + subscribers: 訂閱者 emoji_styles: auto: 自動 native: 原生風格 @@ -1613,15 +1645,6 @@ zh-TW: failed_sign_in_html: 使用來自 %{ip} (%{browser}) 的 %{method} 登入嘗試失敗 successful_sign_in_html: 使用來自 %{ip} (%{browser}) 的 %{method} 登入成功 title: 認證歷史紀錄 - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - favourite: 最愛通知電子郵件 - follow: 跟隨通知電子郵件 - follow_request: 跟隨請求通知電子郵件 - mention: 提及通知電子郵件 - reblog: 轉嘟通知電子郵件 media_attachments: validations: images_and_video: 無法於已有圖片之嘟文中加入影片 @@ -1759,6 +1782,8 @@ zh-TW: posting_defaults: 嘟文預設值 public_timelines: 公開時間軸 privacy: + email_subscriptions: 以電子郵件寄送嘟文 + email_subscriptions_hint_html: 於您的個人檔案中新增電子郵件訂閱表單,該表單將對未登入使用者顯示。當訪客輸入他們的電子郵件地址並選擇訂閱時,Mastodon 將會寄送您公開嘟文之電子郵件通訊。 hint_html: "自訂您希望如何使您的個人檔案及嘟文被發現。藉由啟用一系列 Mastodon 功能以幫助您觸及更廣的受眾。煩請花些時間確認您是否欲啟用這些設定。" privacy: 隱私權 privacy_hint_html: 控制您希望向其他人揭露之內容。人們透過瀏覽其他人的跟隨者與其發嘟之應用程式發現有趣的個人檔案與酷炫的 Mastodon 應用程式,但您能選擇將其隱藏。 @@ -2018,6 +2043,28 @@ zh-TW: resume_app_authorization: 恢復應用程式授權 role_requirement: "%{domain} 要求您設定兩階段驗證以使用 Mastodon。" webauthn: 安全金鑰 + unsubscriptions: + create: + action: 前往伺服器首頁 + email_subscription: + confirmation_html: 您將不再收到來自 %{name} 之電子郵件。 + title: 您已成功取消訂閱 + user: + confirmation_html: 您將不再收到來自 %{domain} Mastodon 之 %{type}。 + notification_emails: + favourite: 最愛通知電子郵件 + follow: 跟隨通知電子郵件 + follow_request: 跟隨請求通知電子郵件 + mention: 提及通知電子郵件 + reblog: 轉嘟通知電子郵件 + show: + action: 取消訂閱 + email_subscription: + confirmation_html: 您將不再收到來自此帳號新嘟文之電子郵件。 + title: 取消訂閱 %{name}? + user: + confirmation_html: 您將不再收到來自 %{domain} Mastodon 之 %{type}。 + title: 取消訂閱 %{type}? user_mailer: announcement_published: description: "%{domain} 之管理員正在進行公告:" From 5061f0b1cd14c3a8dd07fb0cda1ab3456835f178 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 11:41:52 +0100 Subject: [PATCH 06/20] Update dependency @vitejs/plugin-react to v5.2.0 (#38179) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9bedbe029d..8420e1deb4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5210,8 +5210,8 @@ __metadata: linkType: hard "@vitejs/plugin-react@npm:^5.0.0": - version: 5.1.4 - resolution: "@vitejs/plugin-react@npm:5.1.4" + version: 5.2.0 + resolution: "@vitejs/plugin-react@npm:5.2.0" dependencies: "@babel/core": "npm:^7.29.0" "@babel/plugin-transform-react-jsx-self": "npm:^7.27.1" @@ -5220,8 +5220,8 @@ __metadata: "@types/babel__core": "npm:^7.20.5" react-refresh: "npm:^0.18.0" peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/dd7b8f40717ecd4a5ab18f467134ea8135f9a443359333d71e4114aeacfc8b679be9fd36dc12290d076c78883a02e708bfe1f0d93411c06c9659da0879b952e3 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/bac0a409e71eee954a05bc41580411c369bd5f9ef0586a1f9743fba76ad6603c437d93d407d230780015361f93d1592c55e53314813cded6369c36d3c1e8edbf languageName: node linkType: hard From dd8602a928f2fbe1d89fc3bf4d159ea5d39a8df7 Mon Sep 17 00:00:00 2001 From: Echo Date: Thu, 26 Mar 2026 12:03:40 +0100 Subject: [PATCH 07/20] Profile editing: Add notice in profile preferences (#38404) --- app/javascript/styles/mastodon/admin.scss | 47 ++++++++++++++++++++++ app/views/settings/profiles/show.html.haml | 9 +++++ config/locales/en.yml | 3 ++ 3 files changed, 59 insertions(+) diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 47f3ff080c..5a879faf7f 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -442,6 +442,53 @@ $content-width: 840px; } } } + + .callout { + display: flex; + align-items: start; + padding: 12px; + gap: 8px; + background-color: var(--color-bg-brand-softest); + color: var(--color-text-primary); + border-radius: 12px; + font-size: 15px; + margin-bottom: 30px; + + .icon { + padding: 4px; + border-radius: 9999px; + width: 1rem; + height: 1rem; + margin-top: -2px; + background-color: var(--color-bg-brand-soft); + } + + .content { + display: flex; + flex-direction: column; + gap: 8px; + flex-grow: 1; + padding: 0; + + @media screen and (width >= 630px) { + flex-direction: row; + } + } + + .body { + flex-grow: 1; + } + + .title { + font-weight: 600; + margin-bottom: 8px; + } + + a { + color: inherit; + font-weight: 600; + } + } } hr.spacer { diff --git a/app/views/settings/profiles/show.html.haml b/app/views/settings/profiles/show.html.haml index 4f59c04747..7d7eab3545 100644 --- a/app/views/settings/profiles/show.html.haml +++ b/app/views/settings/profiles/show.html.haml @@ -5,6 +5,15 @@ %h1= t('settings.profile') = render partial: 'settings/shared/profile_navigation' +- if Mastodon::Feature.profile_redesign_enabled? + %aside.callout + = material_symbol 'info' + .content + .body + %p.title= t('edit_profile.redesign_title') + %p= t('edit_profile.redesign_body') + = link_to t('edit_profile.redesign_button'), '/profile/edit' + = simple_form_for @account, url: settings_profile_path, html: { id: :edit_profile } do |f| = render 'shared/error_messages', object: @account diff --git a/config/locales/en.yml b/config/locales/en.yml index 97c4809aa3..76b25667df 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1421,6 +1421,9 @@ en: basic_information: Basic information hint_html: "Customize what people see on your public profile and next to your posts. Other people are more likely to follow you back and interact with you when you have a filled out profile and a profile picture." other: Other + redesign_body: Profile editing can now be accessed directly from the profile page. + redesign_button: Go there + redesign_title: There’s a new profile editing experience email_subscription_mailer: confirmation: action: Confirm email address From 39ad873589ae30230c8de1679104ade5e99bfd35 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Thu, 26 Mar 2026 12:16:55 +0100 Subject: [PATCH 08/20] Fix regressions caused by rendering default translation wrapper element (#38412) --- app/javascript/mastodon/components/badge.tsx | 2 +- .../mastodon/components/more_from_author.tsx | 20 +++++++--------- .../components/not_signed_in_indicator.tsx | 1 + .../components/regeneration_indicator.tsx | 1 + .../components/scrollable_list/components.tsx | 6 ++++- .../components/scrollable_list/index.jsx | 2 +- app/javascript/mastodon/components/status.jsx | 4 ++-- .../components/status_thread_label.tsx | 2 +- .../components/empty_message.tsx | 6 ++++- .../account_timeline/v2/tags_suggestions.tsx | 2 ++ .../mastodon/features/collections/index.tsx | 1 + .../compose/components/upload_progress.tsx | 24 ++++++++++--------- .../mastodon/features/explore/links.jsx | 2 +- .../mastodon/features/explore/suggestions.jsx | 2 +- .../mastodon/features/explore/tags.jsx | 2 +- .../mastodon/features/followers/index.tsx | 1 + .../mastodon/features/following/index.tsx | 1 + .../components/inline_follow_suggestions.tsx | 2 +- .../mastodon/features/lists/members.tsx | 1 + .../notification_group_with_status.tsx | 2 +- .../mastodon/features/report/comment.tsx | 1 + .../status/components/detailed_status.tsx | 1 + .../styles/mastodon/components.scss | 7 +----- 23 files changed, 52 insertions(+), 41 deletions(-) diff --git a/app/javascript/mastodon/components/badge.tsx b/app/javascript/mastodon/components/badge.tsx index 07ecdfa46c..54c28bf7b7 100644 --- a/app/javascript/mastodon/components/badge.tsx +++ b/app/javascript/mastodon/components/badge.tsx @@ -31,7 +31,7 @@ export const Badge: FC = ({ data-account-role-id={roleId} > {icon} - {label} + {label} {domain && {domain}} ); diff --git a/app/javascript/mastodon/components/more_from_author.tsx b/app/javascript/mastodon/components/more_from_author.tsx index 5075a29d3d..f855a515d2 100644 --- a/app/javascript/mastodon/components/more_from_author.tsx +++ b/app/javascript/mastodon/components/more_from_author.tsx @@ -6,16 +6,12 @@ import { AuthorLink } from 'mastodon/features/explore/components/author_link'; export const MoreFromAuthor: React.FC<{ accountId: string }> = ({ accountId, }) => ( - }} - > - {(chunks) => ( -
- - {chunks} -
- )} -
+
+ + }} + /> +
); diff --git a/app/javascript/mastodon/components/not_signed_in_indicator.tsx b/app/javascript/mastodon/components/not_signed_in_indicator.tsx index 015f74dcae..c2e95093b7 100644 --- a/app/javascript/mastodon/components/not_signed_in_indicator.tsx +++ b/app/javascript/mastodon/components/not_signed_in_indicator.tsx @@ -6,6 +6,7 @@ export const NotSignedInIndicator: React.FC = () => ( diff --git a/app/javascript/mastodon/components/regeneration_indicator.tsx b/app/javascript/mastodon/components/regeneration_indicator.tsx index e26b93eb4f..a79556104e 100644 --- a/app/javascript/mastodon/components/regeneration_indicator.tsx +++ b/app/javascript/mastodon/components/regeneration_indicator.tsx @@ -20,6 +20,7 @@ export const RegenerationIndicator: React.FC = () => ( diff --git a/app/javascript/mastodon/components/scrollable_list/components.tsx b/app/javascript/mastodon/components/scrollable_list/components.tsx index 79afaf837a..9e90ce807e 100644 --- a/app/javascript/mastodon/components/scrollable_list/components.tsx +++ b/app/javascript/mastodon/components/scrollable_list/components.tsx @@ -37,7 +37,11 @@ export const ItemList = forwardRef< } >(({ isLoading, emptyMessage, className, children, ...otherProps }, ref) => { if (!isLoading && Children.count(children) === 0 && emptyMessage) { - return
{emptyMessage}
; + return ( +
+ {emptyMessage} +
+ ); } return ( diff --git a/app/javascript/mastodon/components/scrollable_list/index.jsx b/app/javascript/mastodon/components/scrollable_list/index.jsx index 02cbb056f7..a80fe5581a 100644 --- a/app/javascript/mastodon/components/scrollable_list/index.jsx +++ b/app/javascript/mastodon/components/scrollable_list/index.jsx @@ -385,7 +385,7 @@ class ScrollableList extends PureComponent { {alwaysPrepend && prepend}
- {emptyMessage} + {emptyMessage}
{footer} diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index 82028b5a3d..1df2d0965e 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -435,7 +435,7 @@ class Status extends ImmutablePureComponent { prepend = (
- +
); @@ -447,7 +447,7 @@ class Status extends ImmutablePureComponent { prepend = (
- +
); } else if (showThread && status.get('in_reply_to_id')) { diff --git a/app/javascript/mastodon/components/status_thread_label.tsx b/app/javascript/mastodon/components/status_thread_label.tsx index e1fc3b8cda..147a6586ed 100644 --- a/app/javascript/mastodon/components/status_thread_label.tsx +++ b/app/javascript/mastodon/components/status_thread_label.tsx @@ -51,7 +51,7 @@ export const StatusThreadLabel: React.FC<{
- {label} + {label} ); }; diff --git a/app/javascript/mastodon/features/account_featured/components/empty_message.tsx b/app/javascript/mastodon/features/account_featured/components/empty_message.tsx index 51450a85d8..5a60780a09 100644 --- a/app/javascript/mastodon/features/account_featured/components/empty_message.tsx +++ b/app/javascript/mastodon/features/account_featured/components/empty_message.tsx @@ -65,5 +65,9 @@ export const EmptyMessage: React.FC = ({ ); } - return
{message}
; + return ( +
+ {message} +
+ ); }; diff --git a/app/javascript/mastodon/features/account_timeline/v2/tags_suggestions.tsx b/app/javascript/mastodon/features/account_timeline/v2/tags_suggestions.tsx index 93ac491f6c..e7f2d19cbe 100644 --- a/app/javascript/mastodon/features/account_timeline/v2/tags_suggestions.tsx +++ b/app/javascript/mastodon/features/account_timeline/v2/tags_suggestions.tsx @@ -78,6 +78,7 @@ export const TagSuggestions: FC = () => { values={{ link: (chunks) => {chunks}, }} + tagName='span' /> ); @@ -122,6 +123,7 @@ export const TagSuggestions: FC = () => { /> ), }} + tagName='span' /> ); diff --git a/app/javascript/mastodon/features/collections/index.tsx b/app/javascript/mastodon/features/collections/index.tsx index 9d9b5d06d8..d1f1953bda 100644 --- a/app/javascript/mastodon/features/collections/index.tsx +++ b/app/javascript/mastodon/features/collections/index.tsx @@ -47,6 +47,7 @@ export const Collections: React.FC<{ ) : ( <> diff --git a/app/javascript/mastodon/features/compose/components/upload_progress.tsx b/app/javascript/mastodon/features/compose/components/upload_progress.tsx index e12f58d17f..4fd861ddfe 100644 --- a/app/javascript/mastodon/features/compose/components/upload_progress.tsx +++ b/app/javascript/mastodon/features/compose/components/upload_progress.tsx @@ -30,17 +30,19 @@ export const UploadProgress: React.FC = ({
- {isProcessing ? ( - - ) : ( - - )} + + {isProcessing ? ( + + ) : ( + + )} +
diff --git a/app/javascript/mastodon/features/explore/links.jsx b/app/javascript/mastodon/features/explore/links.jsx index 9858fc8932..8c2576f4c2 100644 --- a/app/javascript/mastodon/features/explore/links.jsx +++ b/app/javascript/mastodon/features/explore/links.jsx @@ -47,7 +47,7 @@ class Links extends PureComponent { return (
- +
); diff --git a/app/javascript/mastodon/features/explore/suggestions.jsx b/app/javascript/mastodon/features/explore/suggestions.jsx index b469a15252..cca9935f9e 100644 --- a/app/javascript/mastodon/features/explore/suggestions.jsx +++ b/app/javascript/mastodon/features/explore/suggestions.jsx @@ -45,7 +45,7 @@ class Suggestions extends PureComponent { return (
- +
); diff --git a/app/javascript/mastodon/features/explore/tags.jsx b/app/javascript/mastodon/features/explore/tags.jsx index 683f95bfb4..9afb5ad6fa 100644 --- a/app/javascript/mastodon/features/explore/tags.jsx +++ b/app/javascript/mastodon/features/explore/tags.jsx @@ -46,7 +46,7 @@ class Tags extends PureComponent { return (
- +
); diff --git a/app/javascript/mastodon/features/followers/index.tsx b/app/javascript/mastodon/features/followers/index.tsx index bba2f4cb08..219462ef6f 100644 --- a/app/javascript/mastodon/features/followers/index.tsx +++ b/app/javascript/mastodon/features/followers/index.tsx @@ -63,6 +63,7 @@ const Followers: FC = () => {
); diff --git a/app/javascript/mastodon/features/following/index.tsx b/app/javascript/mastodon/features/following/index.tsx index 6bc7abda69..6f213fbe6b 100644 --- a/app/javascript/mastodon/features/following/index.tsx +++ b/app/javascript/mastodon/features/following/index.tsx @@ -65,6 +65,7 @@ const Followers: FC = () => {
); diff --git a/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.tsx b/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.tsx index 45b867ad9d..eb61183834 100644 --- a/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.tsx +++ b/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.tsx @@ -115,7 +115,7 @@ const Source: React.FC<{ id: ApiSuggestionSourceJSON }> = ({ id }) => { title={hint} > - {label} + {label} ); }; diff --git a/app/javascript/mastodon/features/lists/members.tsx b/app/javascript/mastodon/features/lists/members.tsx index c8970b6d7a..5aa8279c05 100644 --- a/app/javascript/mastodon/features/lists/members.tsx +++ b/app/javascript/mastodon/features/lists/members.tsx @@ -285,6 +285,7 @@ const ListMembers: React.FC<{ ) } diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_group_with_status.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_group_with_status.tsx index 00746560da..8035493283 100644 --- a/app/javascript/mastodon/features/notifications_v2/components/notification_group_with_status.tsx +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_group_with_status.tsx @@ -126,7 +126,7 @@ export const NotificationGroupWithStatus: React.FC<{
- {label} + {label} {timestamp && ( <> diff --git a/app/javascript/mastodon/features/report/comment.tsx b/app/javascript/mastodon/features/report/comment.tsx index 8c2728a944..f65d38470e 100644 --- a/app/javascript/mastodon/features/report/comment.tsx +++ b/app/javascript/mastodon/features/report/comment.tsx @@ -194,6 +194,7 @@ const Comment: React.FC = ({ id='report.forward' defaultMessage='Forward to {target}' values={{ target: domain }} + tagName='span' /> ))} diff --git a/app/javascript/mastodon/features/status/components/detailed_status.tsx b/app/javascript/mastodon/features/status/components/detailed_status.tsx index 1dee2e5147..b85841098a 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.tsx +++ b/app/javascript/mastodon/features/status/components/detailed_status.tsx @@ -406,6 +406,7 @@ export const DetailedStatus: React.FC<{
)} diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index d254d0ae52..5890ccc538 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -10679,6 +10679,7 @@ noscript { &__source { display: inline-flex; align-items: center; + max-width: 100%; color: var(--color-text-tertiary); gap: 4px; overflow: hidden; @@ -10899,12 +10900,6 @@ noscript { color: var(--color-text-secondary); } - & > span { - display: flex; - align-items: center; - gap: 8px; - } - a { display: inline-flex; align-items: center; From 35c30dfc6e7cc52cc4058a3ab0827aa2fb221457 Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Thu, 26 Mar 2026 14:29:47 +0100 Subject: [PATCH 09/20] Remove overeager unique index (#38414) --- ...4_remove_unique_index_on_collection_item_object_uris.rb | 7 +++++++ db/schema.rb | 3 +-- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20260326112324_remove_unique_index_on_collection_item_object_uris.rb diff --git a/db/migrate/20260326112324_remove_unique_index_on_collection_item_object_uris.rb b/db/migrate/20260326112324_remove_unique_index_on_collection_item_object_uris.rb new file mode 100644 index 0000000000..0b4ba869bc --- /dev/null +++ b/db/migrate/20260326112324_remove_unique_index_on_collection_item_object_uris.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class RemoveUniqueIndexOnCollectionItemObjectUris < ActiveRecord::Migration[8.1] + def change + remove_index :collection_items, :object_uri, unique: true, where: '(activity_uri IS NOT NULL)' + end +end diff --git a/db/schema.rb b/db/schema.rb index 878ddd9e42..70810b10d9 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[8.1].define(version: 2026_03_25_151755) do +ActiveRecord::Schema[8.1].define(version: 2026_03_26_112324) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" @@ -373,7 +373,6 @@ ActiveRecord::Schema[8.1].define(version: 2026_03_25_151755) do t.index ["account_id"], name: "index_collection_items_on_account_id" t.index ["approval_uri"], name: "index_collection_items_on_approval_uri", unique: true, where: "(approval_uri IS NOT NULL)" t.index ["collection_id"], name: "index_collection_items_on_collection_id" - t.index ["object_uri"], name: "index_collection_items_on_object_uri", unique: true, where: "(activity_uri IS NOT NULL)" t.index ["uri"], name: "index_collection_items_on_uri", unique: true, where: "(uri IS NOT NULL)" end From abd29109c5d445e4696ddb2b99e1d849ab0430ac Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Thu, 26 Mar 2026 14:30:27 +0100 Subject: [PATCH 10/20] Fetch unknown collection when handling `FeatureRequest` activity (#38413) --- .../activitypub/activity/feature_request.rb | 13 ++++++++++- .../activity/feature_request_spec.rb | 23 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app/lib/activitypub/activity/feature_request.rb b/app/lib/activitypub/activity/feature_request.rb index 314a430b6b..67355f6bda 100644 --- a/app/lib/activitypub/activity/feature_request.rb +++ b/app/lib/activitypub/activity/feature_request.rb @@ -7,7 +7,7 @@ class ActivityPub::Activity::FeatureRequest < ActivityPub::Activity return unless Mastodon::Feature.collections_federation_enabled? return if non_matching_uri_hosts?(@account.uri, @json['id']) - @collection = @account.collections.find_by(uri: value_or_id(@json['instrument'])) + @collection = find_or_fetch_collection @featured_account = ActivityPub::TagManager.instance.uris_to_local_accounts([value_or_id(@json['object'])]).first return if @collection.nil? || @featured_account.nil? @@ -37,6 +37,17 @@ class ActivityPub::Activity::FeatureRequest < ActivityPub::Activity queue_delivery!(collection_item, ActivityPub::RejectFeatureRequestSerializer) end + def find_or_fetch_collection + uri = value_or_id(@json['instrument']) + collection = @account.collections.find_by(uri:) + return collection if collection.present? + + collection = ActivityPub::FetchRemoteFeaturedCollectionService.new.call(uri) + return collection if collection.present? && collection.account == @account + + nil + end + def collection_item_attributes(state = :accepted) { account: @featured_account, activity_uri: @json['id'], state: } end diff --git a/spec/lib/activitypub/activity/feature_request_spec.rb b/spec/lib/activitypub/activity/feature_request_spec.rb index 4a3d60b5de..cd199a806a 100644 --- a/spec/lib/activitypub/activity/feature_request_spec.rb +++ b/spec/lib/activitypub/activity/feature_request_spec.rb @@ -52,5 +52,28 @@ RSpec.describe ActivityPub::Activity::FeatureRequest do end, recipient.id, sender.inbox_url) end end + + context 'when the collection is not yet known' do + let(:discoverable) { true } + let(:collection) { instance_double(Collection, uri: 'https://example.com/collections/1') } + let(:stubbed_service) do + service = instance_double(ActivityPub::FetchRemoteFeaturedCollectionService) + allow(service).to receive(:call) do + Fabricate(:remote_collection, account: sender, uri: collection.uri) + end + service + end + + before do + allow(ActivityPub::FetchRemoteFeaturedCollectionService).to receive(:new).and_return(stubbed_service) + end + + it 'fetches the collection before handling the request' do + subject.perform + + expect(ActivityPub::DeliveryWorker).to have_enqueued_sidekiq_job + expect(stubbed_service).to have_received(:call) + end + end end end From e81a4e258c62e14b5bbff860aa1ef9f18c465b8c Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 26 Mar 2026 14:33:16 +0100 Subject: [PATCH 11/20] Add support for FEP-2c59 (#38239) --- app/helpers/context_helper.rb | 1 + .../activitypub/actor_serializer.rb | 6 +- .../activitypub/fetch_remote_actor_service.rb | 20 +++- config/initializers/json_ld_webfinger.rb | 14 +++ .../fetch_remote_actor_service_spec.rb | 92 +++++++++++++++++++ 5 files changed, 128 insertions(+), 5 deletions(-) create mode 100644 config/initializers/json_ld_webfinger.rb diff --git a/app/helpers/context_helper.rb b/app/helpers/context_helper.rb index 143668aa43..ed8f4fbf0b 100644 --- a/app/helpers/context_helper.rb +++ b/app/helpers/context_helper.rb @@ -4,6 +4,7 @@ module ContextHelper NAMED_CONTEXT_MAP = { activitystreams: 'https://www.w3.org/ns/activitystreams', security: 'https://w3id.org/security/v1', + webfinger: 'https://purl.archive.org/socialweb/webfinger', }.freeze CONTEXT_EXTENSION_MAP = { diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb index 9b78412887..664d8f88d7 100644 --- a/app/serializers/activitypub/actor_serializer.rb +++ b/app/serializers/activitypub/actor_serializer.rb @@ -4,7 +4,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer include RoutingHelper include FormattingHelper - context :security + context :security, :webfinger context_extensions :manually_approves_followers, :featured, :also_known_as, :moved_to, :property_value, :discoverable, :suspended, @@ -55,6 +55,10 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer ActivityPub::TagManager.instance.uri_for(object) end + def webfinger + object.local_username_and_domain + end + def type if object.instance_actor? 'Application' diff --git a/app/services/activitypub/fetch_remote_actor_service.rb b/app/services/activitypub/fetch_remote_actor_service.rb index 1fb3f45ce5..9daa7e445e 100644 --- a/app/services/activitypub/fetch_remote_actor_service.rb +++ b/app/services/activitypub/fetch_remote_actor_service.rb @@ -27,11 +27,23 @@ class ActivityPub::FetchRemoteActorService < BaseService raise Error, "Unsupported JSON-LD context for document #{uri}" unless supported_context? raise Error, "Unexpected object type for actor #{uri} (expected any of: #{SUPPORTED_TYPES})" unless expected_type? raise Error, "Actor #{uri} has moved to #{@json['movedTo']}" if break_on_redirect && @json['movedTo'].present? - raise Error, "Actor #{uri} has no 'preferredUsername', which is a requirement for Mastodon compatibility" if @json['preferredUsername'].blank? + raise Error, "Actor #{uri} has neither 'preferredUsername' nor `webfinger`, which is a requirement for Mastodon compatibility" if @json['preferredUsername'].blank? && @json['webfinger'].blank? - @uri = @json['id'] - @username = @json['preferredUsername'] - @domain = Addressable::URI.parse(@uri).normalized_host + @uri = @json['id'] + + # FEP-2c59 defines a `webfinger` attribute that makes things more explicit and spares an extra request in some cases. + # It supersedes `preferredUsername`. + if @json['webfinger'].present? && @json['webfinger'].is_a?(String) + @username, @domain = split_acct(@json['webfinger']) + Rails.logger.debug { "Actor #{uri} has an invalid `webfinger` value, falling back to `preferredUsername`" } + end + + if @username.blank? || @domain.blank? + raise "Actor #{uri} has no `preferredUsername`, and either a bogus or missing `webfinger`, which is a requirement for Mastodon compatibility" if @json['preferredUsername'].blank? + + @username = @json['preferredUsername'] + @domain = Addressable::URI.parse(@uri).normalized_host + end check_webfinger! unless only_key diff --git a/config/initializers/json_ld_webfinger.rb b/config/initializers/json_ld_webfinger.rb new file mode 100644 index 0000000000..da2437260c --- /dev/null +++ b/config/initializers/json_ld_webfinger.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require 'json/ld' + +class JSON::LD::Context + add_preloaded("http://purl.archive.org/socialweb/webfinger") do + new(processingMode: "json-ld-1.0", term_definitions: { + "webfinger" => TermDefinition.new("webfinger", id: "https://purl.archive.org/socialweb/webfinger#webfinger", type_mapping: "http://www.w3.org/2001/XMLSchema#string"), + "wf" => TermDefinition.new("wf", id: "https://purl.archive.org/socialweb/webfinger#", simple: true, prefix: true), + "xsd" => TermDefinition.new("xsd", id: "http://www.w3.org/2001/XMLSchema#", simple: true, prefix: true) + }) + end + alias_preloaded("https://purl.archive.org/socialweb/webfinger", "http://purl.archive.org/socialweb/webfinger") +end diff --git a/spec/services/activitypub/fetch_remote_actor_service_spec.rb b/spec/services/activitypub/fetch_remote_actor_service_spec.rb index 61b1e15c95..a014e234ad 100644 --- a/spec/services/activitypub/fetch_remote_actor_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_actor_service_spec.rb @@ -133,5 +133,97 @@ RSpec.describe ActivityPub::FetchRemoteActorService do expect(subject.call('https://fake.address/@foo', prefetched_body: actor.to_json)).to be_nil end end + + context 'when the actor uses the webfinger propery from FEP-2c59' do + before do + actor[:webfinger] = acct + end + + context 'when URI and WebFinger share the same host' do + let(:acct) { 'alice@example.com' } + let!(:webfinger) { { subject: "acct:#{acct}", links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/activity+json' }] } } + + before do + stub_request(:get, 'https://example.com/alice').to_return(body: actor.to_json, headers: { 'Content-Type': 'application/activity+json' }) + stub_request(:get, "https://example.com/.well-known/webfinger?resource=acct:#{acct}").to_return(body: webfinger.to_json, headers: { 'Content-Type': 'application/jrd+json' }) + end + + it 'fetches resource and looks up webfinger and sets values' do + account + + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once + expect(a_request(:get, "https://example.com/.well-known/webfinger?resource=acct:#{acct}")).to have_been_made.once + + expect(account.username).to eq 'alice' + expect(account.domain).to eq 'example.com' + end + + it_behaves_like 'sets profile data' + end + + context 'when WebFinger returns a different URI' do + let(:acct) { 'alice@example.com' } + let!(:webfinger) { { subject: "acct:#{acct}", links: [{ rel: 'self', href: 'https://example.com/bob', type: 'application/activity+json' }] } } + + before do + stub_request(:get, 'https://example.com/alice').to_return(body: actor.to_json, headers: { 'Content-Type': 'application/activity+json' }) + stub_request(:get, "https://example.com/.well-known/webfinger?resource=acct:#{acct}").to_return(body: webfinger.to_json, headers: { 'Content-Type': 'application/jrd+json' }) + end + + it 'fetches resource and looks up webfinger and does not create account' do + expect(account).to be_nil + + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once + expect(a_request(:get, "https://example.com/.well-known/webfinger?resource=acct:#{acct}")).to have_been_made.once + end + end + + context 'when WebFinger is at another domain' do + let(:acct) { 'alice@iscool.af' } + let!(:webfinger) { { subject: "acct:#{acct}", links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/activity+json' }] } } + + before do + stub_request(:get, 'https://example.com/alice').to_return(body: actor.to_json, headers: { 'Content-Type': 'application/activity+json' }) + stub_request(:get, "https://iscool.af/.well-known/webfinger?resource=acct:#{acct}").to_return(body: webfinger.to_json, headers: { 'Content-Type': 'application/jrd+json' }) + end + + it 'fetches resource and looks up webfinger and follows redirect and sets values' do + account + + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once + expect(a_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com')).to_not have_been_made + expect(a_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af')).to have_been_made.once + + expect(account.username).to eq 'alice' + expect(account.domain).to eq 'iscool.af' + end + + it_behaves_like 'sets profile data' + end + + context 'when WebFinger is at another domain and redirects back' do + let(:acct) { 'alice@iscool.af' } + let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/activity+json' }] } } + + before do + stub_request(:get, 'https://example.com/alice').to_return(body: actor.to_json, headers: { 'Content-Type': 'application/activity+json' }) + stub_request(:get, "https://iscool.af/.well-known/webfinger?resource=acct:#{acct}").to_return(body: webfinger.to_json, headers: { 'Content-Type': 'application/jrd+json' }) + stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: webfinger.to_json, headers: { 'Content-Type': 'application/jrd+json' }) + end + + it 'fetches resource and looks up webfinger and follows redirect and sets values' do + account + + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once + expect(a_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af')).to have_been_made.once + expect(a_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com')).to have_been_made + + expect(account.username).to eq 'alice' + expect(account.domain).to eq 'example.com' + end + + it_behaves_like 'sets profile data' + end + end end end From b321d5d37756cf7e96631321bc07f116667dfcdb Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 26 Mar 2026 10:07:06 -0400 Subject: [PATCH 12/20] Use `resources` to declare API TOS access endpoints (#38416) --- .../instances/terms_of_service_controller.rb | 15 ++++ .../instances/terms_of_services_controller.rb | 23 ------ config/routes/api.rb | 5 +- .../v1/instances/terms_of_services_spec.rb | 77 ++++++++++++++++--- 4 files changed, 83 insertions(+), 37 deletions(-) create mode 100644 app/controllers/api/v1/instances/terms_of_service_controller.rb delete mode 100644 app/controllers/api/v1/instances/terms_of_services_controller.rb diff --git a/app/controllers/api/v1/instances/terms_of_service_controller.rb b/app/controllers/api/v1/instances/terms_of_service_controller.rb new file mode 100644 index 0000000000..9968b41317 --- /dev/null +++ b/app/controllers/api/v1/instances/terms_of_service_controller.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class Api::V1::Instances::TermsOfServiceController < Api::V1::Instances::BaseController + before_action :cache_even_if_authenticated! + + def index + @terms_of_service = TermsOfService.current || raise(ActiveRecord::RecordNotFound) + render json: @terms_of_service, serializer: REST::TermsOfServiceSerializer + end + + def show + @terms_of_service = TermsOfService.published.find_by!(effective_date: params[:date]) + render json: @terms_of_service, serializer: REST::TermsOfServiceSerializer + end +end diff --git a/app/controllers/api/v1/instances/terms_of_services_controller.rb b/app/controllers/api/v1/instances/terms_of_services_controller.rb deleted file mode 100644 index a32438e31d..0000000000 --- a/app/controllers/api/v1/instances/terms_of_services_controller.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -class Api::V1::Instances::TermsOfServicesController < Api::V1::Instances::BaseController - before_action :set_terms_of_service - - def show - cache_even_if_authenticated! - render json: @terms_of_service, serializer: REST::TermsOfServiceSerializer - end - - private - - def set_terms_of_service - @terms_of_service = begin - if params[:date].present? - TermsOfService.published.find_by!(effective_date: params[:date]) - else - TermsOfService.current - end - end - not_found if @terms_of_service.nil? - end -end diff --git a/config/routes/api.rb b/config/routes/api.rb index 61d74f4cd9..696981aad2 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -145,14 +145,13 @@ namespace :api, format: false do resources :peers, only: [:index] resources :rules, only: [:index] resources :domain_blocks, only: [:index] + resources :terms_of_service, only: [:index, :show], param: :date + resource :privacy_policy, only: [:show] - resource :terms_of_service, only: [:show] resource :extended_description, only: [:show] resource :translation_languages, only: [:show] resource :languages, only: [:show] resource :activity, only: [:show], controller: :activity - - get '/terms_of_service/:date', to: 'terms_of_services#show' end end diff --git a/spec/requests/api/v1/instances/terms_of_services_spec.rb b/spec/requests/api/v1/instances/terms_of_services_spec.rb index 5feb49f48d..3a352a6d0c 100644 --- a/spec/requests/api/v1/instances/terms_of_services_spec.rb +++ b/spec/requests/api/v1/instances/terms_of_services_spec.rb @@ -4,21 +4,76 @@ require 'rails_helper' RSpec.describe 'Terms of Service' do describe 'GET /api/v1/instance/terms_of_service' do - before do - Fabricate(:terms_of_service) + context 'with a current TOS record' do + before do + Fabricate(:terms_of_service) + end + + it 'returns http success' do + get api_v1_instance_terms_of_service_index_path + + expect(response) + .to have_http_status(200) + expect(response.media_type) + .to eq('application/json') + + expect(response.parsed_body) + .to be_present + .and include(:content) + end end - it 'returns http success' do - get api_v1_instance_terms_of_service_path + context 'without a current TOS record' do + it 'returns http success' do + get api_v1_instance_terms_of_service_index_path - expect(response) - .to have_http_status(200) - expect(response.content_type) - .to start_with('application/json') + expect(response) + .to have_http_status(404) + expect(response.media_type) + .to eq('application/json') - expect(response.parsed_body) - .to be_present - .and include(:content) + expect(response.parsed_body) + .to be_present + .and include(error: /not found/i) + end + end + end + + describe 'GET /api/v1/instance/terms_of_service/:date' do + context 'with an effective TOS record' do + before do + travel_to 2.days.ago do + Fabricate(:terms_of_service, effective_date: 2.days.from_now, published_at: Date.current) + end + end + + it 'returns http success' do + get api_v1_instance_terms_of_service_path(date: Date.current.to_s) + + expect(response) + .to have_http_status(200) + expect(response.media_type) + .to eq('application/json') + + expect(response.parsed_body) + .to be_present + .and include(:content) + end + end + + context 'without an effective TOS record' do + it 'returns http not found' do + get api_v1_instance_terms_of_service_path(date: Date.current.to_s) + + expect(response) + .to have_http_status(404) + expect(response.media_type) + .to eq('application/json') + + expect(response.parsed_body) + .to be_present + .and include(error: /not found/i) + end end end end From 5b2e614bebdc59552b8c878aaabf957f8ec3e78b Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 26 Mar 2026 15:13:43 +0100 Subject: [PATCH 13/20] Add more key processing tests (#38419) --- .../process_account_service_spec.rb | 121 +++++++++++++++++- 1 file changed, 114 insertions(+), 7 deletions(-) diff --git a/spec/services/activitypub/process_account_service_spec.rb b/spec/services/activitypub/process_account_service_spec.rb index 8e8fbb6a44..99bcbba9fe 100644 --- a/spec/services/activitypub/process_account_service_spec.rb +++ b/spec/services/activitypub/process_account_service_spec.rb @@ -95,6 +95,8 @@ RSpec.describe ActivityPub::ProcessAccountService do end context 'with a single keypair' do + let(:public_key) { 'foo' } + let(:payload) do { id: 'https://foo.test/actor', @@ -104,7 +106,7 @@ RSpec.describe ActivityPub::ProcessAccountService do publicKey: { id: 'https://foo.test/actor#key1', owner: 'https://foo.test/actor', - publicKeyPem: 'foo', + publicKeyPem: public_key, }, }.with_indifferent_access end @@ -116,7 +118,8 @@ RSpec.describe ActivityPub::ProcessAccountService do expect(account.keypairs).to contain_exactly( have_attributes( uri: 'https://foo.test/actor#key1', - type: 'rsa' + type: 'rsa', + public_key: ) ) end @@ -127,7 +130,7 @@ RSpec.describe ActivityPub::ProcessAccountService do it 'invalidates the legacy key and stores the new key' do expect { subject.call('alice', 'example.com', payload) } .to change { alice.reload.public_key }.to('') - .and change { alice.reload.keypairs.to_a }.from([]).to(contain_exactly(have_attributes({ uri: 'https://foo.test/actor#key1', type: 'rsa' }))) + .and change { alice.reload.keypairs.to_a }.from([]).to(contain_exactly(have_attributes({ uri: 'https://foo.test/actor#key1', type: 'rsa', public_key: }))) end end @@ -140,7 +143,104 @@ RSpec.describe ActivityPub::ProcessAccountService do it 'invalidates the legacy key and stores the new key' do expect { subject.call('alice', 'example.com', payload) } - .to change { alice.reload.keypairs.to_a }.from(contain_exactly(have_attributes({ uri: 'https://foo.test/actor#old-key' }))).to(contain_exactly(have_attributes({ uri: 'https://foo.test/actor#key1', type: 'rsa' }))) + .to change { alice.reload.keypairs.to_a }.from(contain_exactly(have_attributes({ uri: 'https://foo.test/actor#old-key' }))).to(contain_exactly(have_attributes({ uri: 'https://foo.test/actor#key1', type: 'rsa', public_key: }))) + + expect(alice.reload.public_key) + .to eq '' + end + end + end + + context 'when the key is in a separate document' do + let(:key_id) { 'https://foo.test/actor/main-key' } + let(:public_key) { 'foo' } + + let(:payload) do + { + id: 'https://foo.test/actor', + type: 'Actor', + inbox: 'https://foo.test/inbox', + preferredUsername: 'alice', + publicKey: key_id, + }.deep_stringify_keys + end + + let(:key_document) do + { + id: key_id, + owner: 'https://foo.test/actor', + publicKeyPem: public_key, + }.deep_stringify_keys + end + + before do + stub_request(:get, key_id).to_return(status: 200, body: key_document.to_json, headers: { 'Content-Type': 'application/activity+json' }) + end + + it 'stores the key' do + account = subject.call('alice', 'example.com', payload) + + expect(account.public_key).to eq '' + expect(account.keypairs).to contain_exactly( + have_attributes( + uri: key_id, + public_key:, + type: 'rsa' + ) + ) + end + + context 'when the key document is a bogus copy of the author (GoToSocial quirk)' do + let(:payload) do + { + id: 'https://foo.test/actor', + type: 'Actor', + inbox: 'https://foo.test/inbox', + preferredUsername: 'alice', + publicKey: { + id: key_id, + owner: 'https://foo.test/actor', + publicKeyPem: public_key, + }, + }.deep_stringify_keys + end + + let(:key_document) { payload } + + it 'stores the key' do + account = subject.call('alice', 'example.com', payload) + + expect(account.public_key).to eq '' + expect(account.keypairs).to contain_exactly( + have_attributes( + uri: key_id, + public_key:, + type: 'rsa' + ) + ) + end + end + + context 'when the account was known with a legacy key' do + let!(:alice) { Fabricate(:account, uri: 'https://foo.test/actor', domain: 'example.com', username: 'alice') } + + it 'invalidates the legacy key and stores the new key' do + expect { subject.call('alice', 'example.com', payload) } + .to change { alice.reload.public_key }.to('') + .and change { alice.reload.keypairs.to_a }.from([]).to(contain_exactly(have_attributes({ uri: key_id, type: 'rsa', public_key: }))) + end + end + + context 'when the account was known with an old key' do + let!(:alice) { Fabricate(:account, uri: 'https://foo.test/actor', domain: 'example.com', username: 'alice', public_key: '') } + + before do + Fabricate(:keypair, account: alice, uri: 'https://foo.test/actor#old-key', type: :rsa) + end + + it 'invalidates the legacy key and stores the new key' do + expect { subject.call('alice', 'example.com', payload) } + .to change { alice.reload.keypairs.to_a }.from(contain_exactly(have_attributes({ uri: 'https://foo.test/actor#old-key' }))).to(contain_exactly(have_attributes({ uri: key_id, type: 'rsa', public_key: }))) expect(alice.reload.public_key) .to eq '' @@ -177,11 +277,13 @@ RSpec.describe ActivityPub::ProcessAccountService do expect(account.keypairs).to contain_exactly( have_attributes( uri: 'https://foo.test/actor#key1', - type: 'rsa' + type: 'rsa', + public_key: 'foo' ), have_attributes( uri: 'https://foo.test/actor#key2', - type: 'rsa' + type: 'rsa', + public_key: 'bar' ) ) end @@ -192,7 +294,12 @@ RSpec.describe ActivityPub::ProcessAccountService do it 'invalidates the legacy key and stores the new keys' do expect { subject.call('alice', 'example.com', payload) } .to change { alice.reload.public_key }.to('') - .and change { alice.keypairs.to_a }.from([]).to(contain_exactly(have_attributes({ uri: 'https://foo.test/actor#key1', type: 'rsa' }), have_attributes({ uri: 'https://foo.test/actor#key2', type: 'rsa' }))) + .and change { alice.keypairs.to_a }.from([]).to( + contain_exactly( + have_attributes({ uri: 'https://foo.test/actor#key1', type: 'rsa', public_key: 'foo' }), + have_attributes({ uri: 'https://foo.test/actor#key2', type: 'rsa', public_key: 'bar' }) + ) + ) end end end From 87dc8f903633f8c31075f75cfe7cff7457993017 Mon Sep 17 00:00:00 2001 From: Echo Date: Thu, 26 Mar 2026 15:15:05 +0100 Subject: [PATCH 14/20] Profile redesign: Fix follower/following pagination (#38417) --- app/javascript/mastodon/selectors/user_lists.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/selectors/user_lists.ts b/app/javascript/mastodon/selectors/user_lists.ts index 9d681aa255..ed5a3271ba 100644 --- a/app/javascript/mastodon/selectors/user_lists.ts +++ b/app/javascript/mastodon/selectors/user_lists.ts @@ -29,7 +29,7 @@ export const selectUserListWithoutMe = createAppSelector( .filter((id) => id !== currentAccountId) .toArray(), isLoading: !!list.get('isLoading', true), - hasMore: !!list.get('hasMore', false), + hasMore: !!list.get('next'), }; }, ); From 71092457e97bb4f842de4b9570e6f36cf86d4879 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 14:18:41 +0000 Subject: [PATCH 15/20] Update dependency rails to v8.1.3 (#38377) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 108 +++++++++++++++++++++++++-------------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index cc3843b19b..d5d71953b4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -12,29 +12,29 @@ GEM specs: action_text-trix (2.1.17) railties - actioncable (8.1.2.1) - actionpack (= 8.1.2.1) - activesupport (= 8.1.2.1) + actioncable (8.1.3) + actionpack (= 8.1.3) + activesupport (= 8.1.3) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (8.1.2.1) - actionpack (= 8.1.2.1) - activejob (= 8.1.2.1) - activerecord (= 8.1.2.1) - activestorage (= 8.1.2.1) - activesupport (= 8.1.2.1) + actionmailbox (8.1.3) + actionpack (= 8.1.3) + activejob (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) mail (>= 2.8.0) - actionmailer (8.1.2.1) - actionpack (= 8.1.2.1) - actionview (= 8.1.2.1) - activejob (= 8.1.2.1) - activesupport (= 8.1.2.1) + actionmailer (8.1.3) + actionpack (= 8.1.3) + actionview (= 8.1.3) + activejob (= 8.1.3) + activesupport (= 8.1.3) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (8.1.2.1) - actionview (= 8.1.2.1) - activesupport (= 8.1.2.1) + actionpack (8.1.3) + actionview (= 8.1.3) + activesupport (= 8.1.3) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) @@ -42,16 +42,16 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (8.1.2.1) + actiontext (8.1.3) action_text-trix (~> 2.1.15) - actionpack (= 8.1.2.1) - activerecord (= 8.1.2.1) - activestorage (= 8.1.2.1) - activesupport (= 8.1.2.1) + actionpack (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (8.1.2.1) - activesupport (= 8.1.2.1) + actionview (8.1.3) + activesupport (= 8.1.3) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) @@ -61,22 +61,22 @@ GEM activemodel (>= 4.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activejob (8.1.2.1) - activesupport (= 8.1.2.1) + activejob (8.1.3) + activesupport (= 8.1.3) globalid (>= 0.3.6) - activemodel (8.1.2.1) - activesupport (= 8.1.2.1) - activerecord (8.1.2.1) - activemodel (= 8.1.2.1) - activesupport (= 8.1.2.1) + activemodel (8.1.3) + activesupport (= 8.1.3) + activerecord (8.1.3) + activemodel (= 8.1.3) + activesupport (= 8.1.3) timeout (>= 0.4.0) - activestorage (8.1.2.1) - actionpack (= 8.1.2.1) - activejob (= 8.1.2.1) - activerecord (= 8.1.2.1) - activesupport (= 8.1.2.1) + activestorage (8.1.3) + actionpack (= 8.1.3) + activejob (= 8.1.3) + activerecord (= 8.1.3) + activesupport (= 8.1.3) marcel (~> 1.0) - activesupport (8.1.2.1) + activesupport (8.1.3) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) @@ -354,7 +354,7 @@ GEM azure-blob (~> 0.5.2) hashie (~> 5.0) jmespath (1.6.2) - json (2.19.2) + json (2.19.3) json-canonicalization (1.0.0) json-jwt (1.17.0) activesupport (>= 4.2) @@ -657,20 +657,20 @@ GEM rack (>= 1.3) rackup (2.3.1) rack (>= 3) - rails (8.1.2.1) - actioncable (= 8.1.2.1) - actionmailbox (= 8.1.2.1) - actionmailer (= 8.1.2.1) - actionpack (= 8.1.2.1) - actiontext (= 8.1.2.1) - actionview (= 8.1.2.1) - activejob (= 8.1.2.1) - activemodel (= 8.1.2.1) - activerecord (= 8.1.2.1) - activestorage (= 8.1.2.1) - activesupport (= 8.1.2.1) + rails (8.1.3) + actioncable (= 8.1.3) + actionmailbox (= 8.1.3) + actionmailer (= 8.1.3) + actionpack (= 8.1.3) + actiontext (= 8.1.3) + actionview (= 8.1.3) + activejob (= 8.1.3) + activemodel (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) bundler (>= 1.15.0) - railties (= 8.1.2.1) + railties (= 8.1.3) rails-dom-testing (2.3.0) activesupport (>= 5.0.0) minitest @@ -681,9 +681,9 @@ GEM rails-i18n (8.1.0) i18n (>= 0.7, < 2) railties (>= 8.0.0, < 9) - railties (8.1.2.1) - actionpack (= 8.1.2.1) - activesupport (= 8.1.2.1) + railties (8.1.3) + actionpack (= 8.1.3) + activesupport (= 8.1.3) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) From 6f509d71c3ea3fd715bd46d17f6f391f3c800392 Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Thu, 26 Mar 2026 15:42:44 +0100 Subject: [PATCH 16/20] Make sure collection exists before items are added (#38424) --- .../process_featured_collection_service.rb | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/app/services/activitypub/process_featured_collection_service.rb b/app/services/activitypub/process_featured_collection_service.rb index 80742b081e..9e7c82af42 100644 --- a/app/services/activitypub/process_featured_collection_service.rb +++ b/app/services/activitypub/process_featured_collection_service.rb @@ -17,20 +17,15 @@ class ActivityPub::ProcessFeaturedCollectionService Collection.transaction do @collection = @account.collections.find_or_initialize_by(uri: @json['id']) - @collection.update!( - local: false, - name: (@json['name'] || '')[0, Collection::NAME_LENGTH_HARD_LIMIT], - description_html: truncated_summary, - language:, - sensitive: @json['sensitive'], - discoverable: @json['discoverable'], - original_number_of_items: @json['totalItems'] || 0, - tag_name: @json.dig('topic', 'name') - ) + @collection.update!(collection_attributes) - process_items! + @items = (@json['orderedItems'] || [])[0, ITEMS_LIMIT] + item_uris = @items.filter_map { |i| value_or_id(i) } + @collection.collection_items.where.not(uri: item_uris).delete_all end + process_items! + @collection end end @@ -46,14 +41,22 @@ class ActivityPub::ProcessFeaturedCollectionService @json['summaryMap']&.keys&.first end + def collection_attributes + { + local: false, + name: (@json['name'] || '')[0, Collection::NAME_LENGTH_HARD_LIMIT], + description_html: truncated_summary, + language:, + sensitive: @json['sensitive'], + discoverable: @json['discoverable'], + original_number_of_items: @json['totalItems'] || 0, + tag_name: @json.dig('topic', 'name'), + } + end + def process_items! - uris = [] - items = @json['orderedItems'] || [] - items.take(ITEMS_LIMIT).each_with_index do |item_json, index| - uris << value_or_id(item_json) + @items.each_with_index do |item_json, index| ActivityPub::ProcessFeaturedItemWorker.perform_async(@collection.id, item_json, index + 1, @request_id) end - uris.compact! - @collection.collection_items.where.not(uri: uris).delete_all end end From 2124be8a819a0d645dd8438ec50fd698f749936f Mon Sep 17 00:00:00 2001 From: diondiondion Date: Thu, 26 Mar 2026 15:56:36 +0100 Subject: [PATCH 17/20] Update collection list item design (#38425) --- app/javascript/mastodon/components/avatar.tsx | 2 +- .../components/display_name/default.tsx | 15 +- .../features/account_featured/index.tsx | 1 + .../detail/collection_list_item.module.scss | 54 +++++-- .../detail/collection_list_item.tsx | 149 +++++++++++------- .../features/collections/detail/index.tsx | 51 +++++- .../collections/detail/styles.module.scss | 12 +- .../mastodon/features/collections/index.tsx | 2 + app/javascript/mastodon/locales/en.json | 1 + .../styles/mastodon/components.scss | 5 +- 10 files changed, 215 insertions(+), 77 deletions(-) diff --git a/app/javascript/mastodon/components/avatar.tsx b/app/javascript/mastodon/components/avatar.tsx index b086ef4225..ced733b5d7 100644 --- a/app/javascript/mastodon/components/avatar.tsx +++ b/app/javascript/mastodon/components/avatar.tsx @@ -95,7 +95,7 @@ export const Avatar: React.FC = ({ }; export const AvatarById: React.FC< - { accountId: string } & Omit + { accountId: string | undefined } & Omit > = ({ accountId, ...otherProps }) => { const account = useAccount(accountId); return ; diff --git a/app/javascript/mastodon/components/display_name/default.tsx b/app/javascript/mastodon/components/display_name/default.tsx index 57ae24ab26..ec42c9ada9 100644 --- a/app/javascript/mastodon/components/display_name/default.tsx +++ b/app/javascript/mastodon/components/display_name/default.tsx @@ -6,10 +6,11 @@ import { Skeleton } from '../skeleton'; import type { DisplayNameProps } from './index'; import { DisplayNameWithoutDomain } from './no-domain'; -export const DisplayNameDefault: FC< - Omit & ComponentPropsWithoutRef<'span'> -> = ({ account, localDomain, className, ...props }) => { - const username = useMemo(() => { +export function useAccountHandle( + account: DisplayNameProps['account'], + localDomain: DisplayNameProps['localDomain'], +) { + return useMemo(() => { if (!account) { return null; } @@ -20,6 +21,12 @@ export const DisplayNameDefault: FC< } return `@${acct}`; }, [account, localDomain]); +} + +export const DisplayNameDefault: FC< + Omit & ComponentPropsWithoutRef<'span'> +> = ({ account, localDomain, className, ...props }) => { + const username = useAccountHandle(account, localDomain); return ( = ({ key={item.id} collection={item} withoutBorder={index === listedCollections.length - 1} + withAuthorHandle={false} positionInList={index + 1} listSize={listedCollections.length} /> diff --git a/app/javascript/mastodon/features/collections/detail/collection_list_item.module.scss b/app/javascript/mastodon/features/collections/detail/collection_list_item.module.scss index 3c71e90f48..7cdf9b8541 100644 --- a/app/javascript/mastodon/features/collections/detail/collection_list_item.module.scss +++ b/app/javascript/mastodon/features/collections/detail/collection_list_item.module.scss @@ -1,8 +1,9 @@ .wrapper { display: flex; - align-items: center; + align-items: start; + margin-inline: 24px; + padding-block: 12px; gap: 16px; - padding-inline: 16px; &:not(.wrapperWithoutBorder) { border-bottom: 1px solid var(--color-border-primary); @@ -12,12 +13,42 @@ .content { position: relative; flex-grow: 1; - padding-block: 15px; + display: flex; + align-items: center; + column-gap: 12px; +} + +.avatarGrid { + position: relative; + display: grid; + grid-template-columns: repeat(2, min-content); + gap: 2px; + + &.avatarGridSensitive { + .avatar { + filter: blur(4px); + } + } +} + +.avatar { + background: var(--color-bg-brand-softest); +} + +.avatarSensitiveBadge { + position: absolute; + inset: 0; + margin: auto; + padding: 3px; + width: 18px; + height: 18px; + border-radius: 8px; + color: var(--color-text-primary); + background: var(--color-bg-warning-softest); } .link { display: block; - margin-bottom: 2px; font-size: 15px; font-weight: 500; text-decoration: none; @@ -40,15 +71,12 @@ color: var(--color-text-secondary); } -.metaList { - --gap: 0.75ch; +.menuButton { + padding: 4px; + margin-top: -2px; - display: flex; - flex-wrap: wrap; - gap: var(--gap); - - & > li:not(:last-child)::after { - content: '·'; - margin-inline-start: var(--gap); + svg { + width: 20px; + height: 20px; } } diff --git a/app/javascript/mastodon/features/collections/detail/collection_list_item.tsx b/app/javascript/mastodon/features/collections/detail/collection_list_item.tsx index 73584a9e7b..08c04f030a 100644 --- a/app/javascript/mastodon/features/collections/detail/collection_list_item.tsx +++ b/app/javascript/mastodon/features/collections/detail/collection_list_item.tsx @@ -5,70 +5,65 @@ import { FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { Link } from 'react-router-dom'; +import WarningIcon from '@/material-icons/400-24px/warning.svg?react'; import type { ApiCollectionJSON } from 'mastodon/api_types/collections'; +import { AvatarById } from 'mastodon/components/avatar'; +import { useAccountHandle } from 'mastodon/components/display_name/default'; import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; import { Article } from 'mastodon/components/scrollable_list/components'; +import { useAccount } from 'mastodon/hooks/useAccount'; +import { domain } from 'mastodon/initial_state'; import classes from './collection_list_item.module.scss'; import { CollectionMenu } from './collection_menu'; -export const CollectionMetaData: React.FC<{ - collection: ApiCollectionJSON; - extended?: boolean; - className?: string; -}> = ({ collection, extended, className }) => { +export const AvatarGrid: React.FC<{ + accountIds: (string | undefined)[]; + sensitive?: boolean; +}> = ({ accountIds: ids, sensitive }) => { + const avatarIds = [ids[0], ids[1], ids[2], ids[3]]; return ( -
    - - {extended && ( - <> - {collection.discoverable ? ( - - ) : ( - - )} - {collection.sensitive && ( - - )} - +
    , - }} - tagName='li' - /> -
+ > + {avatarIds.map((id) => ( + + ))} + {sensitive && } + ); }; export const CollectionListItem: React.FC<{ collection: ApiCollectionJSON; withoutBorder?: boolean; + withAuthorHandle?: boolean; + withTimestamp?: boolean; positionInList: number; listSize: number; -}> = ({ collection, withoutBorder, positionInList, listSize }) => { +}> = ({ + collection, + withoutBorder, + withAuthorHandle = true, + withTimestamp, + positionInList, + listSize, +}) => { const { id, name } = collection; - const linkId = useId(); + const uniqueId = useId(); + const linkId = `${uniqueId}-link`; + const infoId = `${uniqueId}-info`; + const authorAccount = useAccount(collection.account_id); + const authorHandle = useAccountHandle(authorAccount, domain); return (
-

- - {name} - -

- + item.account_id)} + sensitive={collection.sensitive} + /> +
+

+ + {name} + +

+
    + {collection.sensitive && ( +
  • + +
  • + )} + {withAuthorHandle && authorAccount && ( + + )} + + {withTimestamp && ( + + ), + }} + tagName='li' + /> + )} +
+
- +
); }; diff --git a/app/javascript/mastodon/features/collections/detail/index.tsx b/app/javascript/mastodon/features/collections/detail/index.tsx index 8db00e73d3..1e4248026c 100644 --- a/app/javascript/mastodon/features/collections/detail/index.tsx +++ b/app/javascript/mastodon/features/collections/detail/index.tsx @@ -6,6 +6,7 @@ import { Helmet } from 'react-helmet'; import { useHistory, useLocation, useParams } from 'react-router'; import { openModal } from '@/mastodon/actions/modal'; +import { RelativeTimestamp } from '@/mastodon/components/relative_timestamp'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import ShareIcon from '@/material-icons/400-24px/share.svg?react'; import type { ApiCollectionJSON } from 'mastodon/api_types/collections'; @@ -25,7 +26,6 @@ import { fetchCollection } from 'mastodon/reducers/slices/collections'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; import { CollectionAccountsList } from './accounts_list'; -import { CollectionMetaData } from './collection_list_item'; import { CollectionMenu } from './collection_menu'; import classes from './styles.module.scss'; @@ -40,6 +40,54 @@ const messages = defineMessages({ }, }); +const CollectionMetaData: React.FC<{ + collection: ApiCollectionJSON; + extended?: boolean; +}> = ({ collection, extended }) => { + return ( +
    + + {extended && ( + <> + {collection.discoverable ? ( + + ) : ( + + )} + {collection.sensitive && ( + + )} + + )} + , + }} + tagName='li' + /> +
+ ); +}; + export const AuthorNote: React.FC<{ id: string; previewMode?: boolean }> = ({ id, // When previewMode is enabled, your own display name @@ -137,7 +185,6 @@ const CollectionHeader: React.FC<{ collection: ApiCollectionJSON }> = ({ ); diff --git a/app/javascript/mastodon/features/collections/detail/styles.module.scss b/app/javascript/mastodon/features/collections/detail/styles.module.scss index 786c0e7000..89bad584b6 100644 --- a/app/javascript/mastodon/features/collections/detail/styles.module.scss +++ b/app/javascript/mastodon/features/collections/detail/styles.module.scss @@ -52,9 +52,19 @@ font-size: 13px; } -.metaData { +.metaList { + --gap: 0.75ch; + + display: flex; + flex-wrap: wrap; margin-top: 16px; + gap: var(--gap); font-size: 15px; + + & > li:not(:last-child)::after { + content: '·'; + margin-inline-start: var(--gap); + } } .columnSubheading { diff --git a/app/javascript/mastodon/features/collections/index.tsx b/app/javascript/mastodon/features/collections/index.tsx index d1f1953bda..82653a22c1 100644 --- a/app/javascript/mastodon/features/collections/index.tsx +++ b/app/javascript/mastodon/features/collections/index.tsx @@ -93,6 +93,8 @@ export const Collections: React.FC<{ {collections.map((item, index) => ( Date: Thu, 26 Mar 2026 11:03:10 -0400 Subject: [PATCH 18/20] Avoid `rubocop:disable` for private address spec (#38420) --- spec/lib/private_address_check_spec.rb | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/spec/lib/private_address_check_spec.rb b/spec/lib/private_address_check_spec.rb index ee9f9295d5..20a94983d9 100644 --- a/spec/lib/private_address_check_spec.rb +++ b/spec/lib/private_address_check_spec.rb @@ -4,17 +4,11 @@ require 'rails_helper' RSpec.describe PrivateAddressCheck do describe 'private_address?' do + let(:private_ips) { %w(192.168.1.7 0.0.0.0 127.0.0.1 ::ffff:0.0.0.1) } + it 'returns true for private addresses' do - # rubocop:disable RSpec/ExpectActual - expect( - [ - '192.168.1.7', - '0.0.0.0', - '127.0.0.1', - '::ffff:0.0.0.1', - ] - ).to all satisfy('return true') { |addr| described_class.private_address?(IPAddr.new(addr)) } - # rubocop:enable RSpec/ExpectActual + expect(private_ips) + .to all(satisfy { |addr| described_class.private_address?(IPAddr.new(addr)) }) end end end From dad7f0e86959f777239310dd615779dc82e0d68e Mon Sep 17 00:00:00 2001 From: diondiondion Date: Thu, 26 Mar 2026 16:07:39 +0100 Subject: [PATCH 19/20] Update outer spacing of new profile page (#38426) --- .../account_timeline/components/redesign.module.scss | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/account_timeline/components/redesign.module.scss b/app/javascript/mastodon/features/account_timeline/components/redesign.module.scss index d483922e77..40fdc5cfa8 100644 --- a/app/javascript/mastodon/features/account_timeline/components/redesign.module.scss +++ b/app/javascript/mastodon/features/account_timeline/components/redesign.module.scss @@ -9,6 +9,11 @@ .barWrapper { border-bottom: none; + padding-inline: 24px; + + @container (width < 500px) { + padding-inline: 16px; + } } .avatarWrapper { @@ -125,7 +130,7 @@ $button-fallback-breakpoint: $button-breakpoint + 55px; position: sticky; bottom: var(--mobile-bottom-nav-height); padding: 12px 16px; - margin: 0 -20px; + margin: 0 -16px; @container (width >= #{$button-breakpoint}) { display: none; @@ -388,7 +393,7 @@ svg.badgeIcon { padding: 0 24px; @container (width < 500px) { - padding: 0 12px; + padding: 0 16px; a { flex: 1 1 0px; From 9d5e10a70e006c1c0bc61e7f591b1078c7be6ab4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 16:25:53 +0100 Subject: [PATCH 20/20] Update dependency chromatic to v16 (#38345) 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 54bae4d389..4fb0a44a06 100644 --- a/package.json +++ b/package.json @@ -165,7 +165,7 @@ "@vitest/browser-playwright": "^4.1.0", "@vitest/coverage-v8": "^4.1.0", "@vitest/ui": "^4.1.0", - "chromatic": "^13.3.3", + "chromatic": "^16.0.0", "eslint": "^9.39.2", "eslint-import-resolver-typescript": "^4.2.5", "eslint-plugin-formatjs": "^6.0.0", diff --git a/yarn.lock b/yarn.lock index 8420e1deb4..c1ae517064 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2875,7 +2875,7 @@ __metadata: axios: "npm:^1.4.0" babel-plugin-transform-react-remove-prop-types: "npm:^0.4.24" blurhash: "npm:^2.0.5" - chromatic: "npm:^13.3.3" + chromatic: "npm:^16.0.0" classnames: "npm:^2.3.2" cocoon-js-vanilla: "npm:^1.5.1" color-blend: "npm:^4.0.0" @@ -6194,9 +6194,9 @@ __metadata: languageName: node linkType: hard -"chromatic@npm:^13.3.3": - version: 13.3.5 - resolution: "chromatic@npm:13.3.5" +"chromatic@npm:^16.0.0": + version: 16.0.0 + resolution: "chromatic@npm:16.0.0" peerDependencies: "@chromatic-com/cypress": ^0.*.* || ^1.0.0 "@chromatic-com/playwright": ^0.*.* || ^1.0.0 @@ -6209,7 +6209,7 @@ __metadata: chroma: dist/bin.js chromatic: dist/bin.js chromatic-cli: dist/bin.js - checksum: 10c0/58b3d7984db000f8c7b605788569a24c3f3cd41bb6b2d3a94f18acc9ff11ce6c6881f795c8390a94ff721ccfcf8a2d7942e78a54a1f70294a7b3d35ccc382154 + checksum: 10c0/ebebbf1c7d57e1ee9863997416c5125aab0a1886dce60fcb0358d34a51e0e1a45edc4635c8f8fb56d9facbcf21cd48014320c550f723b4791da51dde8552ee2b languageName: node linkType: hard