From e22ec250770a395579ab52965b2feeacb697e128 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Sun, 10 Nov 2024 13:26:51 +0100 Subject: [PATCH 01/52] Fix typo in account unlocked localisation (#32821) --- config/locales/simple_form.en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 25de9f5910..f451c780b0 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -10,7 +10,7 @@ en: indexable: Your public posts may appear in search results on Mastodon. People who have interacted with your posts may be able to search them regardless. note: 'You can @mention other people or #hashtags.' show_collections: People will be able to browse through your follows and followers. People that you follow will see that you follow them regardless. - unlocked: People will be able to follow you without requesting approval. Uncheck if you want to review follow requests and chose whether to accept or reject new followers. + unlocked: People will be able to follow you without requesting approval. Uncheck if you want to review follow requests and choose whether to accept or reject new followers. account_alias: acct: Specify the username@domain of the account you want to move from account_migration: From 157fba4698361348c8211bc64e522492a13ff23b Mon Sep 17 00:00:00 2001 From: Christian Schmidt Date: Sun, 10 Nov 2024 17:16:07 +0100 Subject: [PATCH 02/52] Backspace hotkey should override default behaviour (#32826) --- app/javascript/mastodon/features/ui/index.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index 2f9f962b81..b90ea5585a 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -482,7 +482,9 @@ class UI extends PureComponent { } }; - handleHotkeyBack = () => { + handleHotkeyBack = e => { + e.preventDefault(); + const { history } = this.props; if (history.location?.state?.fromMastodon) { From d033920b7ed9a01f31b367a67551094b1856eb12 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 11 Nov 2024 03:29:55 -0500 Subject: [PATCH 03/52] Move account silence-related methods to concern (#28866) --- app/models/account.rb | 15 +------------ app/models/concerns/account/silences.rb | 22 +++++++++++++++++++ spec/models/account_spec.rb | 8 ------- spec/models/concerns/account/silences_spec.rb | 18 +++++++++++++++ 4 files changed, 41 insertions(+), 22 deletions(-) create mode 100644 app/models/concerns/account/silences.rb create mode 100644 spec/models/concerns/account/silences_spec.rb diff --git a/app/models/account.rb b/app/models/account.rb index 957ccc73c4..007fad7830 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -90,6 +90,7 @@ class Account < ApplicationRecord include Account::Interactions include Account::Merging include Account::Search + include Account::Silences include Account::StatusesSearch include Account::Suspensions include Account::AttributionDomains @@ -129,9 +130,7 @@ class Account < ApplicationRecord scope :remote, -> { where.not(domain: nil) } scope :local, -> { where(domain: nil) } scope :partitioned, -> { order(Arel.sql('row_number() over (partition by domain)')) } - scope :silenced, -> { where.not(silenced_at: nil) } scope :sensitized, -> { where.not(sensitized_at: nil) } - scope :without_silenced, -> { where(silenced_at: nil) } scope :without_instance_actor, -> { where.not(id: INSTANCE_ACTOR_ID) } scope :recent, -> { reorder(id: :desc) } scope :bots, -> { where(actor_type: AUTOMATED_ACTOR_TYPES) } @@ -244,18 +243,6 @@ class Account < ApplicationRecord ResolveAccountService.new.call(acct) unless local? end - def silenced? - silenced_at.present? - end - - def silence!(date = Time.now.utc) - update!(silenced_at: date) - end - - def unsilence! - update!(silenced_at: nil) - end - def sensitized? sensitized_at.present? end diff --git a/app/models/concerns/account/silences.rb b/app/models/concerns/account/silences.rb new file mode 100644 index 0000000000..bd785df311 --- /dev/null +++ b/app/models/concerns/account/silences.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Account::Silences + extend ActiveSupport::Concern + + included do + scope :silenced, -> { where.not(silenced_at: nil) } + scope :without_silenced, -> { where(silenced_at: nil) } + end + + def silenced? + silenced_at.present? + end + + def silence!(date = Time.now.utc) + update!(silenced_at: date) + end + + def unsilence! + update!(silenced_at: nil) + end +end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index 7a5deed599..77341b7786 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -983,14 +983,6 @@ RSpec.describe Account do end end - describe 'silenced' do - it 'returns an array of accounts who are silenced' do - silenced_account = Fabricate(:account, silenced: true) - _account = Fabricate(:account, silenced: false) - expect(described_class.silenced).to contain_exactly(silenced_account) - end - end - describe 'searchable' do let!(:suspended_local) { Fabricate(:account, suspended: true, username: 'suspended_local') } let!(:suspended_remote) { Fabricate(:account, suspended: true, domain: 'example.org', username: 'suspended_remote') } diff --git a/spec/models/concerns/account/silences_spec.rb b/spec/models/concerns/account/silences_spec.rb new file mode 100644 index 0000000000..0d8337ce1d --- /dev/null +++ b/spec/models/concerns/account/silences_spec.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Account::Silences do + describe 'Scopes' do + describe '.silenced' do + let(:silenced_account) { Fabricate :account, silenced: true } + + before { Fabricate :account, silenced: false } + + it 'returns an array of accounts who are silenced' do + expect(Account.silenced) + .to contain_exactly(silenced_account) + end + end + end +end From c78dc23b497ae71e91c6362b91c57a4810715b72 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 11 Nov 2024 08:08:23 -0500 Subject: [PATCH 04/52] Move account sensitize-related methods to concern (#28865) --- app/models/account.rb | 14 +------------ app/models/concerns/account/sensitizes.rb | 21 +++++++++++++++++++ .../concerns/account/sensitizes_spec.rb | 18 ++++++++++++++++ 3 files changed, 40 insertions(+), 13 deletions(-) create mode 100644 app/models/concerns/account/sensitizes.rb create mode 100644 spec/models/concerns/account/sensitizes_spec.rb diff --git a/app/models/account.rb b/app/models/account.rb index 007fad7830..206529301e 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -90,6 +90,7 @@ class Account < ApplicationRecord include Account::Interactions include Account::Merging include Account::Search + include Account::Sensitizes include Account::Silences include Account::StatusesSearch include Account::Suspensions @@ -130,7 +131,6 @@ class Account < ApplicationRecord scope :remote, -> { where.not(domain: nil) } scope :local, -> { where(domain: nil) } scope :partitioned, -> { order(Arel.sql('row_number() over (partition by domain)')) } - scope :sensitized, -> { where.not(sensitized_at: nil) } scope :without_instance_actor, -> { where.not(id: INSTANCE_ACTOR_ID) } scope :recent, -> { reorder(id: :desc) } scope :bots, -> { where(actor_type: AUTOMATED_ACTOR_TYPES) } @@ -243,18 +243,6 @@ class Account < ApplicationRecord ResolveAccountService.new.call(acct) unless local? end - def sensitized? - sensitized_at.present? - end - - def sensitize!(date = Time.now.utc) - update!(sensitized_at: date) - end - - def unsensitize! - update!(sensitized_at: nil) - end - def memorialize! update!(memorial: true) end diff --git a/app/models/concerns/account/sensitizes.rb b/app/models/concerns/account/sensitizes.rb new file mode 100644 index 0000000000..3bb74324a8 --- /dev/null +++ b/app/models/concerns/account/sensitizes.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Account::Sensitizes + extend ActiveSupport::Concern + + included do + scope :sensitized, -> { where.not(sensitized_at: nil) } + end + + def sensitized? + sensitized_at.present? + end + + def sensitize!(date = Time.now.utc) + update!(sensitized_at: date) + end + + def unsensitize! + update!(sensitized_at: nil) + end +end diff --git a/spec/models/concerns/account/sensitizes_spec.rb b/spec/models/concerns/account/sensitizes_spec.rb new file mode 100644 index 0000000000..3596c9a126 --- /dev/null +++ b/spec/models/concerns/account/sensitizes_spec.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Account::Sensitizes do + describe 'Scopes' do + describe '.sensitized' do + let(:sensitized_account) { Fabricate :account, sensitized_at: 2.days.ago } + + before { Fabricate :account, sensitized_at: false } + + it 'returns an array of accounts who are sensitized' do + expect(Account.sensitized) + .to contain_exactly(sensitized_account) + end + end + end +end From aeae1520068c54cb51dd3a350276df393ef43149 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Mon, 11 Nov 2024 20:56:28 +0100 Subject: [PATCH 05/52] Prevent Web::Push notification delivery if notification is outside of TTL window (#32842) --- app/workers/web/push_notification_worker.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/workers/web/push_notification_worker.rb b/app/workers/web/push_notification_worker.rb index 824e7b5940..3629904fa7 100644 --- a/app/workers/web/push_notification_worker.rb +++ b/app/workers/web/push_notification_worker.rb @@ -13,6 +13,8 @@ class Web::PushNotificationWorker @subscription = Web::PushSubscription.find(subscription_id) @notification = Notification.find(notification_id) + return if @notification.updated_at < TTL.ago + # Polymorphically associated activity could have been deleted # in the meantime, so we have to double-check before proceeding return unless @notification.activity.present? && @subscription.pushable?(@notification) From c099797700c5f84b83cf3096c1b58ef2adadb7d7 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 12 Nov 2024 03:28:31 -0500 Subject: [PATCH 06/52] Use `mastodon` config namespace to load software update default value via `config_for` (#30534) --- app/models/software_update.rb | 2 +- app/services/software_update_check_service.rb | 2 +- config/application.rb | 1 + config/mastodon.yml | 3 +++ config/navigation.rb | 6 +++++- .../system_check/software_version_check_spec.rb | 7 ++++--- .../services/software_update_check_service_spec.rb | 14 ++++++++------ 7 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 config/mastodon.yml diff --git a/app/models/software_update.rb b/app/models/software_update.rb index 51a73c2731..2cb935130a 100644 --- a/app/models/software_update.rb +++ b/app/models/software_update.rb @@ -24,7 +24,7 @@ class SoftwareUpdate < ApplicationRecord class << self def check_enabled? - ENV['UPDATE_CHECK_URL'] != '' + Rails.configuration.x.mastodon.software_update_url.present? end def pending_to_a diff --git a/app/services/software_update_check_service.rb b/app/services/software_update_check_service.rb index 24a6955b88..148f269289 100644 --- a/app/services/software_update_check_service.rb +++ b/app/services/software_update_check_service.rb @@ -27,7 +27,7 @@ class SoftwareUpdateCheckService < BaseService end def api_url - ENV.fetch('UPDATE_CHECK_URL', 'https://api.joinmastodon.org/update-check') + Rails.configuration.x.mastodon.software_update_url end def version diff --git a/config/application.rb b/config/application.rb index 18a1b1a0fd..cfeed02e98 100644 --- a/config/application.rb +++ b/config/application.rb @@ -105,6 +105,7 @@ module Mastodon end config.x.captcha = config_for(:captcha) + config.x.mastodon = config_for(:mastodon) config.x.translation = config_for(:translation) config.to_prepare do diff --git a/config/mastodon.yml b/config/mastodon.yml new file mode 100644 index 0000000000..255213b4b7 --- /dev/null +++ b/config/mastodon.yml @@ -0,0 +1,3 @@ +--- +shared: + software_update_url: <%= ENV.fetch('UPDATE_CHECK_URL', 'https://api.joinmastodon.org/update-check') %> diff --git a/config/navigation.rb b/config/navigation.rb index 7ec7ecb7e7..bdda569092 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -6,7 +6,11 @@ SimpleNavigation::Configuration.run do |navigation| navigation.items do |n| n.item :web, safe_join([material_symbol('chevron_left'), t('settings.back')]), root_path - n.item :software_updates, safe_join([material_symbol('report'), t('admin.critical_update_pending')]), admin_software_updates_path, if: -> { ENV['UPDATE_CHECK_URL'] != '' && current_user.can?(:view_devops) && SoftwareUpdate.urgent_pending? }, html: { class: 'warning' } + n.item :software_updates, + safe_join([material_symbol('report'), t('admin.critical_update_pending')]), + admin_software_updates_path, + if: -> { Rails.configuration.x.mastodon.software_update_url.present? && current_user.can?(:view_devops) && SoftwareUpdate.urgent_pending? }, + html: { class: 'warning' } n.item :profile, safe_join([material_symbol('person'), t('settings.profile')]), settings_profile_path, if: -> { current_user.functional? && !self_destruct }, highlights_on: %r{/settings/profile|/settings/featured_tags|/settings/verification|/settings/privacy} diff --git a/spec/lib/admin/system_check/software_version_check_spec.rb b/spec/lib/admin/system_check/software_version_check_spec.rb index 8460d90668..75dc1a4732 100644 --- a/spec/lib/admin/system_check/software_version_check_spec.rb +++ b/spec/lib/admin/system_check/software_version_check_spec.rb @@ -27,9 +27,10 @@ RSpec.describe Admin::SystemCheck::SoftwareVersionCheck do context 'when checks are disabled' do around do |example| - ClimateControl.modify UPDATE_CHECK_URL: '' do - example.run - end + original = Rails.configuration.x.mastodon.software_update_url + Rails.configuration.x.mastodon.software_update_url = '' + example.run + Rails.configuration.x.mastodon.software_update_url = original end it 'returns true' do diff --git a/spec/services/software_update_check_service_spec.rb b/spec/services/software_update_check_service_spec.rb index a1eb9d86e9..4098bd470a 100644 --- a/spec/services/software_update_check_service_spec.rb +++ b/spec/services/software_update_check_service_spec.rb @@ -124,9 +124,10 @@ RSpec.describe SoftwareUpdateCheckService do context 'when update checking is disabled' do around do |example| - ClimateControl.modify UPDATE_CHECK_URL: '' do - example.run - end + original = Rails.configuration.x.mastodon.software_update_url + Rails.configuration.x.mastodon.software_update_url = '' + example.run + Rails.configuration.x.mastodon.software_update_url = original end before do @@ -148,9 +149,10 @@ RSpec.describe SoftwareUpdateCheckService do let(:update_check_url) { 'https://api.example.com/update_check' } around do |example| - ClimateControl.modify UPDATE_CHECK_URL: 'https://api.example.com/update_check' do - example.run - end + original = Rails.configuration.x.mastodon.software_update_url + Rails.configuration.x.mastodon.software_update_url = 'https://api.example.com/update_check' + example.run + Rails.configuration.x.mastodon.software_update_url = original end it_behaves_like 'when the feature is enabled' From 5a99ac3cfd234d61c9f23fe2a6c0a76da3c1a354 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 08:31:08 +0000 Subject: [PATCH 07/52] Update dependency aws-sdk-s3 to v1.170.1 (#32846) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1888485af0..64abf4d77a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -106,7 +106,7 @@ GEM aws-sdk-kms (1.95.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.170.0) + aws-sdk-s3 (1.170.1) aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) From 67a2b03909a5ba459fdb5aff2a32fe396551ce29 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 09:32:43 +0100 Subject: [PATCH 08/52] Update dependency postcss-preset-env to v10.1.0 (#32835) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 218 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 123 insertions(+), 95 deletions(-) diff --git a/yarn.lock b/yarn.lock index c4a35c9328..db834ec39e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1480,26 +1480,26 @@ __metadata: languageName: node linkType: hard -"@csstools/css-calc@npm:^2.0.4": - version: 2.0.4 - resolution: "@csstools/css-calc@npm:2.0.4" +"@csstools/css-calc@npm:^2.1.0": + version: 2.1.0 + resolution: "@csstools/css-calc@npm:2.1.0" peerDependencies: "@csstools/css-parser-algorithms": ^3.0.4 "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/ecb68fc9f8d930b861d5c9c5d4fc6eb43dabc619a4cd6c82dc18034ee746f907dba106fa6cdb909ac727fbfc9b1f7ceac1f356641542faeb2fab99c5fcd52a2e + checksum: 10c0/c707bb533a6ea63ed5bb4b8f1ffcbf3cd2daf970a6d76d42b684243426f5aa7513179a8f34d2e3c5a85df3870f44d3bc2850ca40b085c5fe00b41a291a2ecae2 languageName: node linkType: hard -"@csstools/css-color-parser@npm:^3.0.5": - version: 3.0.5 - resolution: "@csstools/css-color-parser@npm:3.0.5" +"@csstools/css-color-parser@npm:^3.0.6": + version: 3.0.6 + resolution: "@csstools/css-color-parser@npm:3.0.6" dependencies: "@csstools/color-helpers": "npm:^5.0.1" - "@csstools/css-calc": "npm:^2.0.4" + "@csstools/css-calc": "npm:^2.1.0" peerDependencies: "@csstools/css-parser-algorithms": ^3.0.4 "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/535e2a38222ad7ee9e1143c3ef09ba07b2e70a4214bbdf7ca13398388b8d2db9ee295fe15d9d306342036e554d97dd235567a8c8ee03fea6825483f1c4dbbf7e + checksum: 10c0/7c4f42a704c8c44cece75f5dcd647a83634dec0f44d398ae1fbdc6e8527d4fbdc3a809eaaba3b739edf8e3c09d62c28234636f250f9b0b0d52a599e824c22047 languageName: node linkType: hard @@ -1551,33 +1551,33 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-color-function@npm:^4.0.5": - version: 4.0.5 - resolution: "@csstools/postcss-color-function@npm:4.0.5" +"@csstools/postcss-color-function@npm:^4.0.6": + version: 4.0.6 + resolution: "@csstools/postcss-color-function@npm:4.0.6" dependencies: - "@csstools/css-color-parser": "npm:^3.0.5" + "@csstools/css-color-parser": "npm:^3.0.6" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/b47cc4567445eb12dd3e67a4298470d62a449a4d754fd4dd32eb78b23615ba6bd1fe8dacccc6c95087ce8749a6552bace8de0b9b6eee0c9a7b7202a0bcb8fcac + checksum: 10c0/facbae01fd58898a176219cfcffee9ffb06fb466a2c439fd28403819e48778b682621b86a69682c0f758c659f8ec5f14eca1a9612b12b8777a2198173f386b49 languageName: node linkType: hard -"@csstools/postcss-color-mix-function@npm:^3.0.5": - version: 3.0.5 - resolution: "@csstools/postcss-color-mix-function@npm:3.0.5" +"@csstools/postcss-color-mix-function@npm:^3.0.6": + version: 3.0.6 + resolution: "@csstools/postcss-color-mix-function@npm:3.0.6" dependencies: - "@csstools/css-color-parser": "npm:^3.0.5" + "@csstools/css-color-parser": "npm:^3.0.6" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/a17d20dcc42d2c1ccd7a5ceb8d1413133ae9461bf973a9aad997a5782bf4cbbd847aef06accc20fa391ac6fbd44a1003e18c30a621d7c77052d4256fe39619aa + checksum: 10c0/66b906b2425ed137b1c2ef3d166036719ae69039668385dccce4e02bd91e41733b37dd3c884b74a2999067bfe8a8d8d1afa4082ef21a0bf044ba7e7fffb77e01 languageName: node linkType: hard @@ -1595,16 +1595,16 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-exponential-functions@npm:^2.0.4": - version: 2.0.4 - resolution: "@csstools/postcss-exponential-functions@npm:2.0.4" +"@csstools/postcss-exponential-functions@npm:^2.0.5": + version: 2.0.5 + resolution: "@csstools/postcss-exponential-functions@npm:2.0.5" dependencies: - "@csstools/css-calc": "npm:^2.0.4" + "@csstools/css-calc": "npm:^2.1.0" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" peerDependencies: postcss: ^8.4 - checksum: 10c0/b174faa8782b7b3f3a9636412f90963740ff033c6506acf662f002fa07f59b370eb23937dbe3f1a05d7df277373f662d6970237d34ae938cf282a0b8dbde9a47 + checksum: 10c0/8935cb69f70d7448aa5a3dcdfd188bdcfbc34e9a99131306947df8847126272773212011dcff85e10bcee4c9d01f94f7f8557ef93933122a0b82743185684ab1 languageName: node linkType: hard @@ -1620,46 +1620,46 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-gamut-mapping@npm:^2.0.5": - version: 2.0.5 - resolution: "@csstools/postcss-gamut-mapping@npm:2.0.5" +"@csstools/postcss-gamut-mapping@npm:^2.0.6": + version: 2.0.6 + resolution: "@csstools/postcss-gamut-mapping@npm:2.0.6" dependencies: - "@csstools/css-color-parser": "npm:^3.0.5" + "@csstools/css-color-parser": "npm:^3.0.6" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" peerDependencies: postcss: ^8.4 - checksum: 10c0/a9d7365bed5c323dddad06d53c137ef3508870e541c6275dbdf3a73a50d44437830c22fa62c510d9316441d1e9f3b5552730778d1b73d083422245673bd00dac + checksum: 10c0/8a3f012774ab261924cc9f3519caa87a25a6abcd70d78f622144d8e7126a687bddbdaa92995fc30f53355759cd5971e71ac099b6b8cb85c89d8ca86455588e3b languageName: node linkType: hard -"@csstools/postcss-gradients-interpolation-method@npm:^5.0.5": - version: 5.0.5 - resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.5" +"@csstools/postcss-gradients-interpolation-method@npm:^5.0.6": + version: 5.0.6 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.6" dependencies: - "@csstools/css-color-parser": "npm:^3.0.5" + "@csstools/css-color-parser": "npm:^3.0.6" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/0ef258478270005ab3a879132dc6dbf2bf80788c79861515c826607953c551df1c2ef7005ba9592c31c6dad332d12ee247928a9fdd1569a51927a18a75dcc865 + checksum: 10c0/0d97be76837f972ea323b58189ded2310b618ad94b40777464d0d8ac050b557ca9fd1f20af5ada105d61574cc9d8c119ae0daf294a3aacaaa89926f864d9d674 languageName: node linkType: hard -"@csstools/postcss-hwb-function@npm:^4.0.5": - version: 4.0.5 - resolution: "@csstools/postcss-hwb-function@npm:4.0.5" +"@csstools/postcss-hwb-function@npm:^4.0.6": + version: 4.0.6 + resolution: "@csstools/postcss-hwb-function@npm:4.0.6" dependencies: - "@csstools/css-color-parser": "npm:^3.0.5" + "@csstools/css-color-parser": "npm:^3.0.6" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/9ce0a66bf288c9ec7f1fc28323d56ec54d38a30cb2ab722d1afbd46ec070cc5e61121bacb503803cb00293fc5ed117269969ac21071d7f4ce94b385c96168445 + checksum: 10c0/e7bcc98095ef2873a7b1a7326f1618bbeecc1c78660b23805bbefd8ec067bf2f35f2a2d4675be51a02d2280046f36f74d55f6af78e3ce107b82624d1a421ffcf languageName: node linkType: hard @@ -1761,17 +1761,17 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-media-minmax@npm:^2.0.4": - version: 2.0.4 - resolution: "@csstools/postcss-media-minmax@npm:2.0.4" +"@csstools/postcss-media-minmax@npm:^2.0.5": + version: 2.0.5 + resolution: "@csstools/postcss-media-minmax@npm:2.0.5" dependencies: - "@csstools/css-calc": "npm:^2.0.4" + "@csstools/css-calc": "npm:^2.1.0" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/media-query-list-parser": "npm:^4.0.2" peerDependencies: postcss: ^8.4 - checksum: 10c0/f9fe1e99b83a0724250f9426335da6f13bfbc28be6d10ebfafbf037766fc5245240ec33be7e68c9c5b60c013fbc2fa0be96fbed0d41383c919ee9e6f1b8225ce + checksum: 10c0/0d17782076fcaba2c3c85bd769fc102d95809e9ee6141ad9de706ee116466cada62424fd68623c58cc2456771725291c356e550377ba73a102ab6fe628931e30 languageName: node linkType: hard @@ -1811,18 +1811,18 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-oklab-function@npm:^4.0.5": - version: 4.0.5 - resolution: "@csstools/postcss-oklab-function@npm:4.0.5" +"@csstools/postcss-oklab-function@npm:^4.0.6": + version: 4.0.6 + resolution: "@csstools/postcss-oklab-function@npm:4.0.6" dependencies: - "@csstools/css-color-parser": "npm:^3.0.5" + "@csstools/css-color-parser": "npm:^3.0.6" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/a49e2ee60066f7da18316c7c80e5b2ced286ec962052f83c01f1952a1c5fe5b65ba9803a04698260125270a1dd47416f0b287a8f42e591f0d88c9a660ae844ce + checksum: 10c0/74ec74eb7171881deeff7a79e0dc696097fb53dcdcd9627d9559cd7be63f41adecec06c1e88ddd5d8a37f4705715d1c0c135ca2b001fb70fdc0b76ab1e491b66 languageName: node linkType: hard @@ -1837,18 +1837,31 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-relative-color-syntax@npm:^3.0.5": - version: 3.0.5 - resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.5" +"@csstools/postcss-random-function@npm:^1.0.0": + version: 1.0.1 + resolution: "@csstools/postcss-random-function@npm:1.0.1" dependencies: - "@csstools/css-color-parser": "npm:^3.0.5" + "@csstools/css-calc": "npm:^2.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/5e8f29c024aa6ed1f89ee8b9c8ece39c8e72602d63faa82d9684e3183828f01971cf2f760b7d5b773605d44a4ea661d6d4389ec03f7e21002f9aa9e8db613a61 + languageName: node + linkType: hard + +"@csstools/postcss-relative-color-syntax@npm:^3.0.6": + version: 3.0.6 + resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.6" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.6" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/505da97e7b219095a9fb6fa0ad6c6a1358ce1f5debada00564e635e1aa11d034c588be9ce2f76263172a8d1bd07d90647fde826f4565de22dcfc0a76beb68ff1 + checksum: 10c0/207ae711831f8ae9170093dbea3727cd6f32ca31d22c1231b5b678592679eb49e329e87ea403714b8e10feb5b9137780364cc7e1e7d8cc4c90d47483a42132dc languageName: node linkType: hard @@ -1863,16 +1876,29 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-stepped-value-functions@npm:^4.0.4": - version: 4.0.4 - resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.4" +"@csstools/postcss-sign-functions@npm:^1.0.0": + version: 1.0.0 + resolution: "@csstools/postcss-sign-functions@npm:1.0.0" dependencies: - "@csstools/css-calc": "npm:^2.0.4" + "@csstools/css-calc": "npm:^2.1.0" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" peerDependencies: postcss: ^8.4 - checksum: 10c0/c8413a855a5ee9ad5b800263545d24d1bbd815f5ae0693c7dfd10c5f5b47bae5a9d985efdb2c46b03194ed3cae39f3d82c3ccfde502dee0b35d620fa539906be + checksum: 10c0/ec745b2f1e714ffead43ade5964234dfc1750c3a71d2e29df862ab3f79ba4a1275187b270b4c226bbb1155bee8e9e63c35597b4f4cb3effaa632e5e07e422344 + languageName: node + linkType: hard + +"@csstools/postcss-stepped-value-functions@npm:^4.0.5": + version: 4.0.5 + resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.5" + dependencies: + "@csstools/css-calc": "npm:^2.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/76f1f60c24b9e6a80b044eb19f37c1816788a2335fbf7c25f3fbea1cd7104857f424a451dcff60e4f8841618c6b6ffa6091f8b840d6d5930c1c7100c2f8ae74b languageName: node linkType: hard @@ -1888,16 +1914,16 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-trigonometric-functions@npm:^4.0.4": - version: 4.0.4 - resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.4" +"@csstools/postcss-trigonometric-functions@npm:^4.0.5": + version: 4.0.5 + resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.5" dependencies: - "@csstools/css-calc": "npm:^2.0.4" + "@csstools/css-calc": "npm:^2.1.0" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" peerDependencies: postcss: ^8.4 - checksum: 10c0/344c07961d24894f315faebf43c0128167fb2e33964c70d0d39d99a051c045678511d7378959105d672c5286a5360fde28fe390cdebfe823f3949e3cd1d50c4e + checksum: 10c0/b8518c8b81da047448dcee12a5f3716dbc19671333387a4a673991a16f1a120441d2768de8a30ce1e2ef8d0d76509b9509f506ef1e8630da84834451414b23a3 languageName: node linkType: hard @@ -6714,10 +6740,10 @@ __metadata: languageName: node linkType: hard -"cssdb@npm:^8.1.2": - version: 8.1.2 - resolution: "cssdb@npm:8.1.2" - checksum: 10c0/056149e713a78921f56d9ef0cd734577cedb93c27966c3d0eab01956a2aa8d3c260a911766064b57ded8b4d9c55dd5275626cbb022ccd8d2d0b93b53fefd1603 +"cssdb@npm:^8.2.1": + version: 8.2.1 + resolution: "cssdb@npm:8.2.1" + checksum: 10c0/d27d7db0a39e1105181aac119a98d6c92cd5ceba2e8bd349cdf2ba4a8d9ead149b685a1dba9542ca24f094cc70eca4a3e02973fe1f74c11a373b508606e5e1c0 languageName: node linkType: hard @@ -13270,18 +13296,18 @@ __metadata: languageName: node linkType: hard -"postcss-color-functional-notation@npm:^7.0.5": - version: 7.0.5 - resolution: "postcss-color-functional-notation@npm:7.0.5" +"postcss-color-functional-notation@npm:^7.0.6": + version: 7.0.6 + resolution: "postcss-color-functional-notation@npm:7.0.6" dependencies: - "@csstools/css-color-parser": "npm:^3.0.5" + "@csstools/css-color-parser": "npm:^3.0.6" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/5e1771b8a43abd3cb18142842e8ac100b205f37a6757d6686da49e0c61ecf33d09244d256f3802962105e7ef79fbde2dffbfc1eedf1700198c54d2d5e48f3dc1 + checksum: 10c0/15f6dfc9a24d6f5186fb054623a92bcf9e804f4eaa35b339551a8048cdb0c7bd2e4655fdbb09a0c9a89f854e9fb1d71e298e8749597660ac034e79bd0d38d7dd languageName: node linkType: hard @@ -13492,18 +13518,18 @@ __metadata: languageName: node linkType: hard -"postcss-lab-function@npm:^7.0.5": - version: 7.0.5 - resolution: "postcss-lab-function@npm:7.0.5" +"postcss-lab-function@npm:^7.0.6": + version: 7.0.6 + resolution: "postcss-lab-function@npm:7.0.6" dependencies: - "@csstools/css-color-parser": "npm:^3.0.5" + "@csstools/css-color-parser": "npm:^3.0.6" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/b688f6332ac12974452c97c5a40f4d0a604ce16b074124a1106add9cf9c25fbe7717d23423d6e92d937dc6e288e03e885b70e0793b96f41d28d2f7403bce7bf5 + checksum: 10c0/8b8d498dbc939ee79737b29232b39d09cbda26cc92e8926fb74fe56a1bb05af1198e85a67a822f39cc69109ac6757a6ff7b20842ba5ffafce891abc9bc1c3c68 languageName: node linkType: hard @@ -13824,18 +13850,18 @@ __metadata: linkType: hard "postcss-preset-env@npm:^10.0.0": - version: 10.0.9 - resolution: "postcss-preset-env@npm:10.0.9" + version: 10.1.0 + resolution: "postcss-preset-env@npm:10.1.0" dependencies: "@csstools/postcss-cascade-layers": "npm:^5.0.1" - "@csstools/postcss-color-function": "npm:^4.0.5" - "@csstools/postcss-color-mix-function": "npm:^3.0.5" + "@csstools/postcss-color-function": "npm:^4.0.6" + "@csstools/postcss-color-mix-function": "npm:^3.0.6" "@csstools/postcss-content-alt-text": "npm:^2.0.4" - "@csstools/postcss-exponential-functions": "npm:^2.0.4" + "@csstools/postcss-exponential-functions": "npm:^2.0.5" "@csstools/postcss-font-format-keywords": "npm:^4.0.0" - "@csstools/postcss-gamut-mapping": "npm:^2.0.5" - "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.5" - "@csstools/postcss-hwb-function": "npm:^4.0.5" + "@csstools/postcss-gamut-mapping": "npm:^2.0.6" + "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.6" + "@csstools/postcss-hwb-function": "npm:^4.0.6" "@csstools/postcss-ic-unit": "npm:^4.0.0" "@csstools/postcss-initial": "npm:^2.0.0" "@csstools/postcss-is-pseudo-class": "npm:^5.0.1" @@ -13845,27 +13871,29 @@ __metadata: "@csstools/postcss-logical-overscroll-behavior": "npm:^2.0.0" "@csstools/postcss-logical-resize": "npm:^3.0.0" "@csstools/postcss-logical-viewport-units": "npm:^3.0.3" - "@csstools/postcss-media-minmax": "npm:^2.0.4" + "@csstools/postcss-media-minmax": "npm:^2.0.5" "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^3.0.4" "@csstools/postcss-nested-calc": "npm:^4.0.0" "@csstools/postcss-normalize-display-values": "npm:^4.0.0" - "@csstools/postcss-oklab-function": "npm:^4.0.5" + "@csstools/postcss-oklab-function": "npm:^4.0.6" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" - "@csstools/postcss-relative-color-syntax": "npm:^3.0.5" + "@csstools/postcss-random-function": "npm:^1.0.0" + "@csstools/postcss-relative-color-syntax": "npm:^3.0.6" "@csstools/postcss-scope-pseudo-class": "npm:^4.0.1" - "@csstools/postcss-stepped-value-functions": "npm:^4.0.4" + "@csstools/postcss-sign-functions": "npm:^1.0.0" + "@csstools/postcss-stepped-value-functions": "npm:^4.0.5" "@csstools/postcss-text-decoration-shorthand": "npm:^4.0.1" - "@csstools/postcss-trigonometric-functions": "npm:^4.0.4" + "@csstools/postcss-trigonometric-functions": "npm:^4.0.5" "@csstools/postcss-unset-value": "npm:^4.0.0" autoprefixer: "npm:^10.4.19" browserslist: "npm:^4.23.1" css-blank-pseudo: "npm:^7.0.1" css-has-pseudo: "npm:^7.0.1" css-prefers-color-scheme: "npm:^10.0.0" - cssdb: "npm:^8.1.2" + cssdb: "npm:^8.2.1" postcss-attribute-case-insensitive: "npm:^7.0.1" postcss-clamp: "npm:^4.1.0" - postcss-color-functional-notation: "npm:^7.0.5" + postcss-color-functional-notation: "npm:^7.0.6" postcss-color-hex-alpha: "npm:^10.0.0" postcss-color-rebeccapurple: "npm:^10.0.0" postcss-custom-media: "npm:^11.0.5" @@ -13878,7 +13906,7 @@ __metadata: postcss-font-variant: "npm:^5.0.0" postcss-gap-properties: "npm:^6.0.0" postcss-image-set-function: "npm:^7.0.0" - postcss-lab-function: "npm:^7.0.5" + postcss-lab-function: "npm:^7.0.6" postcss-logical: "npm:^8.0.0" postcss-nesting: "npm:^13.0.1" postcss-opacity-percentage: "npm:^3.0.0" @@ -13890,7 +13918,7 @@ __metadata: postcss-selector-not: "npm:^8.0.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/985ef4cfd2dd6a94d8a802db8e392c4b4c47ae0de8fd5224c60d8172cac3d7ce9011e63ab80470cddc77f21f09b2be850f97ac2478f651bc0a8956b538b079fe + checksum: 10c0/bd157dbed38c3c125b3bf86f5437a8094539ec5bf24428487c7bbf29da393731e48053afc695494cc9dbe4d182cfe405c398fcf0b22eb326b6db395e7315f892 languageName: node linkType: hard From 90b5017c190b705b73b5d14488db8aec152da527 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 09:33:02 +0100 Subject: [PATCH 09/52] Update dependency postcss to v8.4.49 (#32831) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index db834ec39e..3da56cf38e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13079,10 +13079,10 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0": - version: 1.1.0 - resolution: "picocolors@npm:1.1.0" - checksum: 10c0/86946f6032148801ef09c051c6fb13b5cf942eaf147e30ea79edb91dd32d700934edebe782a1078ff859fb2b816792e97ef4dab03d7f0b804f6b01a0df35e023 +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 languageName: node linkType: hard @@ -14052,13 +14052,13 @@ __metadata: linkType: hard "postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.47": - version: 8.4.47 - resolution: "postcss@npm:8.4.47" + version: 8.4.49 + resolution: "postcss@npm:8.4.49" dependencies: nanoid: "npm:^3.3.7" - picocolors: "npm:^1.1.0" + picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10c0/929f68b5081b7202709456532cee2a145c1843d391508c5a09de2517e8c4791638f71dd63b1898dba6712f8839d7a6da046c72a5e44c162e908f5911f57b5f44 + checksum: 10c0/f1b3f17aaf36d136f59ec373459f18129908235e65dbdc3aee5eef8eba0756106f52de5ec4682e29a2eab53eb25170e7e871b3e4b52a8f1de3d344a514306be3 languageName: node linkType: hard From 88512220bbd21c49730ca676668c2b61d0a690f2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 08:33:23 +0000 Subject: [PATCH 10/52] Update dependency @formatjs/cli to v6.3.8 (#32830) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3da56cf38e..665ebff051 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2232,8 +2232,8 @@ __metadata: linkType: hard "@formatjs/cli@npm:^6.1.1": - version: 6.3.6 - resolution: "@formatjs/cli@npm:6.3.6" + version: 6.3.8 + resolution: "@formatjs/cli@npm:6.3.8" peerDependencies: "@glimmer/env": ^0.1.7 "@glimmer/reference": ^0.91.1 || ^0.92.0 @@ -2262,7 +2262,7 @@ __metadata: optional: true bin: formatjs: bin/formatjs - checksum: 10c0/55f10699644c8b879d7fcf38660e7d9b0642c5f40ca59076c25ba190f350b48d7edb7f3d8481cc6139d3a708ee73f877c2c0a7d1865f15e80a73667270c9b7e3 + checksum: 10c0/61fb0e56a2da26befad5ca6ff5a8bcf9c383d22634cf288f3cab5661bece7686e6f064adaa500954b37726a7745c73134b459d115d52c931b76d68d998c7b22d languageName: node linkType: hard From a34edc211f9f33ed0bd5a1891ef2d475a935b0e6 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Tue, 12 Nov 2024 09:35:08 +0100 Subject: [PATCH 11/52] Add audit logging to Relays (#32819) --- app/controllers/admin/relays_controller.rb | 4 ++++ app/helpers/admin/action_logs_helper.rb | 2 ++ app/models/admin/action_log_filter.rb | 4 ++++ app/models/relay.rb | 4 ++++ config/locales/en.yml | 8 ++++++++ 5 files changed, 22 insertions(+) diff --git a/app/controllers/admin/relays_controller.rb b/app/controllers/admin/relays_controller.rb index c893802159..f05255adb6 100644 --- a/app/controllers/admin/relays_controller.rb +++ b/app/controllers/admin/relays_controller.rb @@ -21,6 +21,7 @@ module Admin @relay = Relay.new(resource_params) if @relay.save + log_action :create, @relay @relay.enable! redirect_to admin_relays_path else @@ -31,18 +32,21 @@ module Admin def destroy authorize :relay, :update? @relay.destroy + log_action :destroy, @relay redirect_to admin_relays_path end def enable authorize :relay, :update? @relay.enable! + log_action :enable, @relay redirect_to admin_relays_path end def disable authorize :relay, :update? @relay.disable! + log_action :disable, @relay redirect_to admin_relays_path end diff --git a/app/helpers/admin/action_logs_helper.rb b/app/helpers/admin/action_logs_helper.rb index 51e28d8b4e..859f924687 100644 --- a/app/helpers/admin/action_logs_helper.rb +++ b/app/helpers/admin/action_logs_helper.rb @@ -33,6 +33,8 @@ module Admin::ActionLogsHelper else I18n.t('admin.action_logs.deleted_account') end + when 'Relay' + link_to log.human_identifier, admin_relays_path end end diff --git a/app/models/admin/action_log_filter.rb b/app/models/admin/action_log_filter.rb index 1f48e0a497..dfb7fd00ed 100644 --- a/app/models/admin/action_log_filter.rb +++ b/app/models/admin/action_log_filter.rb @@ -31,6 +31,7 @@ class Admin::ActionLogFilter create_domain_block: { target_type: 'DomainBlock', action: 'create' }.freeze, create_email_domain_block: { target_type: 'EmailDomainBlock', action: 'create' }.freeze, create_ip_block: { target_type: 'IpBlock', action: 'create' }.freeze, + create_relay: { target_type: 'Relay', action: 'create' }.freeze, create_unavailable_domain: { target_type: 'UnavailableDomain', action: 'create' }.freeze, create_user_role: { target_type: 'UserRole', action: 'create' }.freeze, create_canonical_email_block: { target_type: 'CanonicalEmailBlock', action: 'create' }.freeze, @@ -40,6 +41,7 @@ class Admin::ActionLogFilter destroy_domain_allow: { target_type: 'DomainAllow', action: 'destroy' }.freeze, destroy_domain_block: { target_type: 'DomainBlock', action: 'destroy' }.freeze, destroy_ip_block: { target_type: 'IpBlock', action: 'destroy' }.freeze, + destroy_relay: { target_type: 'Relay', action: 'destroy' }.freeze, destroy_email_domain_block: { target_type: 'EmailDomainBlock', action: 'destroy' }.freeze, destroy_instance: { target_type: 'Instance', action: 'destroy' }.freeze, destroy_unavailable_domain: { target_type: 'UnavailableDomain', action: 'destroy' }.freeze, @@ -49,8 +51,10 @@ class Admin::ActionLogFilter disable_2fa_user: { target_type: 'User', action: 'disable_2fa' }.freeze, disable_custom_emoji: { target_type: 'CustomEmoji', action: 'disable' }.freeze, disable_user: { target_type: 'User', action: 'disable' }.freeze, + disable_relay: { target_type: 'Relay', action: 'disable' }.freeze, enable_custom_emoji: { target_type: 'CustomEmoji', action: 'enable' }.freeze, enable_user: { target_type: 'User', action: 'enable' }.freeze, + enable_relay: { target_type: 'Relay', action: 'enable' }.freeze, memorialize_account: { target_type: 'Account', action: 'memorialize' }.freeze, promote_user: { target_type: 'User', action: 'promote' }.freeze, remove_avatar_user: { target_type: 'User', action: 'remove_avatar' }.freeze, diff --git a/app/models/relay.rb b/app/models/relay.rb index f652b4864b..1a8fdebc7f 100644 --- a/app/models/relay.rb +++ b/app/models/relay.rb @@ -25,6 +25,10 @@ class Relay < ApplicationRecord alias enabled? accepted? + def to_log_human_identifier + inbox_url + end + def enable! activity_id = ActivityPub::TagManager.instance.generate_uri_for(nil) payload = Oj.dump(follow_activity(activity_id)) diff --git a/config/locales/en.yml b/config/locales/en.yml index e9c8822d5a..cf783338e2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -187,6 +187,7 @@ en: create_domain_block: Create Domain Block create_email_domain_block: Create Email Domain Block create_ip_block: Create IP rule + create_relay: Create Relay create_unavailable_domain: Create Unavailable Domain create_user_role: Create Role demote_user: Demote User @@ -198,14 +199,17 @@ en: destroy_email_domain_block: Delete Email Domain Block destroy_instance: Purge Domain destroy_ip_block: Delete IP rule + destroy_relay: Delete Relay destroy_status: Delete Post destroy_unavailable_domain: Delete Unavailable Domain destroy_user_role: Destroy Role disable_2fa_user: Disable 2FA disable_custom_emoji: Disable Custom Emoji + disable_relay: Disable Relay disable_sign_in_token_auth_user: Disable Email Token Authentication for User disable_user: Disable User enable_custom_emoji: Enable Custom Emoji + enable_relay: Enable Relay enable_sign_in_token_auth_user: Enable Email Token Authentication for User enable_user: Enable User memorialize_account: Memorialize Account @@ -247,6 +251,7 @@ en: create_domain_block_html: "%{name} blocked domain %{target}" create_email_domain_block_html: "%{name} blocked email domain %{target}" create_ip_block_html: "%{name} created rule for IP %{target}" + create_relay_html: "%{name} created a relay %{target}" create_unavailable_domain_html: "%{name} stopped delivery to domain %{target}" create_user_role_html: "%{name} created %{target} role" demote_user_html: "%{name} demoted user %{target}" @@ -258,14 +263,17 @@ en: destroy_email_domain_block_html: "%{name} unblocked email domain %{target}" destroy_instance_html: "%{name} purged domain %{target}" destroy_ip_block_html: "%{name} deleted rule for IP %{target}" + destroy_relay_html: "%{name} deleted the relay %{target}" destroy_status_html: "%{name} removed post by %{target}" destroy_unavailable_domain_html: "%{name} resumed delivery to domain %{target}" destroy_user_role_html: "%{name} deleted %{target} role" disable_2fa_user_html: "%{name} disabled two factor requirement for user %{target}" disable_custom_emoji_html: "%{name} disabled emoji %{target}" + disable_relay_html: "%{name} disabled the relay %{target}" disable_sign_in_token_auth_user_html: "%{name} disabled email token authentication for %{target}" disable_user_html: "%{name} disabled login for user %{target}" enable_custom_emoji_html: "%{name} enabled emoji %{target}" + enable_relay_html: "%{name} enabled the relay %{target}" enable_sign_in_token_auth_user_html: "%{name} enabled email token authentication for %{target}" enable_user_html: "%{name} enabled login for user %{target}" memorialize_account_html: "%{name} turned %{target}'s account into a memoriam page" From 1f85ca2b0e6cf0b928f255271e1b1f491a41dc6d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 08:35:31 +0000 Subject: [PATCH 12/52] Update dependency react-select to v5.8.3 (#32817) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 665ebff051..9e3ec41017 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14682,8 +14682,8 @@ __metadata: linkType: hard "react-select@npm:^5.7.3": - version: 5.8.2 - resolution: "react-select@npm:5.8.2" + version: 5.8.3 + resolution: "react-select@npm:5.8.3" dependencies: "@babel/runtime": "npm:^7.12.0" "@emotion/cache": "npm:^11.4.0" @@ -14697,7 +14697,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/3089b8bfb23f556a7b1de07ea654fc5f5976f531a731a0231bbcbc195afb9294c36f49d712712f2deefc13eb6d7ede4aa1d80cb45b80afd3e26fde2f09db35eb + checksum: 10c0/25aaf0ad964a31dcf991be8b9eb478f94b2ff5dfd2e74a894f692c6dec9247f6ded6258fbf875984d2ada5aeb0ee742b85c6a94f58fae89112e913526cfd0577 languageName: node linkType: hard From ea6d3ca8c10e37a98a687a4a922061973dbac1b7 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 12 Nov 2024 03:38:08 -0500 Subject: [PATCH 13/52] Define constants for sampling sizes in `AccountReachFinder` (#32805) --- app/lib/account_reach_finder.rb | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/app/lib/account_reach_finder.rb b/app/lib/account_reach_finder.rb index 481e254396..19464024a6 100644 --- a/app/lib/account_reach_finder.rb +++ b/app/lib/account_reach_finder.rb @@ -1,6 +1,10 @@ # frozen_string_literal: true class AccountReachFinder + RECENT_LIMIT = 2_000 + STATUS_LIMIT = 200 + STATUS_SINCE = 2.days + def initialize(account) @account = account end @@ -20,13 +24,27 @@ class AccountReachFinder end def recently_mentioned_inboxes - cutoff_id = Mastodon::Snowflake.id_at(2.days.ago, with_random: false) - recent_statuses = @account.statuses.recent.where(id: cutoff_id...).limit(200) - - Account.joins(:mentions).where(mentions: { status: recent_statuses }).inboxes.take(2000) + Account + .joins(:mentions) + .where(mentions: { status: recent_statuses }) + .inboxes + .take(RECENT_LIMIT) end def relay_inboxes Relay.enabled.pluck(:inbox_url) end + + def oldest_status_id + Mastodon::Snowflake + .id_at(STATUS_SINCE.ago, with_random: false) + end + + def recent_statuses + @account + .statuses + .recent + .where(id: oldest_status_id...) + .limit(STATUS_LIMIT) + end end From 0d06d70d114a9c25d8c68a284384b3d9a57288bb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 09:47:59 +0100 Subject: [PATCH 14/52] New Crowdin Translations (automated) (#32811) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/be.json | 2 +- app/javascript/mastodon/locales/cy.json | 26 ++++++++-- app/javascript/mastodon/locales/da.json | 21 ++++++++ app/javascript/mastodon/locales/de.json | 10 ++-- app/javascript/mastodon/locales/el.json | 32 +++++++++++- app/javascript/mastodon/locales/es-AR.json | 24 ++++----- app/javascript/mastodon/locales/he.json | 20 ++++++++ app/javascript/mastodon/locales/hu.json | 20 ++++++++ app/javascript/mastodon/locales/it.json | 1 + app/javascript/mastodon/locales/ja.json | 20 ++++++++ app/javascript/mastodon/locales/pt-PT.json | 4 ++ app/javascript/mastodon/locales/sk.json | 5 ++ app/javascript/mastodon/locales/sq.json | 2 + app/javascript/mastodon/locales/sv.json | 22 ++++---- app/javascript/mastodon/locales/th.json | 8 +++ app/javascript/mastodon/locales/uk.json | 19 +++++++ app/javascript/mastodon/locales/zh-TW.json | 15 +++--- config/locales/doorkeeper.ro.yml | 14 +++++ config/locales/doorkeeper.sv.yml | 2 +- config/locales/el.yml | 1 + config/locales/lv.yml | 5 ++ config/locales/simple_form.ar.yml | 1 - config/locales/simple_form.ast.yml | 1 - config/locales/simple_form.be.yml | 1 - config/locales/simple_form.bg.yml | 1 - config/locales/simple_form.ca.yml | 2 +- config/locales/simple_form.cs.yml | 1 - config/locales/simple_form.cy.yml | 1 - config/locales/simple_form.da.yml | 2 +- config/locales/simple_form.el.yml | 1 - config/locales/simple_form.en-GB.yml | 1 - config/locales/simple_form.eo.yml | 2 +- config/locales/simple_form.es-AR.yml | 2 +- config/locales/simple_form.es-MX.yml | 2 +- config/locales/simple_form.es.yml | 2 +- config/locales/simple_form.et.yml | 1 - config/locales/simple_form.eu.yml | 1 - config/locales/simple_form.fa.yml | 1 - config/locales/simple_form.fr-CA.yml | 1 - config/locales/simple_form.fr.yml | 1 - config/locales/simple_form.fy.yml | 1 - config/locales/simple_form.ga.yml | 1 - config/locales/simple_form.gd.yml | 1 - config/locales/simple_form.ia.yml | 1 - config/locales/simple_form.ie.yml | 1 - config/locales/simple_form.io.yml | 1 - config/locales/simple_form.it.yml | 2 +- config/locales/simple_form.lad.yml | 1 - config/locales/simple_form.lt.yml | 1 - config/locales/simple_form.lv.yml | 3 +- config/locales/simple_form.ms.yml | 1 - config/locales/simple_form.my.yml | 1 - config/locales/simple_form.nn.yml | 1 - config/locales/simple_form.no.yml | 1 - config/locales/simple_form.pl.yml | 1 - config/locales/simple_form.pt-BR.yml | 1 - config/locales/simple_form.pt-PT.yml | 1 - config/locales/simple_form.ro.yml | 59 +++++++++++++++++++++- config/locales/simple_form.ru.yml | 1 - config/locales/simple_form.sl.yml | 1 - config/locales/simple_form.sr-Latn.yml | 1 - config/locales/simple_form.sr.yml | 1 - config/locales/simple_form.sv.yml | 1 - config/locales/simple_form.th.yml | 1 - config/locales/simple_form.zh-CN.yml | 2 +- config/locales/simple_form.zh-HK.yml | 1 - config/locales/sq.yml | 1 + config/locales/sv.yml | 14 ++--- 68 files changed, 307 insertions(+), 94 deletions(-) diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 97d4dc4b4c..06d86a0e85 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -154,7 +154,7 @@ "compose_form.hashtag_warning": "Гэты допіс не будзе паказаны пад аніякім хэштэгам, бо ён не публічны. Толькі публічныя допісы можна знайсці па хэштэгу.", "compose_form.lock_disclaimer": "Ваш уліковы запіс не {locked}. Усе могуць падпісацца на вас, каб бачыць допісы толькі для падпісчыкаў.", "compose_form.lock_disclaimer.lock": "закрыты", - "compose_form.placeholder": "Што здарылася?", + "compose_form.placeholder": "Што ў вас новага?", "compose_form.poll.duration": "Працягласць апытання", "compose_form.poll.multiple": "Множны выбар", "compose_form.poll.option_placeholder": "Варыянт {number}", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 675f7a203e..ca83af9215 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -87,11 +87,29 @@ "alert.unexpected.title": "Wps!", "alt_text_badge.title": "Testun Amgen", "announcement.announcement": "Cyhoeddiad", + "annual_report.summary.archetype.booster": "Y hyrwyddwr", + "annual_report.summary.archetype.lurker": "Yr arsylwr", + "annual_report.summary.archetype.oracle": "Yr oracl", + "annual_report.summary.archetype.pollster": "Yr arholwr", + "annual_report.summary.archetype.replier": "Y sbardunwr", + "annual_report.summary.followers.followers": "dilynwyr", + "annual_report.summary.followers.total": "{count} cyfanswm", + "annual_report.summary.here_it_is": "Dyma eich {year} yn gryno:", + "annual_report.summary.highlighted_post.by_favourites": "postiad wedi'i ffefrynu fwyaf", + "annual_report.summary.highlighted_post.by_reblogs": "postiad wedi'i hybu fwyaf", + "annual_report.summary.highlighted_post.by_replies": "postiad gyda'r ymatebion mwyaf", + "annual_report.summary.highlighted_post.possessive": "{name}", + "annual_report.summary.most_used_app.most_used_app": "ap a ddefnyddiwyd fwyaf", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "hashnod a ddefnyddiwyd fwyaf", + "annual_report.summary.new_posts.new_posts": "postiadau newydd", + "annual_report.summary.percentile.text": "Rydych chi yn y mwyaf o ddefnyddwyr Mastodon.", + "annual_report.summary.percentile.we_wont_tell_bernie": "Ni fyddwn yn dweud wrth Bernie.", + "annual_report.summary.thanks": "Diolch am fod yn rhan o Mastodon!", "attachments_list.unprocessed": "(heb eu prosesu)", "audio.hide": "Cuddio sain", "block_modal.remote_users_caveat": "Byddwn yn gofyn i'r gweinydd {domain} barchu eich penderfyniad. Fodd bynnag, nid yw cydymffurfiad wedi'i warantu gan y gall rhai gweinyddwyr drin rhwystro mewn ffyrdd gwahanol. Mae'n bosibl y bydd postiadau cyhoeddus yn dal i fod yn weladwy i ddefnyddwyr nad ydynt wedi mewngofnodi.", "block_modal.show_less": "Dangos llai", - "block_modal.show_more": "Dangos mwy", + "block_modal.show_more": "Dangos rhagor", "block_modal.they_cant_mention": "Nid ydynt yn gallu eich crybwyll na'ch dilyn.", "block_modal.they_cant_see_posts": "Nid ydynt yn gallu gweld eich postiadau ac ni fyddwch yn gweld eu rhai hwy.", "block_modal.they_will_know": "Gallant weld eu bod wedi'u rhwystro.", @@ -163,9 +181,9 @@ "compose_form.poll.switch_to_single": "Newid pleidlais i gyfyngu i un dewis", "compose_form.poll.type": "Arddull", "compose_form.publish": "Postiad", - "compose_form.publish_form": "Cyhoeddi", + "compose_form.publish_form": "Postiad newydd", "compose_form.reply": "Ateb", - "compose_form.save_changes": "Diweddariad", + "compose_form.save_changes": "Diweddaru", "compose_form.spoiler.marked": "Dileu rhybudd cynnwys", "compose_form.spoiler.unmarked": "Ychwanegu rhybudd cynnwys", "compose_form.spoiler_placeholder": "Rhybudd cynnwys (dewisol)", @@ -508,6 +526,8 @@ "notification.admin.report_statuses_other": "Adroddodd {name} {target}", "notification.admin.sign_up": "Cofrestrodd {name}", "notification.admin.sign_up.name_and_others": "Cofrestrodd {name} {count, plural, one {ac # arall} other {a # arall}}", + "notification.annual_report.message": "Mae eich #Wrapstodon {year} yn aros i chi! Gwelwch eich uchafbwyntiau ac amseroedd i'w cofio o'r flwyddyn hon ar Mastodon!", + "notification.annual_report.view": "Gweld #Wrapstodon", "notification.favourite": "Ffafriodd {name} eich postiad", "notification.favourite.name_and_others_with_link": "Ffafriodd {name} a {count, plural, one {# arall} other {# arall}} eich postiad", "notification.follow": "Dilynodd {name} chi", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 5531576447..927d0a7cb8 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -87,6 +87,24 @@ "alert.unexpected.title": "Ups!", "alt_text_badge.title": "Alt text", "announcement.announcement": "Bekendtgørelse", + "annual_report.summary.archetype.booster": "Cool-hunter", + "annual_report.summary.archetype.lurker": "Lurker", + "annual_report.summary.archetype.oracle": "Oracle", + "annual_report.summary.archetype.pollster": "Pollster", + "annual_report.summary.archetype.replier": "Social butterfly", + "annual_report.summary.followers.followers": "følgere", + "annual_report.summary.followers.total": "{count} i alt", + "annual_report.summary.here_it_is": "Her er {year} i sammendrag:", + "annual_report.summary.highlighted_post.by_favourites": "mest favoritmarkerede indlæg", + "annual_report.summary.highlighted_post.by_reblogs": "mest boostede indlæg", + "annual_report.summary.highlighted_post.by_replies": "indlæg med flest svar", + "annual_report.summary.highlighted_post.possessive": "{name}s", + "annual_report.summary.most_used_app.most_used_app": "mest benyttede app", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "mest benyttede hashtag", + "annual_report.summary.new_posts.new_posts": "nye indlæg", + "annual_report.summary.percentile.text": "Det betyder, at man er i topaf Mastodon-brugere.", + "annual_report.summary.percentile.we_wont_tell_bernie": "Vi fortæller det ikke til Bernie.", + "annual_report.summary.thanks": "Tak for at være en del af Mastodon!", "attachments_list.unprocessed": "(ubehandlet)", "audio.hide": "Skjul lyd", "block_modal.remote_users_caveat": "Serveren {domain} vil blive bedt om at respektere din beslutning. Overholdelse er dog ikke garanteret, da nogle servere kan håndtere blokke forskelligt. Offentlige indlæg kan stadig være synlige for ikke-indloggede brugere.", @@ -158,6 +176,7 @@ "compose_form.poll.duration": "Afstemningens varighed", "compose_form.poll.multiple": "Multivalg", "compose_form.poll.option_placeholder": "Valgmulighed {number}", + "compose_form.poll.single": "Enkeltvalg", "compose_form.poll.switch_to_multiple": "Ændr afstemning til flervalgstype", "compose_form.poll.switch_to_single": "Ændr afstemning til enkeltvalgstype", "compose_form.poll.type": "Stil", @@ -507,6 +526,8 @@ "notification.admin.report_statuses_other": "{name} anmeldte {target}", "notification.admin.sign_up": "{name} tilmeldte sig", "notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# anden} other {# andre}} tilmeldte sig", + "notification.annual_report.message": "{year} #Wrapstodon venter! Afslør årets højdepunkter og mindeværdige øjeblikke på Mastodon!", + "notification.annual_report.view": "Vis #Wrapstodon", "notification.favourite": "{name} favoritmarkerede dit indlæg", "notification.favourite.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} gjorde dit indlæg til favorit", "notification.follow": "{name} begyndte at følge dig", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index d048a191e3..e7679a363c 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -525,15 +525,15 @@ "notification.admin.report_statuses": "{name} meldete {target} wegen {category}", "notification.admin.report_statuses_other": "{name} meldete {target}", "notification.admin.sign_up": "{name} registrierte sich", - "notification.admin.sign_up.name_and_others": "{name} und {count, plural, one {# weitere Person} other {# weitere Personen}} registrierten sich", + "notification.admin.sign_up.name_and_others": "{name} und {count, plural, one {# weiteres Profil} other {# weitere Profile}} registrierten sich", "notification.annual_report.message": "Dein {year} #Wrapstodon erwartet dich! Lass deine Highlights und unvergesslichen Momente auf Mastodon erneut aufleben!", "notification.annual_report.view": "#Wrapstodon ansehen", "notification.favourite": "{name} favorisierte deinen Beitrag", - "notification.favourite.name_and_others_with_link": "{name} und {count, plural, one {# weitere Person} other {# weitere Personen}} favorisierten deinen Beitrag", + "notification.favourite.name_and_others_with_link": "{name} und {count, plural, one {# weiteres Profil} other {# weitere Profile}} favorisierten deinen Beitrag", "notification.follow": "{name} folgt dir", - "notification.follow.name_and_others": "{name} und {count, plural, one {# weitere Person} other {# weitere Personen}} folgen dir", + "notification.follow.name_and_others": "{name} und {count, plural, one {# weiteres Profil} other {# weitere Profile}} folgen dir", "notification.follow_request": "{name} möchte dir folgen", - "notification.follow_request.name_and_others": "{name} und {count, plural, one {# weitere Person} other {# weitere Personen}} möchten dir folgen", + "notification.follow_request.name_and_others": "{name} und {count, plural, one {# weiteres Profil} other {# weitere Profile}} möchten dir folgen", "notification.label.mention": "Erwähnung", "notification.label.private_mention": "Private Erwähnung", "notification.label.private_reply": "Private Antwort", @@ -552,7 +552,7 @@ "notification.own_poll": "Deine Umfrage ist beendet", "notification.poll": "Eine Umfrage, an der du teilgenommen hast, ist beendet", "notification.reblog": "{name} teilte deinen Beitrag", - "notification.reblog.name_and_others_with_link": "{name} und {count, plural, one {# weitere Person} other {# weitere Personen}} teilten deinen Beitrag", + "notification.reblog.name_and_others_with_link": "{name} und {count, plural, one {# weiteres Profil} other {# weitere Profile}} teilten deinen Beitrag", "notification.relationships_severance_event": "Verbindungen mit {name} verloren", "notification.relationships_severance_event.account_suspension": "Ein Admin von {from} hat {target} gesperrt. Du wirst von diesem Profil keine Updates mehr erhalten und auch nicht mit ihm interagieren können.", "notification.relationships_severance_event.domain_block": "Ein Admin von {from} hat {target} blockiert – darunter {followersCount} deiner Follower und {followingCount, plural, one {# Konto, dem} other {# Konten, denen}} du folgst.", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 40517f8340..2920968e6a 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -87,6 +87,24 @@ "alert.unexpected.title": "Ουπς!", "alt_text_badge.title": "Εναλλακτικό κείμενο", "announcement.announcement": "Ανακοίνωση", + "annual_report.summary.archetype.booster": "Ο κυνηγός των φοβερών", + "annual_report.summary.archetype.lurker": "Ο διακριτικός", + "annual_report.summary.archetype.oracle": "Η Πυθία", + "annual_report.summary.archetype.pollster": "Ο δημοσκόπος", + "annual_report.summary.archetype.replier": "Η κοινωνική πεταλούδα", + "annual_report.summary.followers.followers": "ακόλουθοι", + "annual_report.summary.followers.total": "{count} συνολικά", + "annual_report.summary.here_it_is": "Εδώ είναι το {year} σου σε ανασκόπηση:", + "annual_report.summary.highlighted_post.by_favourites": "πιο αγαπημένη ανάρτηση", + "annual_report.summary.highlighted_post.by_reblogs": "πιο ενισχυμένη ανάρτηση", + "annual_report.summary.highlighted_post.by_replies": "ανάρτηση με τις περισσότερες απαντήσεις", + "annual_report.summary.highlighted_post.possessive": "του χρήστη {name}", + "annual_report.summary.most_used_app.most_used_app": "πιο χρησιμοποιημένη εφαρμογή", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "πιο χρησιμοποιημένη ετικέτα", + "annual_report.summary.new_posts.new_posts": "νέες αναρτήσεις", + "annual_report.summary.percentile.text": "Αυτό σε βάζει στην κορυφή του των χρηστών του Mastodon.", + "annual_report.summary.percentile.we_wont_tell_bernie": "Δεν θα το πούμε στον Bernie.", + "annual_report.summary.thanks": "Ευχαριστούμε που συμμετέχεις στο Mastodon!", "attachments_list.unprocessed": "(μη επεξεργασμένο)", "audio.hide": "Απόκρυψη αρχείου ήχου", "block_modal.remote_users_caveat": "Θα ζητήσουμε από τον διακομιστή {domain} να σεβαστεί την απόφασή σου. Ωστόσο, η συμμόρφωση δεν είναι εγγυημένη δεδομένου ότι ορισμένοι διακομιστές ενδέχεται να χειρίζονται τους αποκλεισμούς διαφορετικά. Οι δημόσιες αναρτήσεις ενδέχεται να είναι ορατές σε μη συνδεδεμένους χρήστες.", @@ -158,6 +176,7 @@ "compose_form.poll.duration": "Διάρκεια δημοσκόπησης", "compose_form.poll.multiple": "Πολλαπλή επιλογή", "compose_form.poll.option_placeholder": "Επιλογή {number}", + "compose_form.poll.single": "Μονή επιλογή", "compose_form.poll.switch_to_multiple": "Ενημέρωση δημοσκόπησης με πολλαπλές επιλογές", "compose_form.poll.switch_to_single": "Ενημέρωση δημοσκόπησης με μοναδική επιλογή", "compose_form.poll.type": "Στυλ", @@ -196,6 +215,7 @@ "confirmations.unfollow.title": "Άρση ακολούθησης;", "content_warning.hide": "Απόκρυψη ανάρτησης", "content_warning.show": "Εμφάνιση ούτως ή άλλως", + "content_warning.show_more": "Εμφάνιση περισσότερων", "conversation.delete": "Διαγραφή συζήτησης", "conversation.mark_as_read": "Σήμανση ως αναγνωσμένο", "conversation.open": "Προβολή συνομιλίας", @@ -304,6 +324,7 @@ "filter_modal.select_filter.subtitle": "Χρησιμοποιήστε μια υπάρχουσα κατηγορία ή δημιουργήστε μια νέα", "filter_modal.select_filter.title": "Φιλτράρισμα αυτής της ανάρτησης", "filter_modal.title.status": "Φιλτράρισμα μιας ανάρτησης", + "filter_warning.matches_filter": "Ταιριάζει με το φίλτρο “{title}”", "filtered_notifications_banner.pending_requests": "Από {count, plural, =0 {κανένα} one {ένα άτομο} other {# άτομα}} που μπορεί να ξέρεις", "filtered_notifications_banner.title": "Φιλτραρισμένες ειδοποιήσεις", "firehose.all": "Όλα", @@ -383,9 +404,10 @@ "interaction_modal.description.follow": "Με έναν λογαριασμό Mastodon, μπορείς να ακολουθήσεις τον/την {name} ώστε να λαμβάνεις τις αναρτήσεις του/της στη δική σου ροή.", "interaction_modal.description.reblog": "Με ένα λογαριασμό Mastodon, μπορείς να ενισχύσεις αυτή την ανάρτηση για να τη μοιραστείς με τους δικούς σου ακολούθους.", "interaction_modal.description.reply": "Με ένα λογαριασμό Mastodon, μπορείς να απαντήσεις σε αυτή την ανάρτηση.", - "interaction_modal.login.action": "Take me home\nΠήγαινέ με στην αρχική σελίδα", + "interaction_modal.description.vote": "Με ένα λογαριασμό Mastodon, μπορείς να απαντήσεις σ' αυτή την ανάρτηση.", + "interaction_modal.login.action": "Πήγαινέ με στην αρχική σελίδα", "interaction_modal.login.prompt": "Τομέας του οικιακού σου διακομιστή, πχ. mastodon.social", - "interaction_modal.no_account_yet": "Not on Mastodon?\nΔεν είστε στο Mastodon;", + "interaction_modal.no_account_yet": "Δεν είστε στο Mastodon;", "interaction_modal.on_another_server": "Σε διαφορετικό διακομιστή", "interaction_modal.on_this_server": "Σε αυτόν τον διακομιστή", "interaction_modal.sign_in": "Δεν είσαι συνδεδεμένος σε αυτόν το διακομιστή. Πού φιλοξενείται ο λογαριασμός σου;", @@ -394,6 +416,7 @@ "interaction_modal.title.follow": "Ακολούθησε {name}", "interaction_modal.title.reblog": "Ενίσχυσε την ανάρτηση του {name}", "interaction_modal.title.reply": "Απάντηση στην ανάρτηση του {name}", + "interaction_modal.title.vote": "Ψήφισε στη δημοσκόπηση του χρήστη {name}", "intervals.full.days": "{number, plural, one {# μέρα} other {# μέρες}}", "intervals.full.hours": "{number, plural, one {# ώρα} other {# ώρες}}", "intervals.full.minutes": "{number, plural, one {# λεπτό} other {# λεπτά}}", @@ -503,9 +526,12 @@ "notification.admin.report_statuses_other": "Ο χρήστης {name} ανέφερε τον χρήστη {target}", "notification.admin.sign_up": "{name} έχει εγγραφεί", "notification.admin.sign_up.name_and_others": "{name} και {count, plural, one {# ακόμη} other {# ακόμη}} έχουν εγγραφεί", + "notification.annual_report.message": "Το #Wrapstodon {year} σε περιμένει! Αποκάλυψε τα στιγμιότυπα της χρονιάς και αξέχαστες στιγμές σου στο Mastodon!", + "notification.annual_report.view": "Προβολή #Wrapstodon", "notification.favourite": "{name} favorited your post\n{name} προτίμησε την ανάρτηση σου", "notification.favourite.name_and_others_with_link": "{name} και {count, plural, one {# ακόμη} other {# ακόμη}} αγάπησαν την ανάρτησή σου", "notification.follow": "Ο/Η {name} σε ακολούθησε", + "notification.follow.name_and_others": "Ο χρήστης {name} και {count, plural, one {# ακόμη} other {# ακόμη}} σε ακολούθησαν", "notification.follow_request": "Ο/H {name} ζήτησε να σε ακολουθήσει", "notification.follow_request.name_and_others": "{name} και {count, plural, one {# άλλος} other {# άλλοι}} ζήτησαν να σε ακολουθήσουν", "notification.label.mention": "Επισήμανση", @@ -513,6 +539,7 @@ "notification.label.private_reply": "Ιδιωτική απάντηση", "notification.label.reply": "Απάντηση", "notification.mention": "Επισήμανση", + "notification.mentioned_you": "Ο χρήστης {name} σε επισήμανε", "notification.moderation-warning.learn_more": "Μάθε περισσότερα", "notification.moderation_warning": "Έχετε λάβει μία προειδοποίηση συντονισμού", "notification.moderation_warning.action_delete_statuses": "Ορισμένες από τις αναρτήσεις σου έχουν αφαιρεθεί.", @@ -563,6 +590,7 @@ "notifications.column_settings.filter_bar.category": "Μπάρα γρήγορου φίλτρου", "notifications.column_settings.follow": "Νέοι ακόλουθοι:", "notifications.column_settings.follow_request": "Νέο αίτημα ακολούθησης:", + "notifications.column_settings.group": "Ομάδα", "notifications.column_settings.mention": "Επισημάνσεις:", "notifications.column_settings.poll": "Αποτελέσματα δημοσκόπησης:", "notifications.column_settings.push": "Ειδοποιήσεις Push", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index a556d90e33..9dc7b0d6c0 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -87,22 +87,22 @@ "alert.unexpected.title": "¡Epa!", "alt_text_badge.title": "Texto alternativo", "announcement.announcement": "Anuncio", - "annual_report.summary.archetype.booster": "El cazador de tendencias", + "annual_report.summary.archetype.booster": "Corrió la voz", "annual_report.summary.archetype.lurker": "El acechador", "annual_report.summary.archetype.oracle": "El oráculo", - "annual_report.summary.archetype.pollster": "El encuestador", - "annual_report.summary.archetype.replier": "El más sociable", + "annual_report.summary.archetype.pollster": "Estuvo consultando", + "annual_report.summary.archetype.replier": "Respondió un montón", "annual_report.summary.followers.followers": "seguidores", "annual_report.summary.followers.total": "{count} en total", - "annual_report.summary.here_it_is": "Aquí está tu resumen de {year}:", - "annual_report.summary.highlighted_post.by_favourites": "publicación con más favoritos", - "annual_report.summary.highlighted_post.by_reblogs": "publicación más impulsada", - "annual_report.summary.highlighted_post.by_replies": "publicación con más respuestas", - "annual_report.summary.highlighted_post.possessive": "de {name}", - "annual_report.summary.most_used_app.most_used_app": "aplicación más usada", - "annual_report.summary.most_used_hashtag.most_used_hashtag": "etiqueta más usada", - "annual_report.summary.new_posts.new_posts": "nuevas publicaciones", - "annual_report.summary.percentile.text": "Eso te pone en el topde usuarios de Mastodon.", + "annual_report.summary.here_it_is": "Acá está tu resumen de {year}:", + "annual_report.summary.highlighted_post.by_favourites": "el mensaje más veces marcado como favorito", + "annual_report.summary.highlighted_post.by_reblogs": "el mensaje que más adhesiones recibió", + "annual_report.summary.highlighted_post.by_replies": "el mensaje que más respuestas recibió", + "annual_report.summary.highlighted_post.possessive": "{name}", + "annual_report.summary.most_used_app.most_used_app": "la aplicación más usada", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "la etiqueta más usada", + "annual_report.summary.new_posts.new_posts": "nuevos mensajes", + "annual_report.summary.percentile.text": "Eso te pone en la cimade los usuarios de Mastodon.", "annual_report.summary.percentile.we_wont_tell_bernie": "No se lo diremos a Bernie.", "annual_report.summary.thanks": "¡Gracias por ser parte de Mastodon!", "attachments_list.unprocessed": "[sin procesar]", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index ed08a9aba3..48ea869dd2 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -87,6 +87,24 @@ "alert.unexpected.title": "אופס!", "alt_text_badge.title": "כיתוב חלופי", "announcement.announcement": "הכרזה", + "annual_report.summary.archetype.booster": "ההד-וניסט(ית)", + "annual_report.summary.archetype.lurker": "השורץ.ת השקט.ה", + "annual_report.summary.archetype.oracle": "כבוד הרב.ה", + "annual_report.summary.archetype.pollster": "הסקרן.ית", + "annual_report.summary.archetype.replier": "הפרפר.ית החברתי.ת", + "annual_report.summary.followers.followers": "עוקבים", + "annual_report.summary.followers.total": "{count} בסך הכל", + "annual_report.summary.here_it_is": "והנה סיכום {year} שלך:", + "annual_report.summary.highlighted_post.by_favourites": "התות הכי מחובב", + "annual_report.summary.highlighted_post.by_reblogs": "התות הכי מהודהד", + "annual_report.summary.highlighted_post.by_replies": "התות עם מספר התשובות הגבוה ביותר", + "annual_report.summary.highlighted_post.possessive": "של {name}", + "annual_report.summary.most_used_app.most_used_app": "היישומון שהכי בשימוש", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "התג בשימוש הרב ביותר", + "annual_report.summary.new_posts.new_posts": "הודעות חדשות", + "annual_report.summary.percentile.text": "ממקם אותך באחוזון של משמשי מסטודון.", + "annual_report.summary.percentile.we_wont_tell_bernie": "לא נגלה לברני.", + "annual_report.summary.thanks": "תודה על היותך חלק ממסטודון!", "attachments_list.unprocessed": "(לא מעובד)", "audio.hide": "השתק", "block_modal.remote_users_caveat": "אנו נבקש מהשרת {domain} לכבד את החלטתך. עם זאת, ציות למוסכמות איננו מובטח כיוון ששרתים מסויימים עשויים לטפל בחסימות בצורה אחרת. הודעות פומביות עדיין יהיו גלויות לעיני משתמשים שאינם מחוברים.", @@ -508,6 +526,8 @@ "notification.admin.report_statuses_other": "{name} דיווח.ה על {target}", "notification.admin.sign_up": "{name} נרשמו", "notification.admin.sign_up.name_and_others": "{name} ועוד {count, plural,one {אחד אחר}other {# אחרים}} נרשמו", + "notification.annual_report.message": "ה- #סיכומודון שלך לשנת {year} מחכה! גלו את רגעי השיא והזכרונות ממסטודון!", + "notification.annual_report.view": "לצפייה ב- #סיכומודון", "notification.favourite": "הודעתך חובבה על ידי {name}", "notification.favourite.name_and_others_with_link": "{name} ועוד {count, plural,one {אחד נוסף}other {# נוספים}} חיבבו את הודעתך", "notification.follow": "{name} במעקב אחרייך", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 0933a7c256..cdc113d8d7 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -87,6 +87,24 @@ "alert.unexpected.title": "Hoppá!", "alt_text_badge.title": "Helyettesítő szöveg", "announcement.announcement": "Közlemény", + "annual_report.summary.archetype.booster": "A cool-vadász", + "annual_report.summary.archetype.lurker": "A settenkedő", + "annual_report.summary.archetype.oracle": "Az orákulum", + "annual_report.summary.archetype.pollster": "A közvélemény-kutató", + "annual_report.summary.archetype.replier": "A társasági pillangó", + "annual_report.summary.followers.followers": "követő", + "annual_report.summary.followers.total": "{count} összesen", + "annual_report.summary.here_it_is": "Itt a {year}. év értékelése:", + "annual_report.summary.highlighted_post.by_favourites": "legkedvencebb bejegyzés", + "annual_report.summary.highlighted_post.by_reblogs": "legtöbbet megtolt bejegyzés", + "annual_report.summary.highlighted_post.by_replies": "bejegyzés a legtöbb válasszal", + "annual_report.summary.highlighted_post.possessive": "{name} fióktól", + "annual_report.summary.most_used_app.most_used_app": "legtöbbet használt app", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "legtöbbet használt hashtag", + "annual_report.summary.new_posts.new_posts": "új bejegyzés", + "annual_report.summary.percentile.text": "Ezzel acsúcs Mastodon felhasználó között vagy.", + "annual_report.summary.percentile.we_wont_tell_bernie": "Nem mondjuk el Bernie-nek.", + "annual_report.summary.thanks": "Kösz, hogy a Mastodon része vagy!", "attachments_list.unprocessed": "(feldolgozatlan)", "audio.hide": "Hang elrejtése", "block_modal.remote_users_caveat": "Arra kérjük a {domain} kiszolgálót, hogy tartsa tiszteletben a döntésedet. Ugyanakkor az együttműködés nem garantált, mivel néhány kiszolgáló másképp kezelheti a letiltásokat. A nyilvános bejegyzések a be nem jelentkezett felhasználók számára továbbra is látszódhatnak.", @@ -508,6 +526,8 @@ "notification.admin.report_statuses_other": "{name} jelentette: {target}", "notification.admin.sign_up": "{name} regisztrált", "notification.admin.sign_up.name_and_others": "{name} és {count, plural, one {# másik} other {# másik}} regisztrált", + "notification.annual_report.message": "Vár a {year}. év #Wrapstodon jelentése! Fedd fel az éved jelentős eseményeit és emlékezetes pillanatait a Mastodonon!", + "notification.annual_report.view": "#Wrapstodon Megtekintése", "notification.favourite": "{name} kedvencnek jelölte a bejegyzésedet", "notification.favourite.name_and_others_with_link": "{name} és {count, plural, one {# másik} other {# másik}} kedvencnek jelölte a bejegyzésedet", "notification.follow": "{name} követ téged", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 13ba1f8836..bf179ea2f2 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -100,6 +100,7 @@ "annual_report.summary.new_posts.new_posts": "nuovi post", "annual_report.summary.percentile.text": "Questo ti colloca tra ildei migliori utenti Mastodon.", "annual_report.summary.percentile.we_wont_tell_bernie": "Non lo diremo a Bernie.", + "annual_report.summary.thanks": "Grazie per far parte di Mastodon!", "attachments_list.unprocessed": "(non elaborato)", "audio.hide": "Nascondi audio", "block_modal.remote_users_caveat": "Chiederemo al server {domain} di rispettare la tua decisione. Tuttavia, la conformità non è garantita poiché alcuni server potrebbero gestire i blocchi in modo diverso. I post pubblici potrebbero essere ancora visibili agli utenti che non hanno effettuato l'accesso.", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 6f319dbb10..b839764242 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -87,6 +87,24 @@ "alert.unexpected.title": "エラー!", "alt_text_badge.title": "代替テキスト", "announcement.announcement": "お知らせ", + "annual_report.summary.archetype.booster": "トレンドハンター", + "annual_report.summary.archetype.lurker": "ROM専", + "annual_report.summary.archetype.oracle": "予言者", + "annual_report.summary.archetype.pollster": "調査員", + "annual_report.summary.archetype.replier": "社交家", + "annual_report.summary.followers.followers": "フォロワー", + "annual_report.summary.followers.total": "合計{count}", + "annual_report.summary.here_it_is": "こちらがあなたの{year}年の振り返りです", + "annual_report.summary.highlighted_post.by_favourites": "最もお気に入りされた投稿", + "annual_report.summary.highlighted_post.by_reblogs": "最もブーストされた投稿", + "annual_report.summary.highlighted_post.by_replies": "最も返信が多かった投稿", + "annual_report.summary.highlighted_post.possessive": "{name}の", + "annual_report.summary.most_used_app.most_used_app": "最も使用されているアプリ", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "最も使用されたハッシュタグ", + "annual_report.summary.new_posts.new_posts": "新しい投稿", + "annual_report.summary.percentile.text": "それにより、あなたは上位に位置しています。Mastodonユーザーの中で。", + "annual_report.summary.percentile.we_wont_tell_bernie": "バー二ーには秘密にしておくよ。", + "annual_report.summary.thanks": "Mastodonの一員になってくれてありがとう!", "attachments_list.unprocessed": "(未処理)", "audio.hide": "音声を閉じる", "block_modal.remote_users_caveat": "このサーバーはあなたのブロックの意思を尊重するように {domain} へ通知します。しかしながら、ブロックの扱い方はサーバーによってさまざまで、相手のサーバーは必ずしもこのブロックを適切に取り扱うものではないことに留意が必要です。また、あなたの公開投稿はサーバーからログアウトすれば誰からも見ることができます。", @@ -508,6 +526,8 @@ "notification.admin.report_statuses_other": "{name}さんが{target}さんを通報しました", "notification.admin.sign_up": "{name}さんがサインアップしました", "notification.admin.sign_up.name_and_others": "{name}さんとほか{count, plural, other {#人}}がサインアップしました", + "notification.annual_report.message": "「あなたの{year}年の#Wrapstodonが待っています!Mastodonであなたの年のハイライトや思い出の瞬間を公開しましょう!」と訳せます。", + "notification.annual_report.view": "#Wrapstodon を表示", "notification.favourite": "{name}さんがお気に入りしました", "notification.favourite.name_and_others_with_link": "{name}さんとほか{count, plural, other {#人}}がお気に入りしました", "notification.follow": "{name}さんにフォローされました", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index a4f2e27401..a06d259be2 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -85,7 +85,11 @@ "alert.rate_limited.title": "Limite de tentativas", "alert.unexpected.message": "Ocorreu um erro inesperado.", "alert.unexpected.title": "Bolas!", + "alt_text_badge.title": "Texto alternativo", "announcement.announcement": "Anúncio", + "annual_report.summary.followers.total": "{count} total", + "annual_report.summary.here_it_is": "Aqui está o seu {year} em revisão:", + "annual_report.summary.new_posts.new_posts": "novas publicações", "attachments_list.unprocessed": "(não processado)", "audio.hide": "Ocultar áudio", "block_modal.remote_users_caveat": "Vamos pedir ao servidor {domain} para respeitar a sua decisão. No entanto, não é garantido o seu cumprimento, uma vez que alguns servidores podem tratar os bloqueios de forma diferente. As mensagens públicas podem continuar a ser visíveis para utilizadores não autenticados.", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 1102754fd7..8a01263eb2 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -88,6 +88,8 @@ "alt_text_badge.title": "Alternatívny popis", "announcement.announcement": "Oznámenie", "annual_report.summary.followers.followers": "sledovatelia", + "annual_report.summary.followers.total": "{count} celkovo", + "annual_report.summary.highlighted_post.by_favourites": "najviac obľúbený príspevok", "annual_report.summary.highlighted_post.by_reblogs": "najviac vyzdvihovaný príspevok", "annual_report.summary.highlighted_post.by_replies": "príspevok s najviac odpoveďami", "annual_report.summary.most_used_app.most_used_app": "najviac používaná aplikácia", @@ -99,6 +101,7 @@ "block_modal.show_less": "Zobraziť menej", "block_modal.show_more": "Zobraziť viac", "block_modal.they_cant_mention": "Nemôžu ťa spomenúť, alebo nasledovať.", + "block_modal.they_cant_see_posts": "On/a nemôže vidieť tvoje príspevky a ty neuvidíš jej/ho.", "block_modal.they_will_know": "Môžu vidieť, že sú zablokovaní/ý.", "block_modal.title": "Blokovať užívateľa?", "block_modal.you_wont_see_mentions": "Neuvidíš príspevky, ktoré ich spomínajú.", @@ -345,6 +348,7 @@ "hashtag.follow": "Sledovať hashtag", "hashtag.unfollow": "Prestať sledovať hashtag", "hashtags.and_other": "…a {count, plural, other {# ďalších}}", + "hints.threads.see_more": "Pozri viac odpovedí na {domain}", "home.column_settings.show_reblogs": "Zobraziť zdieľania", "home.column_settings.show_replies": "Zobraziť odpovede", "home.hide_announcements": "Skryť oznámenia", @@ -371,6 +375,7 @@ "interaction_modal.title.follow": "Sledovať {name}", "interaction_modal.title.reblog": "Zdieľať príspevok od {name}", "interaction_modal.title.reply": "Odpovedať na príspevok od {name}", + "interaction_modal.title.vote": "Hlasuj v ankete od {name}", "intervals.full.days": "{number, plural, one {# deň} few {# dni} many {# dní} other {# dní}}", "intervals.full.hours": "{number, plural, one {# hodina} few {# hodiny} many {# hodín} other {# hodín}}", "intervals.full.minutes": "{number, plural, one {# minúta} few {# minúty} many {# minút} other {# minút}}", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 088b48a3f3..0faee304c6 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -526,6 +526,7 @@ "notification.favourite": "{name} i vuri shenjë postimit tuaj si të parapëlqyer", "notification.favourite.name_and_others_with_link": "{name} dhe {count, plural, one {# tjetër} other {# të tjerë}} i vunë shenjë postimit tuaj si të parapëlqyer", "notification.follow": "{name} zuri t’ju ndjekë", + "notification.follow.name_and_others": "Ju ndoqi {name} dhe {count, plural, one {# tjetër} other {# të tjerë}}", "notification.follow_request": "{name} ka kërkuar t’ju ndjekë", "notification.follow_request.name_and_others": "Ka kërkuar t’ju ndjekë {name} dhe {count, plural, one {# tjetër} other {# të tjerë}}", "notification.label.mention": "Përmendje", @@ -584,6 +585,7 @@ "notifications.column_settings.filter_bar.category": "Shtyllë filtrimesh të shpejta", "notifications.column_settings.follow": "Ndjekës të rinj:", "notifications.column_settings.follow_request": "Kërkesa të reja për ndjekje:", + "notifications.column_settings.group": "Grupoji", "notifications.column_settings.mention": "Përmendje:", "notifications.column_settings.poll": "Përfundime pyetësori:", "notifications.column_settings.push": "Njoftime Push", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index e3571704bb..ef2d912c00 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -424,7 +424,7 @@ "keyboard_shortcuts.blocked": "Öppna listan över blockerade användare", "keyboard_shortcuts.boost": "Boosta inlägg", "keyboard_shortcuts.column": "Fokusera kolumn", - "keyboard_shortcuts.compose": "för att fokusera skrivfältet", + "keyboard_shortcuts.compose": "Fokusera skrivfältet", "keyboard_shortcuts.description": "Beskrivning", "keyboard_shortcuts.direct": "för att öppna privata nämningskolumnen", "keyboard_shortcuts.down": "Flytta ner i listan", @@ -433,20 +433,20 @@ "keyboard_shortcuts.favourites": "Öppna favoritlistan", "keyboard_shortcuts.federated": "Öppna federerad tidslinje", "keyboard_shortcuts.heading": "Tangentbordsgenvägar", - "keyboard_shortcuts.home": "för att öppna Hem-tidslinjen", + "keyboard_shortcuts.home": "Öppna Hemtidslinjen", "keyboard_shortcuts.hotkey": "Kommando", - "keyboard_shortcuts.legend": "för att visa denna översikt", - "keyboard_shortcuts.local": "för att öppna Lokal tidslinje", - "keyboard_shortcuts.mention": "för att nämna skaparen", + "keyboard_shortcuts.legend": "Visa denna översikt", + "keyboard_shortcuts.local": "Öppna lokal tidslinje", + "keyboard_shortcuts.mention": "Nämna skaparen", "keyboard_shortcuts.muted": "Öppna listan över tystade användare", - "keyboard_shortcuts.my_profile": "för att öppna din profil", - "keyboard_shortcuts.notifications": "för att öppna Meddelanden", - "keyboard_shortcuts.open_media": "öppna media", + "keyboard_shortcuts.my_profile": "Öppna din profil", + "keyboard_shortcuts.notifications": "Öppna meddelanden", + "keyboard_shortcuts.open_media": "Öppna media", "keyboard_shortcuts.pinned": "Öppna listan över fästa inlägg", - "keyboard_shortcuts.profile": "för att öppna skaparens profil", + "keyboard_shortcuts.profile": "Öppna författarens profil", "keyboard_shortcuts.reply": "Svara på inlägg", - "keyboard_shortcuts.requests": "för att öppna Följförfrågningar", - "keyboard_shortcuts.search": "för att fokusera sökfältet", + "keyboard_shortcuts.requests": "Öppna följförfrågningar", + "keyboard_shortcuts.search": "Fokusera sökfältet", "keyboard_shortcuts.spoilers": "Visa/dölja CW-fält", "keyboard_shortcuts.start": "Öppna \"Kom igång\"-kolumnen", "keyboard_shortcuts.toggle_hidden": "Visa/gömma text bakom CW", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 5cf95554bc..95e3e1e52b 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -87,6 +87,13 @@ "alert.unexpected.title": "อุปส์!", "alt_text_badge.title": "ข้อความแสดงแทน", "announcement.announcement": "ประกาศ", + "annual_report.summary.followers.followers": "ผู้ติดตาม", + "annual_report.summary.highlighted_post.by_favourites": "โพสต์ที่ได้รับการชื่นชอบมากที่สุด", + "annual_report.summary.highlighted_post.by_reblogs": "โพสต์ที่ได้รับการดันมากที่สุด", + "annual_report.summary.highlighted_post.by_replies": "โพสต์ที่มีการตอบกลับมากที่สุด", + "annual_report.summary.new_posts.new_posts": "โพสต์ใหม่", + "annual_report.summary.percentile.we_wont_tell_bernie": "เราจะไม่บอก Bernie", + "annual_report.summary.thanks": "ขอบคุณสำหรับการเป็นส่วนหนึ่งของ Mastodon!", "attachments_list.unprocessed": "(ยังไม่ได้ประมวลผล)", "audio.hide": "ซ่อนเสียง", "block_modal.remote_users_caveat": "เราจะขอให้เซิร์ฟเวอร์ {domain} เคารพการตัดสินใจของคุณ อย่างไรก็ตาม ไม่รับประกันการปฏิบัติตามข้อกำหนดเนื่องจากเซิร์ฟเวอร์บางแห่งอาจจัดการการปิดกั้นแตกต่างกัน โพสต์สาธารณะอาจยังคงปรากฏแก่ผู้ใช้ที่ไม่ได้เข้าสู่ระบบ", @@ -508,6 +515,7 @@ "notification.admin.report_statuses_other": "{name} ได้รายงาน {target}", "notification.admin.sign_up": "{name} ได้ลงทะเบียน", "notification.admin.sign_up.name_and_others": "{name} และ {count, plural, other {# อื่น ๆ}} ได้ลงทะเบียน", + "notification.annual_report.view": "ดู #Wrapstodon", "notification.favourite": "{name} ได้ชื่นชอบโพสต์ของคุณ", "notification.favourite.name_and_others_with_link": "{name} และ {count, plural, other {# อื่น ๆ}} ได้ชื่นชอบโพสต์ของคุณ", "notification.follow": "{name} ได้ติดตามคุณ", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index b34785ebc3..dcbf8cec58 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -87,7 +87,24 @@ "alert.unexpected.title": "Ой!", "alt_text_badge.title": "Альтернативний текст", "announcement.announcement": "Оголошення", + "annual_report.summary.archetype.booster": "Мисливець на дописи", + "annual_report.summary.archetype.lurker": "Причаєнець", + "annual_report.summary.archetype.oracle": "Оракул", + "annual_report.summary.archetype.pollster": "Опитувач", + "annual_report.summary.archetype.replier": "Душа компанії", + "annual_report.summary.followers.followers": "підписники", + "annual_report.summary.followers.total": "Загалом {count}", + "annual_report.summary.here_it_is": "Ось ваші підсумки {year} року:", + "annual_report.summary.highlighted_post.by_favourites": "найуподобаніші дописи", + "annual_report.summary.highlighted_post.by_reblogs": "найпоширюваніші дописи", + "annual_report.summary.highlighted_post.by_replies": "найкоментованіші дописи", + "annual_report.summary.highlighted_post.possessive": "{name}", + "annual_report.summary.most_used_app.most_used_app": "найчастіше використовуваний застосунок", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "найчастіший хештег", "annual_report.summary.new_posts.new_posts": "нові дописи", + "annual_report.summary.percentile.text": "Це виводить вас в топ користувачів Mastodon.", + "annual_report.summary.percentile.we_wont_tell_bernie": "Ми не скажемо Bernie.", + "annual_report.summary.thanks": "Дякуємо, що ви є частиною Mastodon!", "attachments_list.unprocessed": "(не оброблено)", "audio.hide": "Сховати аудіо", "block_modal.remote_users_caveat": "Ми попросимо сервер {domain} поважати ваше рішення. Однак дотримання вимог не гарантується, оскільки деякі сервери можуть обробляти блоки по-різному. Загальнодоступні дописи все ще можуть бути видимими для користувачів, які не увійшли в систему.", @@ -509,6 +526,8 @@ "notification.admin.report_statuses_other": "{name} повідомляє про {target}", "notification.admin.sign_up": "{name} приєдналися", "notification.admin.sign_up.name_and_others": "{name} та {count, plural, one {# інший} few {# інших} many {# інших} other {# інший}} зареєструвалися", + "notification.annual_report.message": "#Wrapstodon за {year} чекає на вас! Дізнайтеся про найяскравіші та пам'ятні моменти вашого року на Mastodon!", + "notification.annual_report.view": "Переглянути #Wrapstodon", "notification.favourite": "Ваш допис сподобався {name}", "notification.favourite.name_and_others_with_link": "{name} та {count, plural, one {# інший} few {# інших} many {# інших} other {# інший}} вподобали ваш допис", "notification.follow": "{name} підписалися на вас", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index e1f9eeb210..91d7f6e45d 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -87,15 +87,15 @@ "alert.unexpected.title": "哎呀!", "alt_text_badge.title": "ALT 說明文字", "announcement.announcement": "公告", - "annual_report.summary.archetype.booster": "酷炫的獵人", - "annual_report.summary.archetype.lurker": "潛伏者", + "annual_report.summary.archetype.booster": "酷炫獵人", + "annual_report.summary.archetype.lurker": "潛水高手", "annual_report.summary.archetype.oracle": "先知", - "annual_report.summary.archetype.pollster": "民調人員", + "annual_report.summary.archetype.pollster": "民調專家", "annual_report.summary.archetype.replier": "社交菁英", "annual_report.summary.followers.followers": "跟隨者", "annual_report.summary.followers.total": "總共 {count}", - "annual_report.summary.here_it_is": "以下是您的{year}年度回顧:", - "annual_report.summary.highlighted_post.by_favourites": "最愛的嘟文", + "annual_report.summary.here_it_is": "以下是您的 {year} 年度回顧:", + "annual_report.summary.highlighted_post.by_favourites": "最多被加到最愛的嘟文", "annual_report.summary.highlighted_post.by_reblogs": "最多轉嘟的嘟文", "annual_report.summary.highlighted_post.by_replies": "最多回覆的嘟文", "annual_report.summary.highlighted_post.possessive": "{name} 的", @@ -103,7 +103,8 @@ "annual_report.summary.most_used_hashtag.most_used_hashtag": "最常使用的主題標籤", "annual_report.summary.new_posts.new_posts": "新嘟文", "annual_report.summary.percentile.text": "這讓您成為前Mastodon 的使用者。", - "annual_report.summary.thanks": "感謝您成為 Mastodon 的一員!", + "annual_report.summary.percentile.we_wont_tell_bernie": "我們不會告訴 Bernie。", + "annual_report.summary.thanks": "感謝您成為 Mastodon 的一份子!", "attachments_list.unprocessed": "(未經處理)", "audio.hide": "隱藏音訊", "block_modal.remote_users_caveat": "我們會要求 {domain} 伺服器尊重您的決定。然而,我們無法保證所有伺服器皆會遵守,某些伺服器可能以不同方式處理封鎖。未登入之使用者仍可能看見您的公開嘟文。", @@ -525,6 +526,8 @@ "notification.admin.report_statuses_other": "{name} 已檢舉 {target}", "notification.admin.sign_up": "{name} 已經註冊", "notification.admin.sign_up.name_and_others": "{name} 與{count, plural, other {其他 # 個人}}已註冊", + "notification.annual_report.message": "您的 {year} #Wrapstodon 正等著您!揭開您 Mastodon 上的年度精彩時刻與值得回憶的難忘時光!", + "notification.annual_report.view": "檢視 #Wrapstodon", "notification.favourite": "{name} 已將您的嘟文加入最愛", "notification.favourite.name_and_others_with_link": "{name} 與{count, plural, other {其他 # 個人}}已將您的嘟文加入最愛", "notification.follow": "{name} 已跟隨您", diff --git a/config/locales/doorkeeper.ro.yml b/config/locales/doorkeeper.ro.yml index 9c02501eff..08b7c3fa8d 100644 --- a/config/locales/doorkeeper.ro.yml +++ b/config/locales/doorkeeper.ro.yml @@ -60,6 +60,7 @@ ro: error: title: A apărut o eroare new: + prompt_html: "%{client_name} ar dori să vă acceseze contul. Aprobați această solicitare numai dacă recunoașteți și aveți încredere în această sursă." review_permissions: Revizuiți permisiunile title: Autorizare necesară show: @@ -82,6 +83,7 @@ ro: access_denied: Proprietarul de resurse sau serverul de autorizare a refuzat cererea. credential_flow_not_configured: Fluxul Resurselor de Acreditări Parole a eșuat din cauza faptului că Doorkeeper.configure.resource_owner_from_credentials nu este configurat. invalid_client: Autentificarea clientului a eșuat din cauza unui client necunoscut, nici o autentificare client inclusă, sau metodă de autentificare nesuportată. + invalid_code_challenge_method: Metoda de provocare a codului trebuie să fie S256, simplu nu este acceptată. invalid_grant: Acordarea autorizației furnizată este invalidă, expirată, revocată, nu corespunde URI-ului de redirecționare folosit în cererea de autorizare, sau a fost eliberat altui client. invalid_redirect_uri: Uri-ul de redirecționare inclus nu este valid. invalid_request: @@ -134,6 +136,7 @@ ro: media: Atașamente media mutes: Pus pe silențios notifications: Notificări + profile: Profilul tău Mastodon push: Notificări push reports: Rapoarte search: Căutare @@ -148,12 +151,23 @@ ro: scopes: admin:read: citește toate datele de pe server admin:read:accounts: citește informații sensibile ale tuturor conturilor + admin:read:canonical_email_blocks: citește informații sensibile ale tuturor blocurilor de e-mail canonice + admin:read:domain_allows: citește informații sensibile ale tuturor domeniilor permise + admin:read:domain_blocks: citește informații sensibile ale tuturor blocurilor de domeniu + admin:read:email_domain_blocks: citește informații sensibile ale tuturor blocurilor de domeniu de e-mail + admin:read:ip_blocks: citește informații sensibile ale tuturor blocurilor IP admin:read:reports: citește informații sensibile din toate rapoartele și conturile raportate admin:write: modifică toate datele de pe server admin:write:accounts: efectuează acțiuni de moderare pe conturi + admin:write:canonical_email_blocks: efectuează acțiuni de moderare pe blocurile de e-mail canonice + admin:write:domain_allows: efectuează acțiuni de moderare pe domeniile permise + admin:write:domain_blocks: efectuează acțiuni de moderare pe blocurile de domeniu + admin:write:email_domain_blocks: efectuează acțiuni de moderare pe blocurile de domeniu de e-mail + admin:write:ip_blocks: efectuează acțiuni de moderare pe blocurile IP admin:write:reports: efectuează acțiuni de moderare pe rapoarte crypto: utilizează criptare la ambele capete follow: modifică relațiile contului + profile: citește doar informațiile de profil ale contului tău push: primește notificările tale push read: citește toate datele contului tău read:accounts: vede informațiile privind conturile diff --git a/config/locales/doorkeeper.sv.yml b/config/locales/doorkeeper.sv.yml index ca8271ebf1..3c8b08ff26 100644 --- a/config/locales/doorkeeper.sv.yml +++ b/config/locales/doorkeeper.sv.yml @@ -72,7 +72,7 @@ sv: revoke: Är du säker? index: authorized_at: Godkändes den %{date} - description_html: Dessa applikationer har åtkomst till ditt konto genom API:et. Om det finns applikationer du inte känner igen här, eller om en applikation inte fungerar, kan du återkalla dess åtkomst. + description_html: Detta är program som kan komma åt ditt konto med hjälp av API. Om det finns program som du inte känner igen här, eller om ett program är inte fungerar kan du återkalla dess åtkomst. last_used_at: Användes senast %{date} never_used: Aldrig använd scopes: Behörigheter diff --git a/config/locales/el.yml b/config/locales/el.yml index 0df31b246f..3a145cbdab 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -21,6 +21,7 @@ el: one: Ανάρτηση other: Αναρτήσεις posts_tab_heading: Αναρτήσεις + self_follow_error: Δεν επιτρέπεται να ακολουθήσεις τον δικό σου λογαριασμό admin: account_actions: action: Εκτέλεση ενέργειας diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 9e95155110..3e5a1db00e 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -447,6 +447,7 @@ lv: resolve: Atrisināt domēnu not_permitted: Nav atļauta resolved_through_html: Atrisināts, izmantojot %{domain} + title: Bloķētie e-pasta domēni export_domain_allows: new: title: Importēt domēnu atļaujas @@ -872,6 +873,8 @@ lv: message_html: Tu neesi definējis nevienu servera nosacījumu. sidekiq_process_check: message_html: Rindā(s) %{value} nedarbojas neviens Sidekiq process. Lūdzu, pārskati savu Sidekiq konfigurāciju + software_version_check: + action: Skatīt pieejamos atjauninājumus software_version_critical_check: action: Skatīt pieejamos atjauninājumus message_html: Ir pieejams kritisks Mastodon atjauninājums. Lūdzu, atjaunini to pēc iespējas ātrāk. @@ -1668,6 +1671,8 @@ lv: webauthn_authentication: Drošības atslēgas severed_relationships: download: Lejupielādēt (%{count}) + event_type: + user_domain_block: Jūs bloķējāt %{target_name} lost_followers: Zaudētie sekotāji lost_follows: Zaudētie sekojumi type: Notikums diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 0a665fb784..f5be51f9c3 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -9,7 +9,6 @@ ar: indexable: قد تظهر منشوراتك الموجهة للعامة في نتائج البحث على ماستدون. فالأشخاص الذين تفاعلوا مع منشوراتك قد يكون بمقدورهم البحث عنها بغظ النظر عن ذلك. note: 'يمكنك @ذكر أشخاص آخرين أو استعمال #الوسوم.' show_collections: سيستطيع الناس من تصفح متابعيك و متابعاتك. سيرى الأشخاص الذين تتبعهم أنك تتبعهم دون أي شك. - unlocked: سيتمكن الآخرون من متابعتك دون طلب الموافقة. قم بتعطيله إن كنت ترغب في مراجعة تلك الطلبات يدويا باختيار قبول أو رفض المتابعين الجدد. account_alias: acct: ادخِل عنون الحساب username@domain الذي تودّ مغادرته account_migration: diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml index 00617c4e3c..997423449d 100644 --- a/config/locales/simple_form.ast.yml +++ b/config/locales/simple_form.ast.yml @@ -4,7 +4,6 @@ ast: hints: account: note: 'Pues @mentar a otros perfiles o poner #etiquetes.' - unlocked: Los perfiles van ser a siguite ensin solicitar la to aprobación. Desmarca esta opción si quies revisar les solicitúes de siguimientu y escoyer si aceptales o refugales. admin_account_action: text_html: Opcional. Pues usar la sintaxis de los artículos y amestar alvertencies preconfiguraes p'aforrar tiempu type_html: Escueyi qué facer con %{acct} diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index db6a94f8eb..d7be72b876 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -9,7 +9,6 @@ be: indexable: Вашыя публічныя допісы могуць з'яўляцца ў рэзультатах пошуку Mastodon. Людзі, якія ўзаемадзейнічалі з вашымі допісамі, усё роўна маюць магчымасць іх знаходзіць. note: 'Вы можаце @згадаць іншых людзей або выкарыстоўваць #хэштэгі.' show_collections: Людзі змогуць праглядаць спіс вашых падпісак і падпісчыкаў. Людзі, на якіх вы падпісаны ў любым выпадку будуць бачыць, што вы іх чытаеце. - unlocked: Людзі змогуць сачыць за вамі, не запытваючы пацвярджэння. Зніміце сцяжок, калі вы хочаце праглядаць запыты на падпіску і выбіраць, прымаць ці адхіляць новых падпісчыкаў. account_alias: acct: Прызначце карыстальнік@дамен уліковага запісу з якога вы хочаце пераехаць account_migration: diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index 2690f07141..5540942d93 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -9,7 +9,6 @@ bg: indexable: Вашите обществени публикации може да се появят в резултатите от търсене в Mastodon. Взаимодействалите с публикациите ви може да ги търсят независимо. note: 'Може да @споменавате други хора или #хаштагове.' show_collections: Хората ще може да разглеждат през вашите последвания и последователи. Хората, които сте следвали, ще видят, че ги следвате независимо от това. - unlocked: Хората ще могат да ви последват без изискване на одобрение. Размаркирайте, ако искате да преглеждате заявките за последване и изберете дали да приемете или отхвърлите новите последователи. account_alias: acct: Посочете потребителско_име@домейн на акаунта си, от който искате да се преместите account_migration: diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index c628bebaad..defb13325b 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -9,7 +9,7 @@ ca: indexable: Els teus tuts públics poden aparèixer en els resultats de cerca de Mastodon. Les persones que han interaccionat amb el teus tuts seran sempre capaços de cercar-los. note: 'Pots @mencionar altra gent o #etiquetes.' show_collections: La gent podrà navegar pels teus seguits i seguidors. Qui segueixis sí que veurà que els segueixes. - unlocked: La gent serà capaç de seguir-te sense sol·licitar-ho. Desmarca si vols revisar les sol·licituds i triar si acceptes o no els nous seguidors. + unlocked: Us podran seguir sense la vostra aprovació. Desmarqueu si voleu moderar les peticions de seguiment i decidir quines autoritzeu o denegueu. account_alias: acct: Especifica l'usuari@domini del compte des d'on et vols traslladar account_migration: diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index 6242b1ca6e..ef82b3232a 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -9,7 +9,6 @@ cs: indexable: Vaše veřejné příspěvky se mohou objevit ve výsledcích vyhledávání na Mastodonu. Lidé, kteří s vašimi příspěvky interagovaly, je mohou stále vyhledávat. note: 'Můžete @zmínit jiné osoby nebo #hashtagy.' show_collections: Lidé budou moci procházet skrz sledující. Lidé, které sledujete, uvidí, že je sledujete bezohledně. - unlocked: Lidé vás budou moci sledovat, aniž by vás žádali o schválení. Zrušte zaškrtnutí, pokud chcete zkontrolovat požadavky a zvolte, zda přijmete nebo odmítněte nové následovníky. account_alias: acct: Zadejte svůj účet, ze kterého se chcete přesunout jinam, ve formátu přezdívka@doména account_migration: diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index dedd50504b..5f3ac2818c 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -10,7 +10,6 @@ cy: indexable: Mae'n bosib y bydd eich postiadau cyhoeddus yn ymddangos yng nghanlyniadau chwilio ar Mastodon. Mae'n bosibl y bydd pobl sydd wedi rhyngweithio â'ch postiadau yn dal i allu eu chwilio. note: 'Gallwch @grybwyll pobl eraill neu #hashnodau.' show_collections: Bydd pobl yn gallu pori trwy'r rhai rydych yn eu dilyn a'ch dilynwyr. Bydd y bobl rydych chi'n eu dilyn yn gweld eich bod chi'n eu dilyn beth bynnag. - unlocked: Bydd pobl yn gallu eich dilyn heb ofyn am ganiatâd. Dad-diciwch os ydych am adolygu ceisiadau dilyn a dewis a ydych am dderbyn neu wrthod dilynwyr newydd. account_alias: acct: Rhowch enwdefnyddiwr@parth y cyfrif y hoffech chi symud ohono account_migration: diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 25cf670ea9..32e8e90b85 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -10,7 +10,7 @@ da: indexable: Dine offentlige indlæg vil kunne vises i Mastodon-søgeresultater. Folk, som har interageret med dem, vil kunne finde dem uanset. note: 'Du kan @omtale andre personer eller #hashtags.' show_collections: Folk vil ikke kunne tjekke dine Følger og Følgere. Folk, du selv følger, vil stadig kunne se dette. - unlocked: Folk vil kunne følge dig uden krav om godkendelse. Fjern markeringen, såfremt du ønsker at tjekke Følg-anmodninger og individuelt acceptere eller afvise nye Følgere. + unlocked: Man vil kunne følges af folk uden først at godkende dem. Ønsker man at gennemgå Følg-anmodninger og individuelt acceptere/afvise nye følgere, så fjern markeringen. account_alias: acct: Angiv brugernavn@domain for den konto, hvorfra du vil flytte account_migration: diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 9dcac5c160..a04db4b228 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -9,7 +9,6 @@ el: indexable: Οι δημόσιες δημοσιεύσεις σου μπορεί να εμφανιστούν στα αποτελέσματα αναζήτησης στο Mastodon. Άτομα που έχουν αλληλεπιδράσει με τις δημοσιεύσεις σου μπορεί να είναι σε θέση να τις αναζητήσουν όπως και να 'χει. note: 'Μπορείς να @επισημάνεις άλλα άτομα ή #ετικέτες.' show_collections: Οι χρήστες θα είναι σε θέση να περιηγηθούν στα άτομα που ακολουθείς και στους ακόλουθούς σου. Άτομα που ακολουθείς θα βλέπουν ότι τους ακολουθείς όπως και να 'χει. - unlocked: Οι χρήστες θα είναι σε θέση να σε ακολουθήσουν χωρίς να ζητούν έγκριση. Κατάργησε την επιλογή αν θες να αξιολογείς τα αιτήματα ακολούθησης και να επιλέξεις αν θα αποδεχθείς ή απορρίψεις νέους ακόλουθους. account_alias: acct: Όρισε το username@domain του λογαριασμού από τον οποίο θέλεις να μετακινηθείς account_migration: diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml index e20249e6bc..ef252d8aeb 100644 --- a/config/locales/simple_form.en-GB.yml +++ b/config/locales/simple_form.en-GB.yml @@ -9,7 +9,6 @@ en-GB: indexable: Your public posts may appear in search results on Mastodon. People who have interacted with your posts may be able to search them regardless. note: 'You can @mention other people or #hashtags.' show_collections: People will be able to browse through your follows and followers. People that you follow will see that you follow them regardless. - unlocked: People will be able to follow you without requesting approval. Uncheck if you want to review follow requests and chose whether to accept or reject new followers. account_alias: acct: Specify the username@domain of the account you want to move from account_migration: diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index f8a5776835..f39eb18f61 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -10,7 +10,7 @@ eo: indexable: Viaj publikaj afiŝoj povas aperi en serĉrezultoj ĉe Mastodon. Homoj, kiuj interagis kun viaj afiŝoj, eble povos serĉi ilin sendepende. note: 'Vi povas @mencii aliajn homojn aŭ #haŝetikedoj.' show_collections: Homoj povos foliumi viajn sekvatojn kaj sekvantojn. Homoj, kiujn vi sekvas, vidos, ke vi sekvas ilin ĉiaokaze. - unlocked: Homoj povos sekvi vin sen peto de aprobo. Malelektu se vi volas kontroli petojn de sekvado kaj elekti, ĉu akcepti aŭ malakcepti novajn sekvantojn. + unlocked: Homoj povos sekvi vin sen peti aprobon. Malmarku ĉu vi volas revizii sekvajn petojn kaj elektu ĉu akcepti aŭ malakcepti novajn sekvantojn. account_alias: acct: Specifu la uzantnomon@domajnon de la konto el kiu vi volas translokiĝi account_migration: diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index 98254c5e99..dada648d5a 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -10,7 +10,7 @@ es-AR: indexable: Tus mensajes públicos pueden aparecer en los resultados de la búsqueda en Mastodon. La gente que interactuó con tus mensajes puede ser capaz de buscarlos sin importar el momento. note: 'Podés @mencionar otras cuentas o usar #etiquetas.' show_collections: La gente podrá navegar a través de tus seguidos y seguidores. Sin embargo, la gente que sigás, sabrá que lo estás haciendo. - unlocked: La gente podrá seguirte sin solicitar aprobación. Desmarcá si querés revisar las solicitudes de seguimiento y elegir si aceptar o rechazar nuevos seguidores. + unlocked: Las personas podrán seguirte sin solicitar aprobación. Desmarca si quieres revisar las solicitudes de seguimiento y elige si quieres aceptar o rechazar nuevos seguidores. account_alias: acct: Especificá el nombredeusuario@dominio de la cuenta desde la que querés mudarte account_migration: diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index 2b5d22aee8..3c340b3005 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -10,7 +10,7 @@ es-MX: indexable: Tus publicaciones públicas pueden aparecer en los resultados de búsqueda en Mastodon. Las personas que han interactuado con tus publicaciones pueden buscarlas en cualquier momento. note: 'Puedes @mencionar a otra gente o #hashtags.' show_collections: Las personas pueden navegar a través de tus seguidos y seguidores. Las personas que te siguen pueden ver que las sigues. - unlocked: Las personas pueden seguirte sin solicitar la aprobación. No lo selecciones si quieres revisar las solicitudes de seguimiento y elegir si aceptas o rechazas a nuevos seguidores. + unlocked: Las personas podrán seguirte sin solicitar aprobación. Desmarca si quieres revisar las solicitudes de seguimiento y elige si quieres aceptar o rechazar nuevos seguidores. account_alias: acct: Especifique el nombre de usuario@dominio de la cuenta desde la cual se desea migrar account_migration: diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 8bc2c5f65c..a0338a3029 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -10,7 +10,7 @@ es: indexable: Tus publicaciones públicas pueden aparecer en los resultados de búsqueda en Mastodon. Las personas que han interactuado con tus publicaciones pueden ser capaces de buscarlas sin importar su visibilidad. note: Puedes mencionar a otras personas o etiquetas. show_collections: Las personas podrán navegar a través de tus seguidos y seguidores. Esto no impide que las personas que sigues sepan que las estás siguiendo. - unlocked: Las personas podrán seguirte sin pedir aprobación. Desmarca si deseas revisar las solicitudes de seguimiento y aceptar o rechazar nuevos seguidores. + unlocked: Las personas podrán seguirte sin solicitar aprobación. Desmarca si quieres revisar las solicitudes de seguimiento y elige si quieres aceptar o rechazar nuevos seguidores. account_alias: acct: Especifica el nombre_de_usuario@dominio de la cuenta desde donde deseas migrar account_migration: diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index a2ebf63b11..690661cd49 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -10,7 +10,6 @@ et: indexable: Sinu avalikud postitused võivad ilmuda Mastodoni otsingutulemustes. Inimesed, kes on sinu postitustele reageerinud, saavad neid otsida nii või naa. note: 'Saad @mainida teisi inimesi või #silte.' show_collections: Inimesed saavad sirvida su jälgijaid ja jälgitavaid. Inimesed, keda sa jälgid, näevad seda sõltumata häälestuse valikust. - unlocked: Inimesed saavad sind jälgima hakata kinnitamist taotlemata. Eemalda märge, kui soovid jälgimistaotlusi üle vaadata ja valida, kas nõustuda või keelduda uute jälgijatega. account_alias: acct: Sisesta konto kasutajanimi@domeen, mille soovid siia ümber kolida account_migration: diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 7647e187ec..f6c4f14915 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -9,7 +9,6 @@ eu: indexable: Zure argitalpen publikoak bilaketa-emaitzetan ager daitezke Mastodonen. Zure argitalpenekin elkarregin duten jendeak ikusi ahal izango dituzte, hala ere. note: 'Beste pertsona edo #traola batzuk @aipatu ditzakezu.' show_collections: Pertsonek zuk jarraitzen dituzunak eta zure jarraitzaileak arakatu ahal izango dute. Jarraitzen dituzun pertsonak jarraitzen dituzula ikusi ahal izando dute, hala ere. - unlocked: Pertsonek zuri jarraitu ahal izango dizute onarpen-eskaerarik gabe. Desgaitu jarraipen-eskaerak berrikusi nahi badituzu eta hauek onartu edo ez erabaki nahi baduzu. account_alias: acct: Zehaztu migrazioaren jatorri den kontuaren erabiltzailea@domeinua account_migration: diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index f51a4ce8bf..9872de222f 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -10,7 +10,6 @@ fa: indexable: ممکن است فرسته‌های عمومیتان در نتیجه‌های جست‌وجوی ماستودون ظاهر شود. افرادی که با فرسته‌هایتان تعامل داشتند در هر صورت می‌توانند جست‌وجویشان کنند. note: 'می‌توانید افراد دیگر را @نام برده یا #برچسب بزنید.' show_collections: افراد خواهند توانست پی‌گیران و پی‌گرفته شده‌هایتان را مرور کنند. افرادی که پی‌می‌گیریدشان در هر صورت خواهند دید که پی‌می‌گیریدشان. - unlocked: افراد خواهند توانست بدون درخواست تأیید پی‌بگیرندتان. اگر می‌خواهید درخواست‌های پی‌گیری را بازبینی کرده و بگزینید که پی‌گیران جدید را بپذیرید یا رد کنید، علامت را بردارید. account_alias: acct: مشخّص کردن username@domain حسابی که می‌خواهید از آن منتقل شوید account_migration: diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index d2ce30ec8e..d38aeaa414 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -9,7 +9,6 @@ fr-CA: indexable: Vos messages publics peuvent apparaître dans les résultats de recherche sur Mastodon. Les personnes qui ont interagi avec vos messages peuvent les trouver dans une recherche quoi qu’il arrive. note: 'Vous pouvez @mentionner d’autres personnes ou des #hashtags.' show_collections: Les gens pourront voir les personnes que vous suivez ou qui vous suivent. Ceux que vous suivez verront que vous les suivez dans tous les cas. - unlocked: Les gens pourront vous suivre sans demander d'approbation. Décochez cette option si vous voulez valider les demandes d'abonnement et choisir d'accepter ou de rejeter les nouveaux abonnés. account_alias: acct: Spécifiez l’identifiant@domaine du compte que vous souhaitez faire migrer account_migration: diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 626032600a..b601bf0b66 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -9,7 +9,6 @@ fr: indexable: Vos messages publics peuvent apparaître dans les résultats de recherche sur Mastodon. Les personnes qui ont interagi avec vos messages peuvent les trouver dans une recherche quoi qu’il arrive. note: 'Vous pouvez @mentionner d’autres personnes ou des #hashtags.' show_collections: Les gens pourront voir les personnes que vous suivez ou qui vous suivent. Ceux que vous suivez verront que vous les suivez dans tous les cas. - unlocked: Les gens pourront vous suivre sans demander d'approbation. Décochez cette option si vous voulez valider les demandes d'abonnement et choisir d'accepter ou de rejeter les nouveaux abonnés. account_alias: acct: Spécifiez l’identifiant@domaine du compte à partir duquel vous souhaitez migrer account_migration: diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index c840342db5..6a37a09201 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -10,7 +10,6 @@ fy: indexable: Jo iepenbiere berjochten kinne ferskine yn de sykresultaten op Mastodon. Minsken dy’t reagearre hawwe op jo berjochten kinne se hoe dan ek trochsykje. note: 'Jo kinne oare minsken @fermelde of #hashtags brûke.' show_collections: Minsken kinne sjen wa’t jo folgje en wa’t jo folget. - unlocked: Minsken kinne jo folgje sûnder dêrfoar tastimming freegje te hoegen. Wannear’t jo nije folgers hânmjittich goedkarre wolle, moatte jo dizze opsje deselektearje. account_alias: acct: Fermeld de brûkersnamme@domein fan de account fan wêr’t jo ferhúzje wolle account_migration: diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml index f8257a9da9..62d59235bf 100644 --- a/config/locales/simple_form.ga.yml +++ b/config/locales/simple_form.ga.yml @@ -10,7 +10,6 @@ ga: indexable: Seans go mbeidh do phostálacha poiblí le feiceáil sna torthaí cuardaigh ar Mastodon. Seans go mbeidh daoine a d’idirghníomhaigh le do phostálacha in ann iad a chuardach beag beann ar. note: 'Is féidir leat @trá a dhéanamh ar dhaoine eile nó #hashtags.' show_collections: Beidh daoine in ann brabhsáil trí do seo a leanas agus do leanúna. Feicfidh na daoine a leanann tú go leanann tú iad beag beann ar. - unlocked: Beidh daoine in ann tú a leanúint gan cead a iarraidh. Díthiceáil an dteastaíonn uait athbhreithniú a dhéanamh ar iarratais leantacha agus roghnaigh cé acu an nglacfaidh nó an diúltóidh tú do leantóirí nua. account_alias: acct: Sonraigh ainm@fearann don chuntas ar mhaith leat aistriú uaidh account_migration: diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index af1f06a316..4083469b63 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -10,7 +10,6 @@ gd: indexable: Faodaidh na postaichean poblach agad a nochdadh am measg toraidhean luirg air Mastodon. ’S urrainn dhan fheadhainn a rinn eadar-ghabhail leis na postaichean agad lorg annta air a h-uile dòigh. note: "’S urrainn dhut @iomradh a thoirt air càch no air #tagaicheanHais." show_collections: "’S urrainn do chàch na dàimhean leantainn agad a rùrachadh. Chì daoine a leanas tu gu bheil thu ’gan leantainn air a h-uile dòigh." - unlocked: "’S urrainnear do leantainn gun aontachadh iarraidh. Thoir a’ chromag far a’ bhogsa nam bu mhiann leat lèirmheas a dhèanamh air na h-iarrtasan leantainn agus taghadh an aontaich thu ri neach-leantainn ùr no an dhiùlt thu iad." account_alias: acct: Sònraich ainm-cleachdaiche@àrainn dhen chunntas a tha thu airson imrich uaithe account_migration: diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml index 85fa74f1ed..5ac75aafb1 100644 --- a/config/locales/simple_form.ia.yml +++ b/config/locales/simple_form.ia.yml @@ -9,7 +9,6 @@ ia: indexable: Tu messages public pote apparer in le resultatos de recerca sur Mastodon. Le personas qui ha interagite con tu messages pote cercar los in omne caso. note: 'Tu pote @mentionar altere personas o #hashtags.' show_collections: Le gente potera percurrer le listas de personas que tu seque e qui te seque. Le personas que tu seque videra que tu les seque in omne caso. - unlocked: Le personas potera sequer te sin requestar approbation. Dismarca si tu vole revider le requestas de sequimento e seliger si acceptar o rejectar nove sequitores. account_alias: acct: Specifica le nomine_de_usator@dominio del conto desde le qual tu vole migrar account_migration: diff --git a/config/locales/simple_form.ie.yml b/config/locales/simple_form.ie.yml index 771e341616..56e737172d 100644 --- a/config/locales/simple_form.ie.yml +++ b/config/locales/simple_form.ie.yml @@ -9,7 +9,6 @@ ie: indexable: Tui public postas posse aparir in sercha-resultates sur Mastodon. E in omni casu, tis qui ha interactet con tui postas va posser serchar e trovar les. note: 'Tu posse @mentionar altri persones o #hashtags.' show_collections: Gente va posser navigar tra tui sequentes e sequitores. Gente quem tu seque va vider que tu seque les sin egarda. - unlocked: Persones va posser sequer te sin petir aprobation. Desselecte si tu vole manualmen tractar petitiones de sequer e decider ca acceptar o rejecter nov sequitores. account_alias: acct: Specificar li usatornomine@dominia del conto ex quel tu vole translocar account_migration: diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml index 1df5008195..631e7182fd 100644 --- a/config/locales/simple_form.io.yml +++ b/config/locales/simple_form.io.yml @@ -9,7 +9,6 @@ io: indexable: Vua posta publika povos aparar en rezultaji di serchi che Mastodon. Personi qui interagis kun vua posti povos serchar oli irgakaze. note: 'Vu povas @mencionar altra personi o #hashtagi.' show_collections: Personi povos navigar tra vua sequati e sequanti. Personi quin vu sequas, vidos ke vu sequas li irgakaze. - unlocked: Personi povos sequar vu sen demandar aprobo. Deselektez se vu volas revuar sequadodemandi e selektez aceptar o refuzar nova sequati. account_alias: acct: Partikulare pozez uzantonomo@domeno di konto quon vua volas ektransferesar account_migration: diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index c36fce36f7..b1fb6c3fc1 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -10,7 +10,7 @@ it: indexable: I tuoi post pubblici potrebbero apparire nei risultati di ricerca su Mastodon. Le persone che hanno interagito con i tuoi post potrebbero essere in grado di cercarli anche se non hai attivato questa impostazione. note: 'Puoi @menzionare altre persone o usare gli #hashtags.' show_collections: Le persone saranno in grado di navigare attraverso i tuoi seguaci e seguaci. Le persone che segui vedranno che li seguirai indipendentemente dalle tue impostazioni. - unlocked: Le persone saranno in grado di seguirti senza richiedere l'approvazione. Deseleziona se vuoi controllare le richieste di seguirti e scegli se accettare o rifiutare nuovi follower. + unlocked: Le persone potranno seguirti senza richiedere l'approvazione. Deseleziona questa opzione, se vuoi rivedere le richieste per poterti seguire e scegliere se accettare o rifiutare i nuovi seguaci. account_alias: acct: Indica il nomeutente@dominio dell'account dal quale vuoi trasferirti account_migration: diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index de37005312..712c2f4e8a 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -9,7 +9,6 @@ lad: indexable: Tus publikasyones publikas pueden apareser en rezultados de bushkeda en Mastodon. Personas ke enteraktuaron kon tus publikasyones syempre pueden bushkarlas inkluzo si trokes esta preferensya. note: 'Puedes @enmentar a otra djente o #etiketas.' show_collections: Otra djente podra ver tus segidos i suivantes. Personas a las kualas siges siempre podran ver que las estas sigiendo. - unlocked: Djente va poder segirte sin solisitar tu achetasyon. Deseleksyona si keres revizar solisitasyones de segimyento i dechidir si keres achetar o refuzar a muevos suivantes. account_alias: acct: Espesifika tu nombre de utilizador@domeno del kuento de ande keres migrar account_migration: diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index de3dd2f31c..d9204efaaa 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -10,7 +10,6 @@ lt: indexable: Tavo vieši įrašai gali būti rodomi Mastodon paieškos rezultatuose. Žmonės, kurie bendravo su tavo įrašais, gali jų ieškoti nepriklausomai nuo to. note: 'Gali @paminėti kitus žmones arba #saitažodžius.' show_collections: Žmonės galės peržiūrėti tavo sekimus ir sekėjus. Žmonės, kuriuos seki, matys, kad juos seki, nepaisant to. - unlocked: Žmonės galės tave sekti nepaprašę patvirtinimo. Panaikink žymėjimą, jei nori peržiūrėti sekimo prašymus ir pasirinkti, ar priimti, ar atmesti naujus sekėjus. account_alias: acct: Nurodyk paskyros, iš kurios nori perkelti, naudotojo vardą@domeną account_migration: diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 106e29d2de..da8dac3c22 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -10,7 +10,6 @@ lv: indexable: Tavi publiskie ieraksti var tikt parādīti Mastodon meklēšanas iznākumā. Cilvēki, kuri ir mijiedarbojušies ar Taviem ierakstiem, var tos meklēt neatkarīgi no tā. note: 'Tu vari @minēt citus cilvēkus vai #mirkļbirkas.' show_collections: Cilvēki varēs pārlūkot Tavus sekotājus un sekojamos. Cilvēki, kuriem Tu seko, redzēs, ka Tu seko viņiem neatkarīgi no tā. - unlocked: Cilvēki varēs tev sekot, neprasot apstiprinājumu. Noņem atzīmi, ja vēlies pārskatīt sekošanas pieprasījumus un izvēlēties, pieņemt vai noraidīt jaunus sekotājus. account_alias: acct: Norādi konta lietotājvārdu@domēnu, no kura vēlies pārvākties account_migration: @@ -183,7 +182,7 @@ lv: autofollow: Uzaicini sekot tavam kontam avatar: Profila attēls bot: Šis ir automatizēts konts - chosen_languages: Filtrēt valodas + chosen_languages: Atlasīt valodas confirm_new_password: Apstiprināt jauno paroli confirm_password: Apstiprināt paroli context: Filtrēt kontekstus diff --git a/config/locales/simple_form.ms.yml b/config/locales/simple_form.ms.yml index ecc3588d67..96c6002aa4 100644 --- a/config/locales/simple_form.ms.yml +++ b/config/locales/simple_form.ms.yml @@ -9,7 +9,6 @@ ms: indexable: Kiriman awam anda mungkin muncul dalam hasil carian di Mastodon. Orang yang telah berinteraksi dengan kiriman anda mungkin boleh mencarinya. note: 'Anda boleh @menyebut orang lain atau #hashtags.' show_collections: Orang akan dapat menyemak imbas ikutan dan pengikut anda. Orang yang anda ikuti akan melihat bahawa anda tetap mengikuti mereka. - unlocked: Orang akan dapat mengikuti anda tanpa meminta kelulusan. Nyahtanda jika anda ingin menyemak permintaan ikutan dan pilih sama ada untuk menerima atau menolak pengikut baharu. account_alias: acct: Tentukan namapengguna@domain akaun yang ingin anda alihkan daripada account_migration: diff --git a/config/locales/simple_form.my.yml b/config/locales/simple_form.my.yml index abcb11bdaa..474b0f6cb4 100644 --- a/config/locales/simple_form.my.yml +++ b/config/locales/simple_form.my.yml @@ -9,7 +9,6 @@ my: indexable: သင်၏ အများမြင်ပို့စ်များသည် Mastodon ရှိ ရှာဖွေမှုရလဒ်များတွင် ပေါ်လာနိုင်သည်။ သင့်ပို့စ်များမှတစ်ဆင့် အပြန်အလှန်တုံ့ပြန်ပြီး ရှာဖွေနိုင်ပါမည်။ note: 'သင်သည် အခြားသူများ သို့မဟုတ် #hashtag များကို @mention ဖြင့် ဖော်ပြနိုင်သည်။' show_collections: သင်စောင့်ကြည့်သူများနှင့် သင့်ကိုစောင့်ကြည့်သူများမှတစ်ဆင့် ရှာဖွေနိုင်မည်ဖြစ်သည်။ သင်စောင့်ကြည့်သူများသည် သင်သူတို့ကို မည်သို့စောင့်ကြည့်သည်ကို တွေ့ရလိမ့်မည်။ - unlocked: ခွင့်ပြုချက်မတောင်းဘဲ လူများက သင့်ကိုစောင့်ကြည့်နိုင်ပါမည်။ စောင့်ကြည့်ရန်အတွက် တောင်းဆိုချက်များထားရှိလိုပါက အမှန်ခြစ်ဖြုတ်ပြီး စောင့်ကြည့်သူသစ်များကို လက်ခံခြင်း သို့မဟုတ် ငြင်းပယ်ခြင်းလည်း အမှန်ခြစ်ဖြုတ်နိုင်ပါသည်။ account_alias: acct: ပြောင်းရွှေ့မည့်အကောင့်မှ username@domain ကို သတ်မှတ်ပါ account_migration: diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index 46b7af4bdb..008af2c5ac 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -10,7 +10,6 @@ nn: indexable: Dei offentlege innlegga dine kan dukka opp i søkjeresultat på Mastodon. Folk som har reagert på oinnlegga dine kan uansett søkja gjennom dei. note: 'Du kan @nemne folk eller #emneknaggar.' show_collections: Andre kan sjå kven du fylgjer og kven som fylgjer deg. Dei du fylgjer kan alltid sjå at du fylgjer dei. - unlocked: Alle kan fylgja deg utan å måtta be om det. Vel bort dersom du vil gå gjennom førespurnader om å fylgja deg og seia ja eller nei til kvar av dei. account_alias: acct: Angi brukarnamn@domene til brukaren du ynskjer å flytta frå account_migration: diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml index 73ba17cd4c..fb7a808876 100644 --- a/config/locales/simple_form.no.yml +++ b/config/locales/simple_form.no.yml @@ -9,7 +9,6 @@ indexable: Dine offentlige innlegg kan vises i søkeresultat på Mastodon. Personer som har samhandlet med innleggene dine kan finne de uansett. note: 'Du kan @nevne andre eller #emneknagger.' show_collections: Folk vil kunne bla gjennom de du følger og dine følgere. Folk du følger vil uansett se at du følger dem. - unlocked: Folk vil kunne følge deg uten å be om godkjenning. Fjern markeringen om du vil gjennomgå følge-forespørsler og velge om du vil akseptere eller avvise nye følgere. account_alias: acct: Spesifiser brukernavn@domene til kontoen du vil flytte fra account_migration: diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index c5ff55c15d..4fba45098d 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -10,7 +10,6 @@ pl: indexable: Twoje publiczne wpisy mogą pojawiać się w wynikach wyszukiwania w Mastodonie. Użytkownicy, którzy wchodzili w interakcje z twoimi wpisami będą mogli je znaleźć niezależnie od tego ustawienia. note: 'Możesz @wspomnieć użytkowników albo #hasztagi.' show_collections: Twoja lista obserwowanych i obserwujących będzie widoczna dla wszystkich. Użytkownicy których obserwujesz będą jednak o tym wiedzieli. - unlocked: Inni użytkownicy będą mogli cię obserwować bez proszenia o zgodę. Odznacz, jeżeli chcesz aprobować obserwujących ręcznie po przejrzeniu próśb o obserwowanie. account_alias: acct: Określ nazwę@domenę konta z którego chcesz się przenieść account_migration: diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 16d7cfe445..0c6be63aaa 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -10,7 +10,6 @@ pt-BR: indexable: Suas publicações públicas podem aparecer nos resultados da pesquisa em Mastodon. As pessoas que interagiram com suas publicações podem conseguir pesquisá-las independentemente disso. note: 'Você pode @mencionar outras pessoas ou #hashtags.' show_collections: As pessoas poderão navegar entre os seus seguidores e seguidores. As pessoas que você segue verão que você as segue independentemente disso. - unlocked: As pessoas poderão te seguir sem pedir aprovação. Desmarque se você deseja revisar pedidos e escolher se aceita ou rejeita novos seguidores. account_alias: acct: Especifique o usuário@domínio de onde veio account_migration: diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index 3b606df032..a172ed2752 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -9,7 +9,6 @@ pt-PT: indexable: As suas mensagens públicas podem aparecer nos resultados da pesquisa no Mastodon. Independentemente disso, as pessoas que interagiram com as suas publicações podem ser capazes de as pesquisar. note: 'Pode @mencionar outras pessoas ou #hashtags.' show_collections: As pessoas podem navegar pelas listas das pessoas que segue e dos seus seguidores. Independentemente disso, as pessoas que segue verão que você as segue. - unlocked: As pessoas podem segui-lo/a sem pedir a sua aprovação. Desmarque se quiser rever os pedidos para seguir e escolher se aceita ou rejeita os novos seguidores. account_alias: acct: Especifique o utilizador@domínio da conta de onde você deseja migrar account_migration: diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml index 458638ddec..63dcf91343 100644 --- a/config/locales/simple_form.ro.yml +++ b/config/locales/simple_form.ro.yml @@ -3,11 +3,14 @@ ro: simple_form: hints: account: + attribution_domains_as_text: Una pe linie. Protejează împotriva atribuirilor false. discoverable: Este posibil ca postările și profilul tău să fie recomandate în diferite zone ale Mastodon, iar profilul tău ar poate fi sugerat altor utilizatori. + display_name: Numele dvs. complet sau numele dvs. amuzant. fields: Pagina ta principală, pronumele tale, vârsta, sau orice îți dorești. indexable: Postările tale publice pot apărea în rezultatele căutărilor pe Mastodon. Persoanele care au interacționat cu postările tale vor putea să le caute oricând. note: 'Poți @menționa alte persoane sau #hashtag-uri.' - unlocked: Alte persoane vă vor putea urmări fără a solicita aprobare. Debifați dacă doriți să revizuiți cererile și să alegeți dacă doriți să acceptați sau să respingeți noii urmăritori. + show_collections: Oamenii vor putea să răsfoiască urmăriți și urmăritorii dvs. Oamenii pe care îi urmăriți vor vedea că îi urmăriți indiferent. + unlocked: Alte persoane vă vor putea urmări fără a solicita aprobare. Debifați dacă doriți să revizuiți cererile de urmărire și să alegeți dacă doriți să acceptați sau să respingeți noii urmăritori. account_alias: acct: Specificați numele de utilizator@domeniu al contului de la care doriți să treceți account_migration: @@ -20,6 +23,12 @@ ro: send_email_notification: Utilizatorul va primi o explicație cu privire la ceea ce sa întâmplat cu contul lui text_html: Opțional. Poți utiliza sintaxe. Poți adăuga avertismente predefinite pentru a salva timp type_html: Alege ce se întâmplă cu %{acct} + types: + disable: Împiedicați utilizatorul să-și folosească contul, dar nu ștergeți sau ascundeți conținutul acestuia. + none: Utilizați acest lucru pentru a trimite o avertizare utilizatorului, fără a declanșa nicio altă acțiune. + sensitive: Forțează toate atașamentele media ale acestui utilizator să fie marcate ca sensibile. + silence: Împiedicați utilizatorul să poată posta cu vizibilitate publică, ascundeți postările și notificările de la persoanele care nu le urmăresc. Închide toate rapoartele pentru acest cont. + suspend: Preveniți orice interacțiune din sau către acest cont și ștergeți conținutul acestuia. Reversibil în 30 de zile. Închide toate rapoartele pentru acest cont. warning_preset_id: Opțional. Poți adăuga text personalizat la sfârșitul presetului announcement: all_day: Când este bifat, numai datele intervalului de timp vor fi afișate @@ -27,6 +36,8 @@ ro: scheduled_at: Lăsați necompletat pentru a publica anunțul imediat starts_at: Opțional. În cazul în care anunțul tău este legat de un anumit interval de timp text: Poți folosi sintaxa de postare. Te rugăm să fii atent la spațiul pe care anunțul îl va ocupa pe ecranul utilizatorului + appeal: + text: Puteți contesta un avertisment o singură dată defaults: autofollow: Persoanele care se înregistrează datorită invitației tale te vor urmări automat avatar: WEBP, PNG, GIF sau JPG. Cel mult %{size}. Va fi redimensionată la %{dimensions}px @@ -65,18 +76,64 @@ ro: actions: hide: Ascunde complet conținutul filtrat, ca și cum nu ar exista warn: Ascunde conținutul filtrat în spatele unui avertisment care menționează titlul filtrului + form_admin_settings: + activity_api_enabled: Numărul de postări publicate local, utilizatori activi și înregistrări noi în grupe săptămânale + app_icon: WEBP, PNG, GIF sau JPG. Înlocuiește pictograma implicită a aplicației pe dispozitivele mobile cu o pictogramă personalizată. + backups_retention_period: Utilizatorii au posibilitatea de a genera arhive ale postărilor lor pentru a le descărca mai târziu. Când este setat la o valoare pozitivă, aceste arhive vor fi șterse automat din spațiul dvs. de stocare după numărul de zile specificat. + bootstrap_timeline_accounts: Aceste conturi vor fi fixate în partea de sus a recomandărilor de urmărire ale noilor utilizatori. + closed_registrations_message: Afișat când înscrierile sunt închise + content_cache_retention_period: Toate postările de pe alte servere (inclusiv amplificarea și răspunsurile) vor fi șterse după numărul specificat de zile, fără a ține cont de interacțiunea utilizatorului local cu acele postări. Aceasta include postările în care un utilizator local le-a marcat ca marcaje sau favorite. Mențiunile private între utilizatorii din diferite instanțe se vor pierde și vor fi imposibil de restaurat. Utilizarea acestei setări este destinată cazurilor cu scop special și încalcă multe așteptări ale utilizatorilor atunci când este implementată pentru uz general. + custom_css: Puteți aplica stiluri personalizate pe versiunea web a Mastodon. + favicon: WEBP, PNG, GIF sau JPG. Suprascrie favicon-ul implicit Mastodon cu o pictogramă personalizată. + mascot: Suprascrie ilustrația din interfața web avansată. + media_cache_retention_period: Fișierele media din postările făcute de utilizatorii la distanță sunt stocate în cache pe serverul dvs. Când este setată la o valoare pozitivă, fișierele media vor fi ștearse după numărul specificat de zile. Dacă datele media sunt solicitate după ce sunt șterse, acestea vor fi re-descărcate, dacă conținutul sursă este încă disponibil. Din cauza restricțiilor cu privire la frecvența cu care cardurile de previzualizare a linkurilor interogează site-urile terțelor părți, se recomandă să setați această valoare la cel puțin 14 zile, sau cardurile de previzualizare a linkurilor nu vor fi actualizate la cerere înainte de această oră. + peers_api_enabled: O listă de nume de domenii pe care acest server le-a întâlnit în fediverse. Nu sunt incluse aici date despre dacă vă federați cu un anumit server, doar că serverul dvs. știe despre asta. Acesta este folosit de serviciile care colectează statistici despre federație în sens general. + profile_directory: Directorul de profil listează toți utilizatorii care au optat pentru a fi descoperibili. + require_invite_text: Când înscrierile necesită aprobare manuală, faceți introducerea textului „De ce doriți să vă alăturați?” obligatorie și nu opțională + site_contact_email: Cum vă pot contacta oamenii pentru întrebări juridice sau de asistență. + site_contact_username: Cum vă pot contacta oamenii pe Mastodon. + site_extended_description: Orice informație suplimentară care poate fi utilă vizitatorilor și utilizatorilor dvs. Poate fi structurată cu sintaxa Markdown. + site_short_description: O descriere scurtă pentru a ajuta la identificarea unică a serverului dvs. Cine-l conduce, pentru cine este? + site_terms: Utilizați propria politică de confidențialitate sau lăsați necompletat pentru a o utiliza pe cea implicit. Poate fi structurată cu sintaxa Markdown. + site_title: Cum se pot referi oamenii la serverul dvs. în afară de numele său de domeniu. + status_page_url: URL-ul unei pagini unde oamenii pot vedea starea acestui server în timpul unei întreruperi + theme: Tema pe care vizitatorii deconectați și utilizatorii noi o văd. + thumbnail: O imagine de aproximativ 2:1 afișată alături de informațiile serverului dvs. + timeline_preview: Vizitatorii deconectați vor putea să răsfoiască cele mai recente postări publice disponibile pe server. + trendable_by_default: Omiteți revizuirea manuală a conținutului în tendințe. Elementele individuale pot fi în continuare eliminate din tendințe după fapt. + trends: Tendințele arată ce postări, hashtag-uri și știri câștigă teren pe serverul dvs. + trends_as_landing_page: Afișați conținut în tendințe utilizatorilor deconectați și vizitatorilor în loc de o descriere a acestui server. Necesită ca tendințele să fie activate. form_challenge: current_password: Ați intrat într-o zonă securizată imports: data: Fișierul CSV exportat de la o altă instanță invite_request: text: Acest lucru ne va ajuta să revizuim cererea dvs + ip_block: + comment: Opțional. Amintiți-vă de ce ați adăugat această regulă. + expires_in: Adresele IP sunt o resursă finită, uneori sunt partajate și adesea se schimbă. Din acest motiv, blocurile IP nedefinite nu sunt recomandate. + ip: Introduceți o adresă IPv4 sau IPv6. Puteți bloca întregul spectru folosind sintaxa CIDR. Aveți grijă să nu vă blocați! + severities: + no_access: Blocați accesul la toate resursele + sign_up_block: Nu vor fi posibile înscrieri noi + sign_up_requires_approval: Înscrierile noi vor necesita aprobarea dvs. + severity: Alegeți ce se va întâmpla cu cererile de la acestă adresă IP + rule: + hint: Opțional. Oferiți mai multe detalii despre regulă + text: Descrieți o regulă sau o cerință pentru utilizatorii de pe acest server. Încercați să o faceți scurtă și simplă sessions: otp: 'Introdu codul pentru dubla protecție generat de telefonul mobil sau unul din codurile de rezervă:' + webauthn: Dacă este o cheie USB, asigurați-vă că o introduceți și, dacă este necesar, atingeți-o. + settings: + indexable: Pagina dvs. de profil poate apărea în rezultatele căutării pe Google, Bing și altele. + show_application: Veți putea întotdeauna să vedeți ce aplicație v-a publicat postarea. tag: name: Poți doar să schimbi caseta literelor, de exemplu, pentru a o face mai lizibilă user: chosen_languages: Doar postările în limbile selectate vor fi afișate în fluxurile publice + role: Rolul controlează ce permisiuni are utilizatorul. + user_role: + color: Culoare care va fi folosită pentru rol în întreaga interfață, ca RGB în format hexazecimal labels: account: fields: diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index 37626ff9fd..d8822d35b9 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -10,7 +10,6 @@ ru: indexable: Ваши публичные сообщения могут появляться в результатах поиска на Mastodon. Люди, которые взаимодействовали с вашими сообщениями, могут искать их независимо от этого. note: 'Вы можете @упоминать других людей или #хэштеги.' show_collections: Люди смогут просматривать список ваших подписок и подписчиков. Люди, за которыми вы следуете, будут видеть, что вы подписаны на них, несмотря ни на что. - unlocked: Люди смогут подписываться на вас, не запрашивая подтверждения. Снимите флажок, если вы хотите просматривать запросы на подписку и выбирать, принимать или отклонять новых подписчиков. account_alias: acct: Укажите имя_пользователя@домен учётной записи, с которой вы собираетесь мигрировать account_migration: diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index d1ae553c8c..1f1867854e 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -9,7 +9,6 @@ sl: indexable: Vaše javne objave se lahko pojavijo v rezultatih iskanja na Mastodonu. Ljudje, ki so bili v interakciji z vašimi objavami, jih bodo lahko iskali ne glede na to. note: 'Druge osebe lahko @omenite ali #ključnite.' show_collections: Ljudje bodo lahko brskali po vaših sledilcih in sledenih. Ljudje, ki jim sledite, bodo videli, da jim sledite ne glede na to. - unlocked: Ljudje vam bodo lahko sledili, ne da bi zahtevali odobritev. Ne potrdite, če želite pregledati prošnje za sledenje, in izbirajte, ali želite nove sledilce sprejeti ali zavrniti. account_alias: acct: Določite uporabniškoime@domena računa, od katerega se želite preseliti account_migration: diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml index 1dec901340..fee7600074 100644 --- a/config/locales/simple_form.sr-Latn.yml +++ b/config/locales/simple_form.sr-Latn.yml @@ -9,7 +9,6 @@ sr-Latn: indexable: Vaše javne objave se mogu pojaviti u rezultatima pretrage na Mastodon-u. Ljudi koji su stupili u interakciju sa vašim objavama će možda moći da ih pretražuju. note: 'Možete da @pomenete druge ljude ili #heš oznake.' show_collections: Ljudi će moći da pregledaju vaše pratioce i pratioce. Ljudi koje pratite videće da ih pratite. - unlocked: Ljudi će moći da vas prate bez zahtevanja odobrenja. Opozovite izbor ako želite da pregledate zahteve za praćenje i izaberite da li da prihvatite ili odbijete nove pratioce. account_alias: acct: Navedite korisničko_ime@domen naloga sa kojeg želite da se preselite account_migration: diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index 9566e09475..7161627e28 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -9,7 +9,6 @@ sr: indexable: Ваше јавне објаве се могу појавити у резултатима претраге на Mastodon-у. Људи који су ступили у интеракцију са вашим објавама ће можда моћи да их претражују. note: 'Можете да @поменете друге људе или #хеш ознаке.' show_collections: Људи ће моћи да прегледају ваше пратиоце и пратиоце. Људи које пратите видеће да их пратите. - unlocked: Људи ће моћи да вас прате без захтевања одобрења. Опозовите избор ако желите да прегледате захтеве за праћење и изаберите да ли да прихватите или одбијете нове пратиоце. account_alias: acct: Наведите корисничко_име@домен налога са којег желите да се преселите account_migration: diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index 72c3f000f6..b8303e2945 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -10,7 +10,6 @@ sv: indexable: Dina offentliga inlägg kan visas i sökresultat på Mastodon. Personer som har interagerat med dina inlägg kan söka dem oavsett. note: 'Du kan @nämna andra personer eller #hashtaggar.' show_collections: Andra kan se vem du följer och vem som följer dig. De du följer kan alltid se att du följer dem. - unlocked: Andra kommer att kunna följa dig utan att begära godkännande. Avmarkera om du vill granska följeslagare och välja om du vill acceptera eller avvisa nya följare. account_alias: acct: Ange användarnamn@domän för kontot som du vill flytta från account_migration: diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index f8f4d3f119..0ba54e26ce 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -10,7 +10,6 @@ th: indexable: โพสต์สาธารณะของคุณอาจปรากฏในผลลัพธ์การค้นหาใน Mastodon ผู้คนที่ได้โต้ตอบกับโพสต์ของคุณอาจสามารถค้นหาโพสต์เหล่านั้นได้ไม่ว่าอย่างไรก็ตาม note: 'คุณสามารถ @กล่าวถึง ผู้คนอื่น ๆ หรือ #แฮชแท็ก' show_collections: ผู้คนจะสามารถเรียกดูการติดตามและผู้ติดตามของคุณ ผู้คนที่คุณติดตามจะเห็นว่าคุณติดตามเขาไม่ว่าอย่างไรก็ตาม - unlocked: ผู้คนจะสามารถติดตามคุณได้โดยไม่ต้องขอการอนุมัติ เลิกกาเครื่องหมายหากคุณต้องการตรวจทานคำขอติดตามและเลือกว่าจะยอมรับหรือปฏิเสธผู้ติดตามใหม่ account_alias: acct: ระบุ username@domain ของบัญชีที่คุณต้องการย้ายจาก account_migration: diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 6586c372ef..5f98d73be6 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -10,7 +10,7 @@ zh-CN: indexable: 您的公开嘟文会出现在 Mastodon 的搜索结果中。无论是否勾选,与您的嘟文有过交互的人都可能通过搜索找到它们。 note: '你可以提及 @其他人 或 #标签 。' show_collections: 人们将能够浏览您的关注和追随者。您关注的人会看到您关注他们。 - unlocked: 人们将能够在不请求批准的情况下关注你。如果你希望审核关注请求并选择接受或拒绝新的粉丝,请取消勾选此项。 + unlocked: 人们将能够在不请求批准的情况下关注你。如果你希望审核关注请求并选择接受或拒绝新的关注者,请取消勾选此项。 account_alias: acct: 指定你想要迁移过来的原账号:用户名@站点域名 account_migration: diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index dd134a58fb..c77de84e4a 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -9,7 +9,6 @@ zh-HK: indexable: 你的公開帖文可能會出現在 Mastodon 的搜尋結果中。無論如何,與你帖文互動過的人都能搜尋到它。 note: '你可以 @提及他人 或使用 #主題標籤。' show_collections: 大家可瀏覽你追蹤的人和你的追蹤者。你追蹤的人無論如何都會看到你追蹤了他們。 - unlocked: 大家毋須獲得批准即可追蹤你。如果你想審核追蹤請求,來接受或拒絕新追蹤者,請取消勾選。 account_alias: acct: 指定欲移動之帳戶的「使用者名稱@域名」 account_migration: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 980eff1aa5..6cff74fb50 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -645,6 +645,7 @@ sq: report: 'Raportim #%{id}' reported_account: Llogari e raportuar reported_by: Raportuar nga + reported_with_application: Raportuar me aplikacion resolved: I zgjidhur resolved_msg: Raportimi u zgjidh me sukses! skip_to_actions: Kaloni te veprimet diff --git a/config/locales/sv.yml b/config/locales/sv.yml index bd33e837bd..b2ec21b82e 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -60,10 +60,10 @@ sv: deleted: Raderad demote: Degradera destroyed_msg: "%{username}s data har nu lagts till kön för att raderas omedelbart" - disable: inaktivera + disable: Inaktivera disable_sign_in_token_auth: Inaktivera autentisering med pollett via e-post disable_two_factor_authentication: Inaktivera 2FA - disabled: inaktiverad + disabled: Inaktiverad display_name: Visningsnamn domain: Domän edit: Redigera @@ -142,7 +142,7 @@ sv: only_password: Endast lösenord password_and_2fa: Lösenord och 2FA sensitive: Känsligt - sensitized: markerad som känsligt + sensitized: Markerad som känsligt shared_inbox_url: Delad inkorg URL show: created_reports: Anmälningar som skapats av det här kontot @@ -836,7 +836,7 @@ sv: title: Kontoinlägg trending: Trendande visibility: Synlighet - with_media: med media + with_media: Med media strikes: actions: delete_statuses: "%{name} raderade %{target}s inlägg" @@ -1494,7 +1494,7 @@ sv: not_ready: Kan inte bifoga filer som inte har behandlats färdigt. Försök igen om ett ögonblick! too_many: Det går inte att bifoga mer än 4 filer migrations: - acct: användarnamn@domän av det nya kontot + acct: Flyttad till cancel: Avbryt omdirigering cancel_explanation: Avstängning av omdirigeringen kommer att återaktivera ditt nuvarande konto, men kommer inte att återskapa följare som har flyttats till det kontot. cancelled_msg: Avbröt omdirigeringen. @@ -1703,7 +1703,7 @@ sv: ios: iOS kai_os: KaiOS linux: Linux - mac: Mac + mac: macOS unknown_platform: Okänd plattform windows: Windows windows_mobile: Windows Mobile @@ -1879,7 +1879,7 @@ sv: subject: Andra faktorns autentiseringsfel title: Misslyckad tvåfaktorsautentisering suspicious_sign_in: - change_password: Ändra ditt lösenord + change_password: ändra ditt lösenord details: 'Här är inloggningsdetaljerna:' explanation: Vi har upptäckt en inloggning till ditt konto från en ny IP-adress. further_actions_html: Om detta inte var du, rekommenderar vi att du snarast %{action} och aktiverar tvåfaktorsautentisering för att hålla ditt konto säkert. From e97f4b18ad5abcb992c6027fefd66b7dcc5b7268 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 12 Nov 2024 09:54:18 +0100 Subject: [PATCH 15/52] Update changelog and docker tags to v4.3.1 (#32849) --- CHANGELOG.md | 42 ++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 6 +++--- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fc5291d72..0696f0b31c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,48 @@ All notable changes to this project will be documented in this file. +## [4.3.1] - 2024-10-21 + +### Added + +- Add more explicit explanations about author attribution and `fediverse:creator` (#32383 by @ClearlyClaire) +- Add ability to group follow notifications in WebUI, can be disabled in the column settings (#32520 by @renchap) +- Add back a 6 hours mute duration option (#32522 by @renchap) +- Add note about not changing ActiveRecord encryption secrets once they are set (#32413, #32476, #32512, and #32537 by @ClearlyClaire and @mjankowski) + +### Changed + +- Change translation feature to translate to selected regional variant (e.g. pt-BR) if available (#32428 by @c960657) + +### Removed + +- Remove ability to get embed code for remote posts (#32578 by @ClearlyClaire)\ + Getting the embed code is only reliable for local posts.\ + It never worked for non-Mastodon servers, and stopped working correctly with the changes made in 4.3.0.\ + We have therefore decided to remove the menu entry while we investigate solutions. + +### Fixed + +- Fix follow recommendation moderation page default language when using regional variant (#32580 by @ClearlyClaire) +- Fix column-settings spacing in local timeline in advanced view (#32567 by @lindwurm) +- Fix broken i18n in text welcome mailer tags area (#32571 by @mjankowski) +- Fix missing or incorrect cache-control headers for Streaming server (#32551 by @ThisIsMissEm) +- Fix only the first paragraph being displayed in some notifications (#32348 by @ClearlyClaire) +- Fix reblog icons on account media view (#32506 by @tribela) +- Fix Content-Security-Policy not allowing OpenStack SWIFT object storage URI (#32439 by @kenkiku1021) +- Fix back arrow pointing to the incorrect direction in RTL languages (#32485 by @renchap) +- Fix streaming server using `REDIS_USERNAME` instead of `REDIS_USER` (#32493 by @ThisIsMissEm) +- Fix follow recommendation carrousel scrolling on RTL layouts (#32462 and #32505 by @ClearlyClaire) +- Fix follow recommendation suppressions not applying immediately (#32392 by @ClearlyClaire) +- Fix language of push notifications (#32415 by @ClearlyClaire) +- Fix mute duration not being shown in list of muted accounts in web UI (#32388 by @ClearlyClaire) +- Fix “Mark every notification as read” not updating the read marker if scrolled down (#32385 by @ClearlyClaire) +- Fix “Mention” appearing for otherwise filtered posts (#32356 by @ClearlyClaire) +- Fix notification requests from suspended accounts still being listed (#32354 by @ClearlyClaire) +- Fix list edition modal styling (#32358 and #32367 by @ClearlyClaire and @vmstan) +- Fix 4 columns barely not fitting on 1920px screen (#32361 by @ClearlyClaire) +- Fix icon alignment in applications list (#32293 by @mjankowski) + ## [4.3.0] - 2024-10-08 The following changelog entries focus on changes visible to users, administrators, client developers or federated software developers, but there has also been a lot of code modernization, refactoring, and tooling work, in particular by @mjankowski. diff --git a/docker-compose.yml b/docker-compose.yml index 37cb16497f..6018b85a70 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -59,7 +59,7 @@ services: web: # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # build: . - image: ghcr.io/mastodon/mastodon:v4.3.0 + image: ghcr.io/mastodon/mastodon:v4.3.1 restart: always env_file: .env.production command: bundle exec puma -C config/puma.rb @@ -83,7 +83,7 @@ services: # build: # dockerfile: ./streaming/Dockerfile # context: . - image: ghcr.io/mastodon/mastodon-streaming:v4.3.0 + image: ghcr.io/mastodon/mastodon-streaming:v4.3.1 restart: always env_file: .env.production command: node ./streaming/index.js @@ -101,7 +101,7 @@ services: sidekiq: build: . - image: ghcr.io/mastodon/mastodon:v4.3.0 + image: ghcr.io/mastodon/mastodon:v4.3.1 restart: always env_file: .env.production command: bundle exec sidekiq From bf609090b1b9c0649fdcb51b5acb3453deef84ca Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Tue, 12 Nov 2024 09:55:17 +0100 Subject: [PATCH 16/52] Fix: prevent linking to pages which require extra permissions (#32843) --- app/views/admin/dashboard/index.html.haml | 8 ++++---- app/views/admin/instances/_dashboard.html.haml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 2b4d02fa67..c3b7933293 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -16,7 +16,7 @@ .dashboard__item = react_admin_component :counter, end_at: @time_period.last, - href: admin_accounts_path(origin: 'local'), + href: current_user.can?(:manage_users) ? admin_accounts_path(origin: 'local') : nil, label: t('admin.dashboard.new_users'), measure: 'new_users', start_at: @time_period.first @@ -24,7 +24,7 @@ .dashboard__item = react_admin_component :counter, end_at: @time_period.last, - href: admin_accounts_path(origin: 'local'), + href: current_user.can?(:manage_users) ? admin_accounts_path(origin: 'local') : nil, label: t('admin.dashboard.active_users'), measure: 'active_users', start_at: @time_period.first @@ -39,7 +39,7 @@ .dashboard__item = react_admin_component :counter, end_at: @time_period.last, - href: admin_reports_path, + href: current_user.can?(:manage_reports) ? admin_reports_path : nil, label: t('admin.dashboard.opened_reports'), measure: 'opened_reports', start_at: @time_period.first @@ -47,7 +47,7 @@ .dashboard__item = react_admin_component :counter, end_at: @time_period.last, - href: admin_reports_path(resolved: '1'), + href: current_user.can?(:manage_reports) ? admin_reports_path(resolved: '1') : nil, label: t('admin.dashboard.resolved_reports'), measure: 'resolved_reports', start_at: @time_period.first diff --git a/app/views/admin/instances/_dashboard.html.haml b/app/views/admin/instances/_dashboard.html.haml index ef8500103b..16dcb051a2 100644 --- a/app/views/admin/instances/_dashboard.html.haml +++ b/app/views/admin/instances/_dashboard.html.haml @@ -7,7 +7,7 @@ .dashboard__item = react_admin_component :counter, end_at: period_end_at, - href: admin_accounts_path(origin: 'remote', by_domain: instance_domain), + href: current_user.can?(:manage_users) ? admin_accounts_path(origin: 'remote', by_domain: instance_domain) : nil, label: t('admin.instances.dashboard.instance_accounts_measure'), measure: 'instance_accounts', params: { domain: instance_domain }, @@ -43,7 +43,7 @@ .dashboard__item = react_admin_component :counter, end_at: period_end_at, - href: admin_reports_path(by_target_domain: instance_domain), + href: current_user.can?(:manage_reports) ? admin_reports_path(by_target_domain: instance_domain) : nil, label: t('admin.instances.dashboard.instance_reports_measure'), measure: 'instance_reports', params: { domain: instance_domain }, From 897cb1803e14a4e0eafec44de7ffe37d7a0d2a28 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 12 Nov 2024 03:56:04 -0500 Subject: [PATCH 17/52] Run `bin/rails db:schema:dump` under Rails 7.2 (#32838) --- db/schema.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index ec029366a5..30b16a8a82 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2024_11_04_082851) do +ActiveRecord::Schema[7.2].define(version: 2024_11_04_082851) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -261,10 +261,10 @@ ActiveRecord::Schema[7.1].define(version: 2024_11_04_082851) do end create_table "annual_report_statuses_per_account_counts", force: :cascade do |t| - t.integer "year", null: false - t.bigint "account_id", null: false - t.bigint "statuses_count", null: false - t.index ["year", "account_id"], name: "idx_on_year_account_id_ff3e167cef", unique: true + t.integer "year", null: false + t.bigint "account_id", null: false + t.bigint "statuses_count", null: false + t.index ["year", "account_id"], name: "idx_on_year_account_id_ff3e167cef", unique: true end create_table "appeals", force: :cascade do |t| From 5d9dde3ec04ecd17baa8e6a352599725bd21c3ae Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 12 Nov 2024 03:57:06 -0500 Subject: [PATCH 18/52] Add age/expiry duration constants to `BulkImport` class (#32839) --- app/lib/vacuum/imports_vacuum.rb | 10 ++++++-- app/models/bulk_import.rb | 6 +++++ spec/models/bulk_import_spec.rb | 42 ++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 spec/models/bulk_import_spec.rb diff --git a/app/lib/vacuum/imports_vacuum.rb b/app/lib/vacuum/imports_vacuum.rb index b67865194f..7f101c4506 100644 --- a/app/lib/vacuum/imports_vacuum.rb +++ b/app/lib/vacuum/imports_vacuum.rb @@ -9,10 +9,16 @@ class Vacuum::ImportsVacuum private def clean_unconfirmed_imports! - BulkImport.state_unconfirmed.where(created_at: ..10.minutes.ago).in_batches.delete_all + BulkImport + .confirmation_missed + .in_batches + .delete_all end def clean_old_imports! - BulkImport.where(created_at: ..1.week.ago).in_batches.delete_all + BulkImport + .archival_completed + .in_batches + .delete_all end end diff --git a/app/models/bulk_import.rb b/app/models/bulk_import.rb index 9b3f4c8a3a..e3e46d7b1c 100644 --- a/app/models/bulk_import.rb +++ b/app/models/bulk_import.rb @@ -21,6 +21,9 @@ class BulkImport < ApplicationRecord self.inheritance_column = false + ARCHIVE_PERIOD = 1.week + CONFIRM_PERIOD = 10.minutes + belongs_to :account has_many :rows, class_name: 'BulkImportRow', inverse_of: :bulk_import, dependent: :delete_all @@ -42,6 +45,9 @@ class BulkImport < ApplicationRecord validates :type, presence: true + scope :archival_completed, -> { where(created_at: ..ARCHIVE_PERIOD.ago) } + scope :confirmation_missed, -> { state_unconfirmed.where(created_at: ..CONFIRM_PERIOD.ago) } + def self.progress!(bulk_import_id, imported: false) # Use `increment_counter` so that the incrementation is done atomically in the database BulkImport.increment_counter(:processed_items, bulk_import_id) diff --git a/spec/models/bulk_import_spec.rb b/spec/models/bulk_import_spec.rb new file mode 100644 index 0000000000..a3bd01d2a8 --- /dev/null +++ b/spec/models/bulk_import_spec.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe BulkImport do + describe 'Associations' do + it { is_expected.to belong_to(:account).required } + it { is_expected.to have_many(:rows).class_name('BulkImportRow').inverse_of(:bulk_import).dependent(:delete_all) } + end + + describe 'Validations' do + subject { Fabricate.build :bulk_import } + + it { is_expected.to validate_presence_of(:type) } + end + + describe 'Scopes' do + describe '.archival_completed' do + let!(:old_import) { Fabricate :bulk_import, created_at: 1.month.ago } + let!(:new_import) { Fabricate :bulk_import, created_at: 1.day.ago } + + it 'returns imports which have passed the archive window period' do + expect(described_class.archival_completed) + .to include(old_import) + .and not_include(new_import) + end + end + + describe '.confirmation_missed' do + let!(:old_unconfirmed_import) { Fabricate :bulk_import, created_at: 1.week.ago, state: :unconfirmed } + let!(:old_scheduled_import) { Fabricate :bulk_import, created_at: 1.week.ago, state: :scheduled } + let!(:new_unconfirmed_import) { Fabricate :bulk_import, created_at: 1.minute.ago, state: :unconfirmed } + + it 'returns imports which have passed the confirmation window without confirming' do + expect(described_class.confirmation_missed) + .to include(old_unconfirmed_import) + .and not_include(old_scheduled_import) + .and not_include(new_unconfirmed_import) + end + end + end +end From f8e96e761b8de0d9a0c9ad3664a00225e3984065 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:09:53 +0100 Subject: [PATCH 19/52] Update dependency strong_migrations to v2.1.0 (#32810) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 64abf4d77a..743a78ad54 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -117,7 +117,7 @@ GEM base64 (0.2.0) bcp47_spec (0.2.1) bcrypt (3.1.20) - benchmark (0.3.0) + benchmark (0.4.0) better_errors (2.10.1) erubi (>= 1.0.0) rack (>= 0.9.0) @@ -753,7 +753,7 @@ GEM scenic (1.8.0) activerecord (>= 4.0.0) railties (>= 4.0.0) - securerandom (0.3.1) + securerandom (0.3.2) selenium-webdriver (4.26.0) base64 (~> 0.2) logger (~> 1.4) @@ -795,7 +795,7 @@ GEM stoplight (4.1.0) redlock (~> 1.0) stringio (3.1.1) - strong_migrations (2.0.2) + strong_migrations (2.1.0) activerecord (>= 6.1) swd (1.3.0) activesupport (>= 3) @@ -810,7 +810,7 @@ GEM test-prof (1.4.2) thor (1.3.2) tilt (2.4.0) - timeout (0.4.1) + timeout (0.4.2) tpm-key_attestation (0.12.1) bindata (~> 2.4) openssl (> 2.0) From 32e5e1d3f166062e4939b3fbf25dff5657417893 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 12 Nov 2024 13:35:35 +0100 Subject: [PATCH 20/52] Fix a few visual issues with annual reports in web UI (#32807) --- .../features/annual_report/most_used_hashtag.tsx | 15 ++++++++------- .../features/annual_report/percentile.tsx | 4 ++-- app/javascript/mastodon/locales/en.json | 1 + app/javascript/styles/mastodon-light/diff.scss | 7 +++++++ .../styles/mastodon/annual_reports.scss | 9 +++++++-- 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/app/javascript/mastodon/features/annual_report/most_used_hashtag.tsx b/app/javascript/mastodon/features/annual_report/most_used_hashtag.tsx index 0e4c78f639..4b59b89737 100644 --- a/app/javascript/mastodon/features/annual_report/most_used_hashtag.tsx +++ b/app/javascript/mastodon/features/annual_report/most_used_hashtag.tsx @@ -7,16 +7,17 @@ export const MostUsedHashtag: React.FC<{ }> = ({ data }) => { const hashtag = data[0]; - if (!hashtag) { - return ( -
- ); - } - return (
- #{hashtag.name} + {hashtag ? ( + <>#{hashtag.name} + ) : ( + + )}
(
), diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 5bc8c4ad71..9728528f8e 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name}'s", "annual_report.summary.most_used_app.most_used_app": "most used app", "annual_report.summary.most_used_hashtag.most_used_hashtag": "most used hashtag", + "annual_report.summary.most_used_hashtag.none": "None", "annual_report.summary.new_posts.new_posts": "new posts", "annual_report.summary.percentile.text": "That puts you in the topof Mastodon users.", "annual_report.summary.percentile.we_wont_tell_bernie": "We won't tell Bernie.", diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index 45da56994c..3d4539bb9d 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -535,3 +535,10 @@ a.sparkline { ::-webkit-scrollbar-thumb { opacity: 0.25; } + +.notification-group--annual-report { + .notification-group__icon, + .notification-group__main .link-button { + color: var(--indigo-3); + } +} diff --git a/app/javascript/styles/mastodon/annual_reports.scss b/app/javascript/styles/mastodon/annual_reports.scss index 39784e3b5e..dff1c76eca 100644 --- a/app/javascript/styles/mastodon/annual_reports.scss +++ b/app/javascript/styles/mastodon/annual_reports.scss @@ -103,6 +103,11 @@ background-color: var(--goldenrod-2); } } + + .status-card, + .hashtag-bar { + display: none; + } } &__followers { @@ -237,7 +242,7 @@ } &__number { - font-size: 61px; + font-size: 54px; font-weight: 600; line-height: 73px; color: var(--goldenrod-2); @@ -306,7 +311,7 @@ } .annual-report-modal { - max-width: 480px; + max-width: 600px; background: var(--indigo-1); border-radius: 16px; display: flex; From f5f6273d2badd896cb6ca39ccdd645c339354fa2 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 12 Nov 2024 14:00:52 +0100 Subject: [PATCH 21/52] Move `ALLOWED_PRIVATE_ADDRESSES` parsing to an initializer (#32850) --- app/lib/request.rb | 6 +----- config/initializers/allowed_private_addresses.rb | 5 +++++ 2 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 config/initializers/allowed_private_addresses.rb diff --git a/app/lib/request.rb b/app/lib/request.rb index d7da9fe63c..a12e6e3747 100644 --- a/app/lib/request.rb +++ b/app/lib/request.rb @@ -334,14 +334,10 @@ class Request def check_private_address(address, host) addr = IPAddr.new(address.to_s) - return if Rails.env.development? || private_address_exceptions.any? { |range| range.include?(addr) } + return if Rails.env.development? || Rails.configuration.x.private_address_exceptions.any? { |range| range.include?(addr) } raise Mastodon::PrivateNetworkAddressError, host if PrivateAddressCheck.private_address?(addr) end - - def private_address_exceptions - @private_address_exceptions = (ENV['ALLOWED_PRIVATE_ADDRESSES'] || '').split(/(?:\s*,\s*|\s+)/).map { |addr| IPAddr.new(addr) } - end end end diff --git a/config/initializers/allowed_private_addresses.rb b/config/initializers/allowed_private_addresses.rb new file mode 100644 index 0000000000..65c7af03b4 --- /dev/null +++ b/config/initializers/allowed_private_addresses.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +Rails.application.configure do + config.x.private_address_exceptions = (ENV['ALLOWED_PRIVATE_ADDRESSES'] || '').split(/(?:\s*,\s*|\s+)/).map { |addr| IPAddr.new(addr) } +end From 884bbf7ae239a9b07055e1a7d0238b213c2c8520 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 12 Nov 2024 10:43:55 -0500 Subject: [PATCH 22/52] Prepare the way for banning a bunch of usernames (#32856) --- spec/lib/feed_manager_spec.rb | 16 ++++++++-------- .../models/concerns/account/interactions_spec.rb | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/spec/lib/feed_manager_spec.rb b/spec/lib/feed_manager_spec.rb index 1d70499674..afb007af42 100644 --- a/spec/lib/feed_manager_spec.rb +++ b/spec/lib/feed_manager_spec.rb @@ -343,16 +343,16 @@ RSpec.describe FeedManager do end describe '#push_to_list' do - let(:owner) { Fabricate(:account, username: 'owner') } + let(:list_owner) { Fabricate(:account, username: 'list_owner') } let(:alice) { Fabricate(:account, username: 'alice') } let(:bob) { Fabricate(:account, username: 'bob') } let(:eve) { Fabricate(:account, username: 'eve') } - let(:list) { Fabricate(:list, account: owner) } + let(:list) { Fabricate(:list, account: list_owner) } before do - owner.follow!(alice) - owner.follow!(bob) - owner.follow!(eve) + list_owner.follow!(alice) + list_owner.follow!(bob) + list_owner.follow!(eve) list.accounts << alice list.accounts << bob @@ -377,7 +377,7 @@ RSpec.describe FeedManager do end it 'pushes statuses that are replies to list owner' do - status = Fabricate(:status, text: 'Hello world', account: owner) + status = Fabricate(:status, text: 'Hello world', account: list_owner) reply = Fabricate(:status, text: 'Nay', thread: status, account: bob) expect(subject.push_to_list(list, reply)).to be true end @@ -400,7 +400,7 @@ RSpec.describe FeedManager do end it 'pushes statuses that are replies to list owner' do - status = Fabricate(:status, text: 'Hello world', account: owner) + status = Fabricate(:status, text: 'Hello world', account: list_owner) reply = Fabricate(:status, text: 'Nay', thread: status, account: bob) expect(subject.push_to_list(list, reply)).to be true end @@ -429,7 +429,7 @@ RSpec.describe FeedManager do end it 'pushes statuses that are replies to list owner' do - status = Fabricate(:status, text: 'Hello world', account: owner) + status = Fabricate(:status, text: 'Hello world', account: list_owner) reply = Fabricate(:status, text: 'Nay', thread: status, account: bob) expect(subject.push_to_list(list, reply)).to be true end diff --git a/spec/models/concerns/account/interactions_spec.rb b/spec/models/concerns/account/interactions_spec.rb index 4868054df7..f7ec3a3912 100644 --- a/spec/models/concerns/account/interactions_spec.rb +++ b/spec/models/concerns/account/interactions_spec.rb @@ -3,10 +3,10 @@ require 'rails_helper' RSpec.describe Account::Interactions do - let(:account) { Fabricate(:account, username: 'account') } + let(:account) { Fabricate(:account) } let(:account_id) { account.id } let(:account_ids) { [account_id] } - let(:target_account) { Fabricate(:account, username: 'target') } + let(:target_account) { Fabricate(:account) } let(:target_account_id) { target_account.id } let(:target_account_ids) { [target_account_id] } From ace426830879b9f4f34fe80430be4ac3235f8c01 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 12 Nov 2024 12:27:23 -0500 Subject: [PATCH 23/52] Remove unused `api/v1/polls#create` route (#32860) --- config/routes/api.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes/api.rb b/config/routes/api.rb index 95fdf332a0..86e41a2abe 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -225,7 +225,7 @@ namespace :api, format: false do resources :featured_tags, only: [:index, :create, :destroy] - resources :polls, only: [:create, :show] do + resources :polls, only: [:show] do resources :votes, only: :create, module: :polls end From 2bd56f726a99472b722f9ffafc7c2e4c6ea57350 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Tue, 12 Nov 2024 23:06:13 +0100 Subject: [PATCH 24/52] Add client_secret_expires_at to OAuth Applications (#30317) --- app/serializers/rest/credential_application_serializer.rb | 8 +++++++- spec/requests/api/v1/apps/credentials_spec.rb | 1 + spec/requests/api/v1/apps_spec.rb | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/serializers/rest/credential_application_serializer.rb b/app/serializers/rest/credential_application_serializer.rb index bfec7d03e8..0532390c9a 100644 --- a/app/serializers/rest/credential_application_serializer.rb +++ b/app/serializers/rest/credential_application_serializer.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class REST::CredentialApplicationSerializer < REST::ApplicationSerializer - attributes :client_id, :client_secret + attributes :client_id, :client_secret, :client_secret_expires_at def client_id object.uid @@ -10,4 +10,10 @@ class REST::CredentialApplicationSerializer < REST::ApplicationSerializer def client_secret object.secret end + + # Added for future forwards compatibility when we may decide to expire OAuth + # Applications. Set to zero means that the client_secret never expires. + def client_secret_expires_at + 0 + end end diff --git a/spec/requests/api/v1/apps/credentials_spec.rb b/spec/requests/api/v1/apps/credentials_spec.rb index 8e5fa14b7e..3aca53ed0a 100644 --- a/spec/requests/api/v1/apps/credentials_spec.rb +++ b/spec/requests/api/v1/apps/credentials_spec.rb @@ -44,6 +44,7 @@ RSpec.describe 'Credentials' do expect(response.parsed_body) .to not_include(client_id: be_present) .and not_include(client_secret: be_present) + .and not_include(client_secret_expires_at: be_present) end end diff --git a/spec/requests/api/v1/apps_spec.rb b/spec/requests/api/v1/apps_spec.rb index cf43e14d62..4e9147ba32 100644 --- a/spec/requests/api/v1/apps_spec.rb +++ b/spec/requests/api/v1/apps_spec.rb @@ -42,6 +42,7 @@ RSpec.describe 'Apps' do id: app.id.to_s, client_id: app.uid, client_secret: app.secret, + client_secret_expires_at: 0, name: client_name, website: website, scopes: ['read', 'write'], From a6d829e86fb228be6a8ed8f19b2276e07d5a89e2 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Nov 2024 03:39:58 -0500 Subject: [PATCH 25/52] Fix error in CLI EmailDomainBlocks when supplying `--with-dns-records` (#32863) --- lib/mastodon/cli/email_domain_blocks.rb | 2 +- .../lib/mastodon/cli/email_domain_blocks_spec.rb | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/mastodon/cli/email_domain_blocks.rb b/lib/mastodon/cli/email_domain_blocks.rb index 7b2da8ef9f..a830ca3661 100644 --- a/lib/mastodon/cli/email_domain_blocks.rb +++ b/lib/mastodon/cli/email_domain_blocks.rb @@ -48,7 +48,7 @@ module Mastodon::CLI if options[:with_dns_records] Resolv::DNS.open do |dns| dns.timeouts = 5 - other_domains = dns.getresources(@email_domain_block.domain, Resolv::DNS::Resource::IN::MX).to_a + other_domains = dns.getresources(domain, Resolv::DNS::Resource::IN::MX).to_a.map { |e| e.exchange.to_s }.compact_blank end end diff --git a/spec/lib/mastodon/cli/email_domain_blocks_spec.rb b/spec/lib/mastodon/cli/email_domain_blocks_spec.rb index a5fbd23e65..6ce1a7c5f3 100644 --- a/spec/lib/mastodon/cli/email_domain_blocks_spec.rb +++ b/spec/lib/mastodon/cli/email_domain_blocks_spec.rb @@ -63,6 +63,22 @@ RSpec.describe Mastodon::CLI::EmailDomainBlocks do .and(change(EmailDomainBlock, :count).by(1)) end end + + context 'with --with-dns-records true' do + let(:domain) { 'host.example' } + let(:arguments) { [domain] } + let(:options) { { with_dns_records: true } } + + before do + configure_mx(domain: domain, exchange: 'other.host') + end + + it 'adds a new block for parent and children' do + expect { subject } + .to output_results('Added 2') + .and(change(EmailDomainBlock, :count).by(2)) + end + end end describe '#remove' do From baad7953849307fa4a6bcdd878b9b2207226352d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 13 Nov 2024 10:33:02 +0100 Subject: [PATCH 26/52] New Crowdin Translations (automated) (#32868) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/ca.json | 1 + app/javascript/mastodon/locales/da.json | 1 + app/javascript/mastodon/locales/de.json | 1 + app/javascript/mastodon/locales/eo.json | 11 ++-- app/javascript/mastodon/locales/es-AR.json | 1 + app/javascript/mastodon/locales/es-MX.json | 5 +- app/javascript/mastodon/locales/es.json | 1 + app/javascript/mastodon/locales/fi.json | 13 +++++ app/javascript/mastodon/locales/fo.json | 1 + app/javascript/mastodon/locales/gl.json | 8 +++ app/javascript/mastodon/locales/hu.json | 1 + app/javascript/mastodon/locales/is.json | 1 + app/javascript/mastodon/locales/ko.json | 1 + app/javascript/mastodon/locales/nl.json | 1 + app/javascript/mastodon/locales/nn.json | 22 +++++++ app/javascript/mastodon/locales/pt-BR.json | 1 + app/javascript/mastodon/locales/ru.json | 4 ++ app/javascript/mastodon/locales/sq.json | 1 + app/javascript/mastodon/locales/sv.json | 1 + app/javascript/mastodon/locales/tr.json | 1 + app/javascript/mastodon/locales/uk.json | 1 + app/javascript/mastodon/locales/vi.json | 1 + app/javascript/mastodon/locales/zh-CN.json | 1 + app/javascript/mastodon/locales/zh-TW.json | 1 + config/locales/ca.yml | 8 +++ config/locales/da.yml | 8 +++ config/locales/de.yml | 8 +++ config/locales/fi.yml | 10 +++- config/locales/fo.yml | 8 +++ config/locales/gl.yml | 8 +++ config/locales/hu.yml | 8 +++ config/locales/is.yml | 8 +++ config/locales/ko.yml | 8 +++ config/locales/lt.yml | 8 +++ config/locales/nn.yml | 11 ++++ config/locales/pt-BR.yml | 16 ++++- config/locales/ru.yml | 68 ++++++++++++---------- config/locales/simple_form.ko.yml | 2 +- config/locales/simple_form.lt.yml | 1 + config/locales/simple_form.nl.yml | 2 +- config/locales/simple_form.nn.yml | 1 + config/locales/simple_form.pl.yml | 1 + config/locales/simple_form.ru.yml | 1 + config/locales/simple_form.sv.yml | 1 + config/locales/sq.yml | 8 +++ config/locales/sv.yml | 16 +++-- config/locales/tr.yml | 8 +++ config/locales/vi.yml | 8 +++ config/locales/zh-CN.yml | 8 +++ config/locales/zh-TW.yml | 10 +++- 50 files changed, 278 insertions(+), 47 deletions(-) diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 160a74af4f..53bfc4474c 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -97,6 +97,7 @@ "annual_report.summary.highlighted_post.possessive": "de {name}", "annual_report.summary.most_used_app.most_used_app": "l'aplicació més utilitzada", "annual_report.summary.most_used_hashtag.most_used_hashtag": "l'etiqueta més utilitzada", + "annual_report.summary.most_used_hashtag.none": "Cap", "annual_report.summary.new_posts.new_posts": "publicacions noves", "annual_report.summary.thanks": "Gràcies per formar part de Mastodon!", "attachments_list.unprocessed": "(sense processar)", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 927d0a7cb8..4ba1f4d9e1 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name}s", "annual_report.summary.most_used_app.most_used_app": "mest benyttede app", "annual_report.summary.most_used_hashtag.most_used_hashtag": "mest benyttede hashtag", + "annual_report.summary.most_used_hashtag.none": "Intet", "annual_report.summary.new_posts.new_posts": "nye indlæg", "annual_report.summary.percentile.text": "Det betyder, at man er i topaf Mastodon-brugere.", "annual_report.summary.percentile.we_wont_tell_bernie": "Vi fortæller det ikke til Bernie.", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index e7679a363c..bd24ccd48f 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name}", "annual_report.summary.most_used_app.most_used_app": "am häufigsten verwendete App", "annual_report.summary.most_used_hashtag.most_used_hashtag": "am häufigsten verwendeter Hashtag", + "annual_report.summary.most_used_hashtag.none": "Kein", "annual_report.summary.new_posts.new_posts": "neue Beiträge", "annual_report.summary.percentile.text": "Damit gehörst du zu den oberstender Mastodon-Nutzer*innen.", "annual_report.summary.percentile.we_wont_tell_bernie": "Wir werden Bernie nichts verraten.", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 757bb39866..731e11f27a 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -90,6 +90,7 @@ "annual_report.summary.archetype.replier": "La plej societema", "annual_report.summary.followers.followers": "sekvantoj", "annual_report.summary.highlighted_post.by_replies": "afiŝo kun la plej multaj respondoj", + "annual_report.summary.most_used_hashtag.none": "Nenio", "annual_report.summary.new_posts.new_posts": "novaj afiŝoj", "annual_report.summary.thanks": "Dankon pro esti parto de Mastodon!", "attachments_list.unprocessed": "(neprilaborita)", @@ -219,7 +220,7 @@ "dismissable_banner.community_timeline": "Jen la plej novaj publikaj afiŝoj de uzantoj, kies kontojn gastigas {domain}.", "dismissable_banner.dismiss": "Eksigi", "dismissable_banner.explore_links": "Tiuj novaĵoj estas aktuale priparolataj de uzantoj en tiu ĉi kaj aliaj serviloj, sur la malcentrigita reto.", - "dismissable_banner.explore_statuses": "Ĉi tiuj estas afiŝoj de la tuta socia reto, kiuj populariĝas hodiaŭ. Pli novaj afiŝoj kun pli da diskonigoj kaj plej ŝatataj estas rangigitaj pli alte.", + "dismissable_banner.explore_statuses": "Jen afiŝoj en la socia reto kiuj populariĝis hodiaŭ. Novaj afiŝoj kun pli da diskonigoj kaj stelumoj aperas pli alte.", "dismissable_banner.explore_tags": "Ĉi tiuj kradvostoj populariĝas en ĉi tiu kaj aliaj serviloj en la malcentraliza reto nun.", "dismissable_banner.public_timeline": "Ĉi tiuj estas la plej lastatempaj publikaj afiŝoj de homoj en la socia reto, kiujn homoj sur {domain} sekvas.", "domain_block_modal.block": "Bloki servilon", @@ -646,7 +647,7 @@ "onboarding.start.lead": "Vi nun estas parto de Mastodon, unika, malcentralizita socia amaskomunikilara platformo, kie vi—ne algoritmo—zorgas vian propran sperton. Ni komencu vin sur ĉi tiu nova socia limo:", "onboarding.start.skip": "Ĉu vi ne bezonas helpon por komenci?", "onboarding.start.title": "Vi atingas ĝin!", - "onboarding.steps.follow_people.body": "Sekvi interesajn homojn estas pri kio Mastodonto temas.", + "onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", "onboarding.steps.follow_people.title": "Agordu vian hejman fluon", "onboarding.steps.publish_status.body": "Salutu la mondon per teksto, fotoj, filmetoj aŭ balotenketoj {emoji}", "onboarding.steps.publish_status.title": "Fari vian unuan afiŝon", @@ -780,9 +781,9 @@ "server_banner.is_one_of_many": "{domain} estas unu el la multaj sendependaj Mastodon-serviloj, kiujn vi povas uzi por partopreni en la fediverso.", "server_banner.server_stats": "Statistikoj de la servilo:", "sign_in_banner.create_account": "Krei konton", - "sign_in_banner.follow_anyone": "Sekvi iun ajn tra la fediverso kaj vidi ĉion en kronologia ordo. Neniuj algoritmoj, reklamoj aŭ klakbetoj videblas.", - "sign_in_banner.mastodon_is": "Mastodonto estas la plej bona maniero por resti flank-al-flanke kun kio okazas.", - "sign_in_banner.sign_in": "Saluti", + "sign_in_banner.follow_anyone": "Sekvu iun ajn tra la fediverso kaj vidu ĉion laŭ templinio. Nul algoritmo, reklamo aŭ kliklogilo ĉeestas.", + "sign_in_banner.mastodon_is": "Mastodon estas la plej bona maniero resti ĝisdata pri aktualaĵoj.", + "sign_in_banner.sign_in": "Ensaluti", "sign_in_banner.sso_redirect": "Ensalutu aŭ Registriĝi", "status.admin_account": "Malfermi fasadon de moderigado por @{name}", "status.admin_domain": "Malfermu moderigan interfacon por {domain}", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 9dc7b0d6c0..406c526983 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name}", "annual_report.summary.most_used_app.most_used_app": "la aplicación más usada", "annual_report.summary.most_used_hashtag.most_used_hashtag": "la etiqueta más usada", + "annual_report.summary.most_used_hashtag.none": "Ninguna", "annual_report.summary.new_posts.new_posts": "nuevos mensajes", "annual_report.summary.percentile.text": "Eso te pone en la cimade los usuarios de Mastodon.", "annual_report.summary.percentile.we_wont_tell_bernie": "No se lo diremos a Bernie.", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 4faa35e5c8..63dc31c6df 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -89,9 +89,9 @@ "announcement.announcement": "Anuncio", "annual_report.summary.archetype.booster": "El cazador de tendencias", "annual_report.summary.archetype.lurker": "El acechador", - "annual_report.summary.archetype.oracle": "El oráculo", + "annual_report.summary.archetype.oracle": "El oraculo", "annual_report.summary.archetype.pollster": "El encuestador", - "annual_report.summary.archetype.replier": "El más sociable", + "annual_report.summary.archetype.replier": "La mariposa sociable", "annual_report.summary.followers.followers": "seguidores", "annual_report.summary.followers.total": "{count} en total", "annual_report.summary.here_it_is": "Aquí está tu resumen de {year}:", @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "de {name}", "annual_report.summary.most_used_app.most_used_app": "aplicación más usada", "annual_report.summary.most_used_hashtag.most_used_hashtag": "etiqueta más usada", + "annual_report.summary.most_used_hashtag.none": "Ninguna", "annual_report.summary.new_posts.new_posts": "nuevas publicaciones", "annual_report.summary.percentile.text": "Eso te pone en el topde usuarios de Mastodon.", "annual_report.summary.percentile.we_wont_tell_bernie": "No se lo diremos a Bernie.", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index d14b718016..258b19f411 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "de {name}", "annual_report.summary.most_used_app.most_used_app": "aplicación más usada", "annual_report.summary.most_used_hashtag.most_used_hashtag": "etiqueta más usada", + "annual_report.summary.most_used_hashtag.none": "Ninguna", "annual_report.summary.new_posts.new_posts": "nuevas publicaciones", "annual_report.summary.percentile.text": "Eso te pone en el topde usuarios de Mastodon.", "annual_report.summary.percentile.we_wont_tell_bernie": "No se lo diremos a Bernie.", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 32069b1a03..2763c39168 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -87,10 +87,22 @@ "alert.unexpected.title": "Hups!", "alt_text_badge.title": "Vaihtoehtoinen teksti", "announcement.announcement": "Tiedote", + "annual_report.summary.archetype.booster": "Tehostaja", + "annual_report.summary.archetype.lurker": "Lymyilijä", + "annual_report.summary.archetype.oracle": "Oraakkeli", + "annual_report.summary.archetype.pollster": "Mielipidetutkija", "annual_report.summary.archetype.replier": "Sosiaalinen perhonen", + "annual_report.summary.followers.followers": "seuraajaa", + "annual_report.summary.followers.total": "{count} yhteensä", + "annual_report.summary.here_it_is": "Tässä on katsaus vuoteesi {year}:", + "annual_report.summary.highlighted_post.by_favourites": "suosikkeihin lisätyin julkaisu", "annual_report.summary.highlighted_post.by_reblogs": "tehostetuin julkaisu", + "annual_report.summary.highlighted_post.by_replies": "julkaisu, jolla on eniten vastauksia", + "annual_report.summary.highlighted_post.possessive": "Käyttäjän {name}", "annual_report.summary.most_used_app.most_used_app": "käytetyin sovellus", "annual_report.summary.most_used_hashtag.most_used_hashtag": "käytetyin aihetunniste", + "annual_report.summary.new_posts.new_posts": "uutta julkaisua", + "annual_report.summary.percentile.text": "Olet osa huippujoukkoa, johon kuuluuMastodon-käyttäjistä.", "annual_report.summary.thanks": "Kiitos, että olet osa Mastodonia!", "attachments_list.unprocessed": "(käsittelemätön)", "audio.hide": "Piilota ääni", @@ -513,6 +525,7 @@ "notification.admin.report_statuses_other": "{name} raportoi käyttäjän {target}", "notification.admin.sign_up": "{name} rekisteröityi", "notification.admin.sign_up.name_and_others": "{name} ja {count, plural, one {# muu} other {# muuta}} rekisteröityivät", + "notification.annual_report.message": "Vuoden {year} #Wrapstodon odottaa! Paljasta vuotesi kohokohdat ikimuistoiset hetket Mastodonissa!", "notification.annual_report.view": "Näytä #Wrapstodon", "notification.favourite": "{name} lisäsi julkaisusi suosikkeihinsa", "notification.favourite.name_and_others_with_link": "{name} ja {count, plural, one {# muu} other {# muuta}} lisäsivät julkaisusi suosikkeihinsa", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 6b26ed84fd..789efaa40e 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "hjá {name}", "annual_report.summary.most_used_app.most_used_app": "mest brúkta app", "annual_report.summary.most_used_hashtag.most_used_hashtag": "mest brúkta frámerki", + "annual_report.summary.most_used_hashtag.none": "Einki", "annual_report.summary.new_posts.new_posts": "nýggir postar", "annual_report.summary.percentile.text": "Tað fær teg í toppav Mastodon brúkarum.", "annual_report.summary.percentile.we_wont_tell_bernie": "Vit fara ikki at fortelja Bernie tað.", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 23f444715b..c69a431f4b 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -87,6 +87,11 @@ "alert.unexpected.title": "Vaites!", "alt_text_badge.title": "Texto Alt", "announcement.announcement": "Anuncio", + "annual_report.summary.archetype.booster": "A axencia de noticias", + "annual_report.summary.archetype.lurker": "Volleur", + "annual_report.summary.archetype.oracle": "Sabichón/e", + "annual_report.summary.archetype.pollster": "O INE", + "annual_report.summary.archetype.replier": "Lareteire", "annual_report.summary.followers.followers": "seguidoras", "annual_report.summary.followers.total": "{count} en total", "annual_report.summary.here_it_is": "Este é o resumo do teu {year}:", @@ -96,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "de {name}", "annual_report.summary.most_used_app.most_used_app": "app que mais usaches", "annual_report.summary.most_used_hashtag.most_used_hashtag": "o cancelo mais utilizado", + "annual_report.summary.most_used_hashtag.none": "Nada", "annual_report.summary.new_posts.new_posts": "novas publicacións", "annual_report.summary.percentile.text": "Sitúante no top das usuarias de Mastodon.", "annual_report.summary.thanks": "Grazas por ser parte de Mastodon!", @@ -520,6 +526,8 @@ "notification.admin.report_statuses_other": "{name} denunciou a {target}", "notification.admin.sign_up": "{name} rexistrouse", "notification.admin.sign_up.name_and_others": "{name} e {count, plural, one {# máis} other {# máis}} crearon unha conta", + "notification.annual_report.message": "A #VidaEnMastodon de {year} agarda por ti! Desvela os momentos máis destacados e historias reseñables en Mastodon!", + "notification.annual_report.view": "Ver #VidaEnMastodon", "notification.favourite": "{name} marcou como favorita a túa publicación", "notification.favourite.name_and_others_with_link": "{name} e {count, plural, one {# máis} other {# máis}} favoreceron a túa publicación", "notification.follow": "{name} comezou a seguirte", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index cdc113d8d7..2ba7aef34b 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name} fióktól", "annual_report.summary.most_used_app.most_used_app": "legtöbbet használt app", "annual_report.summary.most_used_hashtag.most_used_hashtag": "legtöbbet használt hashtag", + "annual_report.summary.most_used_hashtag.none": "Nincs", "annual_report.summary.new_posts.new_posts": "új bejegyzés", "annual_report.summary.percentile.text": "Ezzel acsúcs Mastodon felhasználó között vagy.", "annual_report.summary.percentile.we_wont_tell_bernie": "Nem mondjuk el Bernie-nek.", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index adc86faf40..ecfc642969 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name}", "annual_report.summary.most_used_app.most_used_app": "mest notaða forrit", "annual_report.summary.most_used_hashtag.most_used_hashtag": "mest notaða myllumerki", + "annual_report.summary.most_used_hashtag.none": "Ekkert", "annual_report.summary.new_posts.new_posts": "nýjar færslur", "annual_report.summary.percentile.text": "Það setur þig á meðal efstunotenda Mastodon.", "annual_report.summary.percentile.we_wont_tell_bernie": "Við förum ekkert að raupa um þetta.", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index b5c8d4bd21..43f1e59e5e 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name} 님의", "annual_report.summary.most_used_app.most_used_app": "가장 많이 사용한 앱", "annual_report.summary.most_used_hashtag.most_used_hashtag": "가장 많이 사용한 해시태그", + "annual_report.summary.most_used_hashtag.none": "없음", "annual_report.summary.new_posts.new_posts": "새 게시물", "annual_report.summary.percentile.text": "마스토돈 사용자의 상위입니다.", "annual_report.summary.percentile.we_wont_tell_bernie": "엄마한테 말 안 할게요.", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index b66fcf09c0..eb21d2ad1d 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name}'s", "annual_report.summary.most_used_app.most_used_app": "meest gebruikte app", "annual_report.summary.most_used_hashtag.most_used_hashtag": "meest gebruikte hashtag", + "annual_report.summary.most_used_hashtag.none": "Geen", "annual_report.summary.new_posts.new_posts": "nieuwe berichten", "annual_report.summary.percentile.text": "Dat zet je in de topvan Mastodon-gebruikers.", "annual_report.summary.percentile.we_wont_tell_bernie": "We zullen Bernie niets vertellen.", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index cc56754193..b45ff90585 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -87,6 +87,24 @@ "alert.unexpected.title": "Oi sann!", "alt_text_badge.title": "Alternativ tekst", "announcement.announcement": "Kunngjering", + "annual_report.summary.archetype.booster": "Den som jaktar på noko kult", + "annual_report.summary.archetype.lurker": "Den som heng på hjørnet", + "annual_report.summary.archetype.oracle": "Orakelet", + "annual_report.summary.archetype.pollster": "Meiningsmålaren", + "annual_report.summary.archetype.replier": "Den sosiale sumarfuglen", + "annual_report.summary.followers.followers": "fylgjarar", + "annual_report.summary.followers.total": "{count} i alt", + "annual_report.summary.here_it_is": "Her er eit gjensyn med {year}:", + "annual_report.summary.highlighted_post.by_favourites": "det mest omtykte innlegget", + "annual_report.summary.highlighted_post.by_reblogs": "det mest framheva innlegget", + "annual_report.summary.highlighted_post.by_replies": "innlegget med flest svar", + "annual_report.summary.highlighted_post.possessive": "som {name} laga", + "annual_report.summary.most_used_app.most_used_app": "mest brukte app", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "mest brukte emneknagg", + "annual_report.summary.new_posts.new_posts": "nye innlegg", + "annual_report.summary.percentile.text": "Du er av deiivrigaste Mastodon-brukarane.", + "annual_report.summary.percentile.we_wont_tell_bernie": "Ikkje eit ord til pressa.", + "annual_report.summary.thanks": "Takk for at du er med i Mastodon!", "attachments_list.unprocessed": "(ubehandla)", "audio.hide": "Gøym lyd", "block_modal.remote_users_caveat": "Me vil be tenaren {domain} om å respektere di avgjerd. Me kan ikkje garantera at det vert gjort, sidan nokre tenarar kan handtera blokkering ulikt. Offentlege innlegg kan framleis vera synlege for ikkje-innlogga brukarar.", @@ -197,6 +215,7 @@ "confirmations.unfollow.title": "Slutt å fylgja brukaren?", "content_warning.hide": "Gøym innlegg", "content_warning.show": "Vis likevel", + "content_warning.show_more": "Vis meir", "conversation.delete": "Slett samtale", "conversation.mark_as_read": "Marker som lesen", "conversation.open": "Sjå samtale", @@ -305,6 +324,7 @@ "filter_modal.select_filter.subtitle": "Bruk ein eksisterande kategori eller opprett ein ny", "filter_modal.select_filter.title": "Filtrer dette innlegget", "filter_modal.title.status": "Filtrer eit innlegg", + "filter_warning.matches_filter": "Passar med filteret «{title}»", "filtered_notifications_banner.pending_requests": "Frå {count, plural, =0 {ingen} one {éin person} other {# personar}} du kanskje kjenner", "filtered_notifications_banner.title": "Filtrerte varslingar", "firehose.all": "Alle", @@ -506,6 +526,8 @@ "notification.admin.report_statuses_other": "{name} rapporterte {target}", "notification.admin.sign_up": "{name} er registrert", "notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# annan} other {# andre}} vart med", + "notification.annual_report.message": "#Året ditt for {year} ventar! Sjå kva som skjedde i løpet av Mastodon-året ditt!", + "notification.annual_report.view": "Sjå #Året ditt", "notification.favourite": "{name} markerte innlegget ditt som favoritt", "notification.favourite.name_and_others_with_link": "{name} og {count, plural, one {# annan} other {# andre}} favorittmerka innlegget ditt", "notification.follow": "{name} fylgde deg", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 5e69741f20..e2fbaff02b 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name}", "annual_report.summary.most_used_app.most_used_app": "aplicativo mais usado", "annual_report.summary.most_used_hashtag.most_used_hashtag": "hashtag mais usada", + "annual_report.summary.most_used_hashtag.none": "Nenhuma", "annual_report.summary.new_posts.new_posts": "novas publicações", "annual_report.summary.percentile.text": "Isso o coloca no topodos usuários de Mastodon.", "annual_report.summary.percentile.we_wont_tell_bernie": "Não contaremos à Bernie.", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index f5617550e1..e336e39e01 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -89,9 +89,11 @@ "announcement.announcement": "Объявление", "annual_report.summary.archetype.booster": "Репостер", "annual_report.summary.archetype.lurker": "Молчун", + "annual_report.summary.archetype.oracle": "Шаман", "annual_report.summary.archetype.pollster": "Опросчик", "annual_report.summary.archetype.replier": "Душа компании", "annual_report.summary.followers.followers": "подписчиков", + "annual_report.summary.followers.total": "{count} за всё время", "annual_report.summary.here_it_is": "Вот ваши итоги {year} года:", "annual_report.summary.highlighted_post.by_favourites": "пост с наибольшим количеством звёздочек", "annual_report.summary.highlighted_post.by_reblogs": "пост с наибольшим количеством продвижений", @@ -99,7 +101,9 @@ "annual_report.summary.highlighted_post.possessive": "{name}", "annual_report.summary.most_used_app.most_used_app": "наиболее часто используемое приложение", "annual_report.summary.most_used_hashtag.most_used_hashtag": "наиболее часто используемый хэштег", + "annual_report.summary.most_used_hashtag.none": "Нет", "annual_report.summary.new_posts.new_posts": "новых постов", + "annual_report.summary.percentile.text": "Всё это помещает вас в топпользователей Mastodon.", "annual_report.summary.thanks": "Спасибо за то, что были вместе с Mastodon!", "attachments_list.unprocessed": "(не обработан)", "audio.hide": "Скрыть аудио", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 0faee304c6..d1d92c69f6 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -96,6 +96,7 @@ "annual_report.summary.highlighted_post.possessive": "nga {name}", "annual_report.summary.most_used_app.most_used_app": "aplikacioni më i përdorur", "annual_report.summary.most_used_hashtag.most_used_hashtag": "hashtag-u më i përdorur", + "annual_report.summary.most_used_hashtag.none": "Asnjë", "annual_report.summary.new_posts.new_posts": "postime të reja", "annual_report.summary.percentile.text": "Kjo ju vë në kryetë përdoruesve të Mastodon-it.", "annual_report.summary.percentile.we_wont_tell_bernie": "Nuk do t’ia themi Bernit.", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index ef2d912c00..df24db9634 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name}s", "annual_report.summary.most_used_app.most_used_app": "mest använda app", "annual_report.summary.most_used_hashtag.most_used_hashtag": "mest använda hashtag", + "annual_report.summary.most_used_hashtag.none": "Inga", "annual_report.summary.new_posts.new_posts": "nya inlägg", "annual_report.summary.percentile.text": "Det placerar dig i toppav Mastodon-användare.", "annual_report.summary.percentile.we_wont_tell_bernie": "Vi berättar inte för Bernie.", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 4699b9f4bd..ece97614ad 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name}", "annual_report.summary.most_used_app.most_used_app": "en çok kullanılan uygulama", "annual_report.summary.most_used_hashtag.most_used_hashtag": "en çok kullanılan etiket", + "annual_report.summary.most_used_hashtag.none": "Yok", "annual_report.summary.new_posts.new_posts": "yeni gönderiler", "annual_report.summary.percentile.text": "Mastodon kullanıcılarınınüst dilimindesiniz.", "annual_report.summary.percentile.we_wont_tell_bernie": "Bernie'ye söylemeyiz.", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index dcbf8cec58..0e0906eb37 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name}", "annual_report.summary.most_used_app.most_used_app": "найчастіше використовуваний застосунок", "annual_report.summary.most_used_hashtag.most_used_hashtag": "найчастіший хештег", + "annual_report.summary.most_used_hashtag.none": "Немає", "annual_report.summary.new_posts.new_posts": "нові дописи", "annual_report.summary.percentile.text": "Це виводить вас в топ користувачів Mastodon.", "annual_report.summary.percentile.we_wont_tell_bernie": "Ми не скажемо Bernie.", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 2b5401a878..73016ed8c9 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name}", "annual_report.summary.most_used_app.most_used_app": "app dùng nhiều nhất", "annual_report.summary.most_used_hashtag.most_used_hashtag": "hashtag dùng nhiều nhất", + "annual_report.summary.most_used_hashtag.none": "Không có", "annual_report.summary.new_posts.new_posts": "tút mới", "annual_report.summary.percentile.text": "Bạn nằm trong topthành viên Mastodon.", "annual_report.summary.percentile.we_wont_tell_bernie": "Chúng tôi sẽ không kể cho Bernie.", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 57b2011bb1..887410dd51 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name} 的", "annual_report.summary.most_used_app.most_used_app": "最常用的应用", "annual_report.summary.most_used_hashtag.most_used_hashtag": "最常用的话题", + "annual_report.summary.most_used_hashtag.none": "无", "annual_report.summary.new_posts.new_posts": "新发嘟", "annual_report.summary.percentile.text": "这使你跻身 Mastodon 用户的前", "annual_report.summary.percentile.we_wont_tell_bernie": "我们打死也不会告诉Bernie。", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 91d7f6e45d..56ddd9745e 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name} 的", "annual_report.summary.most_used_app.most_used_app": "最常使用的應用程式", "annual_report.summary.most_used_hashtag.most_used_hashtag": "最常使用的主題標籤", + "annual_report.summary.most_used_hashtag.none": "無最常用之主題標籤", "annual_report.summary.new_posts.new_posts": "新嘟文", "annual_report.summary.percentile.text": "這讓您成為前Mastodon 的使用者。", "annual_report.summary.percentile.we_wont_tell_bernie": "我們不會告訴 Bernie。", diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 9d861fa30c..00c8f57a85 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -187,6 +187,7 @@ ca: create_domain_block: Crea un bloqueig de domini create_email_domain_block: Crea un blocatge del domini del correu electrònic create_ip_block: Crear regla IP + create_relay: Crea un repetidor create_unavailable_domain: Crea un domini no disponible create_user_role: Crea Rol demote_user: Degrada l'usuari @@ -198,14 +199,17 @@ ca: destroy_email_domain_block: Elimina el blocatge del domini del correu electrònic destroy_instance: Purga Domini destroy_ip_block: Eliminar regla IP + destroy_relay: Esborra el repetidor destroy_status: Elimina la publicació destroy_unavailable_domain: Esborra domini no disponible destroy_user_role: Destrueix Rol disable_2fa_user: Desactiva 2FA disable_custom_emoji: Desactiva l'emoji personalitzat + disable_relay: Desactiva el repetidor disable_sign_in_token_auth_user: Desactivar l'autenticació de token per correu-e per a l'usuari disable_user: Deshabilita l'usuari enable_custom_emoji: Activa l'emoji personalitzat + enable_relay: Activa el repetidor enable_sign_in_token_auth_user: Activar l'autenticació de token per correu-e per a l'usuari enable_user: Activa l'usuari memorialize_account: Memoritza el compte @@ -247,6 +251,7 @@ ca: create_domain_block_html: "%{name} ha bloquejat el domini %{target}" create_email_domain_block_html: "%{name} ha blocat el domini de correu electrònic %{target}" create_ip_block_html: "%{name} ha creat una regla per a l'IP %{target}" + create_relay_html: "%{name} ha creat un repetidor %{target}" create_unavailable_domain_html: "%{name} ha aturat el lliurament al domini %{target}" create_user_role_html: "%{name} ha creat el rol %{target}" demote_user_html: "%{name} ha degradat l'usuari %{target}" @@ -258,14 +263,17 @@ ca: destroy_email_domain_block_html: "%{name} ha desblocat el domini de correu electrònic %{target}" destroy_instance_html: "%{name} ha purgat el domini %{target}" destroy_ip_block_html: "%{name} ha esborrat la regla per a l'IP %{target}" + destroy_relay_html: "%{name} ha esborrat el repetidor %{target}" destroy_status_html: "%{name} ha eliminat el tut de %{target}" destroy_unavailable_domain_html: "%{name} ha représ el lliurament delivery al domini %{target}" destroy_user_role_html: "%{name} ha esborrat el rol %{target}" disable_2fa_user_html: "%{name} ha desactivat el requisit de dos factors per a l'usuari %{target}" disable_custom_emoji_html: "%{name} ha desactivat l'emoji %{target}" + disable_relay_html: "%{name} ha desactivat el repetidor %{target}" disable_sign_in_token_auth_user_html: "%{name} ha desactivat l'autenticació de token per correu-e per a %{target}" disable_user_html: "%{name} ha desactivat l'accés del usuari %{target}" enable_custom_emoji_html: "%{name} ha activat l'emoji %{target}" + enable_relay_html: "%{name} ha activat el repetidor %{target}" enable_sign_in_token_auth_user_html: "%{name} ha activat l'autenticació de token per correu-e per a %{target}" enable_user_html: "%{name} ha activat l'accés del usuari %{target}" memorialize_account_html: "%{name} ha convertit el compte %{target} en una pàgina de memorial" diff --git a/config/locales/da.yml b/config/locales/da.yml index 6447afb493..daf683637d 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -187,6 +187,7 @@ da: create_domain_block: Opret domæneblokering create_email_domain_block: Opret e-maildomæneblokering create_ip_block: Opret IP-regel + create_relay: Opret Videresendelse create_unavailable_domain: Opret Utilgængeligt Domæne create_user_role: Opret rolle demote_user: Degradér bruger @@ -198,14 +199,17 @@ da: destroy_email_domain_block: Slet e-maildomæneblokering destroy_instance: Udrens domæne destroy_ip_block: Slet IP-regel + destroy_relay: Slet Videresendelse destroy_status: Slet indlæg destroy_unavailable_domain: Slet Utilgængeligt Domæne destroy_user_role: Ødelæg rolle disable_2fa_user: Deaktivér 2FA disable_custom_emoji: Deaktivér tilpasset emoji + disable_relay: Deaktivér Videresendelse disable_sign_in_token_auth_user: Deaktivér e-mailtoken godkendelse for bruger disable_user: Deaktivér bruger enable_custom_emoji: Aktivér tilpasset emoji + enable_relay: Aktivér Relay enable_sign_in_token_auth_user: Aktivér e-mailtoken godkendelse for bruger enable_user: Aktivér bruger memorialize_account: Memoralisér konto @@ -247,6 +251,7 @@ da: create_domain_block_html: "%{name} blokerede domænet %{target}" create_email_domain_block_html: "%{name} blokerede e-maildomænet %{target}" create_ip_block_html: "%{name} oprettede en regel for IP %{target}" + create_relay_html: "%{name} oprettede videresendelsen %{target}" create_unavailable_domain_html: "%{name} stoppede levering til domænet %{target}" create_user_role_html: "%{name} oprettede %{target}-rolle" demote_user_html: "%{name} degraderede brugeren %{target}" @@ -258,14 +263,17 @@ da: destroy_email_domain_block_html: "%{name} afblokerede e-maildomænet %{target}" destroy_instance_html: "%{name} udrensede domænet %{target}" destroy_ip_block_html: "%{name} slettede en regel for IP %{target}" + destroy_relay_html: "%{name} oprettede videresendelsen %{target}" destroy_status_html: "%{name} fjernede indlægget fra %{target}" destroy_unavailable_domain_html: "%{name} genoptog levering til domænet %{target}" destroy_user_role_html: "%{name} slettede %{target}-rolle" disable_2fa_user_html: "%{name} deaktiverede tofaktorkravet for brugeren %{target}" disable_custom_emoji_html: "%{name} deaktiverede emojien %{target}" + disable_relay_html: "%{name} deaktiverede videresendelsen %{target}" disable_sign_in_token_auth_user_html: "%{name} deaktiverede e-mailtoken godkendelsen for %{target}" disable_user_html: "%{name} deaktiverede indlogning for brugeren %{target}" enable_custom_emoji_html: "%{name} aktiverede emojien %{target}" + enable_relay_html: "%{name} aktiverede videresendelsen %{target}" enable_sign_in_token_auth_user_html: "%{name} aktiverede e-mailtoken godkendelse for %{target}" enable_user_html: "%{name} aktiverede indlogning for brugeren %{target}" memorialize_account_html: "%{name} gjorde %{target}s konto til en mindeside" diff --git a/config/locales/de.yml b/config/locales/de.yml index 323579f25f..10223f2278 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -187,6 +187,7 @@ de: create_domain_block: Domain sperren create_email_domain_block: E-Mail-Domain-Sperre erstellen create_ip_block: IP-Regel erstellen + create_relay: Relay erstellen create_unavailable_domain: Nicht verfügbare Domain erstellen create_user_role: Rolle erstellen demote_user: Benutzer*in herabstufen @@ -198,14 +199,17 @@ de: destroy_email_domain_block: E-Mail-Domain-Sperre entfernen destroy_instance: Domain-Daten entfernen destroy_ip_block: IP-Regel löschen + destroy_relay: Relay löschen destroy_status: Beitrag entfernen destroy_unavailable_domain: Nicht-verfügbare Domain entfernen destroy_user_role: Rolle entfernen disable_2fa_user: 2FA deaktivieren disable_custom_emoji: Eigenes Emoji deaktivieren + disable_relay: Relay deaktivieren disable_sign_in_token_auth_user: E-Mail-Token-Authentisierung für dieses Konto deaktivieren disable_user: Benutzer*in deaktivieren enable_custom_emoji: Eigenes Emoji aktivieren + enable_relay: Relay aktivieren enable_sign_in_token_auth_user: E-Mail-Token-Authentisierung für dieses Konto aktivieren enable_user: Benutzer*in aktivieren memorialize_account: Gedenkkonto @@ -247,6 +251,7 @@ de: create_domain_block_html: "%{name} sperrte die Domain %{target}" create_email_domain_block_html: "%{name} sperrte die E-Mail-Domain %{target}" create_ip_block_html: "%{name} erstellte eine IP-Regel für %{target}" + create_relay_html: "%{name} erstellte ein Relay %{target}" create_unavailable_domain_html: "%{name} beendete die Zustellung an die Domain %{target}" create_user_role_html: "%{name} erstellte die Rolle %{target}" demote_user_html: "%{name} stufte %{target} herunter" @@ -258,14 +263,17 @@ de: destroy_email_domain_block_html: "%{name} entsperrte die E-Mail-Domain %{target}" destroy_instance_html: "%{name} entfernte die Daten der Domain %{target} von diesem Server" destroy_ip_block_html: "%{name} entfernte eine IP-Regel für %{target}" + destroy_relay_html: "%{name} löschte das Relay %{target}" destroy_status_html: "%{name} entfernte einen Beitrag von %{target}" destroy_unavailable_domain_html: "%{name} nahm die Zustellung an die Domain %{target} wieder auf" destroy_user_role_html: "%{name} löschte die Rolle %{target}" disable_2fa_user_html: "%{name} deaktivierte die Zwei-Faktor-Authentisierung für %{target}" disable_custom_emoji_html: "%{name} deaktivierte das Emoji %{target}" + disable_relay_html: "%{name} deaktivierte das Relay %{target}" disable_sign_in_token_auth_user_html: "%{name} deaktivierte die E-Mail-Token-Authentisierung für %{target}" disable_user_html: "%{name} deaktivierte den Zugang für %{target}" enable_custom_emoji_html: "%{name} aktivierte das Emoji %{target}" + enable_relay_html: "%{name} aktivierte das Relay %{target}" enable_sign_in_token_auth_user_html: "%{name} aktivierte die E-Mail-Token-Authentisierung für %{target}" enable_user_html: "%{name} aktivierte den Zugang für %{target}" memorialize_account_html: "%{name} wandelte das Konto von %{target} in eine Gedenkseite um" diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 2f9a76c80d..6fe9c14591 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -187,6 +187,7 @@ fi: create_domain_block: Luo verkkotunnuksen esto create_email_domain_block: Luo sähköpostiverkkotunnuksen esto create_ip_block: Luo IP-sääntö + create_relay: Luo välittäjä create_unavailable_domain: Luo ei-saatavilla oleva verkkotunnus create_user_role: Luo rooli demote_user: Alenna käyttäjä @@ -198,14 +199,17 @@ fi: destroy_email_domain_block: Poista sähköpostiverkkotunnuksen esto destroy_instance: Tyhjennä verkkotunnus destroy_ip_block: Poista IP-sääntö + destroy_relay: Poista välittäjä destroy_status: Poista julkaisu destroy_unavailable_domain: Poista ei-saatavilla oleva verkkotunnus destroy_user_role: Hävitä rooli disable_2fa_user: Poista kaksivaiheinen todennus käytöstä disable_custom_emoji: Poista mukautettu emoji käytöstä + disable_relay: Poista välittäjä käytöstä disable_sign_in_token_auth_user: Poista sähköpostitunnuksella todennus käytöstä käyttäjältä disable_user: Poista tili käytöstä enable_custom_emoji: Ota mukautettu emoji käyttöön + enable_relay: Ota välittäjä käyttöön enable_sign_in_token_auth_user: Ota sähköpostitunnuksella todennus käyttöön käyttäjälle enable_user: Ota tili käyttöön memorialize_account: Muuta muistotiliksi @@ -216,7 +220,7 @@ fi: reopen_report: Avaa raportti uudelleen resend_user: Lähetä vahvistusviesti uudelleen reset_password_user: Palauta salasana - resolve_report: Selvitä raportti + resolve_report: Ratkaise raportti sensitive_account: Pakota arkaluonteiseksi tiliksi silence_account: Rajoita tiliä suspend_account: Jäädytä tili @@ -247,6 +251,7 @@ fi: create_domain_block_html: "%{name} esti verkkotunnuksen %{target}" create_email_domain_block_html: "%{name} esti sähköpostiverkkotunnuksen %{target}" create_ip_block_html: "%{name} loi säännön IP-osoitteelle %{target}" + create_relay_html: "%{name} loi välittäjän %{target}" create_unavailable_domain_html: "%{name} pysäytti toimituksen verkkotunnukseen %{target}" create_user_role_html: "%{name} loi roolin %{target}" demote_user_html: "%{name} alensi käyttäjän %{target}" @@ -258,14 +263,17 @@ fi: destroy_email_domain_block_html: "%{name} kumosi sähköpostiverkkotunnuksen %{target} eston" destroy_instance_html: "%{name} tyhjensi verkkotunnuksen %{target}" destroy_ip_block_html: "%{name} poisti säännön IP-osoitteelta %{target}" + destroy_relay_html: "%{name} poisti välittäjän %{target}" destroy_status_html: "%{name} poisti käyttäjän %{target} julkaisun" destroy_unavailable_domain_html: "%{name} jatkoi toimitusta verkkotunnukseen %{target}" destroy_user_role_html: "%{name} poisti roolin %{target}" disable_2fa_user_html: "%{name} poisti käyttäjältä %{target} vaatimuksen kaksivaiheiseen todentamiseen" disable_custom_emoji_html: "%{name} poisti emojin %{target} käytöstä" + disable_relay_html: "%{name} poisti välittäjän %{target} käytöstä" disable_sign_in_token_auth_user_html: "%{name} poisti sähköpostitunnuksella todennuksen käytöstä käyttäjältä %{target}" disable_user_html: "%{name} poisti kirjautumisen käytöstä käyttäjältä %{target}" enable_custom_emoji_html: "%{name} otti emojin %{target} käyttöön" + enable_relay_html: "%{name} otti välittäjän %{target} käyttöön" enable_sign_in_token_auth_user_html: "%{name} otti sähköpostitunnuksella todennuksen käyttöön käyttäjälle %{target}" enable_user_html: "%{name} otti kirjautumisen käyttöön käyttäjälle %{target}" memorialize_account_html: "%{name} muutti käyttäjän %{target} tilin muistosivuksi" diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 1060ee1609..6cc1fda6a0 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -187,6 +187,7 @@ fo: create_domain_block: Stovna navnaøkjablokering create_email_domain_block: Stovna t-post-økisnavnablokk create_ip_block: Stovna IP reglu + create_relay: Stovna reiðlag create_unavailable_domain: Stovna navnaøki, sum ikki er tøkt create_user_role: Stovna leiklut demote_user: Lækka brúkara í tign @@ -198,14 +199,17 @@ fo: destroy_email_domain_block: Strika t-posta-økisnavnablokk destroy_instance: Reinsa navnaøki destroy_ip_block: Strika IP reglu + destroy_relay: Strika reiðlag destroy_status: Strika post destroy_unavailable_domain: Strika navnaøki, sum ikki er tøkt destroy_user_role: Bein burtur leiklut disable_2fa_user: Ger 2FA óvirkið disable_custom_emoji: Ger serligt kenslutekn óvirkið + disable_relay: Ger reiðlag óvirkið disable_sign_in_token_auth_user: Ger váttan við teldupostateknum óvirkna fyri brúkara disable_user: Ger brúkara óvirknan enable_custom_emoji: Ger serligt kenslutekn virkið + enable_relay: Ger reiðlag virkið enable_sign_in_token_auth_user: Ger váttan við teldupostateknum virkna fyri brúkara enable_user: Ger brúkara virknan memorialize_account: Minnst til Konto @@ -247,6 +251,7 @@ fo: create_domain_block_html: "%{name} blokeraði navnaøkið %{target}" create_email_domain_block_html: "%{name} blokeraði teldupostanavnaøkið %{target}" create_ip_block_html: "%{name} gjørdi reglu fyri IP %{target}" + create_relay_html: "%{name} gjørdi eitt reiðlag %{target}" create_unavailable_domain_html: "%{name} steðgaði veiting til navnaøkið %{target}" create_user_role_html: "%{name} stovnaði %{target} leiklutin" demote_user_html: "%{name} lækkaði tignina hjá brúkaranum %{target}" @@ -258,14 +263,17 @@ fo: destroy_email_domain_block_html: "%{name} leysgav teldupostanavnaøkið %{target}" destroy_instance_html: "%{name} reinsaði navnaøkið %{target}" destroy_ip_block_html: "%{name} slettaðar reglur fyri IP %{target}" + destroy_relay_html: "%{name} strikaði reiðlagið %{target}" destroy_status_html: "%{name} slettaði upplegg hjá %{target}" destroy_unavailable_domain_html: "%{name} tók upp aftir veiting til navnaøkið %{target}" destroy_user_role_html: "%{name} slettaði leiklutin hjá %{target}" disable_2fa_user_html: "%{name} slepti kravið um váttan í tveimum stigum fyri brúkaran %{target}" disable_custom_emoji_html: "%{name} gjørdi kensluteknið %{target} óvirkið" + disable_relay_html: "%{name} gjørdi reiðlagið %{target} óvirkið" disable_sign_in_token_auth_user_html: "%{name} gjørdi váttan við teldupostteknum óvirkna fyri %{target}" disable_user_html: "%{name} gjørdi innritan hjá brúkaranum %{target} óvirkna" enable_custom_emoji_html: "%{name} gjørdi kensluteknið %{target} virkið" + enable_relay_html: "%{name} gjørdi reiðlagið %{target} virkið" enable_sign_in_token_auth_user_html: "%{name} gjørdi váttan við teldupostteknum virkna fyri %{target}" enable_user_html: "%{name} gjørdi innritan virkna fyri brúkaran %{target}" memorialize_account_html: "%{name} broytti kontuna hjá %{target} til eina minnissíðu" diff --git a/config/locales/gl.yml b/config/locales/gl.yml index a4f63a50e0..1ad8deb179 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -187,6 +187,7 @@ gl: create_domain_block: Crear bloquedo do Dominio create_email_domain_block: Crear Bloqueo de Dominio do correo create_ip_block: Crear regra IP + create_relay: Crear Repetidor create_unavailable_domain: Crear dominio Non dispoñible create_user_role: Crear Rol demote_user: Degradar usuaria @@ -198,14 +199,17 @@ gl: destroy_email_domain_block: Eliminar bloqueo do dominio do correo destroy_instance: Purgar Dominio destroy_ip_block: Eliminar regra IP + destroy_relay: Eliminar Repetidor destroy_status: Eliminar publicación destroy_unavailable_domain: Eliminar dominio Non dispoñible destroy_user_role: Eliminar Rol disable_2fa_user: Desactivar 2FA disable_custom_emoji: Desactivar emoticona personalizada + disable_relay: Desactivar Repetidor disable_sign_in_token_auth_user: Desactivar Autenticación por Token no Correo para a Usuaria disable_user: Desactivar usuaria enable_custom_emoji: Activar emoticona personalizada + enable_relay: Activar Repetidor enable_sign_in_token_auth_user: Activar Autenticación con Token no Correo para a Usuaria enable_user: Activar usuaria memorialize_account: Transformar en conta conmemorativa @@ -247,6 +251,7 @@ gl: create_domain_block_html: "%{name} bloqueou o dominio %{target}" create_email_domain_block_html: "%{name} bloqueou o dominio de correo %{target}" create_ip_block_html: "%{name} creou regra para o IP %{target}" + create_relay_html: "%{name} creou un repetidor en %{target}" create_unavailable_domain_html: "%{name} deixou de interactuar co dominio %{target}" create_user_role_html: "%{name} creou o rol %{target}" demote_user_html: "%{name} degradou a usuaria %{target}" @@ -258,14 +263,17 @@ gl: destroy_email_domain_block_html: "%{name} desbloqueou o dominio de correo %{target}" destroy_instance_html: "%{name} purgou o dominio %{target}" destroy_ip_block_html: "%{name} eliminou a regra para o IP %{target}" + destroy_relay_html: "%{name} eliminou o repetidor %{target}" destroy_status_html: "%{name} eliminou a publicación de %{target}" destroy_unavailable_domain_html: "%{name} retomou a interacción co dominio %{target}" destroy_user_role_html: "%{name} eliminou o rol %{target}" disable_2fa_user_html: "%{name} desactivou o requerimento do segundo factor para a usuaria %{target}" disable_custom_emoji_html: "%{name} desactivou o emoji %{target}" + disable_relay_html: "%{name} desactivou o repetidor %{target}" disable_sign_in_token_auth_user_html: "%{name} desactivou a autenticación por token no email para %{target}" disable_user_html: "%{name} desactivou as credenciais para a usuaria %{target}" enable_custom_emoji_html: "%{name} activou o emoji %{target}" + enable_relay_html: "%{name} activou o repetidor %{target}" enable_sign_in_token_auth_user_html: "%{name} activou a autenticación con token no email para %{target}" enable_user_html: "%{name} activou as credenciais para a usuaria %{target}" memorialize_account_html: "%{name} convertiu a conta de %{target} nunha páxina para o recordo" diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 47bd24fccf..1892009238 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -187,6 +187,7 @@ hu: create_domain_block: Domain tiltás létrehozása create_email_domain_block: E-mail-domain-tiltás létrehozása create_ip_block: IP szabály létrehozása + create_relay: Továbbító létrehozása create_unavailable_domain: Elérhetetlen domain létrehozása create_user_role: Szerepkör létrehozása demote_user: Felhasználó lefokozása @@ -198,14 +199,17 @@ hu: destroy_email_domain_block: E-mail-domain-tiltás törlése destroy_instance: Domain végleges törlése destroy_ip_block: IP szabály törlése + destroy_relay: Továbbító törlése destroy_status: Bejegyzés törlése destroy_unavailable_domain: Elérhetetlen domain törlése destroy_user_role: Szerepkör eltávolítása disable_2fa_user: Kétlépcsős hitelesítés letiltása disable_custom_emoji: Egyéni emodzsi letiltása + disable_relay: Továbbító letiltása disable_sign_in_token_auth_user: A felhasználó tokenes e-mail-hitelesítésének letiltása disable_user: Felhasználói letiltása enable_custom_emoji: Egyéni emodzsi engedélyezése + enable_relay: Továbbító engedélyezése enable_sign_in_token_auth_user: A felhasználó tokenes e-mail-hitelesítésének engedélyezése enable_user: Felhasználó engedélyezése memorialize_account: Fiók emlékké nyilvánítása @@ -247,6 +251,7 @@ hu: create_domain_block_html: "%{name} letiltotta a %{target} domaint" create_email_domain_block_html: "%{name} letiltotta a(z) %{target} e-mail-domaint" create_ip_block_html: "%{name} létrehozta a(z) %{target} IP-címre vonatkozó szabályt" + create_relay_html: "%{name} létrehozta az átirányítót: %{target}" create_unavailable_domain_html: "%{name} leállította a kézbesítést a %{target} domainbe" create_user_role_html: "%{name} létrehozta a(z) %{target} szerepkört" demote_user_html: "%{name} lefokozta %{target} felhasználót" @@ -258,14 +263,17 @@ hu: destroy_email_domain_block_html: "%{name} engedélyezte a(z) %{target} e-mail-domaint" destroy_instance_html: "%{name} véglegesen törölte a(z) %{target} domaint" destroy_ip_block_html: "%{name} törölte a(z) %{target} IP-címre vonatkozó szabályt" + destroy_relay_html: "%{name} törölte az átirányítót: %{target}" destroy_status_html: "%{name} eltávolította %{target} felhasználó bejegyzését" destroy_unavailable_domain_html: "%{name} újraindította a kézbesítést a %{target} domainbe" destroy_user_role_html: "%{name} törölte a(z) %{target} szerepkört" disable_2fa_user_html: "%{name} kikapcsolta a kétlépcsős hitelesítést %{target} felhasználó fiókján" disable_custom_emoji_html: "%{name} letiltotta az emodzsit: %{target}" + disable_relay_html: "%{name} letiltotta az átirányítót: %{target}" disable_sign_in_token_auth_user_html: "%{name} letiltotta a tokenes e-mail-hitelesítést %{target} felhasználóra" disable_user_html: "%{name} letiltotta %{target} felhasználó bejelentkezését" enable_custom_emoji_html: "%{name} engedélyezte az emodzsit: %{target}" + enable_relay_html: "%{name} engedélyezte az átirányítót: %{target}" enable_sign_in_token_auth_user_html: "%{name} engedélyezte a tokenes e-mail-hitelesítést %{target} felhasználóra" enable_user_html: "%{name} engedélyezte %{target} felhasználó bejelentkezését" memorialize_account_html: "%{name} emléket állított %{target} felhasználónak" diff --git a/config/locales/is.yml b/config/locales/is.yml index c50b3dd20d..552df8f064 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -187,6 +187,7 @@ is: create_domain_block: Búa til útilokun léns create_email_domain_block: Búa til útilokun tölvupóstléns create_ip_block: Búa til IP-reglu + create_relay: Búa til endurvarpa create_unavailable_domain: Útbúa lén sem ekki er tiltækt create_user_role: Útbúa hlutverk demote_user: Lækka notanda í tign @@ -198,14 +199,17 @@ is: destroy_email_domain_block: Eyða útilokun tölvupóstléns destroy_instance: Henda léni destroy_ip_block: Eyða IP-reglu + destroy_relay: Eyða endurvarpa destroy_status: Eyða færslu destroy_unavailable_domain: Eyða léni sem ekki er tiltækt destroy_user_role: Eyða hlutverki disable_2fa_user: Gera tveggja-þátta auðkenningu óvirka disable_custom_emoji: Gera sérsniðið tjáningartákn óvirkt + disable_relay: Gera endurvarpa óvirkan disable_sign_in_token_auth_user: Gera óvirka auðkenningu með teikni í tölvupósti fyrir notandann disable_user: Gera notanda óvirkan enable_custom_emoji: Virkja sérsniðið tjáningartákn + enable_relay: Virkja endurvarpa enable_sign_in_token_auth_user: Gera virka auðkenningu með teikni í tölvupósti fyrir notandann enable_user: Virkja notanda memorialize_account: Gera aðgang að minningargrein @@ -247,6 +251,7 @@ is: create_domain_block_html: "%{name} útilokaði lénið %{target}" create_email_domain_block_html: "%{name} útilokaði póstlénið %{target}" create_ip_block_html: "%{name} útbjó reglu fyrir IP-vistfangið %{target}" + create_relay_html: "%{name} bjó til endurvarpa %{target}" create_unavailable_domain_html: "%{name} stöðvaði afhendingu til lénsins %{target}" create_user_role_html: "%{name} útbjó %{target} hlutverk" demote_user_html: "%{name} lækkaði notandann %{target} í tign" @@ -258,14 +263,17 @@ is: destroy_email_domain_block_html: "%{name} aflétti útilokun af póstléninu %{target}" destroy_instance_html: "%{name} henti léninu %{target}" destroy_ip_block_html: "%{name} eyddi reglu fyrir IP-vistfangið %{target}" + destroy_relay_html: "%{name} eyddi endurvarpanum %{target}" destroy_status_html: "%{name} fjarlægði færslu frá %{target}" destroy_unavailable_domain_html: "%{name} hóf aftur afhendingu til lénsins %{target}" destroy_user_role_html: "%{name} eyddi hlutverki %{target}" disable_2fa_user_html: "%{name} gerði kröfu um tveggja-þátta innskráningu óvirka fyrir notandann %{target}" disable_custom_emoji_html: "%{name} gerði tjáningartáknið %{target} óvirkt" + disable_relay_html: "%{name} gerði endurvarpann %{target} óvirkan" disable_sign_in_token_auth_user_html: "%{name} gerði óvirka auðkenningu með teikni í tölvupósti fyrir %{target}" disable_user_html: "%{name} gerði innskráningu óvirka fyrir notandann %{target}" enable_custom_emoji_html: "%{name} gerði tjáningartáknið %{target} virkt" + enable_relay_html: "%{name} virkjaði endurvarpann %{target}" enable_sign_in_token_auth_user_html: "%{name} gerði virka auðkenningu með teikni í tölvupósti fyrir %{target}" enable_user_html: "%{name} gerði innskráningu virka fyrir notandann %{target}" memorialize_account_html: "%{name} breytti notandaaðgangnum %{target} í minningargreinarsíðu" diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 6bff1703e6..1fe43f7e75 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -184,6 +184,7 @@ ko: create_domain_block: 도메인 차단 추가 create_email_domain_block: 이메일 도메인 차단 생성 create_ip_block: IP 규칙 만들기 + create_relay: 릴레이 생성 create_unavailable_domain: 사용 불가능한 도메인 생성 create_user_role: 역할 생성 demote_user: 사용자 강등 @@ -195,14 +196,17 @@ ko: destroy_email_domain_block: 이메일 도메인 차단 삭제 destroy_instance: 도메인 퍼지하기 destroy_ip_block: IP 규칙 삭제 + destroy_relay: 릴레이 삭제 destroy_status: 게시물 삭제 destroy_unavailable_domain: 사용 불가능한 도메인 제거 destroy_user_role: 역할 삭제 disable_2fa_user: 2단계 인증 비활성화 disable_custom_emoji: 커스텀 에모지 비활성화 + disable_relay: 릴레이 비활성화 disable_sign_in_token_auth_user: 사용자의 이메일 토큰 인증 비활성화 disable_user: 사용자 비활성화 enable_custom_emoji: 커스텀 에모지 활성화 + enable_relay: 릴레이 활성화 enable_sign_in_token_auth_user: 사용자의 이메일 토큰 인증 활성화 enable_user: 사용자 활성화 memorialize_account: 고인의 계정으로 전환 @@ -244,6 +248,7 @@ ko: create_domain_block_html: "%{name} 님이 도메인 %{target}를 차단했습니다" create_email_domain_block_html: "%{name} 님이 이메일 도메인 %{target}를 차단했습니다" create_ip_block_html: "%{name} 님이 IP 규칙 %{target}을 만들었습니다" + create_relay_html: "%{name} 님이 릴레이 %{target}를 생성했습니다" create_unavailable_domain_html: "%{name} 님이 도메인 %{target}에 대한 전달을 중지했습니다" create_user_role_html: "%{name} 님이 %{target} 역할을 생성했습니다" demote_user_html: "%{name} 님이 사용자 %{target} 님을 강등했습니다" @@ -255,14 +260,17 @@ ko: destroy_email_domain_block_html: "%{name} 님이 이메일 도메인 %{target}을 차단 해제하였습니다" destroy_instance_html: "%{name} 님이 도메인 %{target}를 제거했습니다" destroy_ip_block_html: "%{name} 님이 IP 규칙 %{target}을 삭제하였습니다" + destroy_relay_html: "%{name} 님이 릴레이 %{target}를 삭제했습니다" destroy_status_html: "%{name} 님이 %{target} 님의 게시물을 삭제했습니다" destroy_unavailable_domain_html: "%{name} 님이 도메인 %{target}에 대한 전달을 재개" destroy_user_role_html: "%{name} 님이 %{target} 역할을 삭제했습니다" disable_2fa_user_html: "%{name} 님이 사용자 %{target} 님의 2단계 인증을 비활성화 했습니다" disable_custom_emoji_html: "%{name} 님이 에모지 %{target}를 비활성화했습니다" + disable_relay_html: "%{name} 님이 릴레이 %{target}를 비활성화했습니다" disable_sign_in_token_auth_user_html: "%{name} 님이 %{target} 님의 이메일 토큰 인증을 비활성화했습니다" disable_user_html: "%{name} 님이 사용자 %{target}의 로그인을 비활성화했습니다" enable_custom_emoji_html: "%{name} 님이 에모지 %{target}를 활성화했습니다" + enable_relay_html: "%{name} 님이 릴레이 %{target}를 활성화했습니다" enable_sign_in_token_auth_user_html: "%{name} 님이 %{target} 님의 이메일 토큰 인증을 활성화했습니다" enable_user_html: "%{name} 님이 사용자 %{target}의 로그인을 활성화했습니다" memorialize_account_html: "%{name} 님이 %{target}의 계정을 고인의 계정 페이지로 전환했습니다" diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 8ba3bad070..3850e2e071 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -185,6 +185,7 @@ lt: create_domain_allow: Kurti domeno leidimą create_domain_block: Kurti domeno bloką create_ip_block: Kurti IP taisyklę + create_relay: Kurti perdavimą create_unavailable_domain: Kurti nepasiekiamą domeną create_user_role: Kurti vaidmenį demote_user: Pažeminti naudotoją @@ -194,13 +195,16 @@ lt: destroy_domain_block: Ištrinti domeno bloką destroy_instance: Išvalyti domeną destroy_ip_block: Ištrinti IP taisyklę + destroy_relay: Ištrinti perdavimą destroy_status: Ištrinti įrašą destroy_unavailable_domain: Ištrinti nepasiekiamą domeną destroy_user_role: Sunaikinti vaidmenį disable_2fa_user: Išjungti 2FA disable_custom_emoji: Išjungti pasirinktinį jaustuką + disable_relay: Išjungti perdavimą disable_user: Išjungti naudotoją enable_custom_emoji: Įjungti pasirinktinį jaustuką + enable_relay: Įjungti perdavimą enable_user: Įjungti naudotoją memorialize_account: Memorializuoti paskyrą promote_user: Paaukštinti naudotoją @@ -237,6 +241,7 @@ lt: create_domain_allow_html: "%{name} leido federaciją su domenu %{target}" create_domain_block_html: "%{name} užblokavo domeną %{target}" create_ip_block_html: "%{name} sukūrė taisyklę IP %{target}" + create_relay_html: "%{name} sukūrė perdavimą %{target}" create_unavailable_domain_html: "%{name} sustabdė tiekimą į domeną %{target}" create_user_role_html: "%{name} sukūrė %{target} vaidmenį" demote_user_html: "%{name} pažemino naudotoją %{target}" @@ -246,13 +251,16 @@ lt: destroy_domain_block_html: "%{name} atblokavo domeną %{target}" destroy_instance_html: "%{name} išvalė domeną %{target}" destroy_ip_block_html: "%{name} ištrynė taisyklę IP %{target}" + destroy_relay_html: "%{name} ištrynė perdavimą %{target}" destroy_status_html: "%{name} pašalino įrašą %{target}" destroy_unavailable_domain_html: "%{name} pratęsė tiekimą į domeną %{target}" destroy_user_role_html: "%{name} ištrynė %{target} vaidmenį" disable_2fa_user_html: "%{name} išjungė dviejų veiksnių reikalavimą naudotojui %{target}" disable_custom_emoji_html: "%{name} išjungė jaustuką %{target}" + disable_relay_html: "%{name} išjungė perdavimą %{target}" disable_user_html: "%{name} išjungė prisijungimą naudotojui %{target}" enable_custom_emoji_html: "%{name} įjungė jaustuką %{target}" + enable_relay_html: "%{name} įjungė perdavimą %{target}" enable_user_html: "%{name} įjungė prisijungimą naudotojui %{target}" memorialize_account_html: "%{name} pavertė %{target} paskyrą į atminimo puslapį" promote_user_html: "%{name} paaukštino naudotoją %{target}" diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 9ec4f29f42..62b08f42ed 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -187,6 +187,7 @@ nn: create_domain_block: Opprett domene-blokk create_email_domain_block: Opprett blokkering av e-postdomene create_ip_block: Opprett IP-regel + create_relay: Opprett eit relé create_unavailable_domain: Opprett utilgjengeleg domene create_user_role: Opprett rolle demote_user: Degrader brukar @@ -198,14 +199,17 @@ nn: destroy_email_domain_block: Fjern blokkering av e-postdomene destroy_instance: Slett domene destroy_ip_block: Slett IP-regel + destroy_relay: Slett relé destroy_status: Slett status destroy_unavailable_domain: Slett utilgjengeleg domene destroy_user_role: Øydelegg rolle disable_2fa_user: Skruv av 2FA disable_custom_emoji: Skruv av tilpassa emoji + disable_relay: Skru av reléet disable_sign_in_token_auth_user: Slå av e-post-token-autentisering for brukar disable_user: Skruv av brukar enable_custom_emoji: Skruv på tilpassa emoji + enable_relay: Skru på reléet enable_sign_in_token_auth_user: Slå på e-post-token-autentisering for brukar enable_user: Skruv på brukar memorialize_account: Opprett minnekonto @@ -247,6 +251,7 @@ nn: create_domain_block_html: "%{name} blokkerte domenet %{target}" create_email_domain_block_html: "%{name} blokkerte e-postdomenet %{target}" create_ip_block_html: "%{name} oppretta ein regel for IP-en %{target}" + create_relay_html: "%{name} laga reléet %{target}" create_unavailable_domain_html: "%{name} stogga levering til domenet %{target}" create_user_role_html: "%{name} oppretta rolla %{target}" demote_user_html: "%{name} degraderte brukaren %{target}" @@ -258,14 +263,17 @@ nn: destroy_email_domain_block_html: "%{name} avblokkerte e-postdomenet %{target}" destroy_instance_html: "%{name} tømde domenet %{target}" destroy_ip_block_html: "%{name} sletta ein regel for IP-en %{target}" + destroy_relay_html: "%{name} sletta reléet %{target}" destroy_status_html: "%{name} fjerna innlegget frå %{target}" destroy_unavailable_domain_html: "%{name} tok opp att levering til domenet %{target}" destroy_user_role_html: "%{name} sletta rolla %{target}" disable_2fa_user_html: "%{name} tok vekk krav om tofaktorautentisering for brukaren %{target}" disable_custom_emoji_html: "%{name} deaktiverte emojien %{target}" + disable_relay_html: "%{name} skrudde av reléet %{target}" disable_sign_in_token_auth_user_html: "%{name} deaktiverte e-post-token-autentisering for %{target}" disable_user_html: "%{name} slo av innlogging for brukaren %{target}" enable_custom_emoji_html: "%{name} aktiverte emojien %{target}" + enable_relay_html: "%{name} skrudde på reléet %{target}" enable_sign_in_token_auth_user_html: "%{name} aktiverte e-post-token-autentisering for %{target}" enable_user_html: "%{name} aktiverte innlogging for brukaren %{target}" memorialize_account_html: "%{name} endret %{target}s konto til en minneside" @@ -1381,6 +1389,9 @@ nn: following_html: one: Du skal til å fylgja opp til %{count} brukarkonto frå %{filename} og slutta å fylgja alle andre. other: Du skal til å fylgja opp til %{count} brukarkontoar frå %{filename} og slutta å fylgja alle andre. + lists_html: + one: Du er i ferd med å erstatta listene dine med innhaldet i %{filename}. Opptil %{count} konto vil bli lagt til i dei nye listene. + other: Du er i ferd med å erstatta listene dine med innhaldet i %{filename}. Opptil %{count} kontoar vil bli lagt til i dei nye listene. muting_html: one: Du skal til å byta ut lista di over dempa brukarkontoar med opp til %{count} brukarkonto frå %{filename}. other: Du skal til å byta ut lista di over dempa brukarkontoar med opp til %{count} brukarkontoar frå %{filename}. diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 8b2feb5193..0ff944e108 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -35,12 +35,12 @@ pt-BR: accounts: add_email_domain_block: Bloquear domínio de email approve: Aprovar - approved_msg: O registro de %{username} foi aprovado + approved_msg: Aprovado com sucesso o pedido de registro de %{username} are_you_sure: Você tem certeza? avatar: Imagem de perfil by_domain: Domínio change_email: - changed_msg: E-mail alterado! + changed_msg: E-mail alterado com sucesso! current_email: E-mail atual label: Alterar e-mail new_email: Novo e-mail @@ -187,6 +187,7 @@ pt-BR: create_domain_block: Bloquear domínio create_email_domain_block: Criar Bloqueio de Domínio de Email create_ip_block: Criar regra de IP + create_relay: Criar Retransmissão create_unavailable_domain: Criar domínio indisponível create_user_role: Criar cargo demote_user: Rebaixar usuário @@ -198,14 +199,17 @@ pt-BR: destroy_email_domain_block: Deletar bloqueio de domínio Email destroy_instance: Limpar domínio destroy_ip_block: Excluir regra de IP + destroy_relay: Excluir Retransmissão destroy_status: Excluir publicação destroy_unavailable_domain: Excluir domínio indisponível destroy_user_role: Destruir cargo disable_2fa_user: Desativar autenticação de dois fatores disable_custom_emoji: Desativar emoji personalizado + disable_relay: Desativar Retransmissão disable_sign_in_token_auth_user: Desativar autenticação via Token de Email para Usuário disable_user: Desativar usuário enable_custom_emoji: Ativar emoji personalizado + enable_relay: Ativar Retransmissão enable_sign_in_token_auth_user: Ativar autenticação via Token de Email para Usuário enable_user: Ativar usuário memorialize_account: Converter conta em memorial @@ -247,6 +251,7 @@ pt-BR: create_domain_block_html: "%{name} bloqueou o domínio %{target}" create_email_domain_block_html: "%{name} bloqueou o domínio de e-mail %{target}" create_ip_block_html: "%{name} criou a regra para o IP %{target}" + create_relay_html: "%{name} criou uma retransmissão %{target}" create_unavailable_domain_html: "%{name} parou a entrega ao domínio %{target}" create_user_role_html: "%{name} criou o cargo %{target}" demote_user_html: "%{name} rebaixou o usuário %{target}" @@ -258,14 +263,17 @@ pt-BR: destroy_email_domain_block_html: "%{name} desbloqueou o domínio de e-mail %{target}" destroy_instance_html: "%{name} limpou o domínio %{target}" destroy_ip_block_html: "%{name} excluiu a regra para o IP %{target}" + destroy_relay_html: "%{name} excluiu uma retransmissão %{target}" destroy_status_html: "%{name} removeu a publicação de %{target}" destroy_unavailable_domain_html: "%{name} retomou a entrega ao domínio %{target}" destroy_user_role_html: "%{name} excluiu o cargo %{target}" disable_2fa_user_html: "%{name} desativou a exigência da autenticação de dois fatores para o usuário %{target}" disable_custom_emoji_html: "%{name} desativou o emoji %{target}" + disable_relay_html: "%{name} desativou uma retransmissão %{target}" disable_sign_in_token_auth_user_html: "%{name} desativou a autenticação via token por e-mail para %{target}" disable_user_html: "%{name} desativou o login para %{target}" enable_custom_emoji_html: "%{name} ativou o emoji %{target}" + enable_relay_html: "%{name} ativou uma retransmissão %{target}" enable_sign_in_token_auth_user_html: "%{name} ativou a autenticação via token por e-mail para %{target}" enable_user_html: "%{name} ativou o login para %{target}" memorialize_account_html: "%{name} transformou a conta de %{target} em um memorial" @@ -1368,6 +1376,10 @@ pt-BR: merge_long: Manter os registros existentes e adicionar novos overwrite: Sobrescrever overwrite_long: Substituir os registros atuais com os novos + overwrite_preambles: + bookmarks_html: + one: Você está prestes a substituir seus salvos por até %{count} publicação de %{filename}. + other: Você está prestes a substituir seus salvos por até %{count} publicações de %{filename}. preface: Você pode importar dados que você exportou de outro servidor, como a lista de pessoas que você segue ou bloqueou. recent_imports: Importações recentes states: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 831f68b24b..8a84f22115 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -179,104 +179,112 @@ ru: whitelisted: В белом списке action_logs: action_types: - approve_appeal: Одобрить обжалование - approve_user: Утвердить + approve_appeal: Одобрение обжалований + approve_user: Утверждение регистраций assigned_to_self_report: Присвоение жалоб - change_email_user: Сменить e-mail для пользователя - change_role_user: Изменить роль пользователя + change_email_user: Смена e-mail пользователей + change_role_user: Смена ролей пользователей confirm_user: Подтверждение пользователей create_account_warning: Выдача предупреждения create_announcement: Создание объявлений - create_canonical_email_block: Создать блок электронной почты + create_canonical_email_block: Создание блокировок e-mail create_custom_emoji: Добавление эмодзи create_domain_allow: Разрешение доменов create_domain_block: Блокировка доменов - create_email_domain_block: Создать блок домена электронной почты + create_email_domain_block: Создание доменных блокировок e-mail create_ip_block: Создание правил для IP-адресов + create_relay: Создание ретранслятора create_unavailable_domain: Добавление домена в список недоступных - create_user_role: Создать роль + create_user_role: Создание ролей demote_user: Разжалование пользователей destroy_announcement: Удаление объявлений - destroy_canonical_email_block: Удалить блок электронной почты + destroy_canonical_email_block: Удаление блокировок e-mail destroy_custom_emoji: Удаление эмодзи destroy_domain_allow: Отзыв разрешений для доменов destroy_domain_block: Разблокировка доменов - destroy_email_domain_block: Удалить блок домена электронной почты + destroy_email_domain_block: Удаление доменных блокировок e-mail destroy_instance: Очистить домен destroy_ip_block: Удаление правил для IP-адресов + destroy_relay: Удаление ретранслятора destroy_status: Удаление постов destroy_unavailable_domain: Исключение доменов из списка недоступных - destroy_user_role: Удалить роль + destroy_user_role: Удаление ролей disable_2fa_user: Отключение 2FA disable_custom_emoji: Отключение эмодзи - disable_sign_in_token_auth_user: Отключить аутентификацию пользователя с помощью токена электронной почты + disable_relay: Отключение ретранслятора + disable_sign_in_token_auth_user: Отключение аутентификации по e-mail кодам disable_user: Заморозка пользователей enable_custom_emoji: Включение эмодзи - enable_sign_in_token_auth_user: Включить аутентификацию пользователя с помощью токена электронной почты + enable_relay: Включение ретранслятора + enable_sign_in_token_auth_user: Включение аутентификации по e-mail кодам enable_user: Разморозка пользователей memorialize_account: Присвоение пользователям статуса «мемориала» promote_user: Повышение пользователей - reject_appeal: Отклонить обжалование - reject_user: Отклонить + reject_appeal: Отклонение обжалований + reject_user: Отклонение регистраций remove_avatar_user: Удаление аватаров reopen_report: Возобновление жалоб - resend_user: Повторно отправить письмо с подтверждением + resend_user: Повторная отправка писем с подтверждением reset_password_user: Сброс пароля пользователей resolve_report: Отметка жалоб «решёнными» sensitive_account: Присвоение пользователям отметки «деликатного содержания» silence_account: Скрытие пользователей suspend_account: Блокировка пользователей unassigned_report: Снятие жалоб - unblock_email_account: Разблокировать e-mail адрес + unblock_email_account: Разблокировка e-mail адресов unsensitive_account: Снятие с пользователей отметки «деликатного содержания» unsilence_account: Отмена скрытия пользователей unsuspend_account: Разблокировка пользователей update_announcement: Обновление объявлений update_custom_emoji: Обновление эмодзи update_domain_block: Изменение блокировки домена - update_ip_block: Обновить правило для IP-адреса - update_report: Обновить рапорт + update_ip_block: Обновление правил для IP-адресов + update_report: Изменение жалоб update_status: Изменение постов - update_user_role: Обновить роль + update_user_role: Изменение ролей actions: - approve_appeal_html: "%{name} одобрил апелляцию на умеренное решение от %{target}" + approve_appeal_html: "%{name} одобрил(а) обжалование действий модерации от %{target}" approve_user_html: "%{name} утвердил(а) регистрацию %{target}" assigned_to_self_report_html: "%{name} назначил(а) себя для решения жалобы %{target}" - change_email_user_html: "%{name} изменил адрес электронной почты пользователя %{target}" + change_email_user_html: "%{name} cменил(а) e-mail адрес пользователя %{target}" change_role_user_html: "%{name} изменил(а) роль %{target}" - confirm_user_html: "%{name} подтвержденный адрес электронной почты пользователя %{target}" + confirm_user_html: "%{name} подтвердил(а) e-mail адрес пользователя %{target}" create_account_warning_html: "%{name} выдал(а) предупреждение %{target}" create_announcement_html: "%{name} создал(а) новое объявление %{target}" - create_canonical_email_block_html: "%{name} заблокировал письмо с хэшем %{target}" + create_canonical_email_block_html: "%{name} заблокировал(а) e-mail с хешем %{target}" create_custom_emoji_html: "%{name} загрузил(а) новый эмодзи %{target}" create_domain_allow_html: "%{name} разрешил(а) федерацию с доменом %{target}" create_domain_block_html: "%{name} заблокировал(а) домен %{target}" - create_email_domain_block_html: "%{name} заблокированный почтовый домен %{target}" + create_email_domain_block_html: "%{name} заблокировал(а) e-mail домен %{target}" create_ip_block_html: "%{name} создал(а) правило для IP %{target}" + create_relay_html: "%{name} создал(а) ретранслятор %{target}" create_unavailable_domain_html: "%{name} приостановил доставку на узел %{target}" create_user_role_html: "%{name} создал(а) роль %{target}" demote_user_html: "%{name} разжаловал(а) пользователя %{target}" destroy_announcement_html: "%{name} удалил(а) объявление %{target}" - destroy_canonical_email_block_html: "%{name} разблокированное письмо с хэшем %{target}" + destroy_canonical_email_block_html: "%{name} снял(а) блокировку e-mail с хэшем %{target}" destroy_custom_emoji_html: "%{name} удалил(а) эмодзи %{target}" destroy_domain_allow_html: "%{name} запретил(а) федерацию с доменом %{target}" destroy_domain_block_html: "%{name} снял(а) блокировку с домена %{target}" - destroy_email_domain_block_html: "%{name} разблокированный почтовый домен %{target}" + destroy_email_domain_block_html: "%{name} снял(а) блокировку с e-mail домена %{target}" destroy_instance_html: "%{name} очистил(а) данные для домена %{target}" destroy_ip_block_html: "%{name} удалил(а) правило для IP %{target}" + destroy_relay_html: "%{name} удалил(а) ретранслятор %{target}" destroy_status_html: "%{name} удалил(а) пост пользователя %{target}" destroy_unavailable_domain_html: "%{name} возобновил доставку на узел %{target}" destroy_user_role_html: "%{name} удалил(а) роль %{target}" disable_2fa_user_html: "%{name} отключил(а) требование двухэтапной авторизации для пользователя %{target}" disable_custom_emoji_html: "%{name} отключил(а) эмодзи %{target}" - disable_sign_in_token_auth_user_html: "%{name} отключил аутентификацию по маркеру электронной почты для %{target}" + disable_relay_html: "%{name} отключил(а) ретранслятор %{target}" + disable_sign_in_token_auth_user_html: "%{name} отключил(а) аутентификацию по e-mail кодам для %{target}" disable_user_html: "%{name} заморозил(а) пользователя %{target}" enable_custom_emoji_html: "%{name} включил(а) эмодзи %{target}" - enable_sign_in_token_auth_user_html: "%{name} включил аутентификацию с помощью маркера электронной почты для %{target}" + enable_relay_html: "%{name} включил(а) ретранслятор %{target}" + enable_sign_in_token_auth_user_html: "%{name} включил(а) аутентификацию по e-mail кодам для %{target}" enable_user_html: "%{name} разморозил(а) пользователя %{target}" memorialize_account_html: "%{name} перевел(а) учётную запись пользователя %{target} в статус памятника" promote_user_html: "%{name} повысил(а) пользователя %{target}" - reject_appeal_html: "%{name} отклонил апелляцию на модерацию от %{target}" + reject_appeal_html: "%{name} отклонил(а) обжалование действий модерации от %{target}" reject_user_html: "%{name} отклонил(а) регистрацию %{target}" remove_avatar_user_html: "%{name} убрал(а) аватарку пользователя %{target}" reopen_report_html: "%{name} повторно открыл(а) жалобу %{target}" @@ -295,7 +303,7 @@ ru: update_custom_emoji_html: "%{name} обновил(а) эмодзи %{target}" update_domain_block_html: "%{name} обновил(а) блокировку домена для %{target}" update_ip_block_html: "%{name} изменил(а) правило для IP %{target}" - update_report_html: "%{name} обновленный отчет %{target}" + update_report_html: "%{name} изменил(а) жалобу %{target}" update_status_html: "%{name} изменил(а) пост пользователя %{target}" update_user_role_html: "%{name} изменил(а) роль %{target}" deleted_account: удалённая учётная запись diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index b2ebf5666d..962f062534 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -46,7 +46,7 @@ ko: current_password: 보안을 위해 현재 계정의 암호를 입력해주세요 current_username: 확인을 위해, 현재 계정의 사용자명을 입력해주세요 digest: 오랫동안 활동하지 않았을 때 받은 멘션들에 대한 요약 받기 - email: 확인용 이메일을 보냈습니다. + email: 확인용 이메일을 보내게 됩니다 header: WEBP, PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 축소됨 inbox_url: 사용 할 릴레이 서버의 프론트페이지에서 URL을 복사합니다 irreversible: 필터링 된 게시물은 나중에 필터가 사라지더라도 돌아오지 않게 됩니다 diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index d9204efaaa..77482d8012 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -10,6 +10,7 @@ lt: indexable: Tavo vieši įrašai gali būti rodomi Mastodon paieškos rezultatuose. Žmonės, kurie bendravo su tavo įrašais, gali jų ieškoti nepriklausomai nuo to. note: 'Gali @paminėti kitus žmones arba #saitažodžius.' show_collections: Žmonės galės peržiūrėti tavo sekimus ir sekėjus. Žmonės, kuriuos seki, matys, kad juos seki, nepaisant to. + unlocked: Žmonės galės jus sekti nepaprašę patvirtinimo. Panaikinkite žymėjimą, jei norite peržiūrėti sekimo prašymus ir pasirinkti, ar priimti, ar atmesti naujus sekėjus. account_alias: acct: Nurodyk paskyros, iš kurios nori perkelti, naudotojo vardą@domeną account_migration: diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 5318059f4a..2bb31aa0f9 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -3,7 +3,7 @@ nl: simple_form: hints: account: - attribution_domains_as_text: Eén per regel. Beschermt tegen valse toeschrijvingen. + attribution_domains_as_text: Eén per regel. Beschermt tegen ongeldige attributies. discoverable: Jouw openbare berichten kunnen worden uitgelicht op verschillende plekken binnen Mastodon en jouw account kan worden aanbevolen aan andere gebruikers. display_name: Jouw volledige naam of een leuke bijnaam. fields: Jouw website, persoonlijke voornaamwoorden, leeftijd, alles wat je maar kwijt wilt. diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index 008af2c5ac..46b7af4bdb 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -10,6 +10,7 @@ nn: indexable: Dei offentlege innlegga dine kan dukka opp i søkjeresultat på Mastodon. Folk som har reagert på oinnlegga dine kan uansett søkja gjennom dei. note: 'Du kan @nemne folk eller #emneknaggar.' show_collections: Andre kan sjå kven du fylgjer og kven som fylgjer deg. Dei du fylgjer kan alltid sjå at du fylgjer dei. + unlocked: Alle kan fylgja deg utan å måtta be om det. Vel bort dersom du vil gå gjennom førespurnader om å fylgja deg og seia ja eller nei til kvar av dei. account_alias: acct: Angi brukarnamn@domene til brukaren du ynskjer å flytta frå account_migration: diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 4fba45098d..c5ff55c15d 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -10,6 +10,7 @@ pl: indexable: Twoje publiczne wpisy mogą pojawiać się w wynikach wyszukiwania w Mastodonie. Użytkownicy, którzy wchodzili w interakcje z twoimi wpisami będą mogli je znaleźć niezależnie od tego ustawienia. note: 'Możesz @wspomnieć użytkowników albo #hasztagi.' show_collections: Twoja lista obserwowanych i obserwujących będzie widoczna dla wszystkich. Użytkownicy których obserwujesz będą jednak o tym wiedzieli. + unlocked: Inni użytkownicy będą mogli cię obserwować bez proszenia o zgodę. Odznacz, jeżeli chcesz aprobować obserwujących ręcznie po przejrzeniu próśb o obserwowanie. account_alias: acct: Określ nazwę@domenę konta z którego chcesz się przenieść account_migration: diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index d8822d35b9..37626ff9fd 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -10,6 +10,7 @@ ru: indexable: Ваши публичные сообщения могут появляться в результатах поиска на Mastodon. Люди, которые взаимодействовали с вашими сообщениями, могут искать их независимо от этого. note: 'Вы можете @упоминать других людей или #хэштеги.' show_collections: Люди смогут просматривать список ваших подписок и подписчиков. Люди, за которыми вы следуете, будут видеть, что вы подписаны на них, несмотря ни на что. + unlocked: Люди смогут подписываться на вас, не запрашивая подтверждения. Снимите флажок, если вы хотите просматривать запросы на подписку и выбирать, принимать или отклонять новых подписчиков. account_alias: acct: Укажите имя_пользователя@домен учётной записи, с которой вы собираетесь мигрировать account_migration: diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index b8303e2945..72c3f000f6 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -10,6 +10,7 @@ sv: indexable: Dina offentliga inlägg kan visas i sökresultat på Mastodon. Personer som har interagerat med dina inlägg kan söka dem oavsett. note: 'Du kan @nämna andra personer eller #hashtaggar.' show_collections: Andra kan se vem du följer och vem som följer dig. De du följer kan alltid se att du följer dem. + unlocked: Andra kommer att kunna följa dig utan att begära godkännande. Avmarkera om du vill granska följeslagare och välja om du vill acceptera eller avvisa nya följare. account_alias: acct: Ange användarnamn@domän för kontot som du vill flytta från account_migration: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 6cff74fb50..e5becbd916 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -187,6 +187,7 @@ sq: create_domain_block: Krijo Bllokim Përkatësie create_email_domain_block: Krijoni Bllokim Përkatësie Email-esh create_ip_block: Krijoni Rregull IP + create_relay: Krijoni Rele create_unavailable_domain: Krijo Përkatësi të Papërdorshme create_user_role: Krijoni Rol demote_user: Zhgradoje Përdoruesin @@ -198,14 +199,17 @@ sq: destroy_email_domain_block: Fshini Bllokim Përkatësie Email-esh destroy_instance: Spastroje Përkatësinë destroy_ip_block: Fshini Rregull IP + destroy_relay: Fshije Relenë destroy_status: Fshi Gjendje destroy_unavailable_domain: Fshi Përkatësi të Papërdorshme destroy_user_role: Asgjësoje Rolin disable_2fa_user: Çaktivizo 2FA-në disable_custom_emoji: Çaktivizo Emotikon Vetjak + disable_relay: Çaktivizoje Relenë disable_sign_in_token_auth_user: Çaktivizoni për Përdoruesin Mirëfilltësim Me Token Email-i disable_user: Çaktivizo Përdorues enable_custom_emoji: Aktivizo Emotikon Vetjak + enable_relay: Aktivizoje Relenë enable_sign_in_token_auth_user: Aktivizoni për Përdoruesin Mirëfilltësim Me Token Email-i enable_user: Aktivizo Përdorues memorialize_account: Bëje Llogari Përkujtimore @@ -247,6 +251,7 @@ sq: create_domain_block_html: "%{name} bllokoi përkatësinë %{target}" create_email_domain_block_html: "%{name} bllokoi përkatësinë email %{target}" create_ip_block_html: "%{name} krijoi rregull për IP-në %{target}" + create_relay_html: "%{name} krijoi një rele %{target}" create_unavailable_domain_html: "%{name} ndali dërgimin drejt përkatësisë %{target}" create_user_role_html: "%{name} krijoi rolin %{target}" demote_user_html: "%{name} zhgradoi përdoruesin %{target}" @@ -258,14 +263,17 @@ sq: destroy_email_domain_block_html: "%{name} zhbllokoi përkatësi email %{target}" destroy_instance_html: "%{name} spastroi përkatësinë %{target}" destroy_ip_block_html: "%{name} fshiu rregull për IP-në %{target}" + destroy_relay_html: "%{name} fshiu relenë %{target}" destroy_status_html: "%{name} hoqi gjendje nga %{target}" destroy_unavailable_domain_html: "%{name} rinisi dërgimin drejt përkatësisë %{target}" destroy_user_role_html: "%{name} fshiu rolin %{target}" disable_2fa_user_html: "%{name} çaktivizoi domosdoshmërinë për dyfaktorësh për përdoruesin %{target}" disable_custom_emoji_html: "%{name} çaktivizoi emoxhin %{target}" + disable_relay_html: "%{name} çaktivizoi relenë %{target}" disable_sign_in_token_auth_user_html: "%{name} çaktivizoi mirëfilltësim me token email për %{target}" disable_user_html: "%{name} çaktivizoi hyrje për përdoruesin %{target}" enable_custom_emoji_html: "%{name} aktivizoi emoxhin %{target}" + enable_relay_html: "%{name} aktivizoi relenë %{target}" enable_sign_in_token_auth_user_html: "%{name} aktivizoi mirëfilltësim me token email për %{target}" enable_user_html: "%{name} aktivizoi hyrje për përdoruesin %{target}" memorialize_account_html: "%{name} e shndërroi llogarinë e %{target} në një faqe përkujtimore" diff --git a/config/locales/sv.yml b/config/locales/sv.yml index b2ec21b82e..c41795a168 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -187,6 +187,7 @@ sv: create_domain_block: Skapa blockerad domän create_email_domain_block: Skapa E-post domän block create_ip_block: Skapa IP-regel + create_relay: Skapa ombud create_unavailable_domain: Skapa otillgänglig domän create_user_role: Skapa roll demote_user: Degradera användare @@ -198,14 +199,17 @@ sv: destroy_email_domain_block: Ta bort E-post domän block destroy_instance: Rensa domänen destroy_ip_block: Radera IP-regel + destroy_relay: Radera ombud destroy_status: Radera inlägg destroy_unavailable_domain: Ta bort otillgänglig domän destroy_user_role: Förstör roll disable_2fa_user: Inaktivera 2FA disable_custom_emoji: Inaktivera egna emojis + disable_relay: Inaktivera ombud disable_sign_in_token_auth_user: Inaktivera autentisering med pollett via e-post för användare disable_user: Inaktivera användare enable_custom_emoji: Aktivera egna emojis + enable_relay: Aktivera ombud enable_sign_in_token_auth_user: Aktivera autentisering med pollett via e-post för användare enable_user: Aktivera användare memorialize_account: Minnesmärk konto @@ -247,6 +251,7 @@ sv: create_domain_block_html: "%{name} blockerade domänen %{target}" create_email_domain_block_html: "%{name} blockerade e-post domänet%{target}" create_ip_block_html: "%{name} skapade regel för IP %{target}" + create_relay_html: "%{name} skapade ombudet %{target}" create_unavailable_domain_html: "%{name} stoppade leverans till domänen %{target}" create_user_role_html: "%{name} skapade rollen %{target}" demote_user_html: "%{name} nedgraderade användare %{target}" @@ -258,14 +263,17 @@ sv: destroy_email_domain_block_html: "%{name} avblockerade e-post domänet %{target}" destroy_instance_html: "%{name} rensade domän %{target}" destroy_ip_block_html: "%{name} tog bort regel för IP %{target}" + destroy_relay_html: "%{name} tog bort ombudet %{target}" destroy_status_html: "%{name} tog bort inlägget av %{target}" destroy_unavailable_domain_html: "%{name} återupptog leverans till domänen %{target}" destroy_user_role_html: "%{name} raderade rollen %{target}" disable_2fa_user_html: "%{name} inaktiverade tvåfaktorsautentiseringskrav för användaren %{target}" disable_custom_emoji_html: "%{name} inaktiverade emoji %{target}" + disable_relay_html: "%{name} inaktiverade ombudet %{target}" disable_sign_in_token_auth_user_html: "%{name} inaktiverade e-posttokenautentisering för %{target}" disable_user_html: "%{name} stängde av inloggning för användaren %{target}" enable_custom_emoji_html: "%{name} aktiverade emoji %{target}" + enable_relay_html: "%{name} aktiverat ombudet %{target}" enable_sign_in_token_auth_user_html: "%{name} aktiverade e-posttokenautentisering för %{target}" enable_user_html: "%{name} aktiverade inloggning för användaren %{target}" memorialize_account_html: "%{name} gjorde %{target}s konto till en minnessida" @@ -571,7 +579,7 @@ sv: relationships: title: "%{acct}s relationer" relays: - add_new: Lägg till nytt relä + add_new: Lägg till nytt ombud delete: Radera description_html: Ett federeringsombud är en mellanliggande server som utbyter höga antal offentliga inlägg mellan servrar som prenumererar på och publicerar till det. Det kan hjälpa små och medelstora servrar upptäcka innehåll från fediversumet, vilket annars skulle kräva att lokala användare manuellt följer personer på fjärrservrar. disable: Inaktivera @@ -582,10 +590,10 @@ sv: inbox_url: Ombuds-URL pending: Väntar på ombudets godkännande save_and_enable: Spara och aktivera - setup: Konfigurera en relä-anslutning - signatures_not_enabled: Ombud fungerar inte korrekt medan säkert läge eller begränsat federeringsläge är aktiverade + setup: Konfigurera ett ombud + signatures_not_enabled: Ombud fungerar inte korrekt om säkert läge eller begränsat federeringsläge är aktiverade status: Status - title: Relä + title: Ombud report_notes: created_msg: Anmälningsanteckning har skapats! destroyed_msg: Anmälningsanteckning har raderats! diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 942ee2fbf2..88636ef21b 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -187,6 +187,7 @@ tr: create_domain_block: Engellenen Alan Adı Oluştur create_email_domain_block: E-Posta Alan Adı Engeli Oluştur create_ip_block: IP kuralı oluştur + create_relay: Aktarıcı Oluştur create_unavailable_domain: Mevcut Olmayan Alan Adı Oluştur create_user_role: Rol Oluştur demote_user: Kullanıcıyı Düşür @@ -198,14 +199,17 @@ tr: destroy_email_domain_block: E-posta Alan Adı Engelini Sil destroy_instance: Alan adını temizle destroy_ip_block: IP kuralını sil + destroy_relay: Aktarıcı Sil destroy_status: Durumu Sil destroy_unavailable_domain: Mevcut Olmayan Alan Adı Sil destroy_user_role: Rolü Kaldır disable_2fa_user: 2AD Kapat disable_custom_emoji: Özel İfadeyi Devre Dışı Bırak + disable_relay: Aktarıcıyı Devre Dışı Bırak disable_sign_in_token_auth_user: Kullanıcı için E-posta Token Doğrulamayı Devre Dışı Bırak disable_user: Kullanıcıyı Devre Dışı Bırak enable_custom_emoji: Özel İfadeyi Etkinleştir + enable_relay: Aktarıcıyı Etkinleştir enable_sign_in_token_auth_user: Kullanıcı için E-posta Token Doğrulamayı Etkinleştir enable_user: Kullanıcıyı Etkinleştir memorialize_account: Hesabı Anıtlaştır @@ -247,6 +251,7 @@ tr: create_domain_block_html: "%{name}, %{target} alan adını engelledi" create_email_domain_block_html: "%{name}, %{target} e-posta alan adını engelledi" create_ip_block_html: "%{name}, %{target} IP adresi için kural oluşturdu" + create_relay_html: "%{name}, %{target} aktarıcısını oluşturdu" create_unavailable_domain_html: "%{name}, %{target} alan adına teslimatı durdurdu" create_user_role_html: "%{name}, %{target} rolünü oluşturdu" demote_user_html: "%{name}, %{target} kullanıcısını düşürdü" @@ -258,14 +263,17 @@ tr: destroy_email_domain_block_html: "%{name}, %{target} e-posta alan adı engelini kaldırdı" destroy_instance_html: "%{name}, %{target} alan adını temizledi" destroy_ip_block_html: "%{name}, %{target} IP adresi kuralını sildi" + destroy_relay_html: "%{name}, %{target} aktarıcısını sildi" destroy_status_html: "%{name}, %{target} kullanıcısının gönderisini kaldırdı" destroy_unavailable_domain_html: "%{name}, %{target} alan adına teslimatı sürdürdü" destroy_user_role_html: "%{name}, %{target} rolünü sildi" disable_2fa_user_html: "%{name}, %{target} kullanıcısının iki aşamalı doğrulama gereksinimini kapattı" disable_custom_emoji_html: "%{name}, %{target} emojisini devre dışı bıraktı" + disable_relay_html: "%{name}, %{target} aktarıcısını devre dışı bıraktı" disable_sign_in_token_auth_user_html: "%{name}, %{target} için e-posta token doğrulamayı devre dışı bıraktı" disable_user_html: "%{name}, %{target} kullanıcısı için oturum açmayı devre dışı bıraktı" enable_custom_emoji_html: "%{name}, %{target} emojisini etkinleştirdi" + enable_relay_html: "%{name}, %{target} aktarıcısını etkinleştirdi" enable_sign_in_token_auth_user_html: "%{name}, %{target} için e-posta token doğrulamayı etkinleştirdi" enable_user_html: "%{name}, %{target} kullanıcısı için oturum açmayı etkinleştirdi" memorialize_account_html: "%{name}, %{target} kullanıcısının hesabını bir anıt sayfaya dönüştürdü" diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 172ce55a3d..1d04f796f8 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -184,6 +184,7 @@ vi: create_domain_block: Chặn máy chủ create_email_domain_block: Chặn tên miền email create_ip_block: Chặn IP + create_relay: Tạo relay create_unavailable_domain: Bỏ liên hợp create_user_role: Tạo vai trò demote_user: Hạ vai trò @@ -195,14 +196,17 @@ vi: destroy_email_domain_block: Bỏ chặn tên miền email destroy_instance: Thanh trừng máy chủ destroy_ip_block: Bỏ chặn IP + destroy_relay: Xóa relay destroy_status: Xóa tút destroy_unavailable_domain: Cho phép liên hợp destroy_user_role: Xóa vai trò disable_2fa_user: Vô hiệu hóa 2FA disable_custom_emoji: Vô hiệu hóa emoji + disable_relay: Tắt relay disable_sign_in_token_auth_user: Tắt xác minh bằng email cho người dùng disable_user: Vô hiệu hóa đăng nhập enable_custom_emoji: Cho phép emoji + enable_relay: Bật relay enable_sign_in_token_auth_user: Bật xác minh bằng email cho người dùng enable_user: Cho phép đăng nhập memorialize_account: Gán tưởng niệm @@ -244,6 +248,7 @@ vi: create_domain_block_html: "%{name} đã chặn máy chủ %{target}" create_email_domain_block_html: "%{name} đã chặn tên miền email %{target}" create_ip_block_html: "%{name} đã chặn IP %{target}" + create_relay_html: "%{name} đã tạo relay %{target}" create_unavailable_domain_html: "%{name} đã bỏ liên hợp với máy chủ %{target}" create_user_role_html: "%{name} đã tạo vai trò %{target}" demote_user_html: "%{name} đã hạ vai trò của %{target}" @@ -255,14 +260,17 @@ vi: destroy_email_domain_block_html: "%{name} đã bỏ chặn email %{target}" destroy_instance_html: "%{name} đã thanh trừng máy chủ %{target}" destroy_ip_block_html: "%{name} đã bỏ chặn IP %{target}" + destroy_relay_html: "%{name} đã xóa relay %{target}" destroy_status_html: "%{name} đã xóa tút của %{target}" destroy_unavailable_domain_html: "%{name} tiếp tục liên hợp với máy chủ %{target}" destroy_user_role_html: "%{name} đã xóa vai trò %{target}" disable_2fa_user_html: "%{name} đã vô hiệu hóa xác minh hai bước của %{target}" disable_custom_emoji_html: "%{name} đã ẩn emoji %{target}" + disable_relay_html: "%{name} đã tắt relay %{target}" disable_sign_in_token_auth_user_html: "%{name} đã tắt xác minh email của %{target}" disable_user_html: "%{name} đã vô hiệu hóa đăng nhập %{target}" enable_custom_emoji_html: "%{name} đã cho phép emoji %{target}" + enable_relay_html: "%{name} đã bật relay %{target}" enable_sign_in_token_auth_user_html: "%{name} đã bật xác minh email của %{target}" enable_user_html: "%{name} đã bỏ vô hiệu hóa đăng nhập %{target}" memorialize_account_html: "%{name} đã biến tài khoản %{target} thành một trang tưởng niệm" diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 209683e21c..36d316649c 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -184,6 +184,7 @@ zh-CN: create_domain_block: 封禁新域名 create_email_domain_block: 封禁新的邮箱域名 create_ip_block: 新建 IP 规则 + create_relay: 创建中继站 create_unavailable_domain: 创建不可用域名 create_user_role: 创建角色 demote_user: 给用户降职 @@ -195,14 +196,17 @@ zh-CN: destroy_email_domain_block: 解除邮箱域名封禁 destroy_instance: 删除实例 destroy_ip_block: 删除 IP 规则 + destroy_relay: 删除中继站 destroy_status: 删除嘟文 destroy_unavailable_domain: 删除不可用域名 destroy_user_role: 销毁角色 disable_2fa_user: 停用双因素认证 disable_custom_emoji: 禁用自定义表情符号 + disable_relay: 禁用中继站 disable_sign_in_token_auth_user: 为用户禁用邮件令牌身份验证 disable_user: 禁用用户 enable_custom_emoji: 启用自定义表情符号 + enable_relay: 启用中继站 enable_sign_in_token_auth_user: 为用户启用邮件令牌身份验证 enable_user: 启用用户 memorialize_account: 将账户设为追悼模式 @@ -244,6 +248,7 @@ zh-CN: create_domain_block_html: "%{name} 屏蔽了域名 %{target}" create_email_domain_block_html: "%{name} 封禁了邮箱域名 %{target}" create_ip_block_html: "%{name} 为 IP %{target} 创建了规则" + create_relay_html: "%{name} 添加了中继站 %{target}" create_unavailable_domain_html: "%{name} 停止了向域名 %{target} 的投递" create_user_role_html: "%{name} 创建了 %{target} 角色" demote_user_html: "%{name} 对用户 %{target} 进行了降任操作" @@ -255,14 +260,17 @@ zh-CN: destroy_email_domain_block_html: "%{name} 解封了邮箱域名 %{target}" destroy_instance_html: "%{name} 删除了实例 %{target}" destroy_ip_block_html: "%{name} 删除了 IP %{target} 的规则" + destroy_relay_html: "%{name} 删除了中继站 %{target}" destroy_status_html: "%{name} 删除了 %{target} 的嘟文" destroy_unavailable_domain_html: "%{name} 恢复了向域名 %{target} 的投递" destroy_user_role_html: "%{name} 删除了 %{target} 角色" disable_2fa_user_html: "%{name} 停用了用户 %{target} 的双因素认证" disable_custom_emoji_html: "%{name} 停用了自定义表情 %{target}" + disable_relay_html: "%{name} 停用了中继站 %{target}" disable_sign_in_token_auth_user_html: "%{name} 为 %{target} 禁用了邮件令牌身份验证" disable_user_html: "%{name} 将用户 %{target} 设置为禁止登录" enable_custom_emoji_html: "%{name} 启用了自定义表情 %{target}" + enable_relay_html: "%{name} 启用了中继站 %{target}" enable_sign_in_token_auth_user_html: "%{name} 为 %{target} 启用了邮件令牌身份验证" enable_user_html: "%{name} 将用户 %{target} 设置为允许登录" memorialize_account_html: "%{name} 将 %{target} 设置为追悼账户" diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index d8fef10816..495a6a4742 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -184,6 +184,7 @@ zh-TW: create_domain_block: 新增網域封鎖 create_email_domain_block: 新增電子郵件網域封鎖 create_ip_block: 新增IP規則 + create_relay: 新增中繼 create_unavailable_domain: 新增無法存取的網域 create_user_role: 新增角色 demote_user: 將用戶降級 @@ -195,14 +196,17 @@ zh-TW: destroy_email_domain_block: 刪除電子郵件網域封鎖 destroy_instance: 清除網域 destroy_ip_block: 刪除 IP 規則 + destroy_relay: 刪除中繼 destroy_status: 刪除狀態 destroy_unavailable_domain: 刪除無法存取的網域 destroy_user_role: 移除角色 disable_2fa_user: 停用兩階段驗證 disable_custom_emoji: 停用自訂 emoji 表情符號 + disable_relay: 停用中繼 disable_sign_in_token_auth_user: 停用使用者電子郵件 token 驗證 disable_user: 停用帳號 enable_custom_emoji: 啟用自訂 emoji 表情符號 + enable_relay: 啟用中繼 enable_sign_in_token_auth_user: 啟用使用者電子郵件 token 驗證 enable_user: 啓用帳號 memorialize_account: 設定成追悼帳號 @@ -244,6 +248,7 @@ zh-TW: create_domain_block_html: "%{name} 已封鎖網域 %{target}" create_email_domain_block_html: "%{name} 已封鎖電子郵件網域 %{target}" create_ip_block_html: "%{name} 已設定 IP %{target} 的規則" + create_relay_html: "%{name} 已新增中繼 %{target}" create_unavailable_domain_html: "%{name} 停止發送至網域 %{target}" create_user_role_html: "%{name} 已新增 %{target} 角色" demote_user_html: "%{name} 將使用者 %{target} 降級" @@ -255,14 +260,17 @@ zh-TW: destroy_email_domain_block_html: "%{name} 已解除封鎖電子郵件網域 %{target}" destroy_instance_html: "%{name} 已清除網域 %{target}" destroy_ip_block_html: "%{name} 已刪除 IP %{target} 的規則" + destroy_relay_html: "%{name} 已刪除中繼 %{target}" destroy_status_html: "%{name} 已刪除 %{target} 的嘟文" destroy_unavailable_domain_html: "%{name} 已恢復對網域 %{target} 的發送" destroy_user_role_html: "%{name} 已刪除 %{target} 角色" disable_2fa_user_html: "%{name} 已停用使用者 %{target} 的兩階段驗證 (2FA) " disable_custom_emoji_html: "%{name} 已停用自訂 emoji 表情符號 %{target}" + disable_relay_html: "%{name} 已停用中繼 %{target}" disable_sign_in_token_auth_user_html: "%{name} 已停用 %{target} 之使用者電子郵件 token 驗證" disable_user_html: "%{name} 將使用者 %{target} 設定為禁止登入" enable_custom_emoji_html: "%{name} 已啟用自訂 emoji 表情符號 %{target}" + enable_relay_html: "%{name} 已啟用中繼 %{target}" enable_sign_in_token_auth_user_html: "%{name} 已啟用 %{target} 之使用者電子郵件 token 驗證" enable_user_html: "%{name} 將使用者 %{target} 設定為允許登入" memorialize_account_html: "%{name} 將 %{target} 設定為追悼帳號" @@ -560,7 +568,7 @@ zh-TW: relationships: title: "%{acct} 的關係" relays: - add_new: 新增中繼站 + add_new: 新增中繼 delete: 刪除 description_html: "聯邦中繼站 是種中繼伺服器,會於訂閱並推送至此中繼站的伺服器之間交換大量的公開嘟文。中繼站也能協助小型或中型伺服器自聯邦宇宙中探索內容,而無須本地使用者手動跟隨遠端伺服器的其他使用者。" disable: 停用 From 95d7120ce6671ec1765e8435b248eb2dc7d8ee02 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 13 Nov 2024 04:35:21 -0500 Subject: [PATCH 27/52] Misc gem version bumps (#32854) --- Gemfile.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 743a78ad54..b832a18df6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -97,7 +97,7 @@ GEM attr_required (1.0.2) awrence (1.2.1) aws-eventstream (1.3.0) - aws-partitions (1.1001.0) + aws-partitions (1.1004.0) aws-sdk-core (3.212.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) @@ -112,7 +112,7 @@ GEM aws-sigv4 (~> 1.5) aws-sigv4 (1.10.1) aws-eventstream (~> 1, >= 1.0.2) - azure-blob (0.5.2) + azure-blob (0.5.3) rexml base64 (0.2.0) bcp47_spec (0.2.1) @@ -178,7 +178,7 @@ GEM activerecord (>= 5.a) database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) - date (3.3.4) + date (3.4.0) debug (1.9.2) irb (~> 1.10) reline (>= 0.3.8) @@ -189,10 +189,10 @@ GEM railties (>= 4.1.0) responders warden (~> 1.2.3) - devise-two-factor (6.0.0) - activesupport (~> 7.0) + devise-two-factor (6.1.0) + activesupport (>= 7.0, < 8.1) devise (~> 4.0) - railties (~> 7.0) + railties (>= 7.0, < 8.1) rotp (~> 6.0) devise_pam_authenticatable2 (9.2.0) devise (>= 4.0.0) @@ -330,7 +330,7 @@ GEM azure-blob (~> 0.5.2) hashie (~> 5.0) jmespath (1.6.2) - json (2.7.4) + json (2.8.1) json-canonicalization (1.0.0) json-jwt (1.15.3.1) activesupport (>= 4.2) @@ -407,16 +407,16 @@ GEM mime-types (3.6.0) logger mime-types-data (~> 3.2015) - mime-types-data (3.2024.1001) + mime-types-data (3.2024.1105) mini_mime (1.1.5) mini_portile2 (2.8.7) minitest (5.25.1) - msgpack (1.7.3) + msgpack (1.7.5) multi_json (1.15.0) mutex_m (0.2.0) net-http (0.5.0) uri - net-imap (0.5.0) + net-imap (0.5.1) date net-protocol net-ldap (0.19.0) @@ -554,10 +554,10 @@ GEM opentelemetry-semantic_conventions (1.10.1) opentelemetry-api (~> 1.0) orm_adapter (0.5.0) - ostruct (0.6.0) + ostruct (0.6.1) ox (2.14.18) parallel (1.26.3) - parser (3.3.5.0) + parser (3.3.6.0) ast (~> 2.4.1) racc parslet (2.0.0) @@ -579,7 +579,7 @@ GEM activesupport (>= 7.0.0) rack railties (>= 7.0.0) - psych (5.1.2) + psych (5.2.0) stringio public_suffix (6.0.1) puma (6.4.3) @@ -664,7 +664,7 @@ GEM redlock (1.3.2) redis (>= 3.0.0, < 6.0) regexp_parser (2.9.2) - reline (0.5.10) + reline (0.5.11) io-console (~> 0.5) request_store (1.6.0) rack (>= 1.4) @@ -673,7 +673,7 @@ GEM railties (>= 5.2) rexml (3.3.9) rotp (6.3.0) - rouge (4.4.0) + rouge (4.5.1) rpam2 (4.0.2) rqrcode (2.2.0) chunky_png (~> 1.0) @@ -693,7 +693,7 @@ GEM rspec-mocks (3.13.2) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (7.0.1) + rspec-rails (7.1.0) actionpack (>= 7.0) activesupport (>= 7.0) railties (>= 7.0) @@ -794,7 +794,7 @@ GEM stackprof (0.2.26) stoplight (4.1.0) redlock (~> 1.0) - stringio (3.1.1) + stringio (3.1.2) strong_migrations (2.1.0) activerecord (>= 6.1) swd (1.3.0) @@ -867,7 +867,7 @@ GEM rack-proxy (>= 0.6.1) railties (>= 5.2) semantic_range (>= 2.3.0) - webrick (1.8.2) + webrick (1.9.0) websocket (1.2.11) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) From 8f5cbf537026915215d84945efad9a878ac8cdb4 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 13 Nov 2024 11:22:11 +0100 Subject: [PATCH 28/52] Fix list creation limit check (#32869) --- app/models/list.rb | 2 +- spec/models/list_spec.rb | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/models/list.rb b/app/models/list.rb index d4915f56fa..bb7dd4cfc0 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -34,7 +34,7 @@ class List < ApplicationRecord private def validate_account_lists_limit - errors.add(:base, I18n.t('lists.errors.limit')) if account.lists.count >= PER_ACCOUNT_LIMIT + errors.add(:base, I18n.t('lists.errors.limit')) if account.owned_lists.count >= PER_ACCOUNT_LIMIT end def clean_feed_manager diff --git a/spec/models/list_spec.rb b/spec/models/list_spec.rb index 62a84dfebf..48c273d3ec 100644 --- a/spec/models/list_spec.rb +++ b/spec/models/list_spec.rb @@ -11,7 +11,11 @@ RSpec.describe List do context 'when account has hit max list limit' do let(:account) { Fabricate :account } - before { stub_const 'List::PER_ACCOUNT_LIMIT', 0 } + before do + stub_const 'List::PER_ACCOUNT_LIMIT', 1 + + Fabricate(:list, account: account) + end context 'when creating a new list' do it { is_expected.to_not allow_value(account).for(:account).against(:base).with_message(I18n.t('lists.errors.limit')) } From 03ecf5df3bee1c667bfdba26887613c8620dc5c5 Mon Sep 17 00:00:00 2001 From: Jaz-Michael King <141073565+jmking-iftas@users.noreply.github.com> Date: Wed, 13 Nov 2024 08:10:01 -0500 Subject: [PATCH 29/52] Adds a range of reserved usernames to reduce potential misuse by malicious actors (#32828) --- config/settings.yml | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/config/settings.yml b/config/settings.yml index 297bf0281d..673a4c1be2 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -21,14 +21,27 @@ defaults: &defaults trends_as_landing_page: true trendable_by_default: false reserved_usernames: + - abuse + - account + - accounts - admin - - support - - help - - root - - webmaster + - administration - administrator + - admins + - help + - helpdesk + - instance - mod - moderator + - moderators + - mods + - owner + - root + - security + - server + - staff + - support + - webmaster disallowed_hashtags: # space separated string or list of hashtags without the hash bootstrap_timeline_accounts: '' activity_api_enabled: true From 7fc8292ea540fda71434d24dd78622d8e94d024c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 13 Nov 2024 16:08:10 +0100 Subject: [PATCH 30/52] Update dependency react-textarea-autosize to v8.5.5 (#32872) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9e3ec41017..7fd68ac8c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14787,15 +14787,15 @@ __metadata: linkType: hard "react-textarea-autosize@npm:^8.4.1": - version: 8.5.4 - resolution: "react-textarea-autosize@npm:8.5.4" + version: 8.5.5 + resolution: "react-textarea-autosize@npm:8.5.5" dependencies: "@babel/runtime": "npm:^7.20.13" use-composed-ref: "npm:^1.3.0" use-latest: "npm:^1.2.1" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/ea92fda2128983c1a8e84c74706ffb4b8bfa1a19c803d210868ec031c1ac3b8ceee8028766ef5d91017265da2bdccf6a85e5b6e5d553005e839f0c47e5758b43 + checksum: 10c0/d708a31b39a409d0246cd8afbd956ce51db58ce0b6411b9d4e1dc876ce93c329d20875933ce5d337662fdcd3699596966dc630149236fee2835d74e302404c98 languageName: node linkType: hard From 980970ddfd659393877cc4fa87d2811bbd0e0a79 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 10:15:49 +0100 Subject: [PATCH 31/52] Update dependency browser to v6.1.0 (#32878) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index b832a18df6..106fb0d0fd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -131,7 +131,7 @@ GEM msgpack (~> 1.2) brakeman (6.2.2) racc - browser (6.0.0) + browser (6.1.0) brpoplpush-redis_script (0.1.3) concurrent-ruby (~> 1.0, >= 1.0.5) redis (>= 1.0, < 6) From aaebf142aac8ae0f52faa847a9e0c206da57a555 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 10:39:33 +0100 Subject: [PATCH 32/52] New Crowdin Translations (automated) (#32884) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/ar.json | 1 + app/javascript/mastodon/locales/eo.json | 5 +++-- app/javascript/mastodon/locales/fr-CA.json | 3 +++ app/javascript/mastodon/locales/fr.json | 3 +++ app/javascript/mastodon/locales/it.json | 1 + app/javascript/mastodon/locales/lad.json | 25 ++++++++++++++++++++++ config/locales/bg.yml | 18 ++++++++++++++++ config/locales/es.yml | 24 ++++++++++----------- config/locales/lad.yml | 9 ++++++++ config/locales/simple_form.bg.yml | 3 +++ config/locales/simple_form.lad.yml | 1 + 11 files changed, 79 insertions(+), 14 deletions(-) diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 54ed1cb8c8..5c7dfeb128 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -86,6 +86,7 @@ "alert.unexpected.title": "المعذرة!", "alt_text_badge.title": "نص بديل", "announcement.announcement": "إعلان", + "annual_report.summary.archetype.booster": "The cool-hunter", "attachments_list.unprocessed": "(غير معالَج)", "audio.hide": "إخفاء المقطع الصوتي", "block_modal.remote_users_caveat": "سوف نطلب من الخادم {domain} أن يحترم قرارك، لكن الالتزام غير مضمون لأن بعض الخواديم قد تتعامل مع نصوص الكتل بشكل مختلف. قد تظل المنشورات العامة مرئية للمستخدمين غير المسجلين الدخول.", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 731e11f27a..6d8c82385b 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -90,6 +90,7 @@ "annual_report.summary.archetype.replier": "La plej societema", "annual_report.summary.followers.followers": "sekvantoj", "annual_report.summary.highlighted_post.by_replies": "afiŝo kun la plej multaj respondoj", + "annual_report.summary.most_used_app.most_used_app": "plej uzita apo", "annual_report.summary.most_used_hashtag.none": "Nenio", "annual_report.summary.new_posts.new_posts": "novaj afiŝoj", "annual_report.summary.thanks": "Dankon pro esti parto de Mastodon!", @@ -339,7 +340,7 @@ "followed_tags": "Sekvataj kradvortoj", "footer.about": "Pri", "footer.directory": "Profilujo", - "footer.get_app": "Akiru la Programon", + "footer.get_app": "Akiri la apon", "footer.invite": "Inviti homojn", "footer.keyboard_shortcuts": "Fulmoklavoj", "footer.privacy_policy": "Politiko de privateco", @@ -388,7 +389,7 @@ "ignore_notifications_modal.not_followers_title": "Ĉu ignori sciigojn de homoj, kiuj ne sekvas vin?", "ignore_notifications_modal.not_following_title": "Ĉu ignori sciigojn de homoj, kiujn vi ne sekvas?", "ignore_notifications_modal.private_mentions_title": "Ĉu ignori sciigojn de nepetitaj privataj mencioj?", - "interaction_modal.description.favourite": "Per konto ĉe Mastodon, vi povas stelumiti ĉi tiun afiŝon por sciigi la afiŝanton ke vi aprezigas ŝin kaj konservas por la estonteco.", + "interaction_modal.description.favourite": "Per konto ĉe Mastodon, vi povas stelumi ĉi tiun afiŝon por sciigi la afiŝanton ke vi sâtas kaj konservas ĝin por poste.", "interaction_modal.description.follow": "Kun konto ĉe Mastodon, vi povas sekvi {name} por ricevi iliajn afiŝojn en via hejma fluo.", "interaction_modal.description.reblog": "Kun konto ĉe Mastodon, vi povas diskonigi ĉi tiun afiŝon, por ke viaj propraj sekvantoj vidu ĝin.", "interaction_modal.description.reply": "Kun konto ĉe Mastodon, vi povos respondi al ĉi tiu afiŝo.", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 65bbc25c21..fed111e7e8 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -87,6 +87,9 @@ "alert.unexpected.title": "Oups!", "alt_text_badge.title": "Texte Alt", "announcement.announcement": "Annonce", + "annual_report.summary.archetype.oracle": "L’oracle", + "annual_report.summary.here_it_is": "Voici votre récap de {year} :", + "annual_report.summary.most_used_app.most_used_app": "appli la plus utilisée", "attachments_list.unprocessed": "(non traité)", "audio.hide": "Masquer l'audio", "block_modal.remote_users_caveat": "Nous allons demander au serveur {domain} de respecter votre décision. Cependant, ce respect n'est pas garanti, car certains serveurs peuvent gérer différemment les blocages. Les messages publics peuvent rester visibles par les utilisateur·rice·s non connecté·e·s.", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index ed751c244b..10bfc22bd8 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -87,6 +87,9 @@ "alert.unexpected.title": "Oups !", "alt_text_badge.title": "Texte Alt", "announcement.announcement": "Annonce", + "annual_report.summary.archetype.oracle": "L’oracle", + "annual_report.summary.here_it_is": "Voici votre récap de {year} :", + "annual_report.summary.most_used_app.most_used_app": "appli la plus utilisée", "attachments_list.unprocessed": "(non traité)", "audio.hide": "Masquer l'audio", "block_modal.remote_users_caveat": "Nous allons demander au serveur {domain} de respecter votre décision. Cependant, ce respect n'est pas garanti, car certains serveurs peuvent gérer différemment les blocages. Les messages publics peuvent rester visibles par les utilisateur·rice·s non connecté·e·s.", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index bf179ea2f2..06779d337c 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -97,6 +97,7 @@ "annual_report.summary.highlighted_post.possessive": "di {name}", "annual_report.summary.most_used_app.most_used_app": "l'app più utilizzata", "annual_report.summary.most_used_hashtag.most_used_hashtag": "l'hashtag più usato", + "annual_report.summary.most_used_hashtag.none": "Nessuno", "annual_report.summary.new_posts.new_posts": "nuovi post", "annual_report.summary.percentile.text": "Questo ti colloca tra ildei migliori utenti Mastodon.", "annual_report.summary.percentile.we_wont_tell_bernie": "Non lo diremo a Bernie.", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index 563eb3b190..0a5f82aee3 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -87,6 +87,17 @@ "alert.unexpected.title": "Atyo!", "alt_text_badge.title": "Teksto alternativo", "announcement.announcement": "Pregon", + "annual_report.summary.archetype.pollster": "El anketero", + "annual_report.summary.followers.followers": "suivantes", + "annual_report.summary.highlighted_post.by_favourites": "la puvlikasyon mas favoritada", + "annual_report.summary.highlighted_post.by_reblogs": "la puvlikasyon mas repartajada", + "annual_report.summary.highlighted_post.by_replies": "la puvlikasyon kon mas repuestas", + "annual_report.summary.highlighted_post.possessive": "de {name}", + "annual_report.summary.most_used_app.most_used_app": "la aplikasyon mas uzada", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "la etiketa mas uzada", + "annual_report.summary.most_used_hashtag.none": "Dinguno", + "annual_report.summary.new_posts.new_posts": "puvlikasyones muevas", + "annual_report.summary.thanks": "Mersi por ser parte de Mastodon!", "attachments_list.unprocessed": "(no prosesado)", "audio.hide": "Eskonde audio", "block_modal.show_less": "Amostra manko", @@ -97,6 +108,7 @@ "block_modal.you_wont_see_mentions": "No veras publikasyones ke lo enmentan.", "boost_modal.combo": "Puedes klikar {combo} para ometer esto la proksima vez", "boost_modal.reblog": "Repartajar puvlikasyon?", + "boost_modal.undo_reblog": "Departajar puvlikasyon?", "bundle_column_error.copy_stacktrace": "Kopia el raporto de yerro", "bundle_column_error.error.body": "La pajina solisitada no pudo ser renderada. Podria ser por un yerro en muestro kodiche o un problem de kompatibilita kon el navigador.", "bundle_column_error.error.title": "Atyo, no!", @@ -155,6 +167,7 @@ "compose_form.poll.duration": "Durasion de anketa", "compose_form.poll.multiple": "Multiples opsyones", "compose_form.poll.option_placeholder": "Opsyon {number}", + "compose_form.poll.single": "Opsyon unika", "compose_form.poll.switch_to_multiple": "Troka anketa para permeter a eskojer mas ke una opsyon", "compose_form.poll.switch_to_single": "Troka anketa para permeter a eskojer solo una opsyon", "compose_form.poll.type": "Estilo", @@ -213,6 +226,7 @@ "dismissable_banner.public_timeline": "Estas son las publikasyones publikas mas resientes de personas en la red sosyala a las kualas la djente de {domain} sige.", "domain_block_modal.block": "Bloka sirvidor", "domain_block_modal.block_account_instead": "Bloka @{name} en su lugar", + "domain_block_modal.they_can_interact_with_old_posts": "Las personas de este sirvidor pueden enteraktuar kon tus puvlikasyones viejas.", "domain_block_modal.they_cant_follow": "Dingun de este sirvidor puede segirte.", "domain_block_modal.they_wont_know": "No savra ke tiene sido blokado.", "domain_block_modal.title": "Bloka el domeno?", @@ -307,6 +321,7 @@ "follow_suggestions.personalized_suggestion": "Sujestion personalizada", "follow_suggestions.popular_suggestion": "Sujestion populara", "follow_suggestions.popular_suggestion_longer": "Popular en {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Similares a los profils ke tienes segido resyentemente", "follow_suggestions.view_all": "Ve todos", "follow_suggestions.who_to_follow": "A ken segir", "followed_tags": "Etiketas segidas", @@ -335,6 +350,9 @@ "hashtag.follow": "Sige etiketa", "hashtag.unfollow": "Desige etiketa", "hashtags.and_other": "…i {count, plural, one {}other {# mas}}", + "hints.profiles.followers_may_be_missing": "Puede ser ke algunos suivantes de este profil no se amostren.", + "hints.profiles.follows_may_be_missing": "Puede ser ke algunos kuentos segidos por este profil no se amostren.", + "hints.profiles.posts_may_be_missing": "Puede ser ke algunas puvlikasyones de este profil no se amostren.", "hints.profiles.see_more_followers": "Ve mas suivantes en {domain}", "hints.profiles.see_more_follows": "Ve mas segidos en {domain}", "hints.profiles.see_more_posts": "Ve mas puvlikasyones en {domain}", @@ -352,10 +370,12 @@ "ignore_notifications_modal.new_accounts_title": "Inyorar avizos de kuentos muevos?", "ignore_notifications_modal.not_followers_title": "Inyorar avizos de personas a las kualas no te sigen?", "ignore_notifications_modal.not_following_title": "Inyorar avizos de personas a las kualas no siges?", + "ignore_notifications_modal.private_mentions_title": "Ignorar avizos de mensyones privadas no solisitadas?", "interaction_modal.description.favourite": "Kon un kuento en Mastodon, puedes markar esta publikasyon komo favorita para ke el autor sepa ke te plaze i para guadrarla para dempues.", "interaction_modal.description.follow": "Kon un kuento en Mastodon, puedes segir a {name} para risivir sus publikasyones en tu linya temporal prinsipala.", "interaction_modal.description.reblog": "Kon un kuento en Mastodon, puedes repartajar esta publikasyon para amostrarla a tus suivantes.", "interaction_modal.description.reply": "Kon un kuento en Mastodon, puedes arispondir a esta publikasyon.", + "interaction_modal.description.vote": "Kon un kuento en Mastodon, puedes votar en esta anketa.", "interaction_modal.login.action": "Va a tu sirvidor", "interaction_modal.login.prompt": "Domeno del sirvidor de tu kuento, por enshemplo mastodon.social", "interaction_modal.no_account_yet": "No tyenes kuento de Mastodon?", @@ -367,6 +387,7 @@ "interaction_modal.title.follow": "Sige a {name}", "interaction_modal.title.reblog": "Repartaja publikasyon de {name}", "interaction_modal.title.reply": "Arisponde a publikasyon de {name}", + "interaction_modal.title.vote": "Vota en la anketa de {name}", "intervals.full.days": "{number, plural, one {# diya} other {# diyas}}", "intervals.full.hours": "{number, plural, one {# ora} other {# oras}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}", @@ -466,13 +487,16 @@ "navigation_bar.security": "Segurita", "not_signed_in_indicator.not_signed_in": "Nesesitas konektarse kon tu kuento para akseder este rekurso.", "notification.admin.report": "{name} raporto {target}", + "notification.admin.report_statuses": "{name} raporto {target} por {category}", "notification.admin.report_statuses_other": "{name} raporto {target}", "notification.admin.sign_up": "{name} kriyo un konto", + "notification.annual_report.view": "Ve #Wrapstodon", "notification.favourite": "A {name} le plaze tu publikasyon", "notification.follow": "{name} te ampeso a segir", "notification.follow_request": "{name} tiene solisitado segirte", "notification.label.mention": "Enmenta", "notification.label.private_mention": "Enmentadura privada", + "notification.label.private_reply": "Repuesta privada", "notification.label.reply": "Arisponde", "notification.mention": "Enmenta", "notification.mentioned_you": "{name} te enmento", @@ -536,6 +560,7 @@ "notifications.policy.accept_hint": "Amostra en avizos", "notifications.policy.drop": "Inyora", "notifications.policy.filter": "Filtra", + "notifications.policy.filter_limited_accounts_hint": "Limitadas por moderadores del sirvidor", "notifications.policy.filter_limited_accounts_title": "Kuentos moderados", "notifications.policy.filter_new_accounts.hint": "Kriyadas durante {days, plural, one {el ultimo diya} other {los ultimos # diyas}}", "notifications.policy.filter_new_accounts_title": "Muevos kuentos", diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 1fdd0e3533..7181b35b6d 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -412,6 +412,7 @@ bg: attempts_over_week: one: "%{count} опит за изминалата седмица" other: "%{count} опита за регистрация през изминалата седмица" + created_msg: Успешно блокиран домейн на е-поща delete: Изтриване dns: types: @@ -420,8 +421,11 @@ bg: new: create: Добавяне на домейн resolve: Преобразуване на домейна + title: Блокиране на нов домейн на имейл + no_email_domain_block_selected: Няма промяна, тъй като няма избрани блокирания на домейн на имейл not_permitted: Няма позволение resolved_through_html: Преобразувано чрез %{domain} + title: Блокирани домейни на имейл export_domain_allows: new: title: Внасяне на позволенията на домейни @@ -842,6 +846,9 @@ bg: message_html: Не сте определили никакви правила на сървъра. sidekiq_process_check: message_html: Не работи процес Sidekiq за %{value} опашка/и. Прегледайте настройките си за Sidekiq + software_version_check: + action: Преглед на наличните обновявания + message_html: Налично е обновяване на Mastodon. software_version_critical_check: action: Преглед на наличните обновявания message_html: Налично e критично обновяване на Mastodon. Обновете възможно най-бързо. @@ -1102,11 +1109,18 @@ bg: status: account_status: Състояние на акаунта functional: Вашият акаунт е в изправност. + pending: Вашето приложение чака преглед от персонала ни. Това може да отнеме време. Ще получите е-писмо, ако приложението ви се одобри. redirecting_to: Вашият акаунт е бездеен, защото сега се пренасочва към %{acct}. self_destruct: Затваряйки %{domain}, ще получите само ограничен достъп до акаунта си. view_strikes: Преглед на предишните предупреждения против акаунта ви too_fast: Образецът подаден пребързо, опитайте пак. use_security_key: Употреба на ключ за сигурност + author_attribution: + example_title: Примерен текст + more_from_html: Още от %{name} + s_blog: Блогът на %{name} + then_instructions: Тогава добавете име на домейна на публикацията в долното поле. + title: Приписване на авторството challenge: confirm: Продължаване hint_html: "Съвет: няма да ви питаме пак за паролата през следващия час." @@ -1450,6 +1464,7 @@ bg: update: subject: "%{name} промени публикация" notifications: + administration_emails: Известия за администратори по е-поща email_events_hint: 'Изберете събития, за които искате да получавате известия:' number: human: @@ -1607,6 +1622,7 @@ bg: import: Импортиране import_and_export: Импортиране и експортиране migrate: Миграция на акаунта + notifications: Известия по е-поща preferences: Предпочитания profile: Профил relationships: Последвания и последователи @@ -1842,6 +1858,7 @@ bg: invalid_otp_token: Невалиден код otp_lost_help_html: Ако загубите достъп до двете, то може да се свържете с %{email} rate_limited: Премного опити за удостоверяване. Опитайте пак по-късно. + seamless_external_login: Влезли сте чрез външна услуга, така че настройките за парола и имейл не са налични. signed_in_as: 'Влезли като:' verification: extra_instructions_html: Съвет:Връзката в уебсайта ви може да е невидима. Важна част е rel="me", която предотврятява имитирането на уебсайтове с породено от потребителите съдържание. Може дори да употребите етикет за връзката в заглавката на странице вместо а, но HTML трябва да достъпен без изпълнение на JavaScript. @@ -1850,6 +1867,7 @@ bg: instructions_html: Копипейстнете кода долу в HTML на уебсайта си. Тогава добавете адреса на уебсайта си в едно от допълнителните полета на профила ви от раздела "Редактиране на профила" и запазане на промените. verification: Проверка verified_links: Вашите потвърдени връзки + website_verification: Потвърждаване на уебсайта webauthn_credentials: add: Добавяне на нов ключ за сигурност create: diff --git a/config/locales/es.yml b/config/locales/es.yml index 8690c1cdfb..ddd53a2387 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -67,8 +67,8 @@ es: display_name: Nombre domain: Dominio edit: Editar - email: E-mail - email_status: E-mail Status + email: Correo electrónico + email_status: Estado del correo electrónico enable: Habilitar enable_sign_in_token_auth: Habilitar la autenticación por token de correo electrónico enabled: Habilitada @@ -86,7 +86,7 @@ es: local: Local remote: Remoto title: Localización - login_status: Estado del login + login_status: Estado de inicio de sesión media_attachments: Multimedia memorialize: Convertir en memorial memorialized: Cuenta conmemorativa @@ -102,7 +102,7 @@ es: moderation_notes: Notas de moderación most_recent_activity: Actividad más reciente most_recent_ip: IP más reciente - no_account_selected: Ninguna cuenta se cambió como ninguna fue seleccionada + no_account_selected: Ninguna cuenta se cambió, ya que ninguna fue seleccionada no_limits_imposed: Sin límites impuestos no_role_assigned: Ningún rol asignado not_subscribed: No se está suscrito @@ -132,17 +132,17 @@ es: success: "¡Enlace de confirmación enviado con éxito!" reset: Reiniciar reset_password: Reiniciar contraseña - resubscribe: Re-suscribir + resubscribe: Volver a suscribirse role: Rol search: Buscar search_same_email_domain: Otros usuarios con el mismo dominio de correo search_same_ip: Otros usuarios con la misma IP security: Seguridad security_measures: - only_password: Sólo contraseña + only_password: Solo contraseña password_and_2fa: Contraseña y 2FA sensitive: Sensible - sensitized: marcado como sensible + sensitized: Marcada como sensible shared_inbox_url: URL de bandeja compartida show: created_reports: Reportes hechos por esta cuenta @@ -161,10 +161,10 @@ es: unblocked_email_msg: Se ha desbloqueado correctamente la dirección de correo de %{username} unconfirmed_email: Correo electrónico sin confirmar undo_sensitized: Desmarcar como sensible - undo_silenced: Des-silenciar - undo_suspension: Des-suspender + undo_silenced: Dejar de silenciar + undo_suspension: Deshacer suspensión unsilenced_msg: Se quitó con éxito el límite de la cuenta %{username} - unsubscribe: Desuscribir + unsubscribe: Cancelar suscripción unsuspended_msg: Se quitó con éxito la suspensión de la cuenta de %{username} username: Nombre de usuario view_domain: Ver resumen del dominio @@ -296,7 +296,7 @@ es: empty: No se encontraron registros. filter_by_action: Filtrar por acción filter_by_user: Filtrar por usuario - title: Log de auditoría + title: Registro de auditoría unavailable_instance: "(nombre de dominio no disponible)" announcements: destroyed_msg: "¡Anuncio eliminado con éxito!" @@ -338,7 +338,7 @@ es: listed: Listados new: title: Añadir nuevo emoji personalizado - no_emoji_selected: No se cambió ningún emoji ya que no se seleccionó ninguno + no_emoji_selected: No se cambió ningún emoji, ya que no se seleccionó ninguno not_permitted: No tienes permiso para realizar esta acción overwrite: Sobrescribir shortcode: Código de atajo diff --git a/config/locales/lad.yml b/config/locales/lad.yml index ad241856a4..4486df637e 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -24,6 +24,7 @@ lad: admin: account_actions: action: Realiza aksion + already_silenced: Este kuento ya tiene sido limitado. already_suspended: Este kuento ya tiene sido suspendido. title: Modera %{acct} account_moderation_notes: @@ -638,6 +639,7 @@ lad: report: 'Raporta #%{id}' reported_account: Kuento raportado reported_by: Raportado por + reported_with_application: Raportado kon aplikasyon resolved: Rezolvido resolved_msg: Tienes rezolvido la denunsia djustamente! skip_to_actions: Va direktamente a las aksyones @@ -752,6 +754,7 @@ lad: desc_html: Esto se baza en eskriptos eksternos de hCaptcha, ke pueden ser una influensya negra a la sigurita i privasita. Ademas, esto puede rezultar en un proseso de enrejistrasyon signifikativamente manko aksesivle para algunas personas (espesyalmente diskapasitadas). Por estas razones, por favor, konsidera otras alternativas komo rejistrasyon por aprovasyon manuala o kon envitasyon. title: Solisita ke los muevos utilizadores rezolven un CAPTCHA para konfirmar su konto content_retention: + danger_zone: Zona de perikolo preamble: Kontrola komo el kontenido jenerado por el utilizador se magazina en Mastodon. title: Retensyon de kontenido default_noindex: @@ -882,9 +885,12 @@ lad: message_html: "Tu magazinaje de objektos es mal konfigurado. La privasita de tus utilizadores esta en riziko." tags: moderation: + not_trendable: No trendavle + not_usable: No uzavle pending_review: Revizion esta asperando reviewed: Revizado title: Estado + trendable: Trendavle unreviewed: No revizado usable: Uzavle name: Nombre @@ -959,6 +965,7 @@ lad: used_by_over_week: one: Uzada por una persona durante la ultima semana other: Uzada por %{count} personas durante la ultima semana + title: Rekomendasyones i trendes trending: En trend warning_presets: add_new: Adjusta muevo @@ -1138,7 +1145,9 @@ lad: too_fast: Formulario enviado demaziado rapido, aprovalo de muevo. use_security_key: Uza la yave de sigurita author_attribution: + example_title: Teksto de enshemplo more_from_html: Mas de %{name} + s_blog: Blog de %{name} challenge: confirm: Kontinua hint_html: "Konsejo: No retornaremos a demandarte por el kod durante la sigiente ora." diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index 5540942d93..17b7bd6239 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -3,12 +3,14 @@ bg: simple_form: hints: account: + attribution_domains_as_text: Едно на ред. Защитава от фалшиви атрибути. discoverable: Вашите публични публикации и профил може да се представят или препоръчват в различни области на Mastodon и вашия профил може да се предлага на други потребители. display_name: Вашето пълно име или псевдоним. fields: Вашата начална страница, местоимения, години, всичко що искате. indexable: Вашите обществени публикации може да се появят в резултатите от търсене в Mastodon. Взаимодействалите с публикациите ви може да ги търсят независимо. note: 'Може да @споменавате други хора или #хаштагове.' show_collections: Хората ще може да разглеждат през вашите последвания и последователи. Хората, които сте следвали, ще видят, че ги следвате независимо от това. + unlocked: Хората ще могат да ви последват без изискване на одобрение. Размаркирайте, ако искате да преглеждате заявките за последване и избирате дали да приемете или отхвърлите новите последователи. account_alias: acct: Посочете потребителско_име@домейн на акаунта си, от който искате да се преместите account_migration: @@ -142,6 +144,7 @@ bg: url: До къде ще се изпращат събитията labels: account: + attribution_domains_as_text: Уебсайтове, на които е позволено да приписват авторството ви discoverable: Включване на профил и публикации в алгоритмите за откриване fields: name: Етикет diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index 712c2f4e8a..de37005312 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -9,6 +9,7 @@ lad: indexable: Tus publikasyones publikas pueden apareser en rezultados de bushkeda en Mastodon. Personas ke enteraktuaron kon tus publikasyones syempre pueden bushkarlas inkluzo si trokes esta preferensya. note: 'Puedes @enmentar a otra djente o #etiketas.' show_collections: Otra djente podra ver tus segidos i suivantes. Personas a las kualas siges siempre podran ver que las estas sigiendo. + unlocked: Djente va poder segirte sin solisitar tu achetasyon. Deseleksyona si keres revizar solisitasyones de segimyento i dechidir si keres achetar o refuzar a muevos suivantes. account_alias: acct: Espesifika tu nombre de utilizador@domeno del kuento de ande keres migrar account_migration: From ec663eaba13294d803fdb8ddab373d7534c5a644 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 14 Nov 2024 13:50:36 +0100 Subject: [PATCH 33/52] Fix Content Warning and filter states not applying to boosted posts properly (#32887) --- app/javascript/mastodon/components/status.jsx | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index 96ccf3aad4..f17f0367c1 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -393,20 +393,6 @@ class Status extends ImmutablePureComponent { }; let media, statusAvatar, prepend, rebloggedByText; - const matchedFilters = status.get('matched_filters'); - const expanded = (!matchedFilters || this.state.showDespiteFilter) && (!status.get('hidden') || status.get('spoiler_text').length === 0); - - if (hidden) { - return ( - -
- {status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])} - {status.get('spoiler_text').length > 0 && ({status.get('spoiler_text')})} - {expanded && {status.get('content')}} -
-
- ); - } const connectUp = previousId && previousId === status.get('in_reply_to_id'); const connectToRoot = rootId && rootId === status.get('in_reply_to_id'); @@ -446,6 +432,21 @@ class Status extends ImmutablePureComponent { ); } + const matchedFilters = status.get('matched_filters'); + const expanded = (!matchedFilters || this.state.showDespiteFilter) && (!status.get('hidden') || status.get('spoiler_text').length === 0); + + if (hidden) { + return ( + +
+ {status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])} + {status.get('spoiler_text').length > 0 && ({status.get('spoiler_text')})} + {expanded && {status.get('content')}} +
+
+ ); + } + if (pictureInPicture.get('inUse')) { media = ; } else if (status.get('media_attachments').size > 0) { From e8b6607ece43e6fcda99e76f8db0ad40d54b50b6 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 14 Nov 2024 14:28:00 +0100 Subject: [PATCH 34/52] Fix titles being escaped twice (#32889) --- app/helpers/application_helper.rb | 2 +- app/views/about/show.html.haml | 3 +-- app/views/accounts/show.html.haml | 3 +-- app/views/privacy/show.html.haml | 3 +-- app/views/statuses/show.html.haml | 3 +-- spec/helpers/application_helper_spec.rb | 6 +++--- spec/views/statuses/show.html.haml_spec.rb | 6 +----- 7 files changed, 9 insertions(+), 17 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index e36de19255..3d5025724f 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -79,7 +79,7 @@ module ApplicationHelper def html_title safe_join( - [content_for(:page_title).to_s.chomp, title] + [content_for(:page_title), title] .compact_blank, ' - ' ) diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml index 05d8989add..e8f7b43eaa 100644 --- a/app/views/about/show.html.haml +++ b/app/views/about/show.html.haml @@ -1,5 +1,4 @@ -- content_for :page_title do - = t('about.title') +- content_for :page_title, t('about.title') - content_for :header_tags do = render partial: 'shared/og' diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml index dde9c50847..1f5f81348e 100644 --- a/app/views/accounts/show.html.haml +++ b/app/views/accounts/show.html.haml @@ -1,5 +1,4 @@ -- content_for :page_title do - #{display_name(@account)} (#{acct(@account)}) +- content_for :page_title, "#{display_name(@account)} (#{acct(@account)})" - content_for :header_tags do - if @account.user_prefers_noindex? diff --git a/app/views/privacy/show.html.haml b/app/views/privacy/show.html.haml index 95e506641b..9eb4f7a570 100644 --- a/app/views/privacy/show.html.haml +++ b/app/views/privacy/show.html.haml @@ -1,5 +1,4 @@ -- content_for :page_title do - = t('privacy_policy.title') +- content_for :page_title, t('privacy_policy.title') - content_for :header_tags do = render partial: 'shared/og' diff --git a/app/views/statuses/show.html.haml b/app/views/statuses/show.html.haml index 08bab63073..f669885de0 100644 --- a/app/views/statuses/show.html.haml +++ b/app/views/statuses/show.html.haml @@ -1,5 +1,4 @@ -- content_for :page_title do - = t('statuses.title', name: display_name(@account), quote: truncate(@status.spoiler_text.presence || @status.text, length: 50, omission: '…', escape: false)) +- content_for :page_title, t('statuses.title', name: display_name(@account), quote: truncate(@status.spoiler_text.presence || @status.text, length: 50, omission: '…', escape: false)) - content_for :header_tags do - if @account.user_prefers_noindex? diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index ffcc5b81b6..557d08e851 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -257,11 +257,11 @@ RSpec.describe ApplicationHelper do expect(helper.html_title).to be_html_safe end - it 'removes extra new lines' do + it 'does not escape twice' do Setting.site_title = 'Site Title' - helper.content_for(:page_title, "Test Value\n") + helper.content_for(:page_title, '"Test Value"'.html_safe) - expect(helper.html_title).to eq 'Test Value - Site Title' + expect(helper.html_title).to eq '"Test Value" - Site Title' expect(helper.html_title).to be_html_safe end end diff --git a/spec/views/statuses/show.html.haml_spec.rb b/spec/views/statuses/show.html.haml_spec.rb index 1afcb046d4..02b1fe7384 100644 --- a/spec/views/statuses/show.html.haml_spec.rb +++ b/spec/views/statuses/show.html.haml_spec.rb @@ -18,7 +18,7 @@ RSpec.describe 'statuses/show.html.haml' do assign(:descendant_threads, []) end - it 'has valid opengraph tags' do + it 'has valid opengraph tags and twitter player tags' do render expect(header_tags) @@ -26,10 +26,6 @@ RSpec.describe 'statuses/show.html.haml' do .and match(//) .and match(//) .and match(%r{}) - end - - it 'has twitter player tag' do - render expect(header_tags) .to match(%r{}) From 62d65504f66e0361d178ea882c97bdcfbc426c25 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 14 Nov 2024 08:47:29 -0500 Subject: [PATCH 35/52] Add `DomainResource` class to wrap MX lookup/normalize (#32864) --- .../admin/email_domain_blocks_controller.rb | 5 +---- app/lib/domain_resource.rb | 22 +++++++++++++++++++ app/models/user.rb | 8 +------ .../admin/email_domain_blocks/new.html.haml | 4 ++-- lib/mastodon/cli/email_domain_blocks.rb | 7 +----- spec/lib/domain_resource_spec.rb | 19 ++++++++++++++++ 6 files changed, 46 insertions(+), 19 deletions(-) create mode 100644 app/lib/domain_resource.rb create mode 100644 spec/lib/domain_resource_spec.rb diff --git a/app/controllers/admin/email_domain_blocks_controller.rb b/app/controllers/admin/email_domain_blocks_controller.rb index fe822d8c99..9501ebd63a 100644 --- a/app/controllers/admin/email_domain_blocks_controller.rb +++ b/app/controllers/admin/email_domain_blocks_controller.rb @@ -58,10 +58,7 @@ module Admin private def set_resolved_records - Resolv::DNS.open do |dns| - dns.timeouts = 5 - @resolved_records = dns.getresources(@email_domain_block.domain, Resolv::DNS::Resource::IN::MX).to_a - end + @resolved_records = DomainResource.new(@email_domain_block.domain).mx end def resource_params diff --git a/app/lib/domain_resource.rb b/app/lib/domain_resource.rb new file mode 100644 index 0000000000..59a29d8797 --- /dev/null +++ b/app/lib/domain_resource.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class DomainResource + attr_reader :domain + + RESOLVE_TIMEOUT = 5 + + def initialize(domain) + @domain = domain + end + + def mx + Resolv::DNS.open do |dns| + dns.timeouts = RESOLVE_TIMEOUT + dns + .getresources(domain, Resolv::DNS::Resource::IN::MX) + .to_a + .map { |mx| mx.exchange.to_s } + .compact_blank + end + end +end diff --git a/app/models/user.rb b/app/models/user.rb index 9a215669b9..f717dcd860 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -457,13 +457,7 @@ class User < ApplicationRecord # Doing this conditionally is not very satisfying, but this is consistent # with the MX records validations we do and keeps the specs tractable. - unless self.class.skip_mx_check? - Resolv::DNS.open do |dns| - dns.timeouts = 5 - - records = dns.getresources(domain, Resolv::DNS::Resource::IN::MX).to_a.map { |e| e.exchange.to_s }.compact_blank - end - end + records = DomainResource.new(domain).mx unless self.class.skip_mx_check? EmailDomainBlock.requires_approval?(records + [domain], attempt_ip: sign_up_ip) end diff --git a/app/views/admin/email_domain_blocks/new.html.haml b/app/views/admin/email_domain_blocks/new.html.haml index 2dfdca9376..4db8fbe5e5 100644 --- a/app/views/admin/email_domain_blocks/new.html.haml +++ b/app/views/admin/email_domain_blocks/new.html.haml @@ -30,12 +30,12 @@ %label.batch-table__row__select.batch-table__row__select--aligned.batch-checkbox = f.input_field :other_domains, as: :boolean, - checked_value: record.exchange.to_s, + checked_value: record, include_hidden: false, multiple: true .batch-table__row__content.pending-account .pending-account__header - %samp= record.exchange.to_s + %samp= record %br = t('admin.email_domain_blocks.dns.types.mx') diff --git a/lib/mastodon/cli/email_domain_blocks.rb b/lib/mastodon/cli/email_domain_blocks.rb index a830ca3661..0cc9ccb705 100644 --- a/lib/mastodon/cli/email_domain_blocks.rb +++ b/lib/mastodon/cli/email_domain_blocks.rb @@ -45,12 +45,7 @@ module Mastodon::CLI end other_domains = [] - if options[:with_dns_records] - Resolv::DNS.open do |dns| - dns.timeouts = 5 - other_domains = dns.getresources(domain, Resolv::DNS::Resource::IN::MX).to_a.map { |e| e.exchange.to_s }.compact_blank - end - end + other_domains = DomainResource.new(domain).mx if options[:with_dns_records] email_domain_block = EmailDomainBlock.new(domain: domain, other_domains: other_domains) email_domain_block.save! diff --git a/spec/lib/domain_resource_spec.rb b/spec/lib/domain_resource_spec.rb new file mode 100644 index 0000000000..0d239fd9de --- /dev/null +++ b/spec/lib/domain_resource_spec.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe DomainResource do + describe '#mx' do + subject { described_class.new(domain) } + + let(:domain) { 'example.host' } + let(:exchange) { 'mx.host' } + + before { configure_mx(domain: domain, exchange: exchange) } + + it 'returns array of hostnames' do + expect(subject.mx) + .to eq([exchange]) + end + end +end From 766358e52b86ca0dc6cf9bb091565e97af00b19a Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 14 Nov 2024 09:03:57 -0500 Subject: [PATCH 36/52] Add coverage for malformed version cleanup in `SoftwareUpdateCheckService`, add helper query methods (#32876) --- app/models/software_update.rb | 16 +++++- app/services/software_update_check_service.rb | 2 +- spec/models/software_update_spec.rb | 54 +++++++++++++++++++ .../software_update_check_service_spec.rb | 5 +- 4 files changed, 73 insertions(+), 4 deletions(-) diff --git a/app/models/software_update.rb b/app/models/software_update.rb index 2cb935130a..7e2b15656e 100644 --- a/app/models/software_update.rb +++ b/app/models/software_update.rb @@ -22,6 +22,14 @@ class SoftwareUpdate < ApplicationRecord Gem::Version.new(version) end + def outdated? + runtime_version >= gem_version + end + + def pending? + gem_version > runtime_version + end + class << self def check_enabled? Rails.configuration.x.mastodon.software_update_url.present? @@ -30,11 +38,17 @@ class SoftwareUpdate < ApplicationRecord def pending_to_a return [] unless check_enabled? - all.to_a.filter { |update| update.gem_version > Mastodon::Version.gem_version } + all.to_a.filter(&:pending?) end def urgent_pending? pending_to_a.any?(&:urgent?) end end + + private + + def runtime_version + Mastodon::Version.gem_version + end end diff --git a/app/services/software_update_check_service.rb b/app/services/software_update_check_service.rb index 148f269289..45ec1f50db 100644 --- a/app/services/software_update_check_service.rb +++ b/app/services/software_update_check_service.rb @@ -12,7 +12,7 @@ class SoftwareUpdateCheckService < BaseService def clean_outdated_updates! SoftwareUpdate.find_each do |software_update| - software_update.delete if Mastodon::Version.gem_version >= software_update.gem_version + software_update.delete if software_update.outdated? rescue ArgumentError software_update.delete end diff --git a/spec/models/software_update_spec.rb b/spec/models/software_update_spec.rb index 0a494b0c4c..43e9cd058f 100644 --- a/spec/models/software_update_spec.rb +++ b/spec/models/software_update_spec.rb @@ -3,6 +3,60 @@ require 'rails_helper' RSpec.describe SoftwareUpdate do + describe '#pending?' do + subject { described_class.new(version: update_version) } + + before { allow(Mastodon::Version).to receive(:gem_version).and_return(Gem::Version.new(mastodon_version)) } + + context 'when the runtime version is older than the update' do + let(:mastodon_version) { '4.0.0' } + let(:update_version) { '5.0.0' } + + it { is_expected.to be_pending } + end + + context 'when the runtime version is newer than the update' do + let(:mastodon_version) { '6.0.0' } + let(:update_version) { '5.0.0' } + + it { is_expected.to_not be_pending } + end + + context 'when the runtime version is same as the update' do + let(:mastodon_version) { '4.0.0' } + let(:update_version) { '4.0.0' } + + it { is_expected.to_not be_pending } + end + end + + describe '#outdated?' do + subject { described_class.new(version: update_version) } + + before { allow(Mastodon::Version).to receive(:gem_version).and_return(Gem::Version.new(mastodon_version)) } + + context 'when the runtime version is older than the update' do + let(:mastodon_version) { '4.0.0' } + let(:update_version) { '5.0.0' } + + it { is_expected.to_not be_outdated } + end + + context 'when the runtime version is newer than the update' do + let(:mastodon_version) { '6.0.0' } + let(:update_version) { '5.0.0' } + + it { is_expected.to be_outdated } + end + + context 'when the runtime version is same as the update' do + let(:mastodon_version) { '4.0.0' } + let(:update_version) { '4.0.0' } + + it { is_expected.to be_outdated } + end + end + describe '.pending_to_a' do before do allow(Mastodon::Version).to receive(:gem_version).and_return(Gem::Version.new(mastodon_version)) diff --git a/spec/services/software_update_check_service_spec.rb b/spec/services/software_update_check_service_spec.rb index 4098bd470a..637e1e26c5 100644 --- a/spec/services/software_update_check_service_spec.rb +++ b/spec/services/software_update_check_service_spec.rb @@ -27,6 +27,7 @@ RSpec.describe SoftwareUpdateCheckService do before do Fabricate(:software_update, version: '3.5.0', type: 'major', urgent: false) Fabricate(:software_update, version: '42.13.12', type: 'major', urgent: false) + Fabricate(:software_update, version: 'Malformed', type: 'major', urgent: false) owner_user.settings.update('notification_emails.software_updates': 'all') owner_user.save! @@ -50,7 +51,7 @@ RSpec.describe SoftwareUpdateCheckService do end it 'deletes outdated update records but keeps valid update records' do - expect { subject.call }.to change { SoftwareUpdate.pluck(:version).sort }.from(['3.5.0', '42.13.12']).to(['42.13.12']) + expect { subject.call }.to change { SoftwareUpdate.pluck(:version).sort }.from(['3.5.0', '42.13.12', 'Malformed']).to(['42.13.12']) end end @@ -85,7 +86,7 @@ RSpec.describe SoftwareUpdateCheckService do end it 'updates the list of known updates' do - expect { subject.call }.to change { SoftwareUpdate.pluck(:version).sort }.from(['3.5.0', '42.13.12']).to(['4.2.1', '4.3.0', '5.0.0']) + expect { subject.call }.to change { SoftwareUpdate.pluck(:version).sort }.from(['3.5.0', '42.13.12', 'Malformed']).to(['4.2.1', '4.3.0', '5.0.0']) end context 'when no update is urgent' do From 2de018256ae2ec5e7a508aff6e0e7905ec517118 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 14 Nov 2024 20:42:43 +0100 Subject: [PATCH 37/52] Fix filters not being correctly applied to boosted posts (#32895) --- app/javascript/mastodon/components/status.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index f17f0367c1..95ea53521f 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -397,6 +397,7 @@ class Status extends ImmutablePureComponent { const connectUp = previousId && previousId === status.get('in_reply_to_id'); const connectToRoot = rootId && rootId === status.get('in_reply_to_id'); const connectReply = nextInReplyToId && nextInReplyToId === status.get('id'); + const matchedFilters = status.get('matched_filters'); if (featured) { prepend = ( @@ -432,7 +433,6 @@ class Status extends ImmutablePureComponent { ); } - const matchedFilters = status.get('matched_filters'); const expanded = (!matchedFilters || this.state.showDespiteFilter) && (!status.get('hidden') || status.get('spoiler_text').length === 0); if (hidden) { From ddfb3d123bb4195f0b086fe19bc90700fa5170b4 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Fri, 15 Nov 2024 10:38:01 +0100 Subject: [PATCH 38/52] Improve display of statuses in admin panel (#30813) --- app/controllers/admin/statuses_controller.rb | 2 + .../admin/account_moderation_notes_helper.rb | 4 +- app/javascript/styles/mastodon/admin.scss | 28 +++++++ app/javascript/styles/mastodon/tables.scss | 16 ++-- app/views/admin/reports/_status.html.haml | 78 +++++++++++-------- app/views/admin/statuses/index.html.haml | 21 +++-- app/views/admin/statuses/show.html.haml | 64 ++++++++++++++- config/locales/an.yml | 2 +- config/locales/ar.yml | 2 +- config/locales/be.yml | 2 +- config/locales/bg.yml | 2 +- config/locales/br.yml | 2 +- config/locales/ca.yml | 2 +- config/locales/ckb.yml | 2 +- config/locales/co.yml | 2 +- config/locales/cs.yml | 2 +- config/locales/cy.yml | 2 +- config/locales/da.yml | 2 +- config/locales/de.yml | 2 +- config/locales/el.yml | 2 +- config/locales/en-GB.yml | 2 +- config/locales/en.yml | 8 +- config/locales/eo.yml | 2 +- config/locales/es-AR.yml | 2 +- config/locales/es-MX.yml | 2 +- config/locales/es.yml | 2 +- config/locales/et.yml | 2 +- config/locales/eu.yml | 2 +- config/locales/fa.yml | 2 +- config/locales/fi.yml | 2 +- config/locales/fo.yml | 2 +- config/locales/fr-CA.yml | 2 +- config/locales/fr.yml | 2 +- config/locales/fy.yml | 2 +- config/locales/ga.yml | 2 +- config/locales/gd.yml | 2 +- config/locales/gl.yml | 2 +- config/locales/he.yml | 2 +- config/locales/hu.yml | 2 +- config/locales/hy.yml | 2 +- config/locales/ia.yml | 2 +- config/locales/id.yml | 2 +- config/locales/ie.yml | 2 +- config/locales/io.yml | 2 +- config/locales/is.yml | 2 +- config/locales/it.yml | 2 +- config/locales/ja.yml | 2 +- config/locales/ka.yml | 2 +- config/locales/kab.yml | 2 +- config/locales/kk.yml | 2 +- config/locales/ko.yml | 2 +- config/locales/ku.yml | 2 +- config/locales/lad.yml | 2 +- config/locales/lt.yml | 2 +- config/locales/lv.yml | 2 +- config/locales/ms.yml | 2 +- config/locales/my.yml | 2 +- config/locales/nl.yml | 2 +- config/locales/nn.yml | 2 +- config/locales/no.yml | 2 +- config/locales/oc.yml | 2 +- config/locales/pl.yml | 2 +- config/locales/pt-BR.yml | 2 +- config/locales/pt-PT.yml | 2 +- config/locales/ru.yml | 2 +- config/locales/sc.yml | 2 +- config/locales/sco.yml | 2 +- config/locales/si.yml | 2 +- config/locales/sk.yml | 2 +- config/locales/sl.yml | 2 +- config/locales/sq.yml | 2 +- config/locales/sr-Latn.yml | 2 +- config/locales/sr.yml | 2 +- config/locales/sv.yml | 2 +- config/locales/th.yml | 2 +- config/locales/tr.yml | 2 +- config/locales/uk.yml | 2 +- config/locales/vi.yml | 2 +- config/locales/zh-CN.yml | 2 +- config/locales/zh-HK.yml | 2 +- config/locales/zh-TW.yml | 2 +- 81 files changed, 236 insertions(+), 131 deletions(-) diff --git a/app/controllers/admin/statuses_controller.rb b/app/controllers/admin/statuses_controller.rb index e53b22dca3..40d1a481b2 100644 --- a/app/controllers/admin/statuses_controller.rb +++ b/app/controllers/admin/statuses_controller.rb @@ -16,6 +16,8 @@ module Admin def show authorize [:admin, @status], :show? + + @status_batch_action = Admin::StatusBatchAction.new end def batch diff --git a/app/helpers/admin/account_moderation_notes_helper.rb b/app/helpers/admin/account_moderation_notes_helper.rb index 2a3d954a35..7c931c1157 100644 --- a/app/helpers/admin/account_moderation_notes_helper.rb +++ b/app/helpers/admin/account_moderation_notes_helper.rb @@ -12,12 +12,12 @@ module Admin::AccountModerationNotesHelper ) end - def admin_account_inline_link_to(account) + def admin_account_inline_link_to(account, path: nil) return if account.nil? link_to( account_inline_text(account), - admin_account_path(account.id), + path || admin_account_path(account.id), class: class_names('inline-name-tag', suspended: suspended_account?(account)), title: account.acct ) diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index c7b32a9c9e..579b2a4f69 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -1922,3 +1922,31 @@ a.sparkline { } } } + +.status__card { + padding: 15px; + border-radius: 4px; + background: $ui-base-color; + font-size: 15px; + line-height: 20px; + word-wrap: break-word; + font-weight: 400; + border: 1px solid lighten($ui-base-color, 4%); + color: $primary-text-color; + box-sizing: border-box; + min-height: 100%; + + .status__prepend { + padding: 0 0 15px; + gap: 4px; + align-items: center; + } + + .status__content { + padding-top: 0; + + summary { + display: list-item; + } + } +} diff --git a/app/javascript/styles/mastodon/tables.scss b/app/javascript/styles/mastodon/tables.scss index 0cbf5c1d55..07d1ce12fd 100644 --- a/app/javascript/styles/mastodon/tables.scss +++ b/app/javascript/styles/mastodon/tables.scss @@ -339,16 +339,12 @@ a.table-action-link { } } - .status__content { - padding-top: 0; - - summary { - display: list-item; - } - - strong { - font-weight: 700; - } + // Reset the status card to not have borders, background or padding when + // inline in the table of statuses + .status__card { + border: none; + background: none; + padding: 0; } .nothing-here { diff --git a/app/views/admin/reports/_status.html.haml b/app/views/admin/reports/_status.html.haml index f4630ed25a..3a35fdd272 100644 --- a/app/views/admin/reports/_status.html.haml +++ b/app/views/admin/reports/_status.html.haml @@ -2,40 +2,52 @@ %label.batch-table__row__select.batch-checkbox = f.check_box :status_ids, { multiple: true, include_hidden: false }, status.id .batch-table__row__content - .status__content>< - - if status.proper.spoiler_text.blank? - = prerender_custom_emojis(status_content_format(status.proper), status.proper.emojis) - - else - %details< - %summary>< - %strong> Content warning: #{prerender_custom_emojis(h(status.proper.spoiler_text), status.proper.emojis)} - = prerender_custom_emojis(status_content_format(status.proper), status.proper.emojis) - - - unless status.proper.ordered_media_attachments.empty? - = render partial: 'admin/reports/media_attachments', locals: { status: status.proper } - - .detailed-status__meta - - if status.application - = status.application.name - · - = link_to ActivityPub::TagManager.instance.url_for(status.proper), class: 'detailed-status__datetime', target: stream_link_target, rel: 'noopener noreferrer' do - %time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at) - - if status.edited? - · - = link_to t('statuses.edited_at_html', date: content_tag(:time, l(status.edited_at), datetime: status.edited_at.iso8601, title: l(status.edited_at), class: 'formatted')), - admin_account_status_path(status.account_id, status), - class: 'detailed-status__datetime' - - if status.discarded? - · - %span.negative-hint= t('admin.statuses.deleted') - · + .status__card - if status.reblog? - = material_symbol('repeat_active') - = t('statuses.boosted_from_html', acct_link: admin_account_inline_link_to(status.proper.account)) - - else + .status__prepend + = material_symbol('repeat') + = t('statuses.boosted_from_html', acct_link: admin_account_inline_link_to(status.proper.account, path: admin_account_status_path(status.proper.account.id, status.proper.id))) + - elsif status.reply? && status.in_reply_to_id.present? + .status__prepend + = material_symbol('reply') + = t('admin.statuses.replied_to_html', acct_link: admin_account_inline_link_to(status.in_reply_to_account, path: admin_account_status_path(status.thread.account_id, status.in_reply_to_id))) + .status__content>< + - if status.proper.spoiler_text.blank? + = prerender_custom_emojis(status_content_format(status.proper), status.proper.emojis) + - else + %details< + %summary>< + %strong> Content warning: #{prerender_custom_emojis(h(status.proper.spoiler_text), status.proper.emojis)} + = prerender_custom_emojis(status_content_format(status.proper), status.proper.emojis) + + - unless status.proper.ordered_media_attachments.empty? + = render partial: 'admin/reports/media_attachments', locals: { status: status.proper } + + .detailed-status__meta + - if status.application + = status.application.name + · + + = link_to admin_account_status_path(status.account.id, status), class: 'detailed-status__datetime' do + %time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at) + - if status.edited? + · + = link_to t('statuses.edited_at_html', date: content_tag(:time, l(status.edited_at), datetime: status.edited_at.iso8601, title: l(status.edited_at), class: 'formatted')), + admin_account_status_path(status.account_id, status), + class: 'detailed-status__datetime' + - if status.discarded? + · + %span.negative-hint= t('admin.statuses.deleted') + · + = material_symbol visibility_icon(status) = t("statuses.visibilities.#{status.visibility}") - - if status.proper.sensitive? · - = material_symbol('visibility_off') - = t('stream_entries.sensitive_content') + + = link_to ActivityPub::TagManager.instance.url_for(status.proper), class: 'detailed-status__link', target: stream_link_target, rel: 'noopener noreferrer' do + = t('admin.statuses.view_publicly') + + - if status.proper.sensitive? + · + = material_symbol('visibility_off') + = t('stream_entries.sensitive_content') diff --git a/app/views/admin/statuses/index.html.haml b/app/views/admin/statuses/index.html.haml index 4d5d037060..57b9fe0e15 100644 --- a/app/views/admin/statuses/index.html.haml +++ b/app/views/admin/statuses/index.html.haml @@ -1,7 +1,5 @@ - content_for :page_title do - = t('admin.statuses.title') - \- - @#{@account.pretty_acct} + = t('admin.statuses.title', name: @account.pretty_acct) .filters .filter-subset @@ -33,11 +31,18 @@ = check_box_tag :batch_checkbox_all, nil, false .batch-table__toolbar__actions - unless @statuses.empty? - = f.button safe_join([material_symbol('flag'), t('admin.statuses.batch.report')]), - class: 'table-action-link', - data: { confirm: t('admin.reports.are_you_sure') }, - name: :report, - type: :submit + - if params[:report_id] + = f.button safe_join([material_symbol('add'), t('admin.statuses.batch.add_to_report', id: params[:report_id])]), + class: 'table-action-link', + data: { confirm: t('admin.reports.are_you_sure') }, + name: :report, + type: :submit + - else + = f.button safe_join([material_symbol('flag'), t('admin.statuses.batch.report')]), + class: 'table-action-link', + data: { confirm: t('admin.reports.are_you_sure') }, + name: :report, + type: :submit .batch-table__body - if @statuses.empty? = nothing_here 'nothing-here--under-tabs' diff --git a/app/views/admin/statuses/show.html.haml b/app/views/admin/statuses/show.html.haml index 9cadde2870..49c23e921c 100644 --- a/app/views/admin/statuses/show.html.haml +++ b/app/views/admin/statuses/show.html.haml @@ -1,7 +1,14 @@ - content_for :page_title do - = t('statuses.title', name: display_name(@account), quote: truncate(@status.spoiler_text.presence || @status.text, length: 50, omission: '…', escape: false)) + = t('admin.statuses.status_title', name: @account.pretty_acct) - content_for :heading_actions do + = form_with model: @status_batch_action, url: batch_admin_account_statuses_path(@account.id) do |f| + = f.hidden_field :status_ids, { multiple: true, value: @status.id } + = f.button safe_join([material_symbol('flag'), t('admin.statuses.batch.report')]), + class: 'button', + data: { confirm: t('admin.reports.are_you_sure') }, + name: :report, + type: :submit = link_to t('admin.statuses.open'), ActivityPub::TagManager.instance.url_for(@status), class: 'button', target: '_blank', rel: 'noopener noreferrer' %h3= t('admin.statuses.metadata') @@ -44,7 +51,56 @@ %hr.spacer/ -%h3= t('admin.statuses.history') +%h3= t('admin.statuses.contents') -%ol.history - = render partial: 'admin/status_edits/status_edit', collection: batched_ordered_status_edits +.status__card + - if @status.reblog? + .status__prepend + = material_symbol('repeat') + = t('statuses.boosted_from_html', acct_link: admin_account_inline_link_to(@status.proper.account, path: admin_account_status_path(@status.proper.account.id, @status.proper.id))) + - elsif @status.reply? && @status.in_reply_to_id.present? + .status__prepend + = material_symbol('reply') + = t('admin.statuses.replied_to_html', acct_link: admin_account_inline_link_to(@status.in_reply_to_account, path: admin_account_status_path(@status.thread.account_id, @status.in_reply_to_id))) + .status__content>< + - if @status.proper.spoiler_text.blank? + = prerender_custom_emojis(status_content_format(@status.proper), @status.proper.emojis) + - else + %details< + %summary>< + %strong> Content warning: #{prerender_custom_emojis(h(@status.proper.spoiler_text), @status.proper.emojis)} + = prerender_custom_emojis(status_content_format(@status.proper), @status.proper.emojis) + + - unless @status.proper.ordered_media_attachments.empty? + = render partial: 'admin/reports/media_attachments', locals: { status: @status.proper } + + .detailed-status__meta + - if @status.application + = @status.application.name + · + %span.detailed-status__datetime + %time.formatted{ datetime: @status.created_at.iso8601, title: l(@status.created_at) }= l(@status.created_at) + - if @status.edited? + · + %span.detailed-status__datetime + = t('statuses.edited_at_html', date: content_tag(:time, l(@status.edited_at), datetime: @status.edited_at.iso8601, title: l(@status.edited_at), class: 'formatted')) + - if @status.discarded? + · + %span.negative-hint= t('admin.statuses.deleted') + - unless @status.reblog? + · + = material_symbol(visibility_icon(@status)) + = t("statuses.visibilities.#{@status.visibility}") + - if @status.proper.sensitive? + · + = material_symbol('visibility_off') + = t('stream_entries.sensitive_content') + +%hr.spacer/ + +%h3= t('admin.statuses.history') +- if @status.edits.empty? + %p= t('admin.statuses.no_history') +- else + %ol.history + = render partial: 'admin/status_edits/status_edit', collection: batched_ordered_status_edits diff --git a/config/locales/an.yml b/config/locales/an.yml index 2db042f1b1..43f8d358cc 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -723,7 +723,7 @@ an: original_status: Publicación orichinal reblogs: Impulsos status_changed: Publicación cambiada - title: Estau d'as cuentas + title: Estau d'as cuentas - @%{name} trending: En tendencia visibility: Visibilidat with_media: Con multimedia diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 1a6f0da8c6..bbc481a137 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -847,7 +847,7 @@ ar: original_status: المنشور الأصلي reblogs: المعاد تدوينها status_changed: عُدّل المنشور - title: منشورات الحساب + title: منشورات الحساب - @%{name} trending: المتداولة visibility: مدى الظهور with_media: تحتوي على وسائط diff --git a/config/locales/be.yml b/config/locales/be.yml index b627672b2d..c59233eb8b 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -856,7 +856,7 @@ be: original_status: Зыходны допіс reblogs: Рэпосты status_changed: Допіс зменены - title: Допісы уліковага запісу + title: Допісы уліковага запісу - @%{name} trending: Папулярныя visibility: Бачнасць with_media: З медыя diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 7181b35b6d..e10ce3197c 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -803,7 +803,7 @@ bg: original_status: Първообразна публикация reblogs: Блогване пак status_changed: Публикацията променена - title: Публикации на акаунта + title: Публикации на акаунта - @%{name} trending: Изгряващи visibility: Видимост with_media: С мултимедия diff --git a/config/locales/br.yml b/config/locales/br.yml index f9fbd34adb..098b20934f 100644 --- a/config/locales/br.yml +++ b/config/locales/br.yml @@ -263,7 +263,7 @@ br: original_status: Toud orin reblogs: Skignadennoù status_changed: Toud kemmet - title: Toudoù ar gont + title: Toudoù ar gont - @%{name} visibility: Gwelusted with_media: Gant mediaoù strikes: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 00c8f57a85..970fd99fff 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -841,7 +841,7 @@ ca: original_status: Publicació original reblogs: Impulsos status_changed: Publicació canviada - title: Estats del compte + title: Estats del compte - @%{name} trending: Tendència visibility: Visibilitat with_media: Amb contingut multimèdia diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index 88dadff014..6e1b11379c 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -520,7 +520,7 @@ ckb: media: title: میدیا no_status_selected: هیچ دۆخیک نەگۆڕاوە وەک ئەوەی هیچ بارێک دەستنیشان نەکراوە - title: دۆخی ئەژمێر + title: دۆخی ئەژمێر - @%{name} with_media: بە میدیا tags: review: پێداچوونەوەی دۆخ diff --git a/config/locales/co.yml b/config/locales/co.yml index dad3e08ffd..b81427e833 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -459,7 +459,7 @@ co: media: title: Media no_status_selected: I statuti ùn sò micca stati mudificati perchè manc'unu era selezziunatu - title: Statuti di u contu + title: Statuti di u contu - @%{name} with_media: Cù media system_checks: rules_check: diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 15211b928a..f5f7f4d731 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -826,7 +826,7 @@ cs: original_status: Původní příspěvek reblogs: Boosty status_changed: Příspěvek změněn - title: Příspěvky účtu + title: Příspěvky účtu - @%{name} trending: Populární visibility: Viditelnost with_media: S médii diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 2d6a0eb38d..ca18de17bc 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -889,7 +889,7 @@ cy: original_status: Postiad gwreiddiol reblogs: Ailflogiadau status_changed: Postiad wedi'i newid - title: Postiadau cyfrif + title: Postiadau cyfrif - @%{name} trending: Yn trendio visibility: Gwelededd with_media: Gyda chyfryngau diff --git a/config/locales/da.yml b/config/locales/da.yml index daf683637d..e157af9cc2 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -841,7 +841,7 @@ da: original_status: Oprindeligt indlæg reblogs: Genblogninger status_changed: Indlæg ændret - title: Kontoindlæg + title: Kontoindlæg - @%{name} trending: Populære visibility: Synlighed with_media: Med medier diff --git a/config/locales/de.yml b/config/locales/de.yml index 10223f2278..e3ee03264e 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -841,7 +841,7 @@ de: original_status: Ursprünglicher Beitrag reblogs: Geteilte Beiträge status_changed: Beitrag bearbeitet - title: Beiträge des Kontos + title: Beiträge des Kontos - @%{name} trending: Trends visibility: Sichtbarkeit with_media: Mit Medien diff --git a/config/locales/el.yml b/config/locales/el.yml index 3a145cbdab..26b0ec00a2 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -817,7 +817,7 @@ el: original_status: Αρχική ανάρτηση reblogs: Αναδημοσιεύσεις status_changed: Η ανάρτηση άλλαξε - title: Καταστάσεις λογαριασμού + title: Καταστάσεις λογαριασμού - @%{name} trending: Τάσεις visibility: Ορατότητα with_media: Με πολυμέσα diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index fb284479f2..e22ed62051 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -832,7 +832,7 @@ en-GB: original_status: Original post reblogs: Reblogs status_changed: Post changed - title: Account posts + title: Account posts - @%{name} trending: Trending visibility: Visibility with_media: With media diff --git a/config/locales/en.yml b/config/locales/en.yml index cf783338e2..2971fe1f25 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -826,8 +826,10 @@ en: back_to_account: Back to account page back_to_report: Back to report page batch: + add_to_report: 'Add to report #%{id}' remove_from_report: Remove from report report: Report + contents: Contents deleted: Deleted favourites: Favorites history: Version history @@ -836,13 +838,17 @@ en: media: title: Media metadata: Metadata + no_history: This post hasn't been edited no_status_selected: No posts were changed as none were selected open: Open post original_status: Original post reblogs: Reblogs + replied_to_html: Replied to %{acct_link} status_changed: Post changed - title: Account posts + status_title: Post by @%{name} + title: Account posts - @%{name} trending: Trending + view_publicly: View publicly visibility: Visibility with_media: With media strikes: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 12cae075f0..b5287d9e2a 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -814,7 +814,7 @@ eo: original_status: Originala afiŝo reblogs: Reblogaĵoj status_changed: Afiŝo ŝanĝiĝis - title: Afiŝoj de la konto + title: Afiŝoj de la konto - @%{name} trending: Popularaĵoj visibility: Videbleco with_media: Kun aŭdovidaĵoj diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 79bfdfbdbf..6dc9d99f37 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -833,7 +833,7 @@ es-AR: original_status: Mensaje original reblogs: Adhesiones status_changed: Mensaje cambiado - title: Mensajes de la cuenta + title: Mensajes de la cuenta - @%{name} trending: En tendencia visibility: Visibilidad with_media: Con medios diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index fef805680a..7e6570f068 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -833,7 +833,7 @@ es-MX: original_status: Publicación original reblogs: Impulsos status_changed: Publicación cambiada - title: Estado de las cuentas + title: Estado de las cuentas - @%{name} trending: En tendencia visibility: Visibilidad with_media: Con multimedia diff --git a/config/locales/es.yml b/config/locales/es.yml index ddd53a2387..32abd9420d 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -833,7 +833,7 @@ es: original_status: Publicación original reblogs: Impulsos status_changed: Publicación cambiada - title: Publicaciones de la cuenta + title: Publicaciones de la cuenta - @%{name} trending: En tendencia visibility: Visibilidad with_media: Con multimedia diff --git a/config/locales/et.yml b/config/locales/et.yml index 3be9add91c..f8a4f7f69e 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -833,7 +833,7 @@ et: original_status: Algne postitus reblogs: Jagamised status_changed: Muudetud postitus - title: Konto postitused + title: Konto postitused - @%{name} trending: Populaarne visibility: Nähtavus with_media: Meediaga diff --git a/config/locales/eu.yml b/config/locales/eu.yml index e9c3be2d24..a764e88bac 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -793,7 +793,7 @@ eu: original_status: Jatorrizko bidalketa reblogs: Bultzadak status_changed: Bidalketa aldatuta - title: Kontuaren bidalketak + title: Kontuaren bidalketak - @%{name} trending: Joera visibility: Ikusgaitasuna with_media: Multimediarekin diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 603cfe8de1..38daf70d29 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -741,7 +741,7 @@ fa: original_status: فرستهٔ اصلی reblogs: تقویت‌ها status_changed: فرسته تغییر کرد - title: نوشته‌های حساب + title: "@%{name} - نوشته‌های حساب" trending: پرطرفدار visibility: نمایانی with_media: دارای عکس یا ویدیو diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 6fe9c14591..efdfdfed04 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -841,7 +841,7 @@ fi: original_status: Alkuperäinen julkaisu reblogs: Edelleen jako status_changed: Julkaisua muutettu - title: Tilin tilat + title: Tilin tilat - @%{name} trending: Suosituttua visibility: Näkyvyys with_media: Sisältää mediaa diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 6cc1fda6a0..8dab61c267 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -841,7 +841,7 @@ fo: original_status: Upprunapostur reblogs: Endurbloggar status_changed: Postur broyttur - title: Postar hjá kontu + title: Postar hjá kontu - @%{name} trending: Vælumtókt visibility: Sýni with_media: Við miðli diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 3c771d4c64..bb0501d0e3 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -836,7 +836,7 @@ fr-CA: original_status: Message original reblogs: Partages status_changed: Publication modifiée - title: Messages du compte + title: Messages du compte - @%{name} trending: Tendances visibility: Visibilité with_media: Avec médias diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 58fc63fc1b..0c35dea62a 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -836,7 +836,7 @@ fr: original_status: Message original reblogs: Partages status_changed: Publication modifiée - title: Messages du compte + title: Messages du compte - @%{name} trending: Tendances visibility: Visibilité with_media: Avec médias diff --git a/config/locales/fy.yml b/config/locales/fy.yml index a6656f91b8..8a4f519e0c 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -833,7 +833,7 @@ fy: original_status: Oarspronklik berjocht reblogs: Boosts status_changed: Berjocht wizige - title: Accountberjochten + title: Accountberjochten - @%{name} trending: Trending visibility: Sichtberheid with_media: Mei media diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 5e5ecb238e..67461f3c2a 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -875,7 +875,7 @@ ga: original_status: Bunphostáil reblogs: Athbhlaganna status_changed: Athraíodh postáil - title: Poist chuntais + title: Poist chuntais - @%{name} trending: Ag treochtáil visibility: Infheictheacht with_media: Le meáin diff --git a/config/locales/gd.yml b/config/locales/gd.yml index c804f42523..89198bd514 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -861,7 +861,7 @@ gd: original_status: Am post tùsail reblogs: Brosnachaidhean status_changed: Post air atharrachadh - title: Postaichean a’ chunntais + title: Postaichean a’ chunntais - @%{name} trending: A’ treandadh visibility: Faicsinneachd with_media: Le meadhanan riutha diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 1ad8deb179..0f3420a7f3 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -841,7 +841,7 @@ gl: original_status: Publicación orixinal reblogs: Promocións status_changed: Publicación editada - title: Publicacións da conta + title: Publicacións da conta - @%{name} trending: Popular visibility: Visibilidade with_media: con medios diff --git a/config/locales/he.yml b/config/locales/he.yml index 10b4611b9a..59dc09799d 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -861,7 +861,7 @@ he: original_status: הודעה מקורית reblogs: שיתופים status_changed: הודעה שונתה - title: הודעות החשבון + title: הודעות החשבון - @%{name} trending: נושאים חמים visibility: נראות with_media: עם מדיה diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 1892009238..da4ff78dc4 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -841,7 +841,7 @@ hu: original_status: Eredeti bejegyzés reblogs: Megosztások status_changed: A bejegyzés megváltozott - title: Fiók bejegyzései + title: Fiók bejegyzései - @%{name} trending: Felkapott visibility: Láthatóság with_media: Médiával diff --git a/config/locales/hy.yml b/config/locales/hy.yml index 201922d102..d8cf2a97ba 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -402,7 +402,7 @@ hy: deleted: Ջնջված է media: title: Մեդիա - title: Օգտատիրոջ գրառումները + title: Օգտատիրոջ գրառումները - @%{name} with_media: Մեդիայի հետ tags: review: Վերանայել գրառումը diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 843e8724b9..1398ae51d4 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -833,7 +833,7 @@ ia: original_status: Message original reblogs: Republicationes status_changed: Message cambiate - title: Messages del conto + title: Messages del conto - @%{name} trending: Tendentias visibility: Visibilitate with_media: Con multimedia diff --git a/config/locales/id.yml b/config/locales/id.yml index 6a005fddaa..9c31daf420 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -711,7 +711,7 @@ id: original_status: Kiriman asli reblogs: Reblog status_changed: Kiriman diubah - title: Status akun + title: Status akun - @%{name} trending: Sedang tren visibility: Visibilitas with_media: Dengan media diff --git a/config/locales/ie.yml b/config/locales/ie.yml index 94c4b7f4f0..d7df83ef69 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -791,7 +791,7 @@ ie: original_status: Original posta reblogs: Boosts status_changed: Posta modificat - title: Postas del conto + title: Postas del conto - @%{name} trending: Populari visibility: Visibilitá with_media: Con medie diff --git a/config/locales/io.yml b/config/locales/io.yml index 8ce5f3403b..1ff5d98bf2 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -779,7 +779,7 @@ io: original_status: Originala posto reblogs: Dissemi status_changed: Posto chanjita - title: Kontoposti + title: Kontoposti - @%{name} trending: Populara visibility: Videbleso with_media: Kun medii diff --git a/config/locales/is.yml b/config/locales/is.yml index 552df8f064..9ba29f2af0 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -843,7 +843,7 @@ is: original_status: Upprunaleg færsla reblogs: Endurbirtingar status_changed: Færslu breytt - title: Færslur notandaaðgangs + title: Færslur notandaaðgangs - @%{name} trending: Vinsælt visibility: Sýnileiki with_media: Með myndefni diff --git a/config/locales/it.yml b/config/locales/it.yml index e18cb0e8f6..08e224ad94 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -833,7 +833,7 @@ it: original_status: Post originale reblogs: Condivisioni status_changed: Post modificato - title: Gli status dell'account + title: Gli status dell'account - @%{name} trending: Di tendenza visibility: Visibilità with_media: con media diff --git a/config/locales/ja.yml b/config/locales/ja.yml index a70ae680e4..76152c3744 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -819,7 +819,7 @@ ja: original_status: オリジナルの投稿 reblogs: ブースト status_changed: 投稿を変更しました - title: 投稿一覧 + title: 投稿一覧 - @%{name} trending: トレンド visibility: 公開範囲 with_media: メディアあり diff --git a/config/locales/ka.yml b/config/locales/ka.yml index 2a0365fbf5..93f7a39dc3 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -190,7 +190,7 @@ ka: media: title: მედია no_status_selected: სატუსები არ შეცვლილა, რადგან არცერთი არ მონიშნულა - title: ანგარიშის სტატუსები + title: ანგარიშის სტატუსები - @%{name} with_media: მედიით title: ადმინისტრაცია admin_mailer: diff --git a/config/locales/kab.yml b/config/locales/kab.yml index 993488f1fc..c74540cfbf 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -419,7 +419,7 @@ kab: media: title: Amidya open: Ldi tasuffeɣt - title: Tisuffaɣ n umiḍan + title: Tisuffaɣ n umiḍan - @%{name} trending: Ayen mucaɛen visibility: Abani with_media: S umidya diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 537104ba51..4b9cef245e 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -285,7 +285,7 @@ kk: media: title: Медиa no_status_selected: Бірде-бір статус өзгерген жоқ, себебі ештеңе таңдалмады - title: Аккаунт статустары + title: Аккаунт статустары - @%{name} with_media: Медиамен tags: review: Статусты көрсету diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 1fe43f7e75..36a13397d0 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -829,7 +829,7 @@ ko: original_status: 원본 게시물 reblogs: 리블로그 status_changed: 게시물 변경됨 - title: 계정 게시물 + title: 계정 게시물 - @%{name} trending: 유행 중 visibility: 공개 설정 with_media: 미디어 있음 diff --git a/config/locales/ku.yml b/config/locales/ku.yml index ddd214441c..54188d2514 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -720,7 +720,7 @@ ku: original_status: Şandiyê resen reblogs: Ji nû ve nivîsandin status_changed: Şandî hate guhertin - title: Şandiyên ajimêr + title: Şandiyên ajimêr - @%{name} trending: Rojev visibility: Xuyabarî with_media: Bi medya yê re diff --git a/config/locales/lad.yml b/config/locales/lad.yml index 4486df637e..3b33888c71 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -825,7 +825,7 @@ lad: original_status: Publikasyon orijinala reblogs: Repartajasyones status_changed: Publikasyon trokada - title: Publikasyones del kuento + title: Publikasyones del kuento - @%{name} trending: Trendes visibility: Vizivilita with_media: Kon multimedia diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 3850e2e071..3519cb5b32 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -601,7 +601,7 @@ lt: no_status_selected: Jokie įrašai nebuvo pakeisti, nes nė vienas buvo pasirinktas open: Atidaryti įrašą original_status: Originalus įrašas - title: Paskyros statusai + title: Paskyros statusai - @%{name} trending: Tendencinga with_media: Su medija system_checks: diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 3e5a1db00e..d793c8e196 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -830,7 +830,7 @@ lv: original_status: Oriģinālā ziņa reblogs: Reblogi status_changed: Ziņa mainīta - title: Konta ziņas + title: Konta ziņas - @%{name} trending: Aktuāli visibility: Redzamība with_media: Ar multividi diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 90493a30b6..76f914dd16 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -768,7 +768,7 @@ ms: original_status: Hantaran asal reblogs: Ulang siar status_changed: Hantaran diubah - title: Hantaran akaun + title: Hantaran akaun - @%{name} trending: Sohor kini visibility: Visibiliti with_media: Dengan media diff --git a/config/locales/my.yml b/config/locales/my.yml index 6a330a16c7..b238abb051 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -764,7 +764,7 @@ my: original_status: မူရင်းပို့စ် reblogs: Reblog များ status_changed: ပို့စ်ပြောင်းပြီးပါပြီ - title: အကောင့်ပို့စ်များ + title: "@%{name} - အကောင့်ပို့စ်များ" trending: လက်ရှိခေတ်စားနေခြင်း visibility: မြင်နိုင်မှု with_media: မီဒီယာနှင့်အတူ diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 1af30bca98..d4a88b3bea 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -833,7 +833,7 @@ nl: original_status: Oorspronkelijk bericht reblogs: Boosts status_changed: Bericht veranderd - title: Berichten van account + title: Berichten van account - @%{name} trending: Trending visibility: Zichtbaarheid with_media: Met media diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 62b08f42ed..e04c0168f2 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -841,7 +841,7 @@ nn: original_status: Opprinnelig innlegg reblogs: Framhevingar status_changed: Innlegg endret - title: Kontostatusar + title: Kontostatusar - @%{name} trending: Populært visibility: Synlighet with_media: Med media diff --git a/config/locales/no.yml b/config/locales/no.yml index 94986f4cae..408fdd5ae1 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -786,7 +786,7 @@ original_status: Opprinnelig innlegg reblogs: Fremheve status_changed: Innlegg endret - title: Kontostatuser + title: Kontostatuser - @%{name} trending: Populært visibility: Synlighet with_media: Med media diff --git a/config/locales/oc.yml b/config/locales/oc.yml index a30126c44b..5130977cb3 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -401,7 +401,7 @@ oc: media: title: Mèdia no_status_selected: Cap d’estatut pas cambiat estant que cap èra pas seleccionat - title: Estatuts del compte + title: Estatuts del compte - @%{name} visibility: Visibilitat with_media: Amb mèdia system_checks: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index d50a042a22..c5d63e1d73 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -861,7 +861,7 @@ pl: original_status: Oryginalny post reblogs: Podbicia status_changed: Post zmieniony - title: Wpisy konta + title: Wpisy konta - @%{name} trending: Popularne visibility: Widoczność with_media: Z zawartością multimedialną diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 0ff944e108..c5a0f3764a 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -841,7 +841,7 @@ pt-BR: original_status: Publicação original reblogs: Reblogs status_changed: Publicação alterada - title: Publicações da conta + title: Publicações da conta - @%{name} trending: Em alta visibility: Visibilidade with_media: Com mídia diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 1761ec3f0c..ff80948848 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -832,7 +832,7 @@ pt-PT: original_status: Publicação original reblogs: Re-publicacões status_changed: Publicação alterada - title: Estado das contas + title: Estado das contas - @%{name} trending: Em tendência visibility: Visibilidade with_media: Com media diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 8a84f22115..09d89cef9d 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -869,7 +869,7 @@ ru: original_status: Оригинальный пост reblogs: Продвинули status_changed: Пост изменен - title: Посты пользователя + title: Посты пользователя - @%{name} trending: Популярное visibility: Видимость with_media: С файлами diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 9ab62cea71..09f8ba0e0e 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -582,7 +582,7 @@ sc: open: Aberi sa publicatzione original_status: Publicatzione originale status_changed: Publicatzione modificada - title: Istados de su contu + title: Istados de su contu - @%{name} trending: Populares visibility: Visibilidade with_media: Cun elementos multimediales diff --git a/config/locales/sco.yml b/config/locales/sco.yml index 8cc733a4ac..55e0603d45 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -713,7 +713,7 @@ sco: original_status: Original post reblogs: Reblogs status_changed: Post chynged - title: Accoont posts + title: Accoont posts - @%{name} trending: Trendin visibility: Visibility with_media: Wi media diff --git a/config/locales/si.yml b/config/locales/si.yml index 270e0ae3fc..b0eb1d3b0c 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -607,7 +607,7 @@ si: open: ලිපිය අරින්න original_status: මුල් ලිපිය status_changed: ලිපිය සංශෝධිතයි - title: ගිණුමේ ලිපි + title: ගිණුමේ ලිපි - @%{name} trending: නැගී එන with_media: මාධ්‍ය සමඟ strikes: diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 6ef78a8f21..d576bf0382 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -684,7 +684,7 @@ sk: open: Otvor príspevok original_status: Pôvodný príspevok status_changed: Príspevok bol zmenený - title: Príspevky na účte + title: Príspevky na účte - @%{name} trending: Populárne visibility: Viditeľnosť with_media: S médiami diff --git a/config/locales/sl.yml b/config/locales/sl.yml index e9c06bcaa6..6ae239d69f 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -853,7 +853,7 @@ sl: original_status: Izvorna objava reblogs: Ponovljeni blogi status_changed: Objava spremenjena - title: Objave računa + title: Objave računa - @%{name} trending: V trendu visibility: Vidnost with_media: Z mediji diff --git a/config/locales/sq.yml b/config/locales/sq.yml index e5becbd916..b1e2a4f61e 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -838,7 +838,7 @@ sq: original_status: Postim origjinal reblogs: Riblogime status_changed: Postimi ndryshoi - title: Gjendje llogarish + title: Gjendje llogarish - @%{name} trending: Në modë visibility: Dukshmëri with_media: Me media diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index f56cdb9cb5..76a0f8afe9 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -807,7 +807,7 @@ sr-Latn: original_status: Originalna objava reblogs: Deljenja status_changed: Objava promenjena - title: Statusi naloga + title: Statusi naloga - @%{name} trending: U trendu visibility: Vidljivost with_media: Sa multimedijom diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 45feb0b5fc..6a75316c23 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -837,7 +837,7 @@ sr: original_status: Оригинална објава reblogs: Дељења status_changed: Објава промењена - title: Статуси налога + title: Статуси налога - @%{name} trending: У тренду visibility: Видљивост with_media: Са мултимедијом diff --git a/config/locales/sv.yml b/config/locales/sv.yml index c41795a168..11b37f8bfc 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -841,7 +841,7 @@ sv: original_status: Ursprungligt inlägg reblogs: Ombloggningar status_changed: Inlägg ändrat - title: Kontoinlägg + title: Kontoinlägg - @%{name} trending: Trendande visibility: Synlighet with_media: Med media diff --git a/config/locales/th.yml b/config/locales/th.yml index ea039a2b99..32f2b30292 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -819,7 +819,7 @@ th: original_status: โพสต์ดั้งเดิม reblogs: การดัน status_changed: เปลี่ยนโพสต์แล้ว - title: โพสต์ของบัญชี + title: โพสต์ของบัญชี - @%{name} trending: กำลังนิยม visibility: การมองเห็น with_media: มีสื่อ diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 88636ef21b..2eafed1b47 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -841,7 +841,7 @@ tr: original_status: Özgün gönderi reblogs: Yeniden Paylaşımlar status_changed: Gönderi değişti - title: Hesap durumları + title: Hesap durumları - @%{name} trending: Öne çıkanlar visibility: Görünürlük with_media: Medya ile diff --git a/config/locales/uk.yml b/config/locales/uk.yml index e6a765267f..7ea76b2a75 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -861,7 +861,7 @@ uk: original_status: Оригінальний допис reblogs: Поширення status_changed: Допис змінено - title: Дописи облікових записів + title: Дописи облікових записів - @%{name} trending: Популярне visibility: Видимість with_media: З медіа diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 1d04f796f8..71c4357f2f 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -827,7 +827,7 @@ vi: original_status: Tút gốc reblogs: Lượt đăng lại status_changed: Tút đã sửa - title: Tất cả tút + title: Tất cả tút - @%{name} trending: Xu hướng visibility: Hiển thị with_media: Có media diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 36d316649c..cae0efee57 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -827,7 +827,7 @@ zh-CN: original_status: 原始嘟文 reblogs: 转发 status_changed: 嘟文已编辑 - title: 帐户嘟文 + title: 帐户嘟文 - @%{name} trending: 当前热门 visibility: 可见性 with_media: 含有媒体文件 diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index e33ebeadb4..6f0a99a5b3 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -777,7 +777,7 @@ zh-HK: original_status: 原始帖文 reblogs: 轉發 status_changed: 帖文已變更 - title: 帳戶文章 + title: 帳戶文章 - @%{name} trending: 熱門 visibility: 可見性 with_media: 含有媒體檔案 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 495a6a4742..ce6bd3e8f5 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -829,7 +829,7 @@ zh-TW: original_status: 原始嘟文 reblogs: 轉嘟 status_changed: 嘟文已編輯 - title: 帳號嘟文 + title: 帳號嘟文 - @%{name} trending: 熱門 visibility: 可見性 with_media: 含有媒體檔案 From c546aa57cb0b89c5d4ec7f7d7d38656d9e378402 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 11:30:11 +0100 Subject: [PATCH 39/52] New Crowdin Translations (automated) (#32900) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/bg.json | 27 +++++++++++++++++++++++++ app/javascript/mastodon/locales/cy.json | 1 + app/javascript/mastodon/locales/lt.json | 1 + app/javascript/mastodon/locales/lv.json | 4 ++++ config/locales/bg.yml | 9 +++++++++ config/locales/cy.yml | 8 ++++++++ config/locales/devise.lv.yml | 10 ++++----- config/locales/eo.yml | 26 +++++++++++++++++++++++- config/locales/hu.yml | 16 +++++++-------- config/locales/lv.yml | 25 +++++++++++++++-------- config/locales/simple_form.cy.yml | 3 ++- config/locales/simple_form.hu.yml | 4 ++-- config/locales/simple_form.lv.yml | 5 +++-- 13 files changed, 112 insertions(+), 27 deletions(-) diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 3d5d8a8585..44482f6c96 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -87,6 +87,17 @@ "alert.unexpected.title": "Опаа!", "alt_text_badge.title": "Алтернативен текст", "announcement.announcement": "Оповестяване", + "annual_report.summary.archetype.lurker": "Дебнещото", + "annual_report.summary.archetype.oracle": "Оракул", + "annual_report.summary.archetype.pollster": "Анкетьорче", + "annual_report.summary.archetype.replier": "Социална пеперуда", + "annual_report.summary.followers.followers": "последователи", + "annual_report.summary.followers.total": "{count} общо", + "annual_report.summary.highlighted_post.by_favourites": "най-правено като любима публикация", + "annual_report.summary.most_used_app.most_used_app": "най-употребявано приложение", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "най-употребяван хаштаг", + "annual_report.summary.new_posts.new_posts": "нови публикации", + "annual_report.summary.thanks": "Благодарим, че сте част от Mastodon!", "attachments_list.unprocessed": "(необработено)", "audio.hide": "Скриване на звука", "block_modal.remote_users_caveat": "Ще поискаме сървърът {domain} да почита решението ви. Съгласието обаче не се гарантира откак някои сървъри могат да боравят с блоковете по различен начин. Обществените публикации още може да се виждат от невлезли в системата потребители.", @@ -158,6 +169,7 @@ "compose_form.poll.duration": "Времетраене на анкетата", "compose_form.poll.multiple": "Множествен избор", "compose_form.poll.option_placeholder": "Избор {number}", + "compose_form.poll.single": "Единичен избор", "compose_form.poll.switch_to_multiple": "Промяна на анкетата, за да се позволят множество възможни избора", "compose_form.poll.switch_to_single": "Промяна на анкетата, за да се позволи един възможен избор", "compose_form.poll.type": "Стил", @@ -195,6 +207,8 @@ "confirmations.unfollow.message": "Наистина ли искате да не следвате {name}?", "confirmations.unfollow.title": "Спирате ли да следвате потребителя?", "content_warning.hide": "Скриване на публ.", + "content_warning.show": "Нека се покаже", + "content_warning.show_more": "Показване на още", "conversation.delete": "Изтриване на разговора", "conversation.mark_as_read": "Маркиране като прочетено", "conversation.open": "Преглед на разговора", @@ -365,6 +379,9 @@ "home.pending_critical_update.link": "Преглед на обновяванията", "home.pending_critical_update.title": "Налично критично обновяване на сигурността!", "home.show_announcements": "Показване на оповестяванията", + "ignore_notifications_modal.disclaimer": "Mastodon не може да осведоми потребители, че сте пренебрегнали известията им. Пренебрегването на известията няма да спре самите съобщения да не бъдат изпращани.", + "ignore_notifications_modal.filter_to_act_users": "Вие все още ще може да приемате, отхвърляте или докладвате потребители", + "ignore_notifications_modal.filter_to_avoid_confusion": "Прецеждането помага за избягване на възможно объркване", "interaction_modal.description.favourite": "Имайки акаунт в Mastodon, може да сложите тази публикации в любими, за да позволите на автора да узнае, че я цените и да я запазите за по-късно.", "interaction_modal.description.follow": "С акаунт в Mastodon може да последвате {name}, за да получавате публикациите от този акаунт в началния си инфоканал.", "interaction_modal.description.reblog": "С акаунт в Mastodon може да подсилите тази публикация, за да я споделите с последователите си.", @@ -380,6 +397,7 @@ "interaction_modal.title.follow": "Последване на {name}", "interaction_modal.title.reblog": "Подсилване на публикацията на {name}", "interaction_modal.title.reply": "Отговаряне на публикацията на {name}", + "interaction_modal.title.vote": "Гласувайте в анкетата на {name}", "intervals.full.days": "{number, plural, one {# ден} other {# дни}}", "intervals.full.hours": "{number, plural, one {# час} other {# часа}}", "intervals.full.minutes": "{number, plural, one {# минута} other {# минути}}", @@ -420,6 +438,8 @@ "lightbox.close": "Затваряне", "lightbox.next": "Напред", "lightbox.previous": "Назад", + "lightbox.zoom_in": "Увеличение до действителната големина", + "lightbox.zoom_out": "Увеличение до побиране", "limited_account_hint.action": "Показване на профила въпреки това", "limited_account_hint.title": "Този профил е бил скрит от модераторите на {domain}.", "link_preview.author": "От {name}", @@ -441,6 +461,7 @@ "lists.subheading": "Вашите списъци", "load_pending": "{count, plural, one {# нов елемент} other {# нови елемента}}", "loading_indicator.label": "Зареждане…", + "media_gallery.hide": "Скриване", "moved_to_account_banner.text": "Вашият акаунт {disabledAccount} сега е изключен, защото се преместихте в {movedToAccount}.", "mute_modal.hide_from_notifications": "Скриване от известията", "mute_modal.hide_options": "Скриване на възможностите", @@ -489,6 +510,7 @@ "notification.favourite": "{name} направи любима публикацията ви", "notification.favourite.name_and_others_with_link": "{name} и {count, plural, one {# друг} other {# други}} направиха любима ваша публикация", "notification.follow": "{name} ви последва", + "notification.follow.name_and_others": "{name} и {count, plural, one {# друг} other {# други}} ви последваха", "notification.follow_request": "{name} поиска да ви последва", "notification.follow_request.name_and_others": "{name} и {count, plural, one {# друг} other {# други}} поискаха да ви последват", "notification.label.mention": "Споменаване", @@ -496,6 +518,7 @@ "notification.label.private_reply": "Личен отговор", "notification.label.reply": "Отговор", "notification.mention": "Споменаване", + "notification.mentioned_you": "{name} ви спомена", "notification.moderation-warning.learn_more": "Научете повече", "notification.moderation_warning": "Получихте предупреждение за модериране", "notification.moderation_warning.action_delete_statuses": "Някои от публикациите ви са премахнати.", @@ -752,6 +775,7 @@ "status.bookmark": "Отмятане", "status.cancel_reblog_private": "Край на подсилването", "status.cannot_reblog": "Публикацията не може да се подсилва", + "status.continued_thread": "Продължена нишка", "status.copy": "Копиране на връзката към публикация", "status.delete": "Изтриване", "status.detailed_status": "Подробен изглед на разговора", @@ -760,6 +784,7 @@ "status.edit": "Редактиране", "status.edited": "Последно редактирано на {date}", "status.edited_x_times": "Редактирано {count, plural,one {{count} път} other {{count} пъти}}", + "status.embed": "Вземане на кода за вграждане", "status.favourite": "Любимо", "status.favourites": "{count, plural, one {любимо} other {любими}}", "status.filter": "Филтриране на публ.", @@ -784,6 +809,7 @@ "status.reblogs.empty": "Още никого не е подсилвал публикацията. Подсилващият ще се покаже тук.", "status.redraft": "Изтриване и преработване", "status.remove_bookmark": "Премахване на отметката", + "status.replied_in_thread": "Отговорено в нишката", "status.replied_to": "В отговор до {name}", "status.reply": "Отговор", "status.replyAll": "Отговор на нишка", @@ -821,6 +847,7 @@ "upload_error.poll": "Качването на файлове не е позволено с анкети.", "upload_form.audio_description": "Опишете за хора, които са глухи или трудно чуват", "upload_form.description": "Опишете за хора, които са слепи или имат слабо зрение", + "upload_form.drag_and_drop.instructions": "Натиснете интервал или enter, за да подберете мултимедийно прикачване. Провлачвайки, ползвайте клавишите със стрелки, за да премествате мултимедията във всяка дадена посока. Натиснете пак интервал или enter, за да се стовари мултимедийното прикачване в новото си положение или натиснете Esc за отмяна.", "upload_form.edit": "Редактиране", "upload_form.thumbnail": "Промяна на миниобраза", "upload_form.video_description": "Опишете за хора, които са глухи или трудно чуват, слепи или имат слабо зрение", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index ca83af9215..1fa17e56ea 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name}", "annual_report.summary.most_used_app.most_used_app": "ap a ddefnyddiwyd fwyaf", "annual_report.summary.most_used_hashtag.most_used_hashtag": "hashnod a ddefnyddiwyd fwyaf", + "annual_report.summary.most_used_hashtag.none": "Dim", "annual_report.summary.new_posts.new_posts": "postiadau newydd", "annual_report.summary.percentile.text": "Rydych chi yn y mwyaf o ddefnyddwyr Mastodon.", "annual_report.summary.percentile.we_wont_tell_bernie": "Ni fyddwn yn dweud wrth Bernie.", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index d03833e11f..378f642cfe 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -101,6 +101,7 @@ "annual_report.summary.highlighted_post.possessive": "{name}", "annual_report.summary.most_used_app.most_used_app": "labiausiai naudota programa", "annual_report.summary.most_used_hashtag.most_used_hashtag": "labiausiai naudotas saitažodis", + "annual_report.summary.most_used_hashtag.none": "Nieko", "annual_report.summary.new_posts.new_posts": "nauji įrašai", "annual_report.summary.percentile.text": "Tai reiškia, kad esate tarppopuliariausių „Mastodon“ naudotojų.", "annual_report.summary.percentile.we_wont_tell_bernie": "Mes nesakysime Bernie.", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 30fc0ea348..f6053b2e09 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -86,6 +86,10 @@ "alert.unexpected.message": "Radās negaidīta kļūda.", "alert.unexpected.title": "Ups!", "announcement.announcement": "Paziņojums", + "annual_report.summary.followers.followers": "sekotāji", + "annual_report.summary.followers.total": "pavisam {count}", + "annual_report.summary.here_it_is": "Šeit ir {year}. gada pārskats:", + "annual_report.summary.new_posts.new_posts": "jauni ieraksti", "attachments_list.unprocessed": "(neapstrādāti)", "audio.hide": "Slēpt audio", "block_modal.remote_users_caveat": "Mēs vaicāsim serverim {domain} ņemt vērā Tavu lēmumu. Tomēr atbilstība nav nodrošināta, jo atsevišķi serveri var apstrādāt bloķēšanu citādi. Publiski ieraksti joprojām var būt redzami lietotājiem, kuri nav pieteikušies.", diff --git a/config/locales/bg.yml b/config/locales/bg.yml index e10ce3197c..2c5edf0b13 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -21,9 +21,12 @@ bg: one: Публикация other: Публикации posts_tab_heading: Публикации + self_follow_error: Не е позволено да следвате собствения си акаунт admin: account_actions: action: Изпълняване на действие + already_silenced: Този акаунт вече е ограничен. + already_suspended: Този акаунт вече е спрян. title: Извършване на модериращо действие за %{acct} account_moderation_notes: create: Оставяне на бележка @@ -45,6 +48,7 @@ bg: title: Промяна на имейл за %{username} change_role: changed_msg: Успешно променена роля! + edit_roles: Управление на потребителските роли label: Промяна на ролята no_role: Без роля title: Промяна на ролята за %{username} @@ -875,6 +879,7 @@ bg: name: Име newest: Най-нови oldest: Най-стари + open: Преглед публично reset: Нулиране review: Преглед на състояние search: Търсене @@ -888,6 +893,7 @@ bg: links: allow: Позволяване на връзка allow_provider: Позволяване на публикуващия + confirm_allow: Наистина ли искате да позволите избраните връзки? confirm_allow_provider: Наистина ли искате да позволите избраните доставчици? description_html: Това са връзки, които в момента са много пъти споделяни от акаунти, чиито публикации сървърът ви вижда. Може да помогне на потребителите ви да разберат какво се случва по света. Никоя връзка няма да се показва публично, докато не одобрите публикуващия. Може още и да одобрявате или отхвърляте отделни връзки. disallow: Забранявам връзката @@ -912,6 +918,8 @@ bg: statuses: allow: Позволяване на публикацията allow_account: Позволяване на автора + confirm_allow: Наистина ли искате да позволите избраните статуси? + confirm_allow_account: Наистина ли искате да позволите избраните акаунти? description_html: Това са публикации, за които сървърът ви знае, че са често споделяни или харесвани в момента. Това може да помогне на вашите нови и завръщащи се потребители да открият повече хора за следване. Никоя от публикациите няма да бъде показана публично, докато не одобрите автора и докато авторът не позволи акаунтът му да бъде предлган на другите. Също така можете да позволявате или отхвърляте отделни публикации. disallow: Забраняване на публикацията disallow_account: Забрана на автора @@ -1028,6 +1036,7 @@ bg: guide_link_text: Всеки може да участва. sensitive_content: Деликатно съдържание application_mailer: + notification_preferences: Промяна на предпочитанията за е-поща salutation: "%{name}," unsubscribe: Стоп на абонамента view: 'Преглед:' diff --git a/config/locales/cy.yml b/config/locales/cy.yml index ca18de17bc..f479f0f0a0 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -199,6 +199,7 @@ cy: create_domain_block: Creu Gwaharddiad Parth create_email_domain_block: Creu Rhwystr Parth E-bost create_ip_block: Creu rheol IP + create_relay: Creu Cyfnewidiad create_unavailable_domain: Creu Parth Ddim ar Gael create_user_role: Creu Rôl demote_user: Diraddio Defnyddiwr @@ -210,14 +211,17 @@ cy: destroy_email_domain_block: Dileu Rhwystr Parth E-bost destroy_instance: Clirio Parth destroy_ip_block: Dileu rheol IP + destroy_relay: Dileu Cyfnewidiad destroy_status: Dileu Postiad destroy_unavailable_domain: Dileu Parth Ddim ar Gael destroy_user_role: Dileu Rôl disable_2fa_user: Diffodd 2FA disable_custom_emoji: Analluogi Emoji Addasedig + disable_relay: Analluogi Cyfnewidiad disable_sign_in_token_auth_user: Analluogi Dilysu Tocyn E-bost Defnyddiwr disable_user: Analluogi Defnyddiwr enable_custom_emoji: Galluogi Emoji Addasedig + enable_relay: Galluogi Cyfnewidiad enable_sign_in_token_auth_user: Galluogi Dilysu Tocyn E-bost Defnyddiwr enable_user: Galluogi Defnyddiwr memorialize_account: Cofadeilio Cyfrif @@ -259,6 +263,7 @@ cy: create_domain_block_html: Mae %{name} wedi rhwystro parth %{target} create_email_domain_block_html: Mae %{name} wedi rhwystro parth e-bost %{target} create_ip_block_html: Mae %{name} wedi creu rheol ar gyfer IP %{target} + create_relay_html: Creodd %{name} gyfnewidiad %{target} create_unavailable_domain_html: Mae %{name} wedi stopio danfon i barth %{target} create_user_role_html: Mae %{name} wedi creu rôl %{target} demote_user_html: Mae %{name} wedi israddio defnyddiwr %{target} @@ -270,14 +275,17 @@ cy: destroy_email_domain_block_html: Mae %{name} wedi dad-rwystro parth e-bost %{target} destroy_instance_html: Mae %{name} wedi dileu parth %{target} destroy_ip_block_html: Mae %{name} dileu rheol ar gyfer IP %{target} + destroy_relay_html: Dileodd %{name} y cyfnewidiad %{target} destroy_status_html: Mae %{name} wedi tynnu postiad gan %{target} destroy_unavailable_domain_html: Mae %{name} wedi ailddechrau anfon i barth %{target} destroy_user_role_html: Mae %{name} wedi dileu rôl %{target} disable_2fa_user_html: Mae %{name} wedi analluogi gofyniad dau ffactor ar gyfer defnyddiwr %{target} disable_custom_emoji_html: Mae %{name} wedi analluogi emoji %{target} + disable_relay_html: Analluogodd %{name} y cyfnewidiad %{target} disable_sign_in_token_auth_user_html: Mae %{name} wedi analluogi dilysiad tocyn e-bost %{target} disable_user_html: Mae %{name} wedi analluogi mewngofnodi defnyddiwr %{target} enable_custom_emoji_html: Mae %{name} wedi analluogi emoji %{target} + enable_relay_html: Galluogodd %{name} y cyfnewidiad %{target} enable_sign_in_token_auth_user_html: Mae %{name} wedi galluogi dilysiad tocyn e-bost %{target} enable_user_html: Mae %{name} wedi galluogi mewngofnodi defnyddiwr %{target} memorialize_account_html: Newidiodd %{name} gyfrif %{target} i dudalen memoriam diff --git a/config/locales/devise.lv.yml b/config/locales/devise.lv.yml index 4470c8109e..5aaa23a731 100644 --- a/config/locales/devise.lv.yml +++ b/config/locales/devise.lv.yml @@ -14,7 +14,7 @@ lv: not_found_in_database: Nederīga %{authentication_keys} vai parole. omniauth_user_creation_failure: Kļūda šīs identitātes konta izveidošanā. pending: Tavs konts joprojām tiek pārskatīts. - timeout: Sesijair beigusies. Lūgums vēlreiz pieteikties, lai turpinātu. + timeout: Sesija ir beigusies. Lūgums vēlreiz pieteikties, lai turpinātu. unauthenticated: Lai turpinātu, jāpiesakās vai jāreģistrējas. unconfirmed: Lai turpinātu, jāapliecina sava e-pasta adrese. mailer: @@ -90,13 +90,13 @@ lv: no_token: Tu nevari piekļūt šai lapai, ja neesi saņēmis paroles atiestatīšanas e-pasta ziņojumu. Ja ienāci no paroles atiestatīšanas e-pasta, lūdzu, pārliecinies, vai izmanto visu norādīto URL. send_instructions: Ja tava e-pasta adrese ir mūsu datu bāzē, pēc dažām minūtēm uz savu e-pasta adresi saņemsi paroles atkopšanas saiti. Lūdzu, pārbaudi spama mapi, ja neesi saņēmis šo e-pastu. send_paranoid_instructions: Ja tava e-pasta adrese ir mūsu datu bāzē, pēc dažām minūtēm uz savu e-pasta adresi saņemsi paroles atkopšanas saiti. Lūdzu, pārbaudi spama mapi, ja neesi saņēmis šo e-pastu. - updated: Tava parole tika veiksmīgi nomainīta. Tu tagad esi pieteicies. + updated: Tava parole tika veiksmīgi nomainīta. Tagad esi pieteicies. updated_not_active: Tava parole ir veiksmīgi nomainīta. registrations: destroyed: Visu labu! Tavs konts ir veiksmīgi atcelts. Mēs ceram tevi drīz atkal redzēt. signed_up: Laipni lūdzam! Tu esi veiksmīgi reģistrējies. - signed_up_but_inactive: Tava reģistrācija bija veiksmīga. Tomēr mēs nevarējām tevi pierakstīt, jo tavs konts vēl nav aktivizēts. - signed_up_but_locked: Tava reģistrācija bija veiksmīga. Tomēr mēs nevarējām tevi pierakstīt, jo tavs konts ir bloķēts. + signed_up_but_inactive: Tava reģistrācija bija veiksmīga. Tomēr mēs nevarējām Tevi pieteikt, jo Tavs konts vēl nav aktivizēts. + signed_up_but_locked: Tava reģistrācija bija veiksmīga. Tomēr mēs nevarējām Tevi pieteikt, jo Tavs konts ir slēgts. signed_up_but_pending: Uz tavu e-pasta adresi ir nosūtīts ziņojums ar apstiprinājuma saiti. Pēc noklikšķināšanas uz saites mēs izskatīsim tavu pieteikumu. Tu tiksi informēts, ja tas tiks apstiprināts. signed_up_but_unconfirmed: Uz tavu e-pasta adresi ir nosūtīts ziņojums ar apstiprinājuma saiti. Lūdzu, seko saitei, lai aktivizētu savu kontu. Lūdzu, pārbaudi spama mapi, ja neesi saņēmis šo e-pastu. update_needs_confirmation: Tu veiksmīgi atjaunināji savu kontu, taču mums ir jāverificē teva jaunā e-pasta adrese. Lūdzu, pārbaudi savu e-pastu un seko apstiprinājuma saitei, lai apstiprinātu savu jauno e-pasta adresi. Lūdzu, pārbaudi spama mapi, ja neesi saņēmis šo e-pastu. @@ -111,7 +111,7 @@ lv: unlocked: Konts tika veiksmīgi atbloķēts. Lūgums pieteikties, lai turpinātu. errors: messages: - already_confirmed: jau tika apstiprināts, lūdzu, mēģini pierakstīties + already_confirmed: jau tika apstiprināts, lūgums mēģināt pieteikties confirmation_period_expired: jāapstiprina %{period} laikā, lūdzu, pieprasi jaunu expired: ir beidzies derīguma termiņš, lūdzu, pieprasi jaunu not_found: nav atrasts diff --git a/config/locales/eo.yml b/config/locales/eo.yml index b5287d9e2a..194b2c17b8 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -73,7 +73,7 @@ eo: enable_sign_in_token_auth: Ebligu retpoŝtan ĵeton-aŭtentikigon enabled: Ebligita enabled_msg: Sukcese malfrostigis konton de %{username} - followers: Sekvantoj + followers: Sekvoj follows: Sekvatoj header: Kapa bildo inbox_url: Enira URL @@ -187,6 +187,7 @@ eo: create_domain_block: Krei Blokadon De Domajno create_email_domain_block: Krei retpoŝtan domajnan blokon create_ip_block: Krei IP-regulon + create_relay: Krei Relajson create_unavailable_domain: Krei Nehaveblan Domajnon create_user_role: Krei Rolon demote_user: Malpromocii Uzanton @@ -198,13 +199,18 @@ eo: destroy_email_domain_block: Forigi retpoŝtan domajnan blokon destroy_instance: Forigi Domajnon destroy_ip_block: Forigi IP-regulon + destroy_relay: Forigi Relajson destroy_status: Forigi Afiŝon destroy_unavailable_domain: Forigi Nehaveblan Domajnon destroy_user_role: Detrui Rolon disable_2fa_user: Malebligi 2FA disable_custom_emoji: Malebligi proprajn emoĝiojn + disable_relay: Malebligi Relajson + disable_sign_in_token_auth_user: Malebligi aŭtentigon per retpoŝta ĵetono por la uzanto disable_user: Neebligi la uzanton enable_custom_emoji: Ebligi Propran Emoĝion + enable_relay: Ebligi Relajson + enable_sign_in_token_auth_user: Ebligi aŭtentigon per retpoŝta ĵetono por la uzanto enable_user: Ebligi uzanton memorialize_account: Memorigu Konton promote_user: Promocii Uzanton @@ -245,6 +251,7 @@ eo: create_domain_block_html: "%{name} blokis domajnon %{target}" create_email_domain_block_html: "%{name} blokis retpoŝtan domajnon %{target}" create_ip_block_html: "%{name} kreis regulon por IP %{target}" + create_relay_html: "%{name} kreis relajson %{target}" create_unavailable_domain_html: "%{name} ĉesis sendon al domajno %{target}" create_user_role_html: "%{name} kreis rolon de %{target}" demote_user_html: "%{name} degradis uzanton %{target}" @@ -256,13 +263,18 @@ eo: destroy_email_domain_block_html: "%{name} malblokis retpoŝtan domajnon %{target}" destroy_instance_html: "%{name} forigis domajnon %{target}" destroy_ip_block_html: "%{name} forigis regulon por IP %{target}" + destroy_relay_html: "%{name} forigis la relajson %{target}" destroy_status_html: "%{name} forigis mesaĝojn de %{target}" destroy_unavailable_domain_html: "%{name} restartigis sendon al domajno %{target}" destroy_user_role_html: "%{name} forigis rolon de %{target}" disable_2fa_user_html: "%{name} malebligis dufaktoran aŭtentigon por uzanto %{target}" disable_custom_emoji_html: "%{name} malebligis la emoĝion %{target}" + disable_relay_html: "%{name} malebligis la relajson %{target}" + disable_sign_in_token_auth_user_html: "%{name} malebligis la aŭtentigon de retpoŝta ĵetono por %{target}" disable_user_html: "%{name} malebligis ensaluton por uzanto %{target}" enable_custom_emoji_html: "%{name} ebligis la emoĝion %{target}" + enable_relay_html: "%{name} ebligis la relajson %{target}" + enable_sign_in_token_auth_user_html: "%{name} ebligis la aŭtentigon de retpoŝta ĵetono por %{target}" enable_user_html: "%{name} ebligis ensaluton por uzanto %{target}" memorialize_account_html: "%{name} ŝanĝis la konton de %{target} al memora paĝo" promote_user_html: "%{name} plirangigis uzanton %{target}" @@ -270,6 +282,7 @@ eo: reject_user_html: "%{name} malakceptis registriĝon de %{target}" remove_avatar_user_html: "%{name} forigis la profilbildon de %{target}" reopen_report_html: "%{name} remalfermis signalon %{target}" + resend_user_html: "%{name} resendis konfirman retmesaĝon por %{target}" reset_password_user_html: "%{name} restarigis la pasvorton de la uzanto %{target}" resolve_report_html: "%{name} solvis raporton %{target}" sensitive_account_html: "%{name} markis audovidaĵon de %{target} kiel tiklan" @@ -440,6 +453,7 @@ eo: create: Aldoni domajnon resolve: Solvi domajnon title: Bloki novan retpoŝtan domajnon + no_email_domain_block_selected: Neniuj domajn blokoj ŝanĝiĝis ĉar nenio estis elektita not_permitted: Ne permesita resolved_through_html: Solvis tra %{domain} title: Blokis retpoŝtajn domajnojn @@ -467,6 +481,8 @@ eo: title: Rekomendoj de sekvado unsuppress: Regajni sekvorekomendon instances: + audit_log: + title: Novaj Protokoloj Pri Ekzamenoj availability: description_html: one: Se sendo la domajno malsukcesis por %{count} dio, ne estas sendprovo plu escepte de la dojmano. @@ -1054,6 +1070,7 @@ eo: awaiting_review_title: Via registriĝo estas reviziita clicking_this_link: alklakante ĉi tiun ligilon login_link: ensaluti + proceed_to_login_html: Vi nun povas iri al %{login_link}. registration_complete: Via registriĝo sur %{domain} nun finiĝis! welcome_title: Bonvenon, %{name}! wrong_email_hint: Se tiu retadreso ne estas ĝusta, vi povas ŝanĝi ĝin en kontagordoj. @@ -1329,6 +1346,7 @@ eo: unconfirmed: Nekonfirmita status: Stato success: Viaj datumoj estis sukcese alŝutitaj kaj estos traktitaj kiel planite + time_started: Komencis je titles: following: Importado de sekvaj kontoj lists: Importi listojn @@ -1375,6 +1393,7 @@ eo: authentication_methods: otp: 2-faktora autentigprogramaro password: pasvorto + sign_in_token: retpoŝta sekureca kodo webauthn: sekurecaj ŝlosiloj description_html: Se vi vidas nerekonitan agon, eble ŝanĝu vian pasvorton. empty: Neniu autentighistorio disponebla @@ -1385,6 +1404,9 @@ eo: unsubscribe: action: Jes, malabonu complete: Malabonita + emails: + notification_emails: + follow_request: retpoŝtajn petoj de sekvado title: Malaboni media_attachments: validations: @@ -1725,6 +1747,7 @@ eo: default: "%Y.%b.%d, %H:%M" month: "%b %Y" time: "%H:%M" + with_time_zone: "%b %d, %Y, %H:%M %Z" translation: errors: quota_exceeded: La tutservila uzkvoto por la tradukservo estas superita. @@ -1805,6 +1828,7 @@ eo: apps_ios_action: Elŝutu ĉe la App Store apps_step: Elŝutu niajn oficialajn aplikaĵojn. apps_title: Aplikaĵoj de Mastodon + checklist_title: Bonvenan Markolisto edit_profile_action: Agordi edit_profile_title: Agordi vian profilon explanation: Jen kelkaj konsiloj por helpi vin komenci diff --git a/config/locales/hu.yml b/config/locales/hu.yml index da4ff78dc4..56d41daf86 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -579,21 +579,21 @@ hu: relationships: title: "%{acct} kapcsolatai" relays: - add_new: Új relé hozzáadása + add_new: Új továbbító hozzáadása delete: Törlés - description_html: A föderációs relé egy olyan köztes szerver, mely nagy mennyiségű nyilvános bejegyzést cserél az erre feliratkozó vagy erre publikáló szerverek között. Ezzel segíthetsz kis és közepes szervereknek tartalmat megtalálni a föderációban, mely egyébként csak akkor válna lehetővé, ha a saját felhasználóik más szervereken lévő fiókokat követnének. + description_html: A föderációs továbbító egy olyan köztes kiszolgáló, mely nagy mennyiségű nyilvános bejegyzést cserél az erre feliratkozó vagy erre publikáló kiszolgálók között. Ezzel segíthetsz kis és közepes kiszolgálóknak megtalálni a tartalmakat a föderációban, melyek egyébként csak akkor válnának lehetővé, ha a saját felhasználóik más kiszolgálókon lévő fiókokat követnének. disable: Kikapcsolás disabled: Kikapcsolva enable: Bekapcsolás - enable_hint: Ha bekapcsolod, a szerver minden nyilvános bejegyzésre feliratkozik ezen a relén, valamint az összes nyilvános bejegyzést elküldi ennek. + enable_hint: Ha bekapcsolod, a kiszolgáló minden nyilvános bejegyzésre feliratkozik ezen a továbbítón, valamint az összes nyilvános bejegyzést elküldi ennek. enabled: Bekapcsolva - inbox_url: Relé URL - pending: Várakozás a relé jóváhagyására + inbox_url: Továbbító URL + pending: Várakozás a továbbító jóváhagyására save_and_enable: Mentés és engedélyezés - setup: Relé kapcsolat felállítása - signatures_not_enabled: A relék nem fognak megfelelően működni, amíg a biztonságos mód vagy a korlátozott föderációs mód engedélyezett + setup: Továbbító kapcsolat felállítása + signatures_not_enabled: A továbbítók nem fognak megfelelően működni, amíg a biztonságos mód vagy a korlátozott föderációs mód engedélyezett status: Állapot - title: Relék + title: Továbbítók report_notes: created_msg: Bejelentési feljegyzés létrehozva! destroyed_msg: Bejelentési feljegyzés törölve! diff --git a/config/locales/lv.yml b/config/locales/lv.yml index d793c8e196..33b357b837 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -293,7 +293,7 @@ lv: empty: Žurnāli nav atrasti. filter_by_action: Filtrēt pēc darbības filter_by_user: Filtrēt pēc lietotāja - title: Auditācijas pieraksti + title: Audita žurnāls unavailable_instance: "(domēna vārds nav pieejams)" announcements: destroyed_msg: Paziņojums ir veiksmīgi izdzēsts! @@ -596,7 +596,7 @@ lv: one: "%{count} piezīme" other: "%{count} piezīmes" zero: "%{count} piezīmju" - action_log: Auditācijas pieraksti + action_log: Audita žurnāls action_taken_by: Veiktā darbība actions: delete_description_html: Raksti, par kurām ziņots, tiks dzēsti, un tiks reģistrēts brīdinājums, lai palīdzētu tev izvērst turpmākos pārkāpumus saistībā ar to pašu kontu. @@ -875,6 +875,7 @@ lv: message_html: Rindā(s) %{value} nedarbojas neviens Sidekiq process. Lūdzu, pārskati savu Sidekiq konfigurāciju software_version_check: action: Skatīt pieejamos atjauninājumus + message_html: Pieejams Mastodon atjauninājums. software_version_critical_check: action: Skatīt pieejamos atjauninājumus message_html: Ir pieejams kritisks Mastodon atjauninājums. Lūdzu, atjaunini to pēc iespējas ātrāk. @@ -1132,7 +1133,7 @@ lv: title: Pārbaudi savu iesūtni sign_in: preamble_html: Jāpiesakās ar saviem %{domain} piekļuves datiem. Ja konts tiek mitināts citā serverī, šeit nevarēs pieteikties. - title: Pierakstīties %{domain} + title: Pieteikties %{domain} sign_up: manual_review: Reģistrācijas domēnā %{domain} manuāli pārbauda mūsu moderatori. Lai palīdzētu mums apstrādāt tavu reģistrāciju, uzraksti mazliet par sevi un to, kāpēc vēlies kontu %{domain}. preamble: Ar kontu šajā Mastodon serverī varēsi sekot jebkuram citam tīklā esošam cilvēkam neatkarīgi no tā, kur tiek mitināts viņa konts. @@ -1418,13 +1419,20 @@ lv: webauthn: drošības atslēgas description_html: Ja pamani darbības, kuras neatpazīsti, jāapsver iespēja nomainīt savu paroli un iespējot divpakāpju autentifikāciju. empty: Nav pieejama autentifikācijas vēsture - failed_sign_in_html: Neizdevies pierakstīšanās mēģinājums ar %{method} no %{ip} (%{browser}) - successful_sign_in_html: Veiksmīga pierakstīšanās ar %{method} no %{ip} (%{browser}) + failed_sign_in_html: Neizdevies pieteikšanās mēģinājums ar %{method} no %{ip} (%{browser}) + successful_sign_in_html: Veiksmīga pieteikšanās ar %{method} no %{ip} (%{browser}) title: Autentifikācijas vēsture mail_subscriptions: unsubscribe: action: Jā, atcelt abonēšanu complete: Anulēts + 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 title: Atcelt abonēšanu media_attachments: validations: @@ -1656,6 +1664,7 @@ lv: delete: Konta dzēšana development: Izstrāde edit_profile: Labot profilu + export: Izgūt featured_tags: Piedāvātie tēmturi import: Imports import_and_export: Imports un eksports @@ -1802,11 +1811,11 @@ lv: title: Arhīva līdzņemšana suspicious_sign_in: change_password: mainīt paroli - details: 'Šeit ir detalizēta informācija par pierakstīšanos:' - explanation: Esam konstatējuši pierakstīšanos tavā kontā no jaunas IP adreses. + details: 'Šeit ir pieteikšanās izvērsums:' + explanation: Esam noteikuši pieteikšanos Tavā kontā no jaunas IP adreses. further_actions_html: Ja tas nebiji tu, iesakām nekavējoties %{action} un iespējot divu faktoru autentifikāciju, lai tavs konts būtu drošībā. subject: Tavam kontam ir piekļūts no jaunas IP adreses - title: Jauna pierakstīšanās + title: Jauna pieteikšanās warning: appeal: Iesniegt apelāciju appeal_description: Ja uzskatāt, ka tā ir kļūda, varat iesniegt apelāciju %{instance} darbiniekiem. diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 5f3ac2818c..6c21683b07 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -3,13 +3,14 @@ cy: simple_form: hints: account: - attribution_domains_as_text: Un i bob llinell. Yn amddiffyn rhag cydnabyddiaethau ffug. + attribution_domains_as_text: Un i bob llinell. Yn amddiffyn rhag priodoli ffug. discoverable: Mae'n bosibl y bydd eich postiadau cyhoeddus a'ch proffil yn cael sylw neu'n cael eu hargymell mewn gwahanol feysydd o Mastodon ac efallai y bydd eich proffil yn cael ei awgrymu i ddefnyddwyr eraill. display_name: Eich enw llawn neu'ch enw hwyl. fields: Eich tudalen cartref, rhagenwau, oed, neu unrhyw beth. indexable: Mae'n bosib y bydd eich postiadau cyhoeddus yn ymddangos yng nghanlyniadau chwilio ar Mastodon. Mae'n bosibl y bydd pobl sydd wedi rhyngweithio â'ch postiadau yn dal i allu eu chwilio. note: 'Gallwch @grybwyll pobl eraill neu #hashnodau.' show_collections: Bydd pobl yn gallu pori trwy'r rhai rydych yn eu dilyn a'ch dilynwyr. Bydd y bobl rydych chi'n eu dilyn yn gweld eich bod chi'n eu dilyn beth bynnag. + unlocked: Bydd pobl yn gallu eich dilyn heb ofyn am gymeradwyaeth. Dad-diciwch os ydych am adolygu ceisiadau i'ch dilyn a dewis a ydych am dderbyn neu wrthod dilynwyr newydd. account_alias: acct: Rhowch enwdefnyddiwr@parth y cyfrif y hoffech chi symud ohono account_migration: diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 230965fe87..60922b06b5 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -48,7 +48,7 @@ hu: digest: Csak hosszú távollét esetén küldődik és csak ha személyes üzenetet kaptál távollétedben email: Kapsz egy megerősítő e-mailt header: WEBP, PNG, GIF vagy JPG. Legfeljebb %{size}. Át lesz méretezve %{dimensions} képpontosra. - inbox_url: Másold ki a használandó relé szerver kezdőoldalának URL-jét + inbox_url: Másold ki a használandó továbbító kiszolgáló kezdőoldalának URL-jét irreversible: A kiszűrt bejegyzések visszafordíthatatlanul eltűnnek, a szűrő későbbi törlése esetén is locale: A felhasználói felület, e-mailek, push üzenetek nyelve password: Legalább 8 karakter @@ -195,7 +195,7 @@ hu: fields: Profil metaadatai header: Fejléc honeypot: "%{label} (ne töltsd ki)" - inbox_url: Relé inbox-hoz tartozó URL + inbox_url: Továbbító inbox-hoz tartozó URL irreversible: Eldobás elrejtés helyett locale: Felhasználói felület nyelve max_uses: Hányszor használható diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index da8dac3c22..2f4a05dca4 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -10,6 +10,7 @@ lv: indexable: Tavi publiskie ieraksti var tikt parādīti Mastodon meklēšanas iznākumā. Cilvēki, kuri ir mijiedarbojušies ar Taviem ierakstiem, var tos meklēt neatkarīgi no tā. note: 'Tu vari @minēt citus cilvēkus vai #mirkļbirkas.' show_collections: Cilvēki varēs pārlūkot Tavus sekotājus un sekojamos. Cilvēki, kuriem Tu seko, redzēs, ka Tu seko viņiem neatkarīgi no tā. + unlocked: Cilvēki varēs Tev sekot bez apstiprinājuma pieprasīšanas. Jānoņem atzīme, ja vēlies pārskatīt sekošanas pieprasījumus un izvēlēties, vai apstiprināt vai noraidīt jaunus sekotājus. account_alias: acct: Norādi konta lietotājvārdu@domēnu, no kura vēlies pārvākties account_migration: @@ -88,7 +89,7 @@ lv: media_cache_retention_period: Informācijas nesēju datnes no ierakstiem, kurus ir veikuši attālie lietotāji, tiek kešoti šajā serverī. Kad ir iestatīta apstiprinoša vērtība, informācijas nesēji tiks izdzēsti pēc norādītā dienu skaita. Ja informācijas nesēju dati tiks pieprasīti pēc tam, kad tie tika izdzēsti, tie tiks atkārtoti lejupielādēti, ja avota saturs joprojām būs pieejams. Saišu priekšskatījuma karšu vaicājumu biežuma ierobežojumu dēļ ir ieteicams iestatīt šo vērtību vismaz 14 dienas vai saišu priekšskatījuma kartes netiks atjauninātas pēc pieprasījuma pirms tā laika. peers_api_enabled: Domēna vārdu saraksts, ar kuriem šis serveris ir saskāries fediversā. Šeit nav iekļauti dati par to, vai tu veic federāciju ar noteiktu serveri, tikai tavs serveris par to zina. To izmanto dienesti, kas apkopo statistiku par federāciju vispārīgā nozīmē. profile_directory: Profilu direktorijā ir uzskaitīti visi lietotāji, kuri ir izvēlējušies būt atklājami. - require_invite_text: 'Ja pierakstīšanai nepieciešama manuāla apstiprināšana, izdari tā, lai teksta: “Kāpēc vēlaties pievienoties?” ievade ir obligāta, nevis opcionāla' + require_invite_text: Ja nepieciešama pašrocīga apstiprināšana, lai pierakstītos, teksta “Kāpēc vēlies pievienoties?” ievade jāpadara par nepieciešamu, nevis izvēles site_contact_email: Kā cilvēki var sazināties ar tevi par juridiskiem vai atbalsta jautājumiem. site_contact_username: Tagad cilvēki var tevi sasniegt Mastodon. site_extended_description: Jebkura papildu informācija, kas var būt noderīga apmeklētājiem un lietotājiem. Var strukturēt ar Markdown sintaksi. @@ -338,5 +339,5 @@ lv: text: nepieciešams title: sessions: - webauthn: Lai pierakstītos, izmanto vienu no savām drošības atslēgām + webauthn: Lai pieteiktos, jāizmanto viena no savām drošības atslēgām 'yes': Jā From 0838cf1e0576cbcb8df1f9a1a57d42abb51f866c Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 15 Nov 2024 14:37:45 +0100 Subject: [PATCH 40/52] Fix domain attribution field having autocorrect and autocapitalize enabled (#32903) --- app/views/settings/verifications/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/settings/verifications/show.html.haml b/app/views/settings/verifications/show.html.haml index 4def10e595..a93ffcebed 100644 --- a/app/views/settings/verifications/show.html.haml +++ b/app/views/settings/verifications/show.html.haml @@ -65,7 +65,7 @@ %p.lead= t('author_attribution.then_instructions') .fields-group - = f.input :attribution_domains_as_text, as: :text, wrapper: :with_block_label, input_html: { placeholder: "example1.com\nexample2.com\nexample3.com", rows: 4 } + = f.input :attribution_domains_as_text, as: :text, wrapper: :with_block_label, input_html: { placeholder: "example1.com\nexample2.com\nexample3.com", rows: 4, autocapitalize: 'none', autocorrect: 'off' } .actions = f.button :button, t('generic.save_changes'), type: :submit From f1ef7b5b433b392956469874392acb146bfc6c57 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 15 Nov 2024 16:35:30 +0100 Subject: [PATCH 41/52] Fix uploading higher-than-wide GIF profile picture with libvips enabled (#32911) --- lib/paperclip/vips_lazy_thumbnail.rb | 1 + spec/fixtures/files/avatar-high.gif | Bin 0 -> 75006 bytes .../examples/models/concerns/account_avatar.rb | 9 ++++++++- 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 spec/fixtures/files/avatar-high.gif diff --git a/lib/paperclip/vips_lazy_thumbnail.rb b/lib/paperclip/vips_lazy_thumbnail.rb index 4764b04af8..fea4b86064 100644 --- a/lib/paperclip/vips_lazy_thumbnail.rb +++ b/lib/paperclip/vips_lazy_thumbnail.rb @@ -52,6 +52,7 @@ module Paperclip # implement. If cropping ever becomes necessary for other situations, this will # need to be expanded. crop_width = crop_height = [target_width, target_height].min if @target_geometry&.square? + crop_width = crop_height = "'min(iw,ih)'" if crop_width == 'ih' filter = begin if @crop diff --git a/spec/fixtures/files/avatar-high.gif b/spec/fixtures/files/avatar-high.gif new file mode 100644 index 0000000000000000000000000000000000000000..7639f2c507ee72beb745a2ab0677590eb9eb7459 GIT binary patch literal 75006 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 Date: Fri, 15 Nov 2024 15:37:30 +0000 Subject: [PATCH 42/52] Rails 7+: primary_abstract_class recommendation (#32909) --- app/models/application_record.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/application_record.rb b/app/models/application_record.rb index 299aad6340..24e9d6aeba 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class ApplicationRecord < ActiveRecord::Base - self.abstract_class = true + primary_abstract_class include Remotable From 297ce9ef4474c80e10043db7cc61b4fc331c68c1 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 15 Nov 2024 10:49:26 -0500 Subject: [PATCH 43/52] Move body class to shared partial for web app controller concern views (#31797) --- app/controllers/concerns/web_app_controller_concern.rb | 5 ----- app/views/shared/_web_app.html.haml | 1 + spec/system/about_spec.rb | 1 + spec/system/home_spec.rb | 2 ++ spec/system/privacy_spec.rb | 1 + spec/system/tags_spec.rb | 1 + 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/controllers/concerns/web_app_controller_concern.rb b/app/controllers/concerns/web_app_controller_concern.rb index 9485ecda49..249bb20a25 100644 --- a/app/controllers/concerns/web_app_controller_concern.rb +++ b/app/controllers/concerns/web_app_controller_concern.rb @@ -7,7 +7,6 @@ module WebAppControllerConcern vary_by 'Accept, Accept-Language, Cookie' before_action :redirect_unauthenticated_to_permalinks! - before_action :set_app_body_class content_security_policy do |p| policy = ContentSecurityPolicy.new @@ -24,10 +23,6 @@ module WebAppControllerConcern !(ENV['ONE_CLICK_SSO_LOGIN'] == 'true' && ENV['OMNIAUTH_ONLY'] == 'true' && Devise.omniauth_providers.length == 1) && current_user.nil? end - def set_app_body_class - @body_classes = 'app-body' - end - def redirect_unauthenticated_to_permalinks! return if user_signed_in? && current_account.moved_to_account_id.nil? diff --git a/app/views/shared/_web_app.html.haml b/app/views/shared/_web_app.html.haml index 89d6ee567d..4f9a20a9f4 100644 --- a/app/views/shared/_web_app.html.haml +++ b/app/views/shared/_web_app.html.haml @@ -1,3 +1,4 @@ +- content_for :body_classes, 'app-body' - content_for :header_tags do - if user_signed_in? = preload_pack_asset 'features/compose.js' diff --git a/spec/system/about_spec.rb b/spec/system/about_spec.rb index f832802f91..d7fd7f51a1 100644 --- a/spec/system/about_spec.rb +++ b/spec/system/about_spec.rb @@ -8,5 +8,6 @@ RSpec.describe 'About page' do expect(page) .to have_css('noscript', text: /Mastodon/) + .and have_css('body', class: 'app-body') end end diff --git a/spec/system/home_spec.rb b/spec/system/home_spec.rb index c1ce4e1726..0838b3d8e7 100644 --- a/spec/system/home_spec.rb +++ b/spec/system/home_spec.rb @@ -11,6 +11,7 @@ RSpec.describe 'Home page' do expect(page) .to have_css('noscript', text: /Mastodon/) + .and have_css('body', class: 'app-body') end end @@ -20,6 +21,7 @@ RSpec.describe 'Home page' do expect(page) .to have_css('noscript', text: /Mastodon/) + .and have_css('body', class: 'app-body') end end end diff --git a/spec/system/privacy_spec.rb b/spec/system/privacy_spec.rb index 631440ebb2..f2e4d5a993 100644 --- a/spec/system/privacy_spec.rb +++ b/spec/system/privacy_spec.rb @@ -8,5 +8,6 @@ RSpec.describe 'Privacy policy page' do expect(page) .to have_css('noscript', text: /Mastodon/) + .and have_css('body', class: 'app-body') end end diff --git a/spec/system/tags_spec.rb b/spec/system/tags_spec.rb index f39c6bf0d8..9da5768c7f 100644 --- a/spec/system/tags_spec.rb +++ b/spec/system/tags_spec.rb @@ -13,6 +13,7 @@ RSpec.describe 'Tags' do expect(page) .to have_css('noscript', text: /Mastodon/) + .and have_css('body', class: 'app-body') .and have_private_cache_control end end From 319109029d8eb8b851874b3c80ced3536ba81f29 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 15 Nov 2024 10:52:37 -0500 Subject: [PATCH 44/52] Fix logic in "last used at per application" oauth token list (#32912) --- .../authorized_applications_controller.rb | 8 +------ app/models/user.rb | 9 ++++++++ spec/models/user_spec.rb | 23 +++++++++++++++++++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb index 267409a9ce..9e541e5e3c 100644 --- a/app/controllers/oauth/authorized_applications_controller.rb +++ b/app/controllers/oauth/authorized_applications_controller.rb @@ -35,12 +35,6 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio end def set_last_used_at_by_app - @last_used_at_by_app = Doorkeeper::AccessToken - .select('DISTINCT ON (application_id) application_id, last_used_at') - .where(resource_owner_id: current_resource_owner.id) - .where.not(last_used_at: nil) - .order(application_id: :desc, last_used_at: :desc) - .pluck(:application_id, :last_used_at) - .to_h + @last_used_at_by_app = current_resource_owner.applications_last_used end end diff --git a/app/models/user.rb b/app/models/user.rb index f717dcd860..be9ebac699 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -280,6 +280,15 @@ class User < ApplicationRecord save! end + def applications_last_used + Doorkeeper::AccessToken + .where(resource_owner_id: id) + .where.not(last_used_at: nil) + .group(:application_id) + .maximum(:last_used_at) + .to_h + end + def token_for_app(app) return nil if app.nil? || app.owner != self diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 4393be5a4e..9a5a070d25 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -598,4 +598,27 @@ RSpec.describe User do end end end + + describe '#applications_last_used' do + let!(:user) { Fabricate(:user) } + + let!(:never_used_application) { Fabricate :application, owner: user } + let!(:application_one) { Fabricate :application, owner: user } + let!(:application_two) { Fabricate :application, owner: user } + + before do + _other_user_token = Fabricate :access_token, last_used_at: 3.days.ago + _never_used_token = Fabricate :access_token, application: never_used_application, resource_owner_id: user.id, last_used_at: nil + _app_one_old_token = Fabricate :access_token, application: application_one, resource_owner_id: user.id, last_used_at: 5.days.ago + _app_one_new_token = Fabricate :access_token, application: application_one, resource_owner_id: user.id, last_used_at: 1.day.ago + _never_used_token = Fabricate :access_token, application: application_two, resource_owner_id: user.id, last_used_at: 5.days.ago + end + + it 'returns a hash of unique applications with last used values' do + expect(user.applications_last_used) + .to include(application_one.id => be_within(1.0).of(1.day.ago)) + .and include(application_two.id => be_within(1.0).of(5.days.ago)) + .and not_include(never_used_application.id) + end + end end From 54a7c1898e36cda393dc79cde4d44b53e0a5299a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 15:55:10 +0000 Subject: [PATCH 45/52] Update dependency uuid to v11 (#32676) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- streaming/package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/streaming/package.json b/streaming/package.json index 585c4be4e1..380f1c429d 100644 --- a/streaming/package.json +++ b/streaming/package.json @@ -27,7 +27,7 @@ "pino": "^9.0.0", "pino-http": "^10.0.0", "prom-client": "^15.0.0", - "uuid": "^10.0.0", + "uuid": "^11.0.0", "ws": "^8.12.1" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 7fd68ac8c1..1f9ff3426b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3027,7 +3027,7 @@ __metadata: prom-client: "npm:^15.0.0" typescript: "npm:^5.0.4" utf-8-validate: "npm:^6.0.3" - uuid: "npm:^10.0.0" + uuid: "npm:^11.0.0" ws: "npm:^8.12.1" dependenciesMeta: bufferutil: @@ -17680,12 +17680,12 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^10.0.0": - version: 10.0.0 - resolution: "uuid@npm:10.0.0" +"uuid@npm:^11.0.0": + version: 11.0.1 + resolution: "uuid@npm:11.0.1" bin: - uuid: dist/bin/uuid - checksum: 10c0/eab18c27fe4ab9fb9709a5d5f40119b45f2ec8314f8d4cf12ce27e4c6f4ffa4a6321dc7db6c515068fa373c075b49691ba969f0010bf37f44c37ca40cd6bf7fe + uuid: dist/esm/bin/uuid + checksum: 10c0/cd5a1d7eccfd6da80382ec88cfa28b68dce2c1c1402228b813fc0065ab8b29d20594cffeb67d850bc166ade677a6c35741072bd9dd0cc7d565c1fe8eca14ef22 languageName: node linkType: hard From 7bd7705f591692f9df0346f025a30ef8eda25ae1 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 15 Nov 2024 11:07:26 -0500 Subject: [PATCH 46/52] Combine shared-setup examples across `spec/controllers/auth/*` specs (#32906) --- .../auth/challenges_controller_spec.rb | 32 ++--- .../auth/confirmations_controller_spec.rb | 25 ++-- .../auth/passwords_controller_spec.rb | 53 ++++--- .../auth/registrations_controller_spec.rb | 135 +++++++++--------- 4 files changed, 121 insertions(+), 124 deletions(-) diff --git a/spec/controllers/auth/challenges_controller_spec.rb b/spec/controllers/auth/challenges_controller_spec.rb index 56fdfa61b5..3c9d2a5964 100644 --- a/spec/controllers/auth/challenges_controller_spec.rb +++ b/spec/controllers/auth/challenges_controller_spec.rb @@ -8,9 +8,7 @@ RSpec.describe Auth::ChallengesController do let(:password) { 'foobar12345' } let(:user) { Fabricate(:user, password: password) } - before do - sign_in user - end + before { sign_in user } describe 'POST #create' do let(:return_to) { edit_user_registration_path } @@ -18,28 +16,24 @@ RSpec.describe Auth::ChallengesController do context 'with correct password' do before { post :create, params: { form_challenge: { return_to: return_to, current_password: password } } } - it 'redirects back' do - expect(response).to redirect_to(return_to) - end - - it 'sets session' do - expect(session[:challenge_passed_at]).to_not be_nil + it 'redirects back and sets challenge passed at in session' do + expect(response) + .to redirect_to(return_to) + expect(session[:challenge_passed_at]) + .to_not be_nil end end context 'with incorrect password' do before { post :create, params: { form_challenge: { return_to: return_to, current_password: 'hhfggjjd562' } } } - it 'renders challenge' do - expect(response).to render_template('auth/challenges/new') - end - - it 'displays error' do - expect(response.body).to include 'Invalid password' - end - - it 'does not set session' do - expect(session[:challenge_passed_at]).to be_nil + it 'renders challenge, displays error, does not set session' do + expect(response) + .to render_template('auth/challenges/new') + expect(response.body) + .to include 'Invalid password' + expect(session[:challenge_passed_at]) + .to be_nil end end end diff --git a/spec/controllers/auth/confirmations_controller_spec.rb b/spec/controllers/auth/confirmations_controller_spec.rb index a5b212e660..09a178f0e8 100644 --- a/spec/controllers/auth/confirmations_controller_spec.rb +++ b/spec/controllers/auth/confirmations_controller_spec.rb @@ -23,12 +23,11 @@ RSpec.describe Auth::ConfirmationsController do get :show, params: { confirmation_token: 'foobar' } end - it 'redirects to login' do - expect(response).to redirect_to(new_user_session_path) - end - - it 'queues up bootstrapping of home timeline' do - expect(BootstrapTimelineWorker).to have_received(:perform_async).with(user.account_id) + it 'redirects to login and queues worker' do + expect(response) + .to redirect_to(new_user_session_path) + expect(BootstrapTimelineWorker) + .to have_received(:perform_async).with(user.account_id) end end @@ -88,13 +87,13 @@ RSpec.describe Auth::ConfirmationsController do get :show, params: { confirmation_token: 'foobar' } end - it 'redirects to login and confirms email' do - expect(response).to redirect_to(new_user_session_path) - expect(user.reload.unconfirmed_email).to be_nil - end - - it 'does not queue up bootstrapping of home timeline' do - expect(BootstrapTimelineWorker).to_not have_received(:perform_async) + it 'redirects to login, confirms email, does not queue worker' do + expect(response) + .to redirect_to(new_user_session_path) + expect(user.reload.unconfirmed_email) + .to be_nil + expect(BootstrapTimelineWorker) + .to_not have_received(:perform_async) end end end diff --git a/spec/controllers/auth/passwords_controller_spec.rb b/spec/controllers/auth/passwords_controller_spec.rb index 9ccbb9e494..90095ac4b8 100644 --- a/spec/controllers/auth/passwords_controller_spec.rb +++ b/spec/controllers/auth/passwords_controller_spec.rb @@ -57,29 +57,30 @@ RSpec.describe Auth::PasswordsController do post :update, params: { user: { password: password, password_confirmation: password, reset_password_token: token } } end - it 'redirect to sign in' do - expect(response).to redirect_to '/auth/sign_in' - end + it 'resets the password' do + expect(response) + .to redirect_to '/auth/sign_in' - it 'changes password' do - this_user = User.find(user.id) + # Change password + expect(User.find(user.id)) + .to be_present + .and be_valid_password(password) - expect(this_user).to_not be_nil - expect(this_user.valid_password?(password)).to be true - end + # Deactivate session + expect(user.session_activations.count) + .to eq 0 + expect { session_activation.reload } + .to raise_error(ActiveRecord::RecordNotFound) - it 'deactivates all sessions' do - expect(user.session_activations.count).to eq 0 - expect { session_activation.reload }.to raise_error(ActiveRecord::RecordNotFound) - end + # Revoke tokens + expect(Doorkeeper::AccessToken.active_for(user).count) + .to eq 0 - it 'revokes all access tokens' do - expect(Doorkeeper::AccessToken.active_for(user).count).to eq 0 - end - - it 'removes push subscriptions' do - expect(Web::PushSubscription.where(user: user).or(Web::PushSubscription.where(access_token: access_token)).count).to eq 0 - expect { web_push_subscription.reload }.to raise_error(ActiveRecord::RecordNotFound) + # Remove push subs + expect(Web::PushSubscription.where(user: user).or(Web::PushSubscription.where(access_token: access_token)).count) + .to eq 0 + expect { web_push_subscription.reload } + .to raise_error(ActiveRecord::RecordNotFound) end end @@ -88,15 +89,13 @@ RSpec.describe Auth::PasswordsController do post :update, params: { user: { password: password, password_confirmation: password, reset_password_token: 'some_invalid_value' } } end - it 'renders reset password' do - expect(response).to render_template(:new) - end + it 'renders reset password and retains password' do + expect(response) + .to render_template(:new) - it 'retains password' do - this_user = User.find(user.id) - - expect(this_user).to_not be_nil - expect(this_user.external_or_valid_password?(user.password)).to be true + expect(User.find(user.id)) + .to be_present + .and be_external_or_valid_password(user.password) end end end diff --git a/spec/controllers/auth/registrations_controller_spec.rb b/spec/controllers/auth/registrations_controller_spec.rb index d1542128e7..739cb455e8 100644 --- a/spec/controllers/auth/registrations_controller_spec.rb +++ b/spec/controllers/auth/registrations_controller_spec.rb @@ -6,25 +6,33 @@ RSpec.describe Auth::RegistrationsController do render_views shared_examples 'checks for enabled registrations' do |path| - it 'redirects if it is in single user mode while it is open for registration' do - Fabricate(:account) - Setting.registrations_mode = 'open' - allow(Rails.configuration.x).to receive(:single_user_mode).and_return(true) + context 'when in single user mode and open for registration' do + before do + Setting.registrations_mode = 'open' + allow(Rails.configuration.x).to receive(:single_user_mode).and_return(true) + end - get path + it 'redirects to root' do + Fabricate(:account) + get path - expect(response).to redirect_to '/' - expect(Rails.configuration.x).to have_received(:single_user_mode) + expect(response).to redirect_to '/' + expect(Rails.configuration.x).to have_received(:single_user_mode) + end end - it 'redirects if it is not open for registration while it is not in single user mode' do - Setting.registrations_mode = 'none' - allow(Rails.configuration.x).to receive(:single_user_mode).and_return(false) + context 'when registrations closed and not in single user mode' do + before do + Setting.registrations_mode = 'none' + allow(Rails.configuration.x).to receive(:single_user_mode).and_return(false) + end - get path + it 'redirects to root' do + get path - expect(response).to redirect_to '/' - expect(Rails.configuration.x).to have_received(:single_user_mode) + expect(response).to redirect_to '/' + expect(Rails.configuration.x).to have_received(:single_user_mode) + end end end @@ -35,12 +43,12 @@ RSpec.describe Auth::RegistrationsController do get :edit end - it 'returns http success' do - expect(response).to have_http_status(200) - end + it 'returns http success and cache headers' do + expect(response) + .to have_http_status(200) - it 'returns private cache control header' do - expect(response.headers['Cache-Control']).to include('private, no-store') + expect(response.headers['Cache-Control']) + .to include('private, no-store') end end @@ -53,14 +61,13 @@ RSpec.describe Auth::RegistrationsController do sign_in(user, scope: :user) end - it 'returns http success' do + it 'returns http success and cache headers' do put :update - expect(response).to have_http_status(200) - end - it 'returns private cache control headers' do - put :update - expect(response.headers['Cache-Control']).to include('private, no-store') + expect(response) + .to have_http_status(200) + expect(response.headers['Cache-Control']) + .to include('private, no-store') end it 'can update the user email' do @@ -174,16 +181,14 @@ RSpec.describe Auth::RegistrationsController do post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', agreement: 'true' } } end - it 'redirects to setup' do + it 'redirects to setup and creates user' do subject - expect(response).to redirect_to auth_setup_path - end - it 'creates user' do - subject - user = User.find_by(email: 'test@example.com') - expect(user).to_not be_nil - expect(user.locale).to eq(accept_language) + expect(response) + .to redirect_to auth_setup_path + expect(User.find_by(email: 'test@example.com')) + .to be_present + .and have_attributes(locale: eq(accept_language)) end end @@ -254,17 +259,18 @@ RSpec.describe Auth::RegistrationsController do post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', agreement: 'true' } } end - it 'redirects to setup' do + it 'redirects to setup and creates user' do subject - expect(response).to redirect_to auth_setup_path - end - it 'creates user' do - subject - user = User.find_by(email: 'test@example.com') - expect(user).to_not be_nil - expect(user.locale).to eq(accept_language) - expect(user.approved).to be(false) + expect(response) + .to redirect_to auth_setup_path + + expect(User.find_by(email: 'test@example.com')) + .to be_present + .and have_attributes( + locale: eq(accept_language), + approved: be(false) + ) end end @@ -276,17 +282,17 @@ RSpec.describe Auth::RegistrationsController do post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', invite_code: invite.code, agreement: 'true' } } end - it 'redirects to setup' do + it 'redirects to setup and creates user' do subject - expect(response).to redirect_to auth_setup_path - end - it 'creates user' do - subject - user = User.find_by(email: 'test@example.com') - expect(user).to_not be_nil - expect(user.locale).to eq(accept_language) - expect(user.approved).to be(false) + expect(response).to redirect_to auth_setup_path + + expect(User.find_by(email: 'test@example.com')) + .to be_present + .and have_attributes( + locale: eq(accept_language), + approved: be(false) + ) end end @@ -300,17 +306,17 @@ RSpec.describe Auth::RegistrationsController do post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', invite_code: invite.code, agreement: 'true' } } end - it 'redirects to setup' do + it 'redirects to setup and creates user' do subject - expect(response).to redirect_to auth_setup_path - end - it 'creates user' do - subject - user = User.find_by(email: 'test@example.com') - expect(user).to_not be_nil - expect(user.locale).to eq(accept_language) - expect(user.approved).to be(true) + expect(response).to redirect_to auth_setup_path + + expect(User.find_by(email: 'test@example.com')) + .to be_present + .and have_attributes( + locale: eq(accept_language), + approved: be(true) + ) end end @@ -348,12 +354,11 @@ RSpec.describe Auth::RegistrationsController do delete :destroy end - it 'returns http not found' do - expect(response).to have_http_status(404) - end - - it 'does not delete user' do - expect(User.find(user.id)).to_not be_nil + it 'returns http not found and keeps user' do + expect(response) + .to have_http_status(404) + expect(User.find(user.id)) + .to_not be_nil end end end From 9d3fcc3546df1cef5652ea29e370a86cb87d7a21 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 15 Nov 2024 11:10:20 -0500 Subject: [PATCH 47/52] Remove unused failure action in api/base controller spec (#32905) --- spec/controllers/api/base_controller_spec.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/spec/controllers/api/base_controller_spec.rb b/spec/controllers/api/base_controller_spec.rb index 1e0e7c8f4d..bd4073dfaf 100644 --- a/spec/controllers/api/base_controller_spec.rb +++ b/spec/controllers/api/base_controller_spec.rb @@ -7,10 +7,6 @@ RSpec.describe Api::BaseController do def success head 200 end - - def failure - FakeService.new - end end it 'returns private cache control headers by default' do From 44d92fa4f6aac5c45ad358287af48cd879f5665e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 17:15:44 +0100 Subject: [PATCH 48/52] Update dependency uuid to v11.0.3 (#32913) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1f9ff3426b..aaecae7a2a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17681,11 +17681,11 @@ __metadata: linkType: hard "uuid@npm:^11.0.0": - version: 11.0.1 - resolution: "uuid@npm:11.0.1" + version: 11.0.3 + resolution: "uuid@npm:11.0.3" bin: uuid: dist/esm/bin/uuid - checksum: 10c0/cd5a1d7eccfd6da80382ec88cfa28b68dce2c1c1402228b813fc0065ab8b29d20594cffeb67d850bc166ade677a6c35741072bd9dd0cc7d565c1fe8eca14ef22 + checksum: 10c0/cee762fc76d949a2ff9205770334699e0043d52bb766472593a25f150077c9deed821230251ea3d6ab3943a5ea137d2826678797f1d5f6754c7ce5ce27e9f7a6 languageName: node linkType: hard From e98891f4e5d03927cdfa947b4aa5e75be879481b Mon Sep 17 00:00:00 2001 From: Christian Schmidt Date: Sun, 10 Nov 2024 17:16:07 +0100 Subject: [PATCH 49/52] [Glitch] Backspace hotkey should override default behaviour Port 157fba4698361348c8211bc64e522492a13ff23b to glitch-soc Signed-off-by: Claire --- app/javascript/flavours/glitch/features/ui/index.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/features/ui/index.jsx b/app/javascript/flavours/glitch/features/ui/index.jsx index 1ef29f8db2..8bf4484427 100644 --- a/app/javascript/flavours/glitch/features/ui/index.jsx +++ b/app/javascript/flavours/glitch/features/ui/index.jsx @@ -532,7 +532,9 @@ class UI extends PureComponent { } }; - handleHotkeyBack = () => { + handleHotkeyBack = e => { + e.preventDefault(); + const { history } = this.props; if (history.location?.state?.fromMastodon) { From e86c1c814bad3dc48b8bba802342b5399c8ddf96 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 12 Nov 2024 13:35:35 +0100 Subject: [PATCH 50/52] [Glitch] Fix a few visual issues with annual reports in web UI Port 32e5e1d3f166062e4939b3fbf25dff5657417893 to glitch-soc Signed-off-by: Claire --- .../features/annual_report/most_used_hashtag.tsx | 15 ++++++++------- .../glitch/features/annual_report/percentile.tsx | 4 ++-- .../flavours/glitch/styles/annual_reports.scss | 9 +++++++-- .../glitch/styles/mastodon-light/diff.scss | 7 +++++++ 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/app/javascript/flavours/glitch/features/annual_report/most_used_hashtag.tsx b/app/javascript/flavours/glitch/features/annual_report/most_used_hashtag.tsx index a6d5e08fe1..6bf7493960 100644 --- a/app/javascript/flavours/glitch/features/annual_report/most_used_hashtag.tsx +++ b/app/javascript/flavours/glitch/features/annual_report/most_used_hashtag.tsx @@ -7,16 +7,17 @@ export const MostUsedHashtag: React.FC<{ }> = ({ data }) => { const hashtag = data[0]; - if (!hashtag) { - return ( -

- ); - } - return (
- #{hashtag.name} + {hashtag ? ( + <>#{hashtag.name} + ) : ( + + )}
(
), diff --git a/app/javascript/flavours/glitch/styles/annual_reports.scss b/app/javascript/flavours/glitch/styles/annual_reports.scss index 39784e3b5e..dff1c76eca 100644 --- a/app/javascript/flavours/glitch/styles/annual_reports.scss +++ b/app/javascript/flavours/glitch/styles/annual_reports.scss @@ -103,6 +103,11 @@ background-color: var(--goldenrod-2); } } + + .status-card, + .hashtag-bar { + display: none; + } } &__followers { @@ -237,7 +242,7 @@ } &__number { - font-size: 61px; + font-size: 54px; font-weight: 600; line-height: 73px; color: var(--goldenrod-2); @@ -306,7 +311,7 @@ } .annual-report-modal { - max-width: 480px; + max-width: 600px; background: var(--indigo-1); border-radius: 16px; display: flex; diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss index 2e5cb59398..ab4c3b3866 100644 --- a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss +++ b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss @@ -598,3 +598,10 @@ a.sparkline { ::-webkit-scrollbar-thumb { opacity: 0.25; } + +.notification-group--annual-report { + .notification-group__icon, + .notification-group__main .link-button { + color: var(--indigo-3); + } +} From 18aa0d88717caae760fafdf60c24a9f488f724d0 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 14 Nov 2024 13:50:36 +0100 Subject: [PATCH 51/52] [Glitch] Fix Content Warning and filter states not applying to boosted posts properly (refactor only) Port ec663eaba13294d803fdb8ddab373d7534c5a644 to glitch-soc Signed-off-by: Claire --- app/javascript/flavours/glitch/components/status.jsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/javascript/flavours/glitch/components/status.jsx b/app/javascript/flavours/glitch/components/status.jsx index 62b1b388fa..30ce6c4917 100644 --- a/app/javascript/flavours/glitch/components/status.jsx +++ b/app/javascript/flavours/glitch/components/status.jsx @@ -586,6 +586,9 @@ class Status extends ImmutablePureComponent { let prepend, rebloggedByText; + const connectUp = previousId && previousId === status.get('in_reply_to_id'); + const connectToRoot = rootId && rootId === status.get('in_reply_to_id'); + const connectReply = nextInReplyToId && nextInReplyToId === status.get('id'); const matchedFilters = status.get('matched_filters'); if (hidden) { @@ -600,10 +603,6 @@ class Status extends ImmutablePureComponent { ); } - const connectUp = previousId && previousId === status.get('in_reply_to_id'); - const connectToRoot = rootId && rootId === status.get('in_reply_to_id'); - const connectReply = nextInReplyToId && nextInReplyToId === status.get('id'); - if (this.state.forceFilter === undefined ? matchedFilters : this.state.forceFilter) { const minHandlers = this.props.muted ? {} : { moveUp: this.handleHotkeyMoveUp, From 0e9ab5363a244b54411e3e089a03eb7674c97e80 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Fri, 15 Nov 2024 10:38:01 +0100 Subject: [PATCH 52/52] [Glitch] Improve display of statuses in admin panel Port ddfb3d123bb4195f0b086fe19bc90700fa5170b4 to glitch-soc (CSS only) Signed-off-by: Claire --- .../flavours/glitch/styles/admin.scss | 28 +++++++++++++++++++ .../flavours/glitch/styles/tables.scss | 12 ++++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss index fadc678de3..b07c65c16b 100644 --- a/app/javascript/flavours/glitch/styles/admin.scss +++ b/app/javascript/flavours/glitch/styles/admin.scss @@ -1943,3 +1943,31 @@ a.sparkline { } } } + +.status__card { + padding: 15px; + border-radius: 4px; + background: $ui-base-color; + font-size: 15px; + line-height: 20px; + word-wrap: break-word; + font-weight: 400; + border: 1px solid lighten($ui-base-color, 4%); + color: $primary-text-color; + box-sizing: border-box; + min-height: 100%; + + .status__prepend { + padding: 0 0 15px; + gap: 4px; + align-items: center; + } + + .status__content { + padding-top: 0; + + summary { + display: list-item; + } + } +} diff --git a/app/javascript/flavours/glitch/styles/tables.scss b/app/javascript/flavours/glitch/styles/tables.scss index 75fc29aed5..07d1ce12fd 100644 --- a/app/javascript/flavours/glitch/styles/tables.scss +++ b/app/javascript/flavours/glitch/styles/tables.scss @@ -339,12 +339,12 @@ a.table-action-link { } } - .status__content { - padding-top: 0; - - strong { - font-weight: 700; - } + // Reset the status card to not have borders, background or padding when + // inline in the table of statuses + .status__card { + border: none; + background: none; + padding: 0; } .nothing-here {