Merge commit 'fe2667bb0d3487a32b9da5250402a90482a85fe2' into glitch-soc/merge-upstream

Conflicts:
- `app/lib/content_security_policy.rb`:
  Conflict caused by glitch-soc's support for the extra `EXTRA_DATA_HOSTS`
  environment variable.
  Ported upstream's changes while keeping support for `EXTRA_DATA_HOSTS`.
master
Claire 2024-01-10 17:51:12 +01:00
commit 0b2c7cdb02
116 changed files with 873 additions and 518 deletions

View File

@ -70,7 +70,7 @@ services:
hard: -1 hard: -1
libretranslate: libretranslate:
image: libretranslate/libretranslate:v1.5.2 image: libretranslate/libretranslate:v1.5.3
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- lt-data:/home/libretranslate/.local - lt-data:/home/libretranslate/.local

View File

@ -118,15 +118,10 @@ Rails/UnusedIgnoredColumns:
Rails/NegateInclude: Rails/NegateInclude:
Enabled: false Enabled: false
# Reason: Some single letter camel case files shouldn't be split # Reason: Deprecated cop, will be removed in 3.0, replaced by SpecFilePathFormat
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecfilepath # https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecfilepath
RSpec/FilePath: RSpec/FilePath:
CustomTransform: Enabled: false
ActivityPub: activitypub
DeepL: deepl
FetchOEmbedService: fetch_oembed_service
OEmbedController: oembed_controller
OStatus: ostatus
# Reason: # Reason:
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecnamedsubject # https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecnamedsubject

View File

@ -1,6 +1,6 @@
# This configuration was generated by # This configuration was generated by
# `rubocop --auto-gen-config --auto-gen-only-exclude --no-exclude-limit --no-offense-counts --no-auto-gen-timestamp` # `rubocop --auto-gen-config --auto-gen-only-exclude --no-exclude-limit --no-offense-counts --no-auto-gen-timestamp`
# using RuboCop version 1.57.2. # using RuboCop version 1.59.0.
# The point is for the user to remove these configuration records # The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base. # one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new # Note that changes in the inspected code, or installation of new
@ -26,7 +26,7 @@ Lint/NonLocalExitFromIterator:
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes. # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
Metrics/AbcSize: Metrics/AbcSize:
Max: 100 Max: 82
# Configuration parameters: CountBlocks, Max. # Configuration parameters: CountBlocks, Max.
Metrics/BlockNesting: Metrics/BlockNesting:
@ -50,7 +50,7 @@ RSpec/MultipleExpectations:
# Configuration parameters: AllowSubject. # Configuration parameters: AllowSubject.
RSpec/MultipleMemoizedHelpers: RSpec/MultipleMemoizedHelpers:
Max: 21 Max: 17
# Configuration parameters: AllowedGroups. # Configuration parameters: AllowedGroups.
RSpec/NestedGroups: RSpec/NestedGroups:
@ -66,7 +66,6 @@ Rails/ApplicationController:
Rails/HasAndBelongsToMany: Rails/HasAndBelongsToMany:
Exclude: Exclude:
- 'app/models/concerns/account/associations.rb' - 'app/models/concerns/account/associations.rb'
- 'app/models/preview_card.rb'
- 'app/models/status.rb' - 'app/models/status.rb'
- 'app/models/tag.rb' - 'app/models/tag.rb'
@ -144,7 +143,6 @@ Rails/WhereExists:
Exclude: Exclude:
- 'app/controllers/activitypub/inboxes_controller.rb' - 'app/controllers/activitypub/inboxes_controller.rb'
- 'app/controllers/admin/email_domain_blocks_controller.rb' - 'app/controllers/admin/email_domain_blocks_controller.rb'
- 'app/controllers/auth/registrations_controller.rb'
- 'app/lib/activitypub/activity/create.rb' - 'app/lib/activitypub/activity/create.rb'
- 'app/lib/delivery_failure_tracker.rb' - 'app/lib/delivery_failure_tracker.rb'
- 'app/lib/feed_manager.rb' - 'app/lib/feed_manager.rb'
@ -160,24 +158,16 @@ Rails/WhereExists:
- 'app/serializers/rest/announcement_serializer.rb' - 'app/serializers/rest/announcement_serializer.rb'
- 'app/serializers/rest/tag_serializer.rb' - 'app/serializers/rest/tag_serializer.rb'
- 'app/services/activitypub/fetch_remote_status_service.rb' - 'app/services/activitypub/fetch_remote_status_service.rb'
- 'app/services/app_sign_up_service.rb'
- 'app/services/vote_service.rb' - 'app/services/vote_service.rb'
- 'app/validators/reaction_validator.rb' - 'app/validators/reaction_validator.rb'
- 'app/validators/vote_validator.rb' - 'app/validators/vote_validator.rb'
- 'app/workers/move_worker.rb' - 'app/workers/move_worker.rb'
- 'db/migrate/20190529143559_preserve_old_layout_for_existing_users.rb'
- 'lib/tasks/tests.rake' - 'lib/tasks/tests.rake'
- 'spec/models/account_spec.rb' - 'spec/models/account_spec.rb'
- 'spec/services/activitypub/process_collection_service_spec.rb' - 'spec/services/activitypub/process_collection_service_spec.rb'
- 'spec/services/purge_domain_service_spec.rb' - 'spec/services/purge_domain_service_spec.rb'
- 'spec/services/unallow_domain_service_spec.rb' - 'spec/services/unallow_domain_service_spec.rb'
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowOnConstant, AllowOnSelfClass.
Style/CaseEquality:
Exclude:
- 'config/initializers/trusted_proxies.rb'
# This cop supports unsafe autocorrection (--autocorrect-all). # This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: AllowedMethods, AllowedPatterns. # Configuration parameters: AllowedMethods, AllowedPatterns.
# AllowedMethods: ==, equal?, eql? # AllowedMethods: ==, equal?, eql?
@ -205,8 +195,8 @@ Style/FetchEnvVar:
- 'config/initializers/devise.rb' - 'config/initializers/devise.rb'
- 'config/initializers/paperclip.rb' - 'config/initializers/paperclip.rb'
- 'config/initializers/vapid.rb' - 'config/initializers/vapid.rb'
- 'lib/premailer_webpack_strategy.rb'
- 'lib/mastodon/redis_config.rb' - 'lib/mastodon/redis_config.rb'
- 'lib/premailer_webpack_strategy.rb'
- 'lib/tasks/repo.rake' - 'lib/tasks/repo.rake'
- 'spec/features/profile_spec.rb' - 'spec/features/profile_spec.rb'
@ -223,7 +213,6 @@ Style/FormatStringToken:
# This cop supports unsafe autocorrection (--autocorrect-all). # This cop supports unsafe autocorrection (--autocorrect-all).
Style/GlobalStdStream: Style/GlobalStdStream:
Exclude: Exclude:
- 'config/boot.rb'
- 'config/environments/development.rb' - 'config/environments/development.rb'
- 'config/environments/production.rb' - 'config/environments/production.rb'
@ -253,8 +242,6 @@ Style/GuardClause:
- 'app/workers/redownload_media_worker.rb' - 'app/workers/redownload_media_worker.rb'
- 'app/workers/remote_account_refresh_worker.rb' - 'app/workers/remote_account_refresh_worker.rb'
- 'config/initializers/devise.rb' - 'config/initializers/devise.rb'
- 'db/migrate/20170901141119_truncate_preview_cards.rb'
- 'db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb'
- 'lib/devise/strategies/two_factor_ldap_authenticatable.rb' - 'lib/devise/strategies/two_factor_ldap_authenticatable.rb'
- 'lib/devise/strategies/two_factor_pam_authenticatable.rb' - 'lib/devise/strategies/two_factor_pam_authenticatable.rb'
- 'lib/mastodon/cli/accounts.rb' - 'lib/mastodon/cli/accounts.rb'
@ -275,7 +262,6 @@ Style/HashAsLastArrayItem:
- 'app/models/status.rb' - 'app/models/status.rb'
- 'app/services/batched_remove_status_service.rb' - 'app/services/batched_remove_status_service.rb'
- 'app/services/notify_service.rb' - 'app/services/notify_service.rb'
- 'db/migrate/20181024224956_migrate_account_conversations.rb'
# This cop supports unsafe autocorrection (--autocorrect-all). # This cop supports unsafe autocorrection (--autocorrect-all).
Style/HashTransformValues: Style/HashTransformValues:
@ -415,8 +401,8 @@ Style/TrailingCommaInHashLiteral:
- 'config/environments/test.rb' - 'config/environments/test.rb'
# This cop supports safe autocorrection (--autocorrect). # This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle, MinSize, WordRegex. # Configuration parameters: WordRegex.
# SupportedStyles: percent, brackets # SupportedStyles: percent, brackets
Style/WordArray: Style/WordArray:
Exclude: EnforcedStyle: percent
- 'app/helpers/languages_helper.rb' MinSize: 3

View File

@ -90,7 +90,7 @@ gem 'sidekiq-bulk', '~> 0.2.0'
gem 'simple-navigation', '~> 4.4' gem 'simple-navigation', '~> 4.4'
gem 'simple_form', '~> 5.2' gem 'simple_form', '~> 5.2'
gem 'stoplight', '~> 3.0.1' gem 'stoplight', '~> 3.0.1'
gem 'strong_migrations', '1.6.4' gem 'strong_migrations', '1.7.0'
gem 'tty-prompt', '~> 0.23', require: false gem 'tty-prompt', '~> 0.23', require: false
gem 'twitter-text', '~> 3.1.0' gem 'twitter-text', '~> 3.1.0'
gem 'tzinfo-data', '~> 1.2023' gem 'tzinfo-data', '~> 1.2023'

View File

@ -467,14 +467,14 @@ GEM
multi_json (1.15.0) multi_json (1.15.0)
multipart-post (2.3.0) multipart-post (2.3.0)
mutex_m (0.2.0) mutex_m (0.2.0)
net-http (0.4.0) net-http (0.4.1)
uri uri
net-http-persistent (4.0.2) net-http-persistent (4.0.2)
connection_pool (~> 2.2) connection_pool (~> 2.2)
net-imap (0.4.4) net-imap (0.4.4)
date date
net-protocol net-protocol
net-ldap (0.18.0) net-ldap (0.19.0)
net-pop (0.1.2) net-pop (0.1.2)
net-protocol net-protocol
net-protocol (0.2.2) net-protocol (0.2.2)
@ -544,7 +544,7 @@ GEM
psych (5.1.2) psych (5.1.2)
stringio stringio
public_suffix (5.0.4) public_suffix (5.0.4)
puma (6.4.1) puma (6.4.2)
nio4r (~> 2.0) nio4r (~> 2.0)
pundit (2.3.1) pundit (2.3.1)
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
@ -676,11 +676,11 @@ GEM
unicode-display_width (>= 2.4.0, < 3.0) unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.30.0) rubocop-ast (1.30.0)
parser (>= 3.2.1.0) parser (>= 3.2.1.0)
rubocop-capybara (2.19.0) rubocop-capybara (2.20.0)
rubocop (~> 1.41) rubocop (~> 1.41)
rubocop-factory_bot (2.24.0) rubocop-factory_bot (2.25.0)
rubocop (~> 1.33) rubocop (~> 1.33)
rubocop-performance (1.20.1) rubocop-performance (1.20.2)
rubocop (>= 1.48.1, < 2.0) rubocop (>= 1.48.1, < 2.0)
rubocop-ast (>= 1.30.0, < 2.0) rubocop-ast (>= 1.30.0, < 2.0)
rubocop-rails (2.23.1) rubocop-rails (2.23.1)
@ -688,7 +688,7 @@ GEM
rack (>= 1.1) rack (>= 1.1)
rubocop (>= 1.33.0, < 2.0) rubocop (>= 1.33.0, < 2.0)
rubocop-ast (>= 1.30.0, < 2.0) rubocop-ast (>= 1.30.0, < 2.0)
rubocop-rspec (2.25.0) rubocop-rspec (2.26.1)
rubocop (~> 1.40) rubocop (~> 1.40)
rubocop-capybara (~> 2.17) rubocop-capybara (~> 2.17)
rubocop-factory_bot (~> 2.22) rubocop-factory_bot (~> 2.22)
@ -748,7 +748,7 @@ GEM
stoplight (3.0.2) stoplight (3.0.2)
redlock (~> 1.0) redlock (~> 1.0)
stringio (3.1.0) stringio (3.1.0)
strong_migrations (1.6.4) strong_migrations (1.7.0)
activerecord (>= 5.2) activerecord (>= 5.2)
swd (1.3.0) swd (1.3.0)
activesupport (>= 3) activesupport (>= 3)
@ -952,7 +952,7 @@ DEPENDENCIES
simplecov-lcov (~> 0.8) simplecov-lcov (~> 0.8)
stackprof stackprof
stoplight (~> 3.0.1) stoplight (~> 3.0.1)
strong_migrations (= 1.6.4) strong_migrations (= 1.7.0)
test-prof test-prof
thor (~> 1.2) thor (~> 1.2)
tty-prompt (~> 0.23) tty-prompt (~> 0.23)

View File

@ -40,7 +40,7 @@ module Admin
(@email_domain_block.other_domains || []).uniq.each do |domain| (@email_domain_block.other_domains || []).uniq.each do |domain|
next if EmailDomainBlock.where(domain: domain).exists? next if EmailDomainBlock.where(domain: domain).exists?
other_email_domain_block = EmailDomainBlock.create!(domain: domain, parent: @email_domain_block) other_email_domain_block = EmailDomainBlock.create!(domain: domain, allow_with_approval: @email_domain_block.allow_with_approval, parent: @email_domain_block)
log_action :create, other_email_domain_block log_action :create, other_email_domain_block
end end
end end
@ -65,7 +65,7 @@ module Admin
end end
def resource_params def resource_params
params.require(:email_domain_block).permit(:domain, other_domains: []) params.require(:email_domain_block).permit(:domain, :allow_with_approval, other_domains: [])
end end
def form_email_domain_block_batch_params def form_email_domain_block_batch_params

View File

@ -55,7 +55,7 @@ class Api::V1::Admin::EmailDomainBlocksController < Api::BaseController
end end
def resource_params def resource_params
params.permit(:domain) params.permit(:domain, :allow_with_approval)
end end
def insert_pagination_headers def insert_pagination_headers

View File

@ -3,150 +3,6 @@
module CacheConcern module CacheConcern
extend ActiveSupport::Concern extend ActiveSupport::Concern
module ActiveRecordCoder
EMPTY_HASH = {}.freeze
class << self
def dump(record)
instances = InstanceTracker.new
serialized_associations = serialize_associations(record, instances)
serialized_records = instances.map { |r| serialize_record(r) }
[serialized_associations, *serialized_records]
end
def load(payload)
instances = InstanceTracker.new
serialized_associations, *serialized_records = payload
serialized_records.each { |attrs| instances.push(deserialize_record(*attrs)) }
deserialize_associations(serialized_associations, instances)
end
private
# Records without associations, or which have already been visited before,
# are serialized by their id alone.
#
# Records with associations are serialized as a two-element array including
# their id and the record's association cache.
#
def serialize_associations(record, instances)
return unless record
if (id = instances.lookup(record))
payload = id
else
payload = instances.push(record)
cached_associations = record.class.reflect_on_all_associations.select do |reflection|
record.association_cached?(reflection.name)
end
unless cached_associations.empty?
serialized_associations = cached_associations.map do |reflection|
association = record.association(reflection.name)
serialized_target = if reflection.collection?
association.target.map { |target_record| serialize_associations(target_record, instances) }
else
serialize_associations(association.target, instances)
end
[reflection.name, serialized_target]
end
payload = [payload, serialized_associations]
end
end
payload
end
def deserialize_associations(payload, instances)
return unless payload
id, associations = payload
record = instances.fetch(id)
associations&.each do |name, serialized_target|
begin
association = record.association(name)
rescue ActiveRecord::AssociationNotFoundError
raise AssociationMissingError, "undefined association: #{name}"
end
target = if association.reflection.collection?
serialized_target.map! { |serialized_record| deserialize_associations(serialized_record, instances) }
else
deserialize_associations(serialized_target, instances)
end
association.target = target
end
record
end
def serialize_record(record)
arguments = [record.class.name, attributes_for_database(record)]
arguments << true if record.new_record?
arguments
end
def attributes_for_database(record)
attributes = record.attributes_for_database
attributes.transform_values! { |attr| attr.is_a?(::ActiveModel::Type::Binary::Data) ? attr.to_s : attr }
attributes
end
def deserialize_record(class_name, attributes_from_database, new_record = false) # rubocop:disable Style/OptionalBooleanParameter
begin
klass = Object.const_get(class_name)
rescue NameError
raise ClassMissingError, "undefined class: #{class_name}"
end
# Ideally we'd like to call `klass.instantiate`, however it doesn't allow to pass
# wether the record was persisted or not.
attributes = klass.attributes_builder.build_from_database(attributes_from_database, EMPTY_HASH)
klass.allocate.init_with_attributes(attributes, new_record)
end
end
class Error < StandardError
end
class ClassMissingError < Error
end
class AssociationMissingError < Error
end
class InstanceTracker
def initialize
@instances = []
@ids = {}.compare_by_identity
end
def map(&block)
@instances.map(&block)
end
def fetch(...)
@instances.fetch(...)
end
def push(instance)
id = @ids[instance] = @instances.size
@instances << instance
id
end
def lookup(instance)
@ids[instance]
end
end
end
class_methods do class_methods do
def vary_by(value, **kwargs) def vary_by(value, **kwargs)
before_action(**kwargs) do |controller| before_action(**kwargs) do |controller|
@ -196,11 +52,7 @@ module CacheConcern
raw = raw.cache_ids.to_a if raw.is_a?(ActiveRecord::Relation) raw = raw.cache_ids.to_a if raw.is_a?(ActiveRecord::Relation)
return [] if raw.empty? return [] if raw.empty?
cached_keys_with_value = begin cached_keys_with_value = Rails.cache.read_multi(*raw).transform_keys(&:id)
Rails.cache.read_multi(*raw).transform_keys(&:id).transform_values { |r| ActiveRecordCoder.load(r) }
rescue ActiveRecordCoder::Error
{} # The serialization format may have changed, let's pretend it's a cache miss.
end
uncached_ids = raw.map(&:id) - cached_keys_with_value.keys uncached_ids = raw.map(&:id) - cached_keys_with_value.keys
@ -208,10 +60,7 @@ module CacheConcern
unless uncached_ids.empty? unless uncached_ids.empty?
uncached = klass.where(id: uncached_ids).with_includes.index_by(&:id) uncached = klass.where(id: uncached_ids).with_includes.index_by(&:id)
Rails.cache.write_multi(uncached.values.to_h { |i| [i, i] })
uncached.each_value do |item|
Rails.cache.write(item, ActiveRecordCoder.dump(item))
end
end end
raw.filter_map { |item| cached_keys_with_value[item.id] || uncached[item.id] } raw.filter_map { |item| cached_keys_with_value[item.id] || uncached[item.id] }

View File

@ -21,7 +21,7 @@ module WellKnown
username = username_from_resource username = username_from_resource
@account = begin @account = begin
if username == Rails.configuration.x.local_domain if username == Rails.configuration.x.local_domain || username == Rails.configuration.x.web_domain
Account.representative Account.representative
else else
Account.find_local!(username) Account.find_local!(username)

View File

@ -582,16 +582,20 @@ class Status extends ImmutablePureComponent {
)); ));
} }
setRef = c => { setContainerRef = c => {
this.node = c; this.node = c;
}; };
setStatusRef = c => {
this.statusNode = c;
};
_scrollStatusIntoView () { _scrollStatusIntoView () {
const { status, multiColumn } = this.props; const { status, multiColumn } = this.props;
if (status) { if (status) {
window.requestAnimationFrame(() => { requestIdleCallback(() => {
this.node?.querySelector('.detailed-status__wrapper')?.scrollIntoView(true); this.statusNode?.scrollIntoView(true);
// In the single-column interface, `scrollIntoView` will put the post behind the header, // In the single-column interface, `scrollIntoView` will put the post behind the header,
// so compensate for that. // so compensate for that.
@ -629,9 +633,8 @@ class Status extends ImmutablePureComponent {
} }
// Scroll to focused post if it is loaded // Scroll to focused post if it is loaded
const child = this.node?.querySelector('.detailed-status__wrapper'); if (this.statusNode) {
if (child) { return [0, this.statusNode.offsetTop];
return [0, child.offsetTop];
} }
// Do not scroll otherwise, `componentDidUpdate` will take care of that // Do not scroll otherwise, `componentDidUpdate` will take care of that
@ -692,11 +695,11 @@ class Status extends ImmutablePureComponent {
/> />
<ScrollContainer scrollKey='thread' shouldUpdateScroll={this.shouldUpdateScroll}> <ScrollContainer scrollKey='thread' shouldUpdateScroll={this.shouldUpdateScroll}>
<div className={classNames('scrollable', { fullscreen })} ref={this.setRef}> <div className={classNames('scrollable', { fullscreen })} ref={this.setContainerRef}>
{ancestors} {ancestors}
<HotKeys handlers={handlers}> <HotKeys handlers={handlers}>
<div className={classNames('focusable', 'detailed-status__wrapper', `detailed-status__wrapper-${status.get('visibility')}`)} tabIndex={0} aria-label={textForScreenReader(intl, status, false)}> <div className={classNames('focusable', 'detailed-status__wrapper', `detailed-status__wrapper-${status.get('visibility')}`)} tabIndex={0} aria-label={textForScreenReader(intl, status, false)} ref={this.setStatusRef}>
<DetailedStatus <DetailedStatus
key={`details-${status.get('id')}`} key={`details-${status.get('id')}`}
status={status} status={status}

View File

@ -260,6 +260,9 @@
"filter_modal.select_filter.subtitle": "Χρησιμοποιήστε μια υπάρχουσα κατηγορία ή δημιουργήστε μια νέα", "filter_modal.select_filter.subtitle": "Χρησιμοποιήστε μια υπάρχουσα κατηγορία ή δημιουργήστε μια νέα",
"filter_modal.select_filter.title": "Φιλτράρισμα αυτής της ανάρτησης", "filter_modal.select_filter.title": "Φιλτράρισμα αυτής της ανάρτησης",
"filter_modal.title.status": "Φιλτράρισμα μιας ανάρτησης", "filter_modal.title.status": "Φιλτράρισμα μιας ανάρτησης",
"firehose.all": "Όλα",
"firehose.local": "Αυτός ο διακομιστής",
"firehose.remote": "Άλλοι διακομιστές",
"follow_request.authorize": "Εξουσιοδότησε", "follow_request.authorize": "Εξουσιοδότησε",
"follow_request.reject": "Απέρριψε", "follow_request.reject": "Απέρριψε",
"follow_requests.unlocked_explanation": "Παρόλο που ο λογαριασμός σου δεν είναι κλειδωμένος, το προσωπικό του {domain} θεώρησαν πως ίσως να θέλεις να ελέγξεις χειροκίνητα αυτά τα αιτήματα ακολούθησης.", "follow_requests.unlocked_explanation": "Παρόλο που ο λογαριασμός σου δεν είναι κλειδωμένος, το προσωπικό του {domain} θεώρησαν πως ίσως να θέλεις να ελέγξεις χειροκίνητα αυτά τα αιτήματα ακολούθησης.",
@ -285,11 +288,15 @@
"hashtag.column_settings.tag_toggle": "Προσθήκη επιπλέον ταμπελών για την κολώνα", "hashtag.column_settings.tag_toggle": "Προσθήκη επιπλέον ταμπελών για την κολώνα",
"hashtag.follow": "Παρακολούθηση ετικέτας", "hashtag.follow": "Παρακολούθηση ετικέτας",
"hashtag.unfollow": "Διακοπή παρακολούθησης ετικέτας", "hashtag.unfollow": "Διακοπή παρακολούθησης ετικέτας",
"home.actions.go_to_suggestions": "Βρείτε άτομα για να ακολουθήσετε",
"home.column_settings.basic": "Βασικές ρυθμίσεις", "home.column_settings.basic": "Βασικές ρυθμίσεις",
"home.column_settings.show_reblogs": "Εμφάνιση προωθήσεων", "home.column_settings.show_reblogs": "Εμφάνιση προωθήσεων",
"home.column_settings.show_replies": "Εμφάνιση απαντήσεων", "home.column_settings.show_replies": "Εμφάνιση απαντήσεων",
"home.explore_prompt.body": "Your home feed will have a mix of posts from the hashtags you've chosen to follow, the people you've chosen to follow, and the posts they boost. If that feels too quiet, you may want to:\nΗ τροφοδοσία της αρχικής σελίδας σας είναι ένα μίγμα από αναρτήσεις με τις ετικέτες και τα άτομα που επιλέξατε να ακολουθείτε, και τις αναρτήσεις που προωθούν. Εάν αυτό σας φαίνεται πολύ ήσυχο, μπορεί να θέλετε:", "home.explore_prompt.body": "Your home feed will have a mix of posts from the hashtags you've chosen to follow, the people you've chosen to follow, and the posts they boost. If that feels too quiet, you may want to:\nΗ τροφοδοσία της αρχικής σελίδας σας είναι ένα μίγμα από αναρτήσεις με τις ετικέτες και τα άτομα που επιλέξατε να ακολουθείτε, και τις αναρτήσεις που προωθούν. Εάν αυτό σας φαίνεται πολύ ήσυχο, μπορεί να θέλετε:",
"home.explore_prompt.title": "Αυτό είναι το σπίτι σας στο Mastodon.",
"home.hide_announcements": "Απόκρυψη ανακοινώσεων", "home.hide_announcements": "Απόκρυψη ανακοινώσεων",
"home.pending_critical_update.link": "Δείτε ενημερώσεις",
"home.pending_critical_update.title": "Κρίσιμη ενημέρωση ασφαλείας διαθέσιμη!",
"home.show_announcements": "Εμφάνιση ανακοινώσεων", "home.show_announcements": "Εμφάνιση ανακοινώσεων",
"interaction_modal.description.follow": "Με έναν λογαριασμό Mastodon, μπορείς να ακολουθήσεις τον/την {name} ώστε να λαμβάνεις τις αναρτήσεις του/της στη δική σου ροή.", "interaction_modal.description.follow": "Με έναν λογαριασμό Mastodon, μπορείς να ακολουθήσεις τον/την {name} ώστε να λαμβάνεις τις αναρτήσεις του/της στη δική σου ροή.",
"interaction_modal.description.reblog": "Με ένα λογαριασμό Mastodon, μπορείς να ενισχύσεις αυτή την ανάρτηση για να τη μοιραστείς με τους δικούς σου ακολούθους.", "interaction_modal.description.reblog": "Με ένα λογαριασμό Mastodon, μπορείς να ενισχύσεις αυτή την ανάρτηση για να τη μοιραστείς με τους δικούς σου ακολούθους.",
@ -314,6 +321,7 @@
"keyboard_shortcuts.direct": "για το άνοιγμα της στήλης ιδιωτικών επισημάνσεων", "keyboard_shortcuts.direct": "για το άνοιγμα της στήλης ιδιωτικών επισημάνσεων",
"keyboard_shortcuts.down": "κίνηση προς τα κάτω στη λίστα", "keyboard_shortcuts.down": "κίνηση προς τα κάτω στη λίστα",
"keyboard_shortcuts.enter": "Εμφάνιση ανάρτησης", "keyboard_shortcuts.enter": "Εμφάνιση ανάρτησης",
"keyboard_shortcuts.favourite": "Αγαπημένη δημοσίευση",
"keyboard_shortcuts.federated": "Άνοιγμα ροής συναλλαγών", "keyboard_shortcuts.federated": "Άνοιγμα ροής συναλλαγών",
"keyboard_shortcuts.heading": "Συντομεύσεις πληκτρολογίου", "keyboard_shortcuts.heading": "Συντομεύσεις πληκτρολογίου",
"keyboard_shortcuts.home": "Άνοιγμα ροής αρχικής σελίδας", "keyboard_shortcuts.home": "Άνοιγμα ροής αρχικής σελίδας",
@ -358,6 +366,7 @@
"lists.search": "Αναζήτησε μεταξύ των ανθρώπων που ακουλουθείς", "lists.search": "Αναζήτησε μεταξύ των ανθρώπων που ακουλουθείς",
"lists.subheading": "Οι λίστες σου", "lists.subheading": "Οι λίστες σου",
"load_pending": "{count, plural, one {# νέο στοιχείο} other {# νέα στοιχεία}}", "load_pending": "{count, plural, one {# νέο στοιχείο} other {# νέα στοιχεία}}",
"loading_indicator.label": "Φόρτωση…",
"media_gallery.toggle_visible": "{number, plural, one {Απόκρυψη εικόνας} other {Απόκρυψη εικόνων}}", "media_gallery.toggle_visible": "{number, plural, one {Απόκρυψη εικόνας} other {Απόκρυψη εικόνων}}",
"moved_to_account_banner.text": "Ο λογαριασμός σου {disabledAccount} είναι προσωρινά απενεργοποιημένος επειδή μεταφέρθηκες στον {movedToAccount}.", "moved_to_account_banner.text": "Ο λογαριασμός σου {disabledAccount} είναι προσωρινά απενεργοποιημένος επειδή μεταφέρθηκες στον {movedToAccount}.",
"mute_modal.duration": "Διάρκεια", "mute_modal.duration": "Διάρκεια",
@ -380,6 +389,7 @@
"navigation_bar.lists": "Λίστες", "navigation_bar.lists": "Λίστες",
"navigation_bar.logout": "Αποσύνδεση", "navigation_bar.logout": "Αποσύνδεση",
"navigation_bar.mutes": "Αποσιωπημένοι χρήστες", "navigation_bar.mutes": "Αποσιωπημένοι χρήστες",
"navigation_bar.opened_in_classic_interface": "Δημοσιεύσεις, λογαριασμοί και άλλες συγκεκριμένες σελίδες ανοίγονται από προεπιλογή στην κλασική διεπαφή ιστού.",
"navigation_bar.personal": "Προσωπικά", "navigation_bar.personal": "Προσωπικά",
"navigation_bar.pins": "Καρφιτσωμένες αναρτήσεις", "navigation_bar.pins": "Καρφιτσωμένες αναρτήσεις",
"navigation_bar.preferences": "Προτιμήσεις", "navigation_bar.preferences": "Προτιμήσεις",
@ -403,6 +413,7 @@
"notifications.column_settings.admin.report": "Νέες αναφορές:", "notifications.column_settings.admin.report": "Νέες αναφορές:",
"notifications.column_settings.admin.sign_up": "Νέες εγγραφές:", "notifications.column_settings.admin.sign_up": "Νέες εγγραφές:",
"notifications.column_settings.alert": "Ειδοποιήσεις επιφάνειας εργασίας", "notifications.column_settings.alert": "Ειδοποιήσεις επιφάνειας εργασίας",
"notifications.column_settings.favourite": "Αγαπημένα:",
"notifications.column_settings.filter_bar.advanced": "Εμφάνιση όλων των κατηγοριών", "notifications.column_settings.filter_bar.advanced": "Εμφάνιση όλων των κατηγοριών",
"notifications.column_settings.filter_bar.category": "Μπάρα γρήγορου φίλτρου", "notifications.column_settings.filter_bar.category": "Μπάρα γρήγορου φίλτρου",
"notifications.column_settings.filter_bar.show_bar": "Εμφάνιση μπάρας φίλτρου", "notifications.column_settings.filter_bar.show_bar": "Εμφάνιση μπάρας φίλτρου",

View File

@ -1,4 +1,8 @@
{ {
"about.blocks": "Servitores moderate",
"about.contact": "Contacto:",
"about.disclaimer": "Mastodon es software libere, de codice aperte, e un marca de Mastodon gGmbH.",
"account.account_note_header": "Nota",
"account.add_or_remove_from_list": "Adder o remover ab listas", "account.add_or_remove_from_list": "Adder o remover ab listas",
"account.badges.group": "Gruppo", "account.badges.group": "Gruppo",
"account.block": "Blocar @{name}", "account.block": "Blocar @{name}",
@ -21,9 +25,12 @@
"bundle_column_error.return": "Retornar al initio", "bundle_column_error.return": "Retornar al initio",
"bundle_modal_error.close": "Clauder", "bundle_modal_error.close": "Clauder",
"bundle_modal_error.retry": "Tentar novemente", "bundle_modal_error.retry": "Tentar novemente",
"column.about": "A proposito de",
"column.blocks": "Usatores blocate", "column.blocks": "Usatores blocate",
"column.bookmarks": "Marcapaginas",
"column.directory": "Navigar profilos", "column.directory": "Navigar profilos",
"column.favourites": "Favoritos", "column.favourites": "Favoritos",
"column.firehose": "Fluxos in directe",
"column.home": "Initio", "column.home": "Initio",
"column.lists": "Listas", "column.lists": "Listas",
"column.notifications": "Notificationes", "column.notifications": "Notificationes",
@ -33,23 +40,28 @@
"compose.language.change": "Cambiar le lingua", "compose.language.change": "Cambiar le lingua",
"compose.language.search": "Cercar linguas...", "compose.language.search": "Cercar linguas...",
"compose.published.open": "Aperir", "compose.published.open": "Aperir",
"compose_form.direct_message_warning_learn_more": "Apprender plus",
"compose_form.poll.add_option": "Adder un option", "compose_form.poll.add_option": "Adder un option",
"compose_form.poll.remove_option": "Remover iste option", "compose_form.poll.remove_option": "Remover iste option",
"confirmation_modal.cancel": "Cancellar", "confirmation_modal.cancel": "Cancellar",
"confirmations.delete.confirm": "Deler", "confirmations.delete.confirm": "Deler",
"confirmations.delete_list.confirm": "Deler", "confirmations.delete_list.confirm": "Deler",
"confirmations.edit.confirm": "Modificar",
"confirmations.logout.confirm": "Clauder le session", "confirmations.logout.confirm": "Clauder le session",
"copy_icon_button.copied": "Copiate al area de transferentia", "copy_icon_button.copied": "Copiate al area de transferentia",
"copypaste.copied": "Copiate",
"copypaste.copy_to_clipboard": "Copiar al area de transferentia", "copypaste.copy_to_clipboard": "Copiar al area de transferentia",
"disabled_account_banner.account_settings": "Parametros de conto", "disabled_account_banner.account_settings": "Parametros de conto",
"dismissable_banner.dismiss": "Dimitter", "dismissable_banner.dismiss": "Dimitter",
"emoji_button.activity": "Activitate", "emoji_button.activity": "Activitate",
"emoji_button.clear": "Rader",
"emoji_button.custom": "Personalisate", "emoji_button.custom": "Personalisate",
"emoji_button.search_results": "Resultatos de recerca", "emoji_button.search_results": "Resultatos de recerca",
"empty_column.account_unavailable": "Profilo non disponibile", "empty_column.account_unavailable": "Profilo non disponibile",
"errors.unexpected_crash.report_issue": "Signalar un defecto", "errors.unexpected_crash.report_issue": "Signalar un defecto",
"explore.search_results": "Resultatos de recerca", "explore.search_results": "Resultatos de recerca",
"explore.trending_links": "Novas", "explore.trending_links": "Novas",
"filter_modal.select_filter.prompt_new": "Nove categoria: {name}",
"firehose.all": "Toto", "firehose.all": "Toto",
"firehose.local": "Iste servitor", "firehose.local": "Iste servitor",
"firehose.remote": "Altere servitores", "firehose.remote": "Altere servitores",
@ -62,23 +74,50 @@
"keyboard_shortcuts.my_profile": "Aperir tu profilo", "keyboard_shortcuts.my_profile": "Aperir tu profilo",
"lightbox.close": "Clauder", "lightbox.close": "Clauder",
"lightbox.next": "Sequente", "lightbox.next": "Sequente",
"lightbox.previous": "Precedente",
"link_preview.author": "Per {name}", "link_preview.author": "Per {name}",
"lists.account.add": "Adder al lista", "lists.account.add": "Adder al lista",
"lists.delete": "Deler lista",
"lists.edit": "Modificar lista",
"lists.new.create": "Adder lista",
"lists.subheading": "Tu listas",
"mute_modal.duration": "Duration", "mute_modal.duration": "Duration",
"mute_modal.hide_notifications": "Celar notificationes de iste usator?", "mute_modal.hide_notifications": "Celar notificationes de iste usator?",
"navigation_bar.about": "A proposito de", "navigation_bar.about": "A proposito de",
"navigation_bar.advanced_interface": "Aperir in un interfacie web avantiate", "navigation_bar.advanced_interface": "Aperir in un interfacie web avantiate",
"navigation_bar.blocks": "Usatores blocate", "navigation_bar.blocks": "Usatores blocate",
"navigation_bar.discover": "Discoperir",
"navigation_bar.edit_profile": "Modificar profilo",
"navigation_bar.favourites": "Favoritos", "navigation_bar.favourites": "Favoritos",
"navigation_bar.lists": "Listas", "navigation_bar.lists": "Listas",
"navigation_bar.logout": "Clauder le session", "navigation_bar.logout": "Clauder le session",
"navigation_bar.preferences": "Preferentias", "navigation_bar.preferences": "Preferentias",
"navigation_bar.search": "Cercar",
"navigation_bar.security": "Securitate", "navigation_bar.security": "Securitate",
"notifications.column_settings.alert": "Notificationes de scriptorio", "notifications.column_settings.alert": "Notificationes de scriptorio",
"notifications.column_settings.filter_bar.advanced": "Monstrar tote le categorias", "notifications.column_settings.filter_bar.advanced": "Monstrar tote le categorias",
"notifications.column_settings.sound": "Reproducer sono", "notifications.column_settings.sound": "Reproducer sono",
"notifications.filter.all": "Toto", "notifications.filter.all": "Toto",
"notifications.filter.favourites": "Favoritos",
"notifications.grant_permission": "Conceder permission.",
"notifications.group": "{count} notificationes",
"onboarding.compose.template": "Salute #Mastodon!", "onboarding.compose.template": "Salute #Mastodon!",
"onboarding.profile.save_and_continue": "Salvar e continuar", "onboarding.profile.save_and_continue": "Salvar e continuar",
"onboarding.share.title": "Compartir tu profilo" "onboarding.share.title": "Compartir tu profilo",
"onboarding.steps.share_profile.title": "Compartir tu profilo de Mastodon",
"relative_time.just_now": "ora",
"relative_time.today": "hodie",
"reply_indicator.cancel": "Cancellar",
"report.next": "Sequente",
"report.placeholder": "Commentos additional",
"report.reasons.dislike": "Non me place",
"search.quick_action.go_to_account": "Vader al profilo {x}",
"search_results.accounts": "Profilos",
"search_results.see_all": "Vider toto",
"status.delete": "Deler",
"status.share": "Compartir",
"status.translate": "Traducer",
"status.translated_from_with": "Traducite ab {lang} usante {provider}",
"tabs_bar.home": "Initio",
"tabs_bar.notifications": "Notificationes"
} }

View File

@ -501,6 +501,7 @@
"onboarding.steps.setup_profile.title": "Personaliza tu profil", "onboarding.steps.setup_profile.title": "Personaliza tu profil",
"onboarding.steps.share_profile.body": "Informe a tus amigos komo toparte en Mastodon", "onboarding.steps.share_profile.body": "Informe a tus amigos komo toparte en Mastodon",
"onboarding.steps.share_profile.title": "Partaja tu profil de Mastodon", "onboarding.steps.share_profile.title": "Partaja tu profil de Mastodon",
"password_confirmation.mismatching": "Los dos kodes son desferentes",
"picture_in_picture.restore": "Restora", "picture_in_picture.restore": "Restora",
"poll.closed": "Serrado", "poll.closed": "Serrado",
"poll.refresh": "Arefreska", "poll.refresh": "Arefreska",

View File

@ -606,7 +606,7 @@
"search.quick_action.status_search": "Innlegg som samsvarer med {x}", "search.quick_action.status_search": "Innlegg som samsvarer med {x}",
"search.search_or_paste": "Søk eller lim inn URL", "search.search_or_paste": "Søk eller lim inn URL",
"search_popout.full_text_search_disabled_message": "Ikkje tilgjengeleg på {domain}.", "search_popout.full_text_search_disabled_message": "Ikkje tilgjengeleg på {domain}.",
"search_popout.full_text_search_logged_out_message": "Bare tilgjengelig ved innlogging.", "search_popout.full_text_search_logged_out_message": "Bare tilgjengelig når man er logget inn.",
"search_popout.language_code": "ISO-språkkode", "search_popout.language_code": "ISO-språkkode",
"search_popout.options": "Søkjealternativ", "search_popout.options": "Søkjealternativ",
"search_popout.quick_actions": "Hurtighandlinger", "search_popout.quick_actions": "Hurtighandlinger",

View File

@ -606,7 +606,7 @@
"search.quick_action.status_search": "Innlegg som samsvarer med {x}", "search.quick_action.status_search": "Innlegg som samsvarer med {x}",
"search.search_or_paste": "Søk eller lim inn URL", "search.search_or_paste": "Søk eller lim inn URL",
"search_popout.full_text_search_disabled_message": "Ikke tilgjengelig på {domain}.", "search_popout.full_text_search_disabled_message": "Ikke tilgjengelig på {domain}.",
"search_popout.full_text_search_logged_out_message": "Bare tilgjengelig ved innlogging.", "search_popout.full_text_search_logged_out_message": "Bare tilgjengelig når man er logget inn.",
"search_popout.language_code": "ISO språkkode", "search_popout.language_code": "ISO språkkode",
"search_popout.options": "Alternativer for søk", "search_popout.options": "Alternativer for søk",
"search_popout.quick_actions": "Hurtighandlinger", "search_popout.quick_actions": "Hurtighandlinger",

View File

@ -32,6 +32,7 @@
"account.featured_tags.last_status_never": "Pa postime", "account.featured_tags.last_status_never": "Pa postime",
"account.featured_tags.title": "Hashtagë të zgjedhur të {name}", "account.featured_tags.title": "Hashtagë të zgjedhur të {name}",
"account.follow": "Ndiqeni", "account.follow": "Ndiqeni",
"account.follow_back": "Ndiqe gjithashtu",
"account.followers": "Ndjekës", "account.followers": "Ndjekës",
"account.followers.empty": "Këtë përdorues ende se ndjek kush.", "account.followers.empty": "Këtë përdorues ende se ndjek kush.",
"account.followers_counter": "{count, plural, one {{counter} Ndjekës} other {{counter} Ndjekës}}", "account.followers_counter": "{count, plural, one {{counter} Ndjekës} other {{counter} Ndjekës}}",
@ -52,6 +53,7 @@
"account.mute_notifications_short": "Mos shfaq njoftime", "account.mute_notifications_short": "Mos shfaq njoftime",
"account.mute_short": "Mos i shfaq", "account.mute_short": "Mos i shfaq",
"account.muted": "Heshtuar", "account.muted": "Heshtuar",
"account.mutual": "Reciproke",
"account.no_bio": "Su dha përshkrim.", "account.no_bio": "Su dha përshkrim.",
"account.open_original_page": "Hap faqen origjinale", "account.open_original_page": "Hap faqen origjinale",
"account.posts": "Mesazhe", "account.posts": "Mesazhe",

View File

@ -53,7 +53,7 @@
"account.mute_notifications_short": "关闭通知", "account.mute_notifications_short": "关闭通知",
"account.mute_short": "隐藏", "account.mute_short": "隐藏",
"account.muted": "已隐藏", "account.muted": "已隐藏",
"account.mutual": "互相关注", "account.mutual": "互粉好友",
"account.no_bio": "未提供描述。", "account.no_bio": "未提供描述。",
"account.open_original_page": "打开原始页面", "account.open_original_page": "打开原始页面",
"account.posts": "嘟文", "account.posts": "嘟文",
@ -446,7 +446,7 @@
"notifications.column_settings.filter_bar.advanced": "显示所有类别", "notifications.column_settings.filter_bar.advanced": "显示所有类别",
"notifications.column_settings.filter_bar.category": "快速过滤栏", "notifications.column_settings.filter_bar.category": "快速过滤栏",
"notifications.column_settings.filter_bar.show_bar": "显示过滤栏", "notifications.column_settings.filter_bar.show_bar": "显示过滤栏",
"notifications.column_settings.follow": "新关注者", "notifications.column_settings.follow": "新粉丝",
"notifications.column_settings.follow_request": "新关注请求:", "notifications.column_settings.follow_request": "新关注请求:",
"notifications.column_settings.mention": "提及:", "notifications.column_settings.mention": "提及:",
"notifications.column_settings.poll": "投票结果:", "notifications.column_settings.poll": "投票结果:",
@ -700,7 +700,7 @@
"time_remaining.moments": "即将结束", "time_remaining.moments": "即将结束",
"time_remaining.seconds": "剩余 {number, plural, one {# 秒} other {# 秒}}", "time_remaining.seconds": "剩余 {number, plural, one {# 秒} other {# 秒}}",
"timeline_hint.remote_resource_not_displayed": "不会显示来自其它服务器的{resource}", "timeline_hint.remote_resource_not_displayed": "不会显示来自其它服务器的{resource}",
"timeline_hint.resources.followers": "关注者", "timeline_hint.resources.followers": "粉丝",
"timeline_hint.resources.follows": "关注", "timeline_hint.resources.follows": "关注",
"timeline_hint.resources.statuses": "更早的嘟文", "timeline_hint.resources.statuses": "更早的嘟文",
"trends.counter_by_accounts": "过去 {days, plural, other {{days} 天}}有{count, plural, other { {counter} 人}}讨论", "trends.counter_by_accounts": "过去 {days, plural, other {{days} 天}}有{count, plural, other { {counter} 人}}讨论",

View File

@ -10,7 +10,7 @@ class ContentSecurityPolicy
end end
def media_hosts def media_hosts
[assets_host, cdn_host_value].concat(extra_data_hosts).compact [assets_host, cdn_host_value, paperclip_root_url].concat(extra_data_hosts).compact
end end
private private
@ -27,6 +27,15 @@ class ContentSecurityPolicy
s3_alias_host || s3_cloudfront_host || azure_alias_host || s3_hostname_host s3_alias_host || s3_cloudfront_host || azure_alias_host || s3_hostname_host
end end
def paperclip_root_url
root_url = ENV.fetch('PAPERCLIP_ROOT_URL', nil)
return if root_url.blank?
(Addressable::URI.parse(assets_host) + root_url).tap do |uri|
uri.path += '/' unless uri.path.blank? || uri.path.end_with?('/')
end.to_s
end
def url_from_base_host def url_from_base_host
host_to_url(base_host) host_to_url(base_host)
end end

View File

@ -11,11 +11,12 @@ module Attachmentable
# For some file extensions, there exist different content # For some file extensions, there exist different content
# type variants, and browsers often send the wrong one, # type variants, and browsers often send the wrong one,
# for example, sending an audio .ogg file as video/ogg, # for example, sending an audio .ogg file as video/ogg,
# likewise, MimeMagic also misreports them as such. For # likewise, kt-paperclip also misreports them as such. For
# those files, it is necessary to use the output of the # those files, it is necessary to use the output of the
# `file` utility instead # `file` utility instead
INCORRECT_CONTENT_TYPES = %w( INCORRECT_CONTENT_TYPES = %w(
audio/vorbis audio/vorbis
audio/opus
video/ogg video/ogg
video/webm video/webm
).freeze ).freeze

View File

@ -17,23 +17,8 @@
class CustomFilter < ApplicationRecord class CustomFilter < ApplicationRecord
self.ignored_columns += %w(whole_word irreversible) self.ignored_columns += %w(whole_word irreversible)
# NOTE: We previously used `alias_attribute` but this does not play nicely alias_attribute :title, :phrase
# with cache alias_attribute :filter_action, :action
def title
phrase
end
def title=(value)
self.phrase = value
end
def filter_action
action
end
def filter_action=(value)
self.action = value
end
VALID_CONTEXTS = %w( VALID_CONTEXTS = %w(
home home
@ -143,6 +128,10 @@ class CustomFilter < ApplicationRecord
end end
def context_must_be_valid def context_must_be_valid
errors.add(:context, I18n.t('filters.errors.invalid_context')) if context.empty? || context.any? { |c| !VALID_CONTEXTS.include?(c) } errors.add(:context, I18n.t('filters.errors.invalid_context')) if invalid_context_value?
end
def invalid_context_value?
context.blank? || context.difference(VALID_CONTEXTS).any?
end end
end end

View File

@ -17,15 +17,7 @@ class CustomFilterKeyword < ApplicationRecord
validates :keyword, presence: true validates :keyword, presence: true
# NOTE: We previously used `alias_attribute` but this does not play nicely alias_attribute :phrase, :keyword
# with cache
def phrase
keyword
end
def phrase=(value)
self.keyword = value
end
before_save :prepare_cache_invalidation! before_save :prepare_cache_invalidation!
before_destroy :prepare_cache_invalidation! before_destroy :prepare_cache_invalidation!

View File

@ -4,11 +4,12 @@
# #
# Table name: email_domain_blocks # Table name: email_domain_blocks
# #
# id :bigint(8) not null, primary key # id :bigint(8) not null, primary key
# domain :string default(""), not null # domain :string default(""), not null
# created_at :datetime not null # created_at :datetime not null
# updated_at :datetime not null # updated_at :datetime not null
# parent_id :bigint(8) # parent_id :bigint(8)
# allow_with_approval :boolean default(FALSE), not null
# #
class EmailDomainBlock < ApplicationRecord class EmailDomainBlock < ApplicationRecord
@ -42,8 +43,8 @@ class EmailDomainBlock < ApplicationRecord
@attempt_ip = attempt_ip @attempt_ip = attempt_ip
end end
def match? def match?(...)
blocking? || invalid_uri? blocking?(...) || invalid_uri?
end end
private private
@ -52,8 +53,8 @@ class EmailDomainBlock < ApplicationRecord
@uris.any?(&:nil?) @uris.any?(&:nil?)
end end
def blocking? def blocking?(allow_with_approval: false)
blocks = EmailDomainBlock.where(domain: domains_with_variants).order(Arel.sql('char_length(domain) desc')) blocks = EmailDomainBlock.where(domain: domains_with_variants, allow_with_approval: allow_with_approval).order(Arel.sql('char_length(domain) desc'))
blocks.each { |block| block.history.add(@attempt_ip) } if @attempt_ip.present? blocks.each { |block| block.history.add(@attempt_ip) } if @attempt_ip.present?
blocks.any? blocks.any?
end end
@ -86,4 +87,8 @@ class EmailDomainBlock < ApplicationRecord
def self.block?(domain_or_domains, attempt_ip: nil) def self.block?(domain_or_domains, attempt_ip: nil)
Matcher.new(domain_or_domains, attempt_ip: attempt_ip).match? Matcher.new(domain_or_domains, attempt_ip: attempt_ip).match?
end end
def self.requires_approval?(domain_or_domains, attempt_ip: nil)
Matcher.new(domain_or_domains, attempt_ip: attempt_ip).match?(allow_with_approval: true)
end
end end

View File

@ -418,7 +418,7 @@ class User < ApplicationRecord
def set_approved def set_approved
self.approved = begin self.approved = begin
if sign_up_from_ip_requires_approval? if sign_up_from_ip_requires_approval? || sign_up_email_requires_approval?
false false
else else
open_registrations? || valid_invitation? || external? open_registrations? || valid_invitation? || external?
@ -430,6 +430,12 @@ class User < ApplicationRecord
!sign_up_ip.nil? && IpBlock.where(severity: :sign_up_requires_approval).where('ip >>= ?', sign_up_ip.to_s).exists? !sign_up_ip.nil? && IpBlock.where(severity: :sign_up_requires_approval).where('ip >>= ?', sign_up_ip.to_s).exists?
end end
def sign_up_email_requires_approval?
return false unless email.present? || unconfirmed_email.present?
EmailDomainBlock.requires_approval?(email.presence || unconfirmed_email, attempt_ip: sign_up_ip)
end
def open_registrations? def open_registrations?
Setting.registrations_mode == 'open' Setting.registrations_mode == 'open'
end end

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
class REST::Admin::EmailDomainBlockSerializer < ActiveModel::Serializer class REST::Admin::EmailDomainBlockSerializer < ActiveModel::Serializer
attributes :id, :domain, :created_at, :history attributes :id, :domain, :created_at, :history, :allow_with_approval
def id def id
object.id.to_s object.id.to_s

View File

@ -47,6 +47,7 @@ class EmailMxValidator < ActiveModel::Validator
dns.timeouts = 5 dns.timeouts = 5
records = dns.getresources(domain, Resolv::DNS::Resource::IN::MX).to_a.map { |e| e.exchange.to_s } records = dns.getresources(domain, Resolv::DNS::Resource::IN::MX).to_a.map { |e| e.exchange.to_s }
next if records == [''] # This domain explicitly rejects emails
([domain] + records).uniq.each do |hostname| ([domain] + records).uniq.each do |hostname|
ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::A).to_a.map { |e| e.address.to_s }) ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::A).to_a.map { |e| e.address.to_s })

View File

@ -12,3 +12,7 @@
· ·
= t('admin.email_domain_blocks.attempts_over_week', count: email_domain_block.history.reduce(0) { |sum, day| sum + day.accounts }) = t('admin.email_domain_blocks.attempts_over_week', count: email_domain_block.history.reduce(0) { |sum, day| sum + day.accounts })
- if email_domain_block.allow_with_approval?
·
= t('admin.email_domain_blocks.allow_registrations_with_approval')

View File

@ -7,6 +7,9 @@
.fields-group .fields-group
= f.input :domain, wrapper: :with_block_label, label: t('admin.email_domain_blocks.domain'), input_html: { readonly: defined?(@resolved_records) } = f.input :domain, wrapper: :with_block_label, label: t('admin.email_domain_blocks.domain'), input_html: { readonly: defined?(@resolved_records) }
.fields-group
= f.input :allow_with_approval, wrapper: :with_label, hint: false, label: I18n.t('admin.email_domain_blocks.allow_registrations_with_approval')
- if defined?(@resolved_records) - if defined?(@resolved_records)
%p.hint= t('admin.email_domain_blocks.resolved_dns_records_hint_html') %p.hint= t('admin.email_domain_blocks.resolved_dns_records_hint_html')

View File

@ -63,6 +63,8 @@ module Mastodon
# Initialize configuration defaults for originally generated Rails version. # Initialize configuration defaults for originally generated Rails version.
config.load_defaults 7.0 config.load_defaults 7.0
config.active_record.marshalling_format_version = 7.1
# Please, add to the `ignore` list any other `lib` subdirectories that do # Please, add to the `ignore` list any other `lib` subdirectories that do
# not contain `.rb` files, or that should not be reloaded or eager loaded. # not contain `.rb` files, or that should not be reloaded or eager loaded.
# Common ones are `templates`, `generators`, or `middleware`, for example. # Common ones are `templates`, `generators`, or `middleware`, for example.

View File

@ -1,10 +0,0 @@
# frozen_string_literal: true
# TODO
# The Rails 7.0 framework default here is to set this true. However, we have a
# location in devise that redirects where we don't have an easy ability to
# override a method or set a config option, but where the redirect does not
# provide this option.
# https://github.com/heartcombo/devise/blob/v4.9.2/app/controllers/devise/confirmations_controller.rb#L28
# Once a solution is found, this line can be removed.
Rails.application.config.action_controller.raise_on_open_redirects = false

View File

@ -158,15 +158,6 @@ Rails.application.config.add_autoload_paths_to_load_path = false
# rather than to rely on a global default. # rather than to rely on a global default.
# Rails.application.config.active_record.default_column_serializer = nil # Rails.application.config.active_record.default_column_serializer = nil
# Enable a performance optimization that serializes Active Record models
# in a faster and more compact way.
#
# To perform a rolling deploy of a Rails 7.1 upgrade, wherein servers that have
# not yet been upgraded must be able to read caches from upgraded servers,
# leave this optimization off on the first deploy, then enable it on a
# subsequent deploy.
# Rails.application.config.active_record.marshalling_format_version = 7.1
# Run `after_commit` and `after_*_commit` callbacks in the order they are defined in a model. # Run `after_commit` and `after_*_commit` callbacks in the order they are defined in a model.
# This matches the behaviour of all other callbacks. # This matches the behaviour of all other callbacks.
# In previous versions of Rails, they ran in the inverse order. # In previous versions of Rails, they ran in the inverse order.

View File

@ -0,0 +1,10 @@
# frozen_string_literal: true
# TODO
# Starting with Rails 7.0, the framework default here is to set this true.
# However, we have a location in devise that redirects where we don't have an
# easy ability to override the method or set a config option, and where the
# redirect does not supply this option itself.
# https://github.com/heartcombo/devise/blob/v4.9.2/app/controllers/devise/confirmations_controller.rb#L28
# Once a solution is found, this line can be removed.
Rails.application.config.action_controller.raise_on_open_redirects = false

View File

@ -3,6 +3,7 @@ ia:
activerecord: activerecord:
attributes: attributes:
user: user:
email: Adresse de e-mail
password: Contrasigno password: Contrasigno
user/account: user/account:
username: Nomine de usator username: Nomine de usator

View File

@ -19,6 +19,7 @@ ie:
account: account:
attributes: attributes:
username: username:
invalid: deve contener solmen lítteres, númeres e sublineas
reserved: es reservat reserved: es reservat
admin/webhook: admin/webhook:
attributes: attributes:
@ -39,6 +40,7 @@ ie:
user: user:
attributes: attributes:
email: email:
blocked: usa un ne-permisset provisor de e-posta
unreachable: sembla ne exister unreachable: sembla ne exister
role_id: role_id:
elevated: ne posse esser plu alt quam tui actual rol elevated: ne posse esser plu alt quam tui actual rol

View File

@ -439,6 +439,7 @@ be:
view: Праглядзець новы блок дамену view: Праглядзець новы блок дамену
email_domain_blocks: email_domain_blocks:
add_new: Дадаць add_new: Дадаць
allow_registrations_with_approval: Дазволіць рэгістрацыю з дазволам
attempts_over_week: attempts_over_week:
few: "%{count} спробы рэгіістрацыі за апошні тыдзень" few: "%{count} спробы рэгіістрацыі за апошні тыдзень"
many: "%{count} спроб рэгіістрацыі за апошні тыдзень" many: "%{count} спроб рэгіістрацыі за апошні тыдзень"

View File

@ -425,6 +425,7 @@ ca:
view: Veure el bloqueig del domini view: Veure el bloqueig del domini
email_domain_blocks: email_domain_blocks:
add_new: Afegir nou add_new: Afegir nou
allow_registrations_with_approval: Registre permès amb validació
attempts_over_week: attempts_over_week:
one: "%{count} intent en la darrera setmana" one: "%{count} intent en la darrera setmana"
other: "%{count} intents de registre en la darrera setmana" other: "%{count} intents de registre en la darrera setmana"

View File

@ -453,6 +453,7 @@ cy:
view: Gweld bloc parth view: Gweld bloc parth
email_domain_blocks: email_domain_blocks:
add_new: Ychwanegu add_new: Ychwanegu
allow_registrations_with_approval: Caniatáu cofrestriadau wedi'u cymeradwyo
attempts_over_week: attempts_over_week:
few: "%{count} ymgais i gofrestru dros yr wythnos ddiwethaf" few: "%{count} ymgais i gofrestru dros yr wythnos ddiwethaf"
many: "%{count} ymgais i gofrestru dros yr wythnos ddiwethaf" many: "%{count} ymgais i gofrestru dros yr wythnos ddiwethaf"

View File

@ -425,6 +425,7 @@ da:
view: Vis domæneblokering view: Vis domæneblokering
email_domain_blocks: email_domain_blocks:
add_new: Tilføj ny add_new: Tilføj ny
allow_registrations_with_approval: Tillad registreringer med godkendelse
attempts_over_week: attempts_over_week:
one: "%{count} tilmeldingsforsøg over den seneste uge" one: "%{count} tilmeldingsforsøg over den seneste uge"
other: "%{count} tilmeldingsforsøg over den seneste uge" other: "%{count} tilmeldingsforsøg over den seneste uge"

View File

@ -34,7 +34,7 @@ el:
explanation: Το συνθηματικό του λογαριασμού σου άλλαξε. explanation: Το συνθηματικό του λογαριασμού σου άλλαξε.
extra: Αν δεν άλλαξες εσύ το συνθηματικό σου, ίσως κάποιος να έχει αποκτήσει πρόσβαση στο λογαριασμό σου. Παρακαλούμε άλλαξε το συνθηματικό σου άμεσα ή επικοινώνησε με τον διαχειριστή του κόμβου σου αν έχεις κλειδωθεί απ' έξω. extra: Αν δεν άλλαξες εσύ το συνθηματικό σου, ίσως κάποιος να έχει αποκτήσει πρόσβαση στο λογαριασμό σου. Παρακαλούμε άλλαξε το συνθηματικό σου άμεσα ή επικοινώνησε με τον διαχειριστή του κόμβου σου αν έχεις κλειδωθεί απ' έξω.
subject: 'Mastodon: Αλλαγή συνθηματικού' subject: 'Mastodon: Αλλαγή συνθηματικού'
title: Αλλαγή συνθηματικού title: Ο κωδικός άλλαξε
reconfirmation_instructions: reconfirmation_instructions:
explanation: Επιβεβαίωσε τη νέα διεύθυνση για να αλλάξεις το email σου. explanation: Επιβεβαίωσε τη νέα διεύθυνση για να αλλάξεις το email σου.
extra: Αν δεν ζήτησες εσύ αυτή την αλλαγή, παρακαλούμε αγνόησε αυτό το email. Η διεύθυνση email για τον λογαριασμό σου στο Mastodon δεν θα αλλάξει μέχρι να επισκεφτείς τον παραπάνω σύνδεσμο. extra: Αν δεν ζήτησες εσύ αυτή την αλλαγή, παρακαλούμε αγνόησε αυτό το email. Η διεύθυνση email για τον λογαριασμό σου στο Mastodon δεν θα αλλάξει μέχρι να επισκεφτείς τον παραπάνω σύνδεσμο.

View File

@ -1 +1,25 @@
---
ia: ia:
devise:
mailer:
confirmation_instructions:
action: Verificar adresse de e-mail
action_with_app: Confirmar e retornar a %{app}
title: Verificar adresse de e-mail
email_changed:
title: Nove adresse de e-mail
reconfirmation_instructions:
title: Verificar adresse de e-mail
reset_password_instructions:
action: Cambiar contrasigno
title: Reinitialisar contrasigno
two_factor_disabled:
title: 2FA disactivate
registrations:
updated: Tu conto ha essite actualisate con successo.
unlocks:
unlocked: Tu conto ha essite disblocate con successo. Initia session a continuar.
errors:
messages:
already_confirmed: jam esseva confirmate, tenta initiar session
not_found: non trovate

View File

@ -46,17 +46,26 @@ ie:
title: 2FA desvalidat title: 2FA desvalidat
two_factor_enabled: two_factor_enabled:
title: 2FA permisset title: 2FA permisset
two_factor_recovery_codes_changed:
explanation: Li anteyan codes de recuperation ha esset ínvalidat, e novis generat.
subject: 'Mastodon: 2-factor codes de recuperation regenerat'
title: 2FA codes de recuperation changeat
unlock_instructions: unlock_instructions:
subject: 'Mastodon: Desserral instructiones' subject: 'Mastodon: Desserral instructiones'
webauthn_credential: webauthn_credential:
added: added:
subject: 'Mastodon: Nov clave de securitá' subject: 'Mastodon: Nov clave de securitá'
title: Un nov clave de securitá ha esset adjuntet title: Un nov clave de securitá ha esset adjuntet
deleted:
subject: 'Mastodon: Clave de securitá deletet'
webauthn_disabled: webauthn_disabled:
subject: 'Mastodon: Autentication con claves de securitá desactivisat' subject: 'Mastodon: Autentication con claves de securitá desactivisat'
title: Claves de securitá desactivisat title: Claves de securitá desactivisat
webauthn_enabled:
title: Claves de securitá activisat
omniauth_callbacks: omniauth_callbacks:
failure: Ne posset autenticar te de %{kind} pro "%{reason}". failure: Ne posset autenticar te de %{kind} pro "%{reason}".
success: Successosimen autenticat de conto %{kind}.
passwords: passwords:
no_token: Tu ne posse accessar ti-ci págine sin venir de un email pri reiniciar li passa-parol. Si tu ha venit de un email pri reiniciar li passa-parol, ples far cert que tu usat li complet URL providet. no_token: Tu ne posse accessar ti-ci págine sin venir de un email pri reiniciar li passa-parol. Si tu ha venit de un email pri reiniciar li passa-parol, ples far cert que tu usat li complet URL providet.
send_instructions: Si tui email-adresse existe in nor database, tu va reciver un ligament por recuperar li passa-parol a tui email-adresse in quelc minutes. Ples vider tui spam-emails si tu ne recivet ti email. send_instructions: Si tui email-adresse existe in nor database, tu va reciver un ligament por recuperar li passa-parol a tui email-adresse in quelc minutes. Ples vider tui spam-emails si tu ne recivet ti email.
@ -77,3 +86,6 @@ ie:
expired: ha expirat, ples demandar un nov expired: ha expirat, ples demandar un nov
not_found: ne trovat not_found: ne trovat
not_locked: ne esset serrat not_locked: ne esset serrat
not_saved:
one: '1 error prohibit ti %{resource} de esser conservat:'
other: "%{count} errores prohibit ti %{resource} de esser conservat:"

View File

@ -127,6 +127,7 @@ el:
bookmarks: Σελιδοδείκτες bookmarks: Σελιδοδείκτες
conversations: Συνομιλίες conversations: Συνομιλίες
crypto: Κρυπτογράφηση από άκρο σε άκρο crypto: Κρυπτογράφηση από άκρο σε άκρο
favourites: Αγαπημένα
filters: Φίλτρα filters: Φίλτρα
follow: Ακολουθείτε, σε Σίγαση και Αποκλεισμοί follow: Ακολουθείτε, σε Σίγαση και Αποκλεισμοί
follows: Ακολουθείτε follows: Ακολουθείτε
@ -169,9 +170,10 @@ el:
read:accounts: να βλέπει τα στοιχεία λογαριασμών read:accounts: να βλέπει τα στοιχεία λογαριασμών
read:blocks: να βλέπει τους αποκλεισμένους σου read:blocks: να βλέπει τους αποκλεισμένους σου
read:bookmarks: εμφάνιση των σελιδοδεικτών σας read:bookmarks: εμφάνιση των σελιδοδεικτών σας
read:favourites: δείτε τα αγαπημένα σας
read:filters: να βλέπει τα φίλτρα σου read:filters: να βλέπει τα φίλτρα σου
read:follows: να βλέπει ποιους ακολουθείς read:follows: δές ποιους ακολουθείς
read:lists: να βλέπει τις λίστες σου read:lists: δές τις λίστες σου
read:mutes: να βλέπει ποιους αποσιωπείς read:mutes: να βλέπει ποιους αποσιωπείς
read:notifications: να βλέπει τις ειδοποιήσεις σου read:notifications: να βλέπει τις ειδοποιήσεις σου
read:reports: να βλέπει τις καταγγελίες σου read:reports: να βλέπει τις καταγγελίες σου
@ -183,8 +185,8 @@ el:
write:bookmarks: προσθήκη σελιδοδεικτών write:bookmarks: προσθήκη σελιδοδεικτών
write:conversations: σίγαση και διαγραφή συνομιλιών write:conversations: σίγαση και διαγραφή συνομιλιών
write:filters: να δημιουργεί φίλτρα write:filters: να δημιουργεί φίλτρα
write:follows: να ακολουθεί ανθρώπους write:follows: ακολουθήστε ανθρώπους
write:lists: να δημιουργεί λίστες write:lists: δημιουργία λιστών
write:media: να ανεβάζει πολυμέσα write:media: να ανεβάζει πολυμέσα
write:mutes: να αποσιωπεί ανθρώπους και συζητήσεις write:mutes: να αποσιωπεί ανθρώπους και συζητήσεις
write:notifications: να καθαρίζει τις ειδοποιήσεις σου write:notifications: να καθαρίζει τις ειδοποιήσεις σου

View File

@ -1 +1,55 @@
---
ia: ia:
activerecord:
attributes:
doorkeeper/application:
name: Nomine de application
website: Sito web de application
doorkeeper:
applications:
buttons:
cancel: Cancellar
edit: Modificar
edit:
title: Modificar application
index:
application: Application
delete: Deler
name: Nomine
new: Nove application
show: Monstrar
title: Tu applicationes
new:
title: Nove application
show:
actions: Actiones
title: 'Application: %{name}'
authorizations:
error:
title: Ocurreva un error
authorized_applications:
confirmations:
revoke: Es tu secur?
index:
scopes: Permissiones
title: Tu applicationes autorisate
flash:
applications:
create:
notice: Application create.
destroy:
notice: Application delite.
update:
notice: Application actualisate.
grouped_scopes:
title:
accounts: Contos
admin/accounts: Gestion de contos
favourites: Favoritos
lists: Listas
notifications: Notificationes
push: Notificationes push
layouts:
admin:
nav:
applications: Applicationes

View File

@ -5,6 +5,7 @@ ie:
doorkeeper/application: doorkeeper/application:
name: Nómine de aplication name: Nómine de aplication
redirect_uri: URI de redirection redirect_uri: URI de redirection
scopes: Scopes
website: Situ web de aplication website: Situ web de aplication
errors: errors:
models: models:
@ -29,12 +30,15 @@ ie:
title: Modificar aplication title: Modificar aplication
help: help:
redirect_uri: Usar un linea per URI redirect_uri: Usar un linea per URI
scopes: Separar scopes con intersticies. Lassar blanc por usar li scopes predefinit.
index: index:
application: Aplication application: Aplication
callback_url: URL de retrovocada
delete: Deleter delete: Deleter
empty: Tu have null aplicationes. empty: Tu have null aplicationes.
name: Nómine name: Nómine
new: Nov aplication new: Nov aplication
scopes: Scopes
show: Monstrar show: Monstrar
title: Tui aplicationes title: Tui aplicationes
new: new:
@ -42,6 +46,8 @@ ie:
show: show:
actions: Actiones actions: Actiones
application_id: Clave de client application_id: Clave de client
callback_urls: URLs de retrovocada
scopes: Scopes
secret: Secrete de client secret: Secrete de client
title: 'Aplication: %{name}' title: 'Aplication: %{name}'
authorizations: authorizations:
@ -51,6 +57,7 @@ ie:
error: error:
title: Alquo ha errat title: Alquo ha errat
new: new:
review_permissions: Inspecter permissiones
title: Autorisation besonat title: Autorisation besonat
authorized_applications: authorized_applications:
buttons: buttons:
@ -117,9 +124,13 @@ ie:
admin: admin:
nav: nav:
applications: Aplicationes applications: Aplicationes
oauth2_provider: Provisor OAuth2
application:
title: Autorisation OAuth besonat
scopes: scopes:
admin:read: leer li tot data sur li servitor admin:read: leer li tot data sur li servitor
admin:read:accounts: leer sensitiv information de omni contos admin:read:accounts: leer sensitiv information de omni contos
admin:read:canonical_email_blocks: leer sensitiv information pri omni canonic bloccas de e-posta
admin:read:domain_allows: leer sensitiv information pri omni permisses de dominia admin:read:domain_allows: leer sensitiv information pri omni permisses de dominia
admin:read:domain_blocks: leer sensitiv information pri omni bloccas de dominia admin:read:domain_blocks: leer sensitiv information pri omni bloccas de dominia
admin:read:email_domain_blocks: leer sensitiv information pri omni bloccas de dominia basat sur e-posta admin:read:email_domain_blocks: leer sensitiv information pri omni bloccas de dominia basat sur e-posta
@ -134,6 +145,7 @@ ie:
admin:write:ip_blocks: fa moderatori actiones sur bloccas de IP admin:write:ip_blocks: fa moderatori actiones sur bloccas de IP
admin:write:reports: far moderatori actiones sur raportes admin:write:reports: far moderatori actiones sur raportes
follow: modifica li relationes del conto follow: modifica li relationes del conto
push: reciver tui pussa-notificationes
read: lee omni datas de tui conto read: lee omni datas de tui conto
read:accounts: vide li informationes pri li conto read:accounts: vide li informationes pri li conto
read:blocks: vider tui bloccas read:blocks: vider tui bloccas

View File

@ -962,6 +962,7 @@ el:
notification_preferences: Αλλαγή προτιμήσεων email notification_preferences: Αλλαγή προτιμήσεων email
salutation: "%{name}," salutation: "%{name},"
settings: 'Άλλαξε τις προτιμήσεις email: %{link}' settings: 'Άλλαξε τις προτιμήσεις email: %{link}'
unsubscribe: Κατάργηση εγγραφής
view: 'Προβολή:' view: 'Προβολή:'
view_profile: Προβολή προφίλ view_profile: Προβολή προφίλ
view_status: Προβολή ανάρτησης view_status: Προβολή ανάρτησης
@ -975,6 +976,8 @@ el:
your_token: Το διακριτικό πρόσβασής σου your_token: Το διακριτικό πρόσβασής σου
auth: auth:
apply_for_account: Ζήτα έναν λογαριασμό apply_for_account: Ζήτα έναν λογαριασμό
captcha_confirmation:
title: Ελεγχος ασφαλείας
confirmations: confirmations:
wrong_email_hint: Εάν αυτή η διεύθυνση email δεν είναι σωστή, μπορείς να την αλλάξεις στις ρυθμίσεις λογαριασμού. wrong_email_hint: Εάν αυτή η διεύθυνση email δεν είναι σωστή, μπορείς να την αλλάξεις στις ρυθμίσεις λογαριασμού.
delete_account: Διαγραφή λογαριασμού delete_account: Διαγραφή λογαριασμού
@ -1238,6 +1241,8 @@ el:
status: Κατάσταση status: Κατάσταση
success: Τα δεδομένα σου μεταφορτώθηκαν επιτυχώς και θα επεξεργαστούν σύντομα success: Τα δεδομένα σου μεταφορτώθηκαν επιτυχώς και θα επεξεργαστούν σύντομα
time_started: Ξεκίνησε στις time_started: Ξεκίνησε στις
titles:
following: Εισαγωγή λογαριασμών που ακολουθείτε
type: Τύπος εισαγωγής type: Τύπος εισαγωγής
type_groups: type_groups:
destructive: Μπλοκ & σίγαση destructive: Μπλοκ & σίγαση
@ -1245,7 +1250,7 @@ el:
blocking: Λίστα αποκλεισμού blocking: Λίστα αποκλεισμού
bookmarks: Σελιδοδείκτες bookmarks: Σελιδοδείκτες
domain_blocking: Λίστα αποκλεισμένων τομέων domain_blocking: Λίστα αποκλεισμένων τομέων
following: Λίστα ακολούθων following: Λίστα ατόμων που ακολουθείτε
muting: Λίστα αποσιωπήσεων muting: Λίστα αποσιωπήσεων
upload: Μεταμόρφωση upload: Μεταμόρφωση
invites: invites:
@ -1420,7 +1425,7 @@ el:
follow_failure: Δεν ήταν δυνατή η παρακολούθηση ορισμένων από τους επιλεγμένους λογαριασμούς. follow_failure: Δεν ήταν δυνατή η παρακολούθηση ορισμένων από τους επιλεγμένους λογαριασμούς.
follow_selected_followers: Ακολούθησε τους επιλεγμένους ακόλουθους follow_selected_followers: Ακολούθησε τους επιλεγμένους ακόλουθους
followers: Ακόλουθοι followers: Ακόλουθοι
following: Ακολουθείς following: Ακολουθείτε
invited: Προσκεκλημένοι invited: Προσκεκλημένοι
last_active: Τελευταία ενεργός last_active: Τελευταία ενεργός
most_recent: Πιο πρόσφατος most_recent: Πιο πρόσφατος

View File

@ -425,6 +425,7 @@ en:
view: View domain block view: View domain block
email_domain_blocks: email_domain_blocks:
add_new: Add new add_new: Add new
allow_registrations_with_approval: Allow registrations with approval
attempts_over_week: attempts_over_week:
one: "%{count} attempt over the last week" one: "%{count} attempt over the last week"
other: "%{count} sign-up attempts over the last week" other: "%{count} sign-up attempts over the last week"

View File

@ -425,6 +425,7 @@ es-AR:
view: Ver bloqueo de dominio view: Ver bloqueo de dominio
email_domain_blocks: email_domain_blocks:
add_new: Agregar nuevo add_new: Agregar nuevo
allow_registrations_with_approval: Permitir crear cuentas con aprobación
attempts_over_week: attempts_over_week:
one: "%{count} intento durante la última semana" one: "%{count} intento durante la última semana"
other: "%{count} intentos durante la última semana" other: "%{count} intentos durante la última semana"

View File

@ -425,6 +425,7 @@ es-MX:
view: Ver dominio bloqueado view: Ver dominio bloqueado
email_domain_blocks: email_domain_blocks:
add_new: Añadir nuevo add_new: Añadir nuevo
allow_registrations_with_approval: Permitir registros con aprobación
attempts_over_week: attempts_over_week:
one: "%{count} intentos durante la última semana" one: "%{count} intentos durante la última semana"
other: "%{count} intentos de registro en la última semana" other: "%{count} intentos de registro en la última semana"

View File

@ -425,6 +425,7 @@ es:
view: Ver dominio bloqueado view: Ver dominio bloqueado
email_domain_blocks: email_domain_blocks:
add_new: Añadir nuevo add_new: Añadir nuevo
allow_registrations_with_approval: Permitir registros con aprobación
attempts_over_week: attempts_over_week:
one: "%{count} intento durante la última semana" one: "%{count} intento durante la última semana"
other: "%{count} intentos de registro durante la última semana" other: "%{count} intentos de registro durante la última semana"

View File

@ -427,6 +427,7 @@ eu:
view: Ikusi domeinuaren blokeoa view: Ikusi domeinuaren blokeoa
email_domain_blocks: email_domain_blocks:
add_new: Gehitu berria add_new: Gehitu berria
allow_registrations_with_approval: Baimendu izen-emateak onarpen bidez
attempts_over_week: attempts_over_week:
one: Izen-emateko saiakera %{count} azken astean one: Izen-emateko saiakera %{count} azken astean
other: Izen-emateko %{count} saiakera azken astean other: Izen-emateko %{count} saiakera azken astean

View File

@ -425,6 +425,7 @@ fo:
view: Vís navnaøkisblokering view: Vís navnaøkisblokering
email_domain_blocks: email_domain_blocks:
add_new: Stovna add_new: Stovna
allow_registrations_with_approval: Loyv skrásetingum við góðkenning
attempts_over_week: attempts_over_week:
one: "%{count} roynd seinastu vikuna" one: "%{count} roynd seinastu vikuna"
other: "%{count} tilmeldingarroyndir seinastu vikuna" other: "%{count} tilmeldingarroyndir seinastu vikuna"

View File

@ -425,6 +425,7 @@ fy:
view: Domeinblokkade besjen view: Domeinblokkade besjen
email_domain_blocks: email_domain_blocks:
add_new: Nije tafoegje add_new: Nije tafoegje
allow_registrations_with_approval: Ynskriuwingen mei tastimming tastean
attempts_over_week: attempts_over_week:
one: "%{count} registraasjebesykjen yn de ôfrûne wike" one: "%{count} registraasjebesykjen yn de ôfrûne wike"
other: "%{count} registraasjebesykjen yn de ôfrûne wike" other: "%{count} registraasjebesykjen yn de ôfrûne wike"

View File

@ -425,6 +425,7 @@ gl:
view: Ollar dominios bloqueados view: Ollar dominios bloqueados
email_domain_blocks: email_domain_blocks:
add_new: Engadir novo add_new: Engadir novo
allow_registrations_with_approval: Permitir crear contas con aprobación
attempts_over_week: attempts_over_week:
one: "%{count} intento na última semana" one: "%{count} intento na última semana"
other: "%{count} intentos de conexión na última semana" other: "%{count} intentos de conexión na última semana"

View File

@ -439,6 +439,7 @@ he:
view: צפייה בחסימת דומיינים view: צפייה בחסימת דומיינים
email_domain_blocks: email_domain_blocks:
add_new: הוספת חדש add_new: הוספת חדש
allow_registrations_with_approval: הרשאת הרשמה לאחר אישור
attempts_over_week: attempts_over_week:
many: "%{count} נסיונות הרשמה במשך השבוע שעבר" many: "%{count} נסיונות הרשמה במשך השבוע שעבר"
one: "%{count} נסיון במשך השבוע שעבר" one: "%{count} נסיון במשך השבוע שעבר"

View File

@ -425,6 +425,7 @@ hu:
view: Domain tiltásának megtekintése view: Domain tiltásának megtekintése
email_domain_blocks: email_domain_blocks:
add_new: Új hozzáadása add_new: Új hozzáadása
allow_registrations_with_approval: Regisztráció engedélyezése jóváhagyással
attempts_over_week: attempts_over_week:
one: "%{count} próbálkozás a múlt héten" one: "%{count} próbálkozás a múlt héten"
other: "%{count} próbálkozás feliratkozásra a múlt héten" other: "%{count} próbálkozás feliratkozásra a múlt héten"

View File

@ -50,3 +50,26 @@ ia:
'15778476': 6 menses '15778476': 6 menses
'2629746': 1 mense '2629746': 1 mense
'86400': 1 die '86400': 1 die
statuses_cleanup:
min_age:
'1209600': 2 septimanas
'15778476': 6 menses
'2629746': 1 mense
'31556952': 1 anno
'5259492': 2 menses
'604800': 1 septimana
'63113904': 2 annos
'7889238': 3 menses
themes:
default: Mastodon (Obscur)
mastodon-light: Mastodon (Clar)
two_factor_authentication:
add: Adder
disable: Disactivar 2FA
user_mailer:
appeal_approved:
action: Vader a tu conto
welcome:
subject: Benvenite in Mastodon
webauthn_credentials:
delete: Deler

View File

@ -424,6 +424,7 @@ ie:
view: Vider dominia-blocca view: Vider dominia-blocca
email_domain_blocks: email_domain_blocks:
add_new: Adjunter un nov add_new: Adjunter un nov
allow_registrations_with_approval: Permisser registrationes con aprobation
attempts_over_week: attempts_over_week:
one: "%{count} registration-prova durant li ultim semane" one: "%{count} registration-prova durant li ultim semane"
other: "%{count} registration-prova durant li ultim semane" other: "%{count} registration-prova durant li ultim semane"
@ -439,6 +440,7 @@ ie:
title: Bloccar nov email-dominia title: Bloccar nov email-dominia
no_email_domain_block_selected: Null email-dominia-bloccas esset changeat pro que null esset selectet no_email_domain_block_selected: Null email-dominia-bloccas esset changeat pro que null esset selectet
not_permitted: Ne permisset not_permitted: Ne permisset
resolved_dns_records_hint_html: Li dominia-nómine resolue se al seque dominias MX, queles es in fine responsabil por acceptar e-posta. Bloccar un dominia MX va bloccar inscriptiones de quelcunc e-posta quel usa li sam dominia MX, mem si li visibil dominia-nómine es diferent. <strong>Esse caut e ne blocca majori provisores de e-posta.</strong>
resolved_through_html: Resoluet per %{domain} resolved_through_html: Resoluet per %{domain}
title: Bloccat email-dominias title: Bloccat email-dominias
export_domain_allows: export_domain_allows:
@ -672,11 +674,13 @@ ie:
description_html: Con <strong>roles por usatores</strong>, tu posse customisar li functiones e locs de Mastodon in queles tui usatores posse accesser. description_html: Con <strong>roles por usatores</strong>, tu posse customisar li functiones e locs de Mastodon in queles tui usatores posse accesser.
edit: Modificar rol '%{name}' edit: Modificar rol '%{name}'
everyone: Permissiones predefinit everyone: Permissiones predefinit
everyone_full_description_html: Ti es li <strong>fundamental rol</strong> quel afecta <strong>omni usatores</strong>, mem tis sin un assignat rol. Omni altri roles hereda permissiones de it.
permissions_count: permissions_count:
one: "%{count} permission" one: "%{count} permission"
other: "%{count} permissiones" other: "%{count} permissiones"
privileges: privileges:
administrator: Administrator administrator: Administrator
administrator_description: Usatores con ti permission va trapassar omni permission
delete_user_data: Deleter Data de Usator delete_user_data: Deleter Data de Usator
delete_user_data_description: Possibilisa que usatores mey deleter li data de altri usatores strax delete_user_data_description: Possibilisa que usatores mey deleter li data de altri usatores strax
invite_users: Invitar Usatores invite_users: Invitar Usatores
@ -726,6 +730,8 @@ ie:
settings: settings:
about: about:
manage_rules: Gerer regules de servitor manage_rules: Gerer regules de servitor
preamble: Provider detalliat information pri qualmen li servitor es operat, moderat, payat.
rules_hint: Hay un dedicat area por regules queles vor usatores es expectat obedir.
title: Pri title: Pri
appearance: appearance:
preamble: Customisar li interfacie web de Mastodon. preamble: Customisar li interfacie web de Mastodon.
@ -736,7 +742,10 @@ ie:
desc_html: To ci usa extern scrites de hCaptcha, quel posse esser ínquietant pro rasones de securitá e privatie. In plu, <strong>it posse far li processu de registration mult plu desfacil (particularimen por tis con deshabilitás)</strong>. Pro ti rasones, ples considerar alternativ mesuras, tales quam registration per aprobation o invitation. desc_html: To ci usa extern scrites de hCaptcha, quel posse esser ínquietant pro rasones de securitá e privatie. In plu, <strong>it posse far li processu de registration mult plu desfacil (particularimen por tis con deshabilitás)</strong>. Pro ti rasones, ples considerar alternativ mesuras, tales quam registration per aprobation o invitation.
title: Exige que nov usatores solue un CAPTCHA por confirmar lor conto title: Exige que nov usatores solue un CAPTCHA por confirmar lor conto
content_retention: content_retention:
preamble: Decider qualmen usator-generat contenete es inmagasinat in Mastodon.
title: Retention de contenete title: Retention de contenete
default_noindex:
desc_html: Afecta omni usatores qui ne ha changeat ti parametre personalmen
discovery: discovery:
follow_recommendations: Seque-recomandationes follow_recommendations: Seque-recomandationes
preamble: Exposir interessant contenete es importantissim por incorporar nov usatores qui fórsan conosse nequi che Mastodon. Decider qualmen diferent utensiles de decovrition functiona che vor servitor. preamble: Exposir interessant contenete es importantissim por incorporar nov usatores qui fórsan conosse nequi che Mastodon. Decider qualmen diferent utensiles de decovrition functiona che vor servitor.
@ -771,11 +780,13 @@ ie:
critical_update: Critic — ples actualisar rapidmen critical_update: Critic — ples actualisar rapidmen
description: On recomanda que vu actualisa vor Mastodon-servitor regularimen por profiter del max recent fixes e facultates. In plu, quelcvez it es critic actualisar Mastodon promptmen por evitar problemas de securitá. Pro ti rasones, Mastodon questiona chascun 30 minutes ca hay actualisationes, e va notificar vos secun vor parametres pri email-notificationes. description: On recomanda que vu actualisa vor Mastodon-servitor regularimen por profiter del max recent fixes e facultates. In plu, quelcvez it es critic actualisar Mastodon promptmen por evitar problemas de securitá. Pro ti rasones, Mastodon questiona chascun 30 minutes ca hay actualisationes, e va notificar vos secun vor parametres pri email-notificationes.
documentation_link: Aprender plu documentation_link: Aprender plu
release_notes: Version-notas
title: Actualisationes disponibil title: Actualisationes disponibil
type: Specie type: Specie
types: types:
major: Majori lansament major: Majori lansament
minor: Minori lansament minor: Minori lansament
patch: Lapp-version — bug-corectiones e changes facil a aplicar
version: Version version: Version
statuses: statuses:
account: Autor account: Autor
@ -967,6 +978,7 @@ ie:
body: Nov versiones de Mastodon ha esset lansat, vu fórsan vole actualisar! body: Nov versiones de Mastodon ha esset lansat, vu fórsan vole actualisar!
subject: Nov versiones Mastodon es disponibil por %{instance}! subject: Nov versiones Mastodon es disponibil por %{instance}!
new_trends: new_trends:
body: 'Li sequent elementes besona un revision ante que on posse monstrar les publicmen:'
new_trending_links: new_trending_links:
title: Populari ligamentes title: Populari ligamentes
new_trending_statuses: new_trending_statuses:
@ -1385,10 +1397,12 @@ ie:
media_attachments: media_attachments:
validations: validations:
images_and_video: On ne posse atachar un video a un posta quel ja contene images images_and_video: On ne posse atachar un video a un posta quel ja contene images
not_ready: Ne posse atachar files ancor sub tractament. Prova denov pos ne long!
too_many: Ne posse atachar plu quam 4 files too_many: Ne posse atachar plu quam 4 files
migrations: migrations:
acct: Translocat a acct: Translocat a
cancel: Anullar redirection cancel: Anullar redirection
cancel_explanation: Anullar li redirection va reactivisar tui actual conto, ma ne va restaurar sequitores queles ha esset movet a ti-ta conto.
cancelled_msg: Anullat redirection con successe. cancelled_msg: Anullat redirection con successe.
errors: errors:
already_moved: es li sam conto a equel tu ha ja translocat already_moved: es li sam conto a equel tu ha ja translocat
@ -1397,6 +1411,9 @@ ie:
not_found: ne posset esser trovat not_found: ne posset esser trovat
followers_count: Sequitores al témpor de translocation followers_count: Sequitores al témpor de translocation
incoming_migrations: Translocant de un conto diferent incoming_migrations: Translocant de un conto diferent
incoming_migrations_html: Por mover de un altri conto a ti-ci, erstmen tu deve <a href="%{path}">crear un alias de conto</a>.
moved_msg: Tui conto nu redirecte a %{acct} e tui sequitores es in li processu de esser movet.
not_redirecting: Tui conto redirecte a null altri conto actualmen.
on_cooldown: Tu ha recentmen migrat tui conto. Ti function va esser disponibil denov pos %{count} dies. on_cooldown: Tu ha recentmen migrat tui conto. Ti function va esser disponibil denov pos %{count} dies.
past_migrations: Passat migrationes past_migrations: Passat migrationes
proceed_with_move: Translocar sequitores proceed_with_move: Translocar sequitores
@ -1406,7 +1423,12 @@ ie:
warning: warning:
backreference_required: Li nov conto deve in prim esser configurat por retroreferentiar ti-ci conto backreference_required: Li nov conto deve in prim esser configurat por retroreferentiar ti-ci conto
before: 'Ante proceder, ples leer ti notas cuidosimen:' before: 'Ante proceder, ples leer ti notas cuidosimen:'
cooldown: Pos mover se, hay un periode de atendida durant quel tu ne va posser mover te denov
disabled_account: Tui actual conto ne va esser completmen usabil pos to. Támen, tu va posser accesser li exportation de data, e anc reactivisation.
followers: Ti-ci action va mover omni sequitores del actual conto al nov conto
only_redirect_html: Alternativmen, tu posse <a href="%{path}">solmen meter un redirection sur tui profil</a>.
other_data: Necun altri data va esser translocat automaticmen other_data: Necun altri data va esser translocat automaticmen
redirect: Li profil de tui actual conto va esser actualisat con un anuncie de redirection e va esser excludet de serchas
moderation: moderation:
title: Moderation title: Moderation
move_handler: move_handler:
@ -1805,6 +1827,7 @@ ie:
verification: verification:
extra_instructions_html: '<strong>Nota</strong>: Li ligament in tui websitu posse esser ínvisibil. Li important parte es <code>rel="me"</code> quel prevente fals self-identification in websitus con contenete generat de usatores. Tu posse mem usar un <code>link</code> element in li cap-section del págine vice <code>a</code>, ma li HTML code deve esser accessibil sin executer JavaScript.' extra_instructions_html: '<strong>Nota</strong>: Li ligament in tui websitu posse esser ínvisibil. Li important parte es <code>rel="me"</code> quel prevente fals self-identification in websitus con contenete generat de usatores. Tu posse mem usar un <code>link</code> element in li cap-section del págine vice <code>a</code>, ma li HTML code deve esser accessibil sin executer JavaScript.'
here_is_how: Vide qualmen here_is_how: Vide qualmen
hint_html: "<strong>Verificar tui identitá che Mastodon es por omnes.</strong> Basat sur apert web-criteries, líber nu e sempre. Omno quel tu besona es un websitu personal per quel gente reconosse te. Quande tu fa un ligament a tui websitu de tui profil, on va controlar que li websitu have un ligament reciproc a tui profil e monstrar un visual indicator sur it."
instructions_html: Copiar e collar li code ci infra in li HTML de tui web-situ. Poy adjunter li adresse de tui web-situ ad-in un del aditional campes sur tui profil ex li section "Modificar profil" e salvar li changes. instructions_html: Copiar e collar li code ci infra in li HTML de tui web-situ. Poy adjunter li adresse de tui web-situ ad-in un del aditional campes sur tui profil ex li section "Modificar profil" e salvar li changes.
verification: Verification verification: Verification
verified_links: Tui verificat ligamentes verified_links: Tui verificat ligamentes
@ -1815,9 +1838,12 @@ ie:
success: Tui clave de securitá esset adjuntet con successe. success: Tui clave de securitá esset adjuntet con successe.
delete: Deleter delete: Deleter
delete_confirmation: Vole tu vermen deleter ti-ci clave de securitá? delete_confirmation: Vole tu vermen deleter ti-ci clave de securitá?
description_html: Si tu activisa <strong>autentication per clave de securitá</strong>, aperter session va postular que tu usa un de tui claves de securitá.
destroy: destroy:
error: Un problema evenit durant li deletion de tui clave de securitá. Ples provar denov.
success: Tui clave de securitá esset successosimen deletet. success: Tui clave de securitá esset successosimen deletet.
invalid_credential: Ínvalid clave de securitá invalid_credential: Ínvalid clave de securitá
not_enabled: Tu ancor ne ha possibilisat WebAuthn not_enabled: Tu ancor ne ha possibilisat WebAuthn
not_supported: Ti-ci navigator ne subtene claves de securitá not_supported: Ti-ci navigator ne subtene claves de securitá
otp_required: Por usar claves de securitá, ples activisar 2-factor autentication.
registered_on: Adheret ye %{date} registered_on: Adheret ye %{date}

View File

@ -425,6 +425,7 @@ it:
view: Visualizza blocco di dominio view: Visualizza blocco di dominio
email_domain_blocks: email_domain_blocks:
add_new: Aggiungi nuovo add_new: Aggiungi nuovo
allow_registrations_with_approval: Consenti registrazioni con approvazione
attempts_over_week: attempts_over_week:
one: "%{count} tentativo nell'ultima settimana" one: "%{count} tentativo nell'ultima settimana"
other: "%{count} tentativi di registrazione nell'ultima settimana" other: "%{count} tentativi di registrazione nell'ultima settimana"

View File

@ -420,6 +420,7 @@ ko:
view: 도메인 차단 보기 view: 도메인 차단 보기
email_domain_blocks: email_domain_blocks:
add_new: 새로 추가하기 add_new: 새로 추가하기
allow_registrations_with_approval: 승인을 통한 가입 허용
attempts_over_week: attempts_over_week:
other: 지난 주 동안 %{count}건의 가입 시도가 있었습니다 other: 지난 주 동안 %{count}건의 가입 시도가 있었습니다
created_msg: 이메일 도메인 차단 규칙을 생성했습니다 created_msg: 이메일 도메인 차단 규칙을 생성했습니다

View File

@ -383,7 +383,11 @@ lad:
confirm_suspension: confirm_suspension:
cancel: Anula cancel: Anula
confirm: Suspende confirm: Suspende
permanent_action: Si kites la suspensyon no restoraras dingunos datos ni relasyones.
remove_all_data: Esto efasara todo el kontenido, multimedia i datos de profiles de los kuentos en este domeno de tu sirvidor.
stop_communication: Tu sirvidor deshara de komunikarse kon estos sirvidores.
title: Konfirma bloko de domeno para %{domain} title: Konfirma bloko de domeno para %{domain}
undo_relationships: Esto kitara todas las relasyones de segimyento entre tu kuentos en estos sirvidores i el tu sirvidor.
created_msg: El bloko de domeno esta siendo prosesado created_msg: El bloko de domeno esta siendo prosesado
destroyed_msg: El bloko de domeno se dezizo destroyed_msg: El bloko de domeno se dezizo
domain: Domeno domain: Domeno
@ -772,6 +776,8 @@ lad:
type: Tipo type: Tipo
types: types:
major: Versyon prinsipala major: Versyon prinsipala
minor: Versyon minora
patch: Versyon de remendo koreksyones de yerros i trokamientos simples
version: Versyon version: Versyon
statuses: statuses:
account: Autor account: Autor
@ -829,8 +835,10 @@ lad:
message_html: No ay dingun prosedura Sidekiq en egzekusion para la(s) kola(s) %{value}. Por favor, reviza tu konfigurasyon de Sidekiq message_html: No ay dingun prosedura Sidekiq en egzekusion para la(s) kola(s) %{value}. Por favor, reviza tu konfigurasyon de Sidekiq
software_version_critical_check: software_version_critical_check:
action: Amostra aktualizasyones desponivles action: Amostra aktualizasyones desponivles
message_html: Una aktualizasyon kritika de Mastodon esta desponivle. Por favor aktualiza pishin.
software_version_patch_check: software_version_patch_check:
action: Amostra aktualizasyones desponivles action: Amostra aktualizasyones desponivles
message_html: Una aktualizasyon de Mastodon kon koreksyon de yerros esta desponivle.
upload_check_privacy_error: upload_check_privacy_error:
action: Klika aki para mas enformasyon action: Klika aki para mas enformasyon
message_html: "<strong>Tu sirvidor de web es mal konfigurado. La privasita de tus utilizadores esta en riziko.</strong>" message_html: "<strong>Tu sirvidor de web es mal konfigurado. La privasita de tus utilizadores esta en riziko.</strong>"
@ -945,6 +953,7 @@ lad:
next_steps: Puedes achetar la apelasyon para dezazer la dechizyon de moderasyon, o ignorarla. next_steps: Puedes achetar la apelasyon para dezazer la dechizyon de moderasyon, o ignorarla.
subject: "%{username} esta apelando a una dechizyon de moderasyon en %{instance}" subject: "%{username} esta apelando a una dechizyon de moderasyon en %{instance}"
new_critical_software_updates: new_critical_software_updates:
body: Ay mueva versyon kritika de Mastodon. Es posivle ke keras aktualizar pishin!
subject: Ay aktualizasyones kritikas de Mastodon desponivles para %{instance}! subject: Ay aktualizasyones kritikas de Mastodon desponivles para %{instance}!
new_pending_account: new_pending_account:
body: Los peratim del muevo kuento estan abashos. Puedes achetar o refuzar esta aplikasyon. body: Los peratim del muevo kuento estan abashos. Puedes achetar o refuzar esta aplikasyon.
@ -1045,13 +1054,17 @@ lad:
accept: Acheta accept: Acheta
back: Atras back: Atras
preamble: Estas son establesidas i aplikadas por los moderadores de %{domain}. preamble: Estas son establesidas i aplikadas por los moderadores de %{domain}.
preamble_invited: Antes de kontinuar, por favor reviza las reglas del sirvidor establesidas por los moderatores de %{domain}.
title: Algunas reglas bazikas. title: Algunas reglas bazikas.
title_invited: Fuites envitado. title_invited: Fuites envitado.
security: Sigurita security: Sigurita
set_new_password: Establese muevo kod set_new_password: Establese muevo kod
setup: setup:
email_below_hint_html: Mira en tu kuti de spam o solisita de muevo. Si el adreso de posta elektronika ke aparese aki es yerrado, puedes trokarlo aki. email_below_hint_html: Mira en tu kuti de spam o solisita de muevo. Si el adreso de posta elektronika ke aparese aki es yerrado, puedes trokarlo aki.
email_settings_hint_html: Klika el atadjiko ke te embimos para verifikar %{email}. Asperaremos aki.
link_not_received: No risivites un atadijo? link_not_received: No risivites un atadijo?
new_confirmation_instructions_sent: Resiviras un muevo mesaj de posta elektronika kon el atadjio de konfirmasyon en unos minutos!
title: Reviza tu kuti de arivo
sign_in: sign_in:
preamble_html: Konektate kon tus kredensiales de <strong>%{domain}</strong>. Si tu kuento esta balabayado en otruno servidor, no puedras konektarte aki. preamble_html: Konektate kon tus kredensiales de <strong>%{domain}</strong>. Si tu kuento esta balabayado en otruno servidor, no puedras konektarte aki.
title: Konektate kon %{domain} title: Konektate kon %{domain}
@ -1246,9 +1259,11 @@ lad:
imports: imports:
errors: errors:
empty: Dosya CSV vaziya empty: Dosya CSV vaziya
incompatible_type: Inkompativle kon el tipo de importo eskojido
invalid_csv_file: 'Dosya CSV no valida. Yerro: %{error}' invalid_csv_file: 'Dosya CSV no valida. Yerro: %{error}'
over_rows_processing_limit: kontiene mas de %{count} filas over_rows_processing_limit: kontiene mas de %{count} filas
too_large: Dosya es mas grande too_large: Dosya es mas grande
failures: Yerros
imported: Importado imported: Importado
modes: modes:
merge: Une merge: Une
@ -1671,6 +1686,9 @@ lad:
month: "%b %Y" month: "%b %Y"
time: "%H:%M" time: "%H:%M"
with_time_zone: "%d de %b del %Y, %H:%M %Z" with_time_zone: "%d de %b del %Y, %H:%M %Z"
translation:
errors:
too_many_requests: Ay demaziadas solisitudes de servisyo de traduksyon.
two_factor_authentication: two_factor_authentication:
add: Adjusta add: Adjusta
disable: Inkapasita autentifikasyon en dos pasos disable: Inkapasita autentifikasyon en dos pasos
@ -1750,9 +1768,12 @@ lad:
title: Bienvenido, %{name}! title: Bienvenido, %{name}!
users: users:
follow_limit_reached: No puedes segir a mas de %{limit} personas follow_limit_reached: No puedes segir a mas de %{limit} personas
go_to_sso_account_settings: Va a la konfigurasyon de kuento de tu prokurador de identita
invalid_otp_token: Kodiche de dos pasos no valido invalid_otp_token: Kodiche de dos pasos no valido
otp_lost_help_html: Si pedriste akseso a los dos, puedes kontaktarte kon %{email}
signed_in_as: 'Konektado komo:' signed_in_as: 'Konektado komo:'
verification: verification:
here_is_how: Ansina es komo
verification: Verifikasyon verification: Verifikasyon
verified_links: Tus atadijos verifikados verified_links: Tus atadijos verifikados
webauthn_credentials: webauthn_credentials:

View File

@ -169,6 +169,7 @@ lt:
undo: Atkurti domeno bloką undo: Atkurti domeno bloką
email_domain_blocks: email_domain_blocks:
add_new: Pridėti naują add_new: Pridėti naują
allow_registrations_with_approval: Leisti registracijas su patvirtinimu
created_msg: El pašto domenas sėkmingai pridėtas į juodąjį sąrašą created_msg: El pašto domenas sėkmingai pridėtas į juodąjį sąrašą
delete: Ištrinti delete: Ištrinti
domain: Domenas domain: Domenas

View File

@ -425,6 +425,7 @@ nl:
view: Domeinblokkade bekijken view: Domeinblokkade bekijken
email_domain_blocks: email_domain_blocks:
add_new: Nieuwe toevoegen add_new: Nieuwe toevoegen
allow_registrations_with_approval: Inschrijvingen met toestemming toestaan
attempts_over_week: attempts_over_week:
one: "%{count} registratiepoging tijdens de afgelopen week" one: "%{count} registratiepoging tijdens de afgelopen week"
other: "%{count} registratiepogingen tijdens de afgelopen week" other: "%{count} registratiepogingen tijdens de afgelopen week"

View File

@ -425,6 +425,7 @@ nn:
view: Vis domeneblokkering view: Vis domeneblokkering
email_domain_blocks: email_domain_blocks:
add_new: Lag ny add_new: Lag ny
allow_registrations_with_approval: Tillat registreringer med godkjenning
attempts_over_week: attempts_over_week:
one: "%{count} forsøk i løpet av den siste uken" one: "%{count} forsøk i løpet av den siste uken"
other: "%{count} forsøk på å opprette konto i løpet av den siste uken" other: "%{count} forsøk på å opprette konto i løpet av den siste uken"

View File

@ -425,6 +425,7 @@
view: Vis domeneblokkering view: Vis domeneblokkering
email_domain_blocks: email_domain_blocks:
add_new: Lag ny add_new: Lag ny
allow_registrations_with_approval: Tillat registreringer med godkjenning
attempts_over_week: attempts_over_week:
one: "%{count} forsøk i løpet av den siste uken" one: "%{count} forsøk i løpet av den siste uken"
other: "%{count} forsøk på å opprette konto i løpet av den siste uken" other: "%{count} forsøk på å opprette konto i løpet av den siste uken"

View File

@ -439,6 +439,7 @@ pl:
view: Zobacz blokadę domeny view: Zobacz blokadę domeny
email_domain_blocks: email_domain_blocks:
add_new: Dodaj nową add_new: Dodaj nową
allow_registrations_with_approval: Zezwól na rejestracje po zatwierdzeniu
attempts_over_week: attempts_over_week:
few: "%{count} próby w ciągu ostatniego tygodnia" few: "%{count} próby w ciągu ostatniego tygodnia"
many: "%{count} prób w ciągu ostatniego tygodnia" many: "%{count} prób w ciągu ostatniego tygodnia"

View File

@ -425,6 +425,7 @@ pt-BR:
view: Ver domínios bloqueados view: Ver domínios bloqueados
email_domain_blocks: email_domain_blocks:
add_new: Adicionar novo add_new: Adicionar novo
allow_registrations_with_approval: Permitir inscrições com aprovação
attempts_over_week: attempts_over_week:
one: "%{count} tentativa na última semana" one: "%{count} tentativa na última semana"
other: "%{count} tentativas de inscrição na última semana" other: "%{count} tentativas de inscrição na última semana"

View File

@ -425,6 +425,7 @@ pt-PT:
view: Ver domínios bloqueados view: Ver domínios bloqueados
email_domain_blocks: email_domain_blocks:
add_new: Adicionar novo add_new: Adicionar novo
allow_registrations_with_approval: Permitir inscrições com aprovação
attempts_over_week: attempts_over_week:
one: "%{count} tentativa na última semana" one: "%{count} tentativa na última semana"
other: "%{count} tentativas de inscrição na última semana" other: "%{count} tentativas de inscrição na última semana"

View File

@ -1 +1,46 @@
---
ia: ia:
simple_form:
labels:
account:
fields:
name: Etiquetta
value: Contento
admin_account_action:
type: Action
defaults:
avatar: Pictura de profilo
confirm_new_password: Confirmar nove contrasigno
confirm_password: Confirmar contrasigno
current_password: Contrasigno actual
new_password: Nove contrasigno
password: Contrasigno
setting_display_media_default: Predefinite
setting_display_media_hide_all: Celar toto
setting_display_media_show_all: Monstrar toto
setting_system_font_ui: Usar typo de litteras predefinite del systema
setting_theme: Thema de sito
setting_trends: Monstrar le tendentias de hodie
sign_in_token_attempt: Codice de securitate
title: Titulo
username: Nomine de usator
username_or_email: Nomine de usator o e-mail
form_admin_settings:
custom_css: CSS personalisate
profile_directory: Activar directorio de profilos
site_contact_email: Adresse de e-mail de contacto
site_contact_username: Nomine de usator de contacto
site_terms: Politica de confidentialitate
site_title: Nomine de servitor
theme: Thema predefinite
trends: Activar tendentias
notification_emails:
software_updates:
label: Un nove version de Mastodon es disponibile
user:
time_zone: Fuso horari
user_role:
name: Nomine
permissions_as_keys: Permissiones
position: Prioritate
'yes': Si

View File

@ -8,6 +8,7 @@ ie:
fields: Tui websitu, pronómines, etá, quocunc quel tu vole. fields: Tui websitu, pronómines, etá, quocunc quel tu vole.
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. 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.' 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. 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: account_alias:
acct: Specificar li usatornomine@dominia del conto ex quel tu vole translocar acct: Specificar li usatornomine@dominia del conto ex quel tu vole translocar
@ -58,6 +59,14 @@ ie:
setting_display_media_default: Celar medie marcat quam sensitiv setting_display_media_default: Celar medie marcat quam sensitiv
setting_display_media_hide_all: Sempre celar medie setting_display_media_hide_all: Sempre celar medie
setting_display_media_show_all: Sempre monstrar medie setting_display_media_show_all: Sempre monstrar medie
setting_use_blurhash: Gradientes es basat sur li colores del celat visuales ma obscura omni detallies
setting_use_pending_items: Celar nov postas detra un clicc vice rular li témpor-linea automaticmen
username: Tu posse usar lítteres, númeres e sublineas
domain_allow:
domain: Ti dominia va posser obtener data de ti-ci servitor, e data venient de it va esser tractat e inmagasinat
email_domain_block:
domain: Ti posse esser li dominia-nómine quel apari in li email-adresse o li MX-registre quel it usa. Ili va esser controlat durant adhesion.
with_dns_records: On va far un prova resoluer li DNS-registres del specificat dominia, e li resultates anc va esser bloccat
featured_tag: featured_tag:
name: 'Vi quelc hashtags usat max recentmen de te:' name: 'Vi quelc hashtags usat max recentmen de te:'
filters: filters:
@ -66,8 +75,12 @@ ie:
hide: Celar completmen li contenete filtrat, quam si it ne existe hide: Celar completmen li contenete filtrat, quam si it ne existe
warn: Celar li contenete filtrat detra un avise mentionant li titul del filtre warn: Celar li contenete filtrat detra un avise mentionant li titul del filtre
form_admin_settings: form_admin_settings:
activity_api_enabled: Númeres de postas publicat localmen, activ usatores, e nov adhesiones in periodes semanal
backups_retention_period: Mantener usator-generat archives por li specificat quantitá de dies. backups_retention_period: Mantener usator-generat archives por li specificat quantitá de dies.
bootstrap_timeline_accounts: Ti-ci contos va esser pinglat al parte superiori del recomandationes por nov usatores. bootstrap_timeline_accounts: Ti-ci contos va esser pinglat al parte superiori del recomandationes por nov usatores.
closed_registrations_message: Monstrat quande adhesiones es cludet
content_cache_retention_period: Omni postas e boosts de altri servitores va esser deletet pos li specificat quantitá de dies. Quelc postas fórsan va esser ínrestaurabil. Omni pertinent marcatores, favorites e boosts anc va esser perdit e ínpossibil a restaurar.
custom_css: On posse aplicar customisat stiles al web-version de Mastodon.
mascot: Substitue li ilustration in li avansat interfacie web. mascot: Substitue li ilustration in li avansat interfacie web.
peers_api_enabled: Un liste de nómines de dominia queles ti-ci servitor ha incontrat in li fediverse. Ci null data es includet pri ca tu confedera con un cert servitor o ne; it indica solmen que tui servitor conosse it. Usat per servicies colectent general statisticas pri federation. peers_api_enabled: Un liste de nómines de dominia queles ti-ci servitor ha incontrat in li fediverse. Ci null data es includet pri ca tu confedera con un cert servitor o ne; it indica solmen que tui servitor conosse it. Usat per servicies colectent general statisticas pri federation.
profile_directory: Li profilarium monstra omni usatores volent esser decovribil. profile_directory: Li profilarium monstra omni usatores volent esser decovribil.
@ -86,6 +99,7 @@ ie:
ip_block: ip_block:
comment: Facultativ. Ne obliviar pro quo tu adjuntet ti-ci regul. comment: Facultativ. Ne obliviar pro quo tu adjuntet ti-ci regul.
expires_in: IP-adresses es un ressurse finit, quelcvez partit e transferet de manu a manu. Pro to, un índefinit bloccada de IP ne es recomandat. expires_in: IP-adresses es un ressurse finit, quelcvez partit e transferet de manu a manu. Pro to, un índefinit bloccada de IP ne es recomandat.
ip: Intrar un adresse IPv4 o IPv6. Tu posse bloccar un tot intervalle de ili con li sintaxe CIDR. Atention a ne bloccar te self!
severities: severities:
no_access: Bloccar accesse a omni ressurses no_access: Bloccar accesse a omni ressurses
sign_up_block: Nov registrationes ne va esser possibil sign_up_block: Nov registrationes ne va esser possibil
@ -93,6 +107,10 @@ ie:
severity: Selecter quo va evenir con demandes ex ti-ci IP severity: Selecter quo va evenir con demandes ex ti-ci IP
rule: rule:
text: Descrir un regul o postulation por usatores sur ti-ci servitor. Prova scrir un descrition curt e simplic text: Descrir un regul o postulation por usatores sur ti-ci servitor. Prova scrir un descrition curt e simplic
sessions:
otp: 'Intrar li 2-factor code generat del app sur tui portabile o usar un de tui codes de recuperation:'
settings:
show_application: Totvez, tu va sempre posser vider quel app ha publicat tui posta.
user: user:
role: Permissiones de usator decidet per su rol role: Permissiones de usator decidet per su rol
user_role: user_role:
@ -111,6 +129,7 @@ ie:
name: Etiquette name: Etiquette
value: Contenete value: Contenete
indexable: Includer public postas in resultates de sercha indexable: Includer public postas in resultates de sercha
unlocked: Automaticmen acceptar nov sequitores
account_alias: account_alias:
acct: Usator-nómine del anteyan conto acct: Usator-nómine del anteyan conto
account_migration: account_migration:
@ -158,6 +177,7 @@ ie:
max_uses: Max grand númere de usas max_uses: Max grand númere de usas
new_password: Nov passa-parol new_password: Nov passa-parol
note: Biografie note: Biografie
otp_attempt: 2-factor code
password: Passa-parol password: Passa-parol
phrase: Clave-parol o frase phrase: Clave-parol o frase
setting_advanced_layout: Possibilisar web-interfacie avansat setting_advanced_layout: Possibilisar web-interfacie avansat
@ -165,10 +185,13 @@ ie:
setting_default_language: Lingue in quel postar setting_default_language: Lingue in quel postar
setting_default_privacy: Privatie de postada setting_default_privacy: Privatie de postada
setting_default_sensitive: Sempre marcar medie quam sensitiv setting_default_sensitive: Sempre marcar medie quam sensitiv
setting_display_media: Exposition de medie
setting_display_media_default: Predefinitiones setting_display_media_default: Predefinitiones
setting_display_media_hide_all: Celar omno setting_display_media_hide_all: Celar omno
setting_display_media_show_all: Monstrar omno setting_display_media_show_all: Monstrar omno
setting_expand_spoilers: Sempre expander postas marcat con admonitiones de contenete setting_expand_spoilers: Sempre expander postas marcat con admonitiones de contenete
setting_hide_network: Celar tui grafica social
setting_reduce_motion: Reducter motion in animationes
setting_system_font_ui: Usar predefinit fonte de sistema setting_system_font_ui: Usar predefinit fonte de sistema
setting_theme: Tema de situ setting_theme: Tema de situ
setting_trends: Monstrar li hodial tendenties setting_trends: Monstrar li hodial tendenties
@ -179,7 +202,10 @@ ie:
title: Titul title: Titul
type: Specie de importation type: Specie de importation
username: Nómine de usator username: Nómine de usator
username_or_email: Usator-nómine o E-posta
whole_word: Plen parol whole_word: Plen parol
email_domain_block:
with_dns_records: Includer archives MX e IPs del dominia
featured_tag: featured_tag:
name: Hashtag name: Hashtag
filters: filters:
@ -187,22 +213,36 @@ ie:
hide: Celar completmen hide: Celar completmen
warn: Celar con un admonition warn: Celar con un admonition
form_admin_settings: form_admin_settings:
activity_api_enabled: Publicar agregat statisticas pri usator-activitá in li API
backups_retention_period: Periode de retener archives de usator backups_retention_period: Periode de retener archives de usator
bootstrap_timeline_accounts: Sempre recomandar ti-ci contos a nov usatores bootstrap_timeline_accounts: Sempre recomandar ti-ci contos a nov usatores
closed_registrations_message: Customisat missage quande registration ne disponibil closed_registrations_message: Customisat missage quande registration ne disponibil
content_cache_retention_period: Periode de retention por cachat contenete
custom_css: Custom CSS custom_css: Custom CSS
media_cache_retention_period: Periode de retention por cachat medie
peers_api_enabled: Publicar liste de conosset servitores per li API
profile_directory: Possibilisar profilarium profile_directory: Possibilisar profilarium
registrations_mode: Qui posse registrar se registrations_mode: Qui posse registrar se
require_invite_text: Exiger un rason por adherer se
show_domain_blocks: Vider bloccas de dominia show_domain_blocks: Vider bloccas de dominia
show_domain_blocks_rationale: Monstrar pro quo cert dominias esset bloccat show_domain_blocks_rationale: Monstrar pro quo cert dominias esset bloccat
site_contact_email: Contact e-mail adresse site_contact_email: Contact e-mail adresse
site_contact_username: Usator-nómine de contact site_contact_username: Usator-nómine de contact
site_extended_description: Extendet descrition site_extended_description: Extendet descrition
site_short_description: Descrition del servitor
site_terms: Politica pri Privatie
site_title: Nómine de servitor site_title: Nómine de servitor
status_page_url: URL de statu-págine
theme: Predefenit tema theme: Predefenit tema
thumbnail: Miniatura del servitor
timeline_preview: Permisser accesse ínautenticat al public témpor-lineas
trendable_by_default: Possibilisar tendenties sin priori inspection trendable_by_default: Possibilisar tendenties sin priori inspection
trends: Possibilisar tendenties trends: Possibilisar tendenties
trends_as_landing_page: Usar tendenties quam frontispicie trends_as_landing_page: Usar tendenties quam frontispicie
interactions:
must_be_follower: Bloccar notificationes de tis qui ne seque te
must_be_following: Bloccar notificationes de tis quem tu ne seque
must_be_following_dm: Bloccar direct missages de tis quem tu ne seque
invite: invite:
comment: Comentar comment: Comentar
invite_request: invite_request:
@ -216,27 +256,38 @@ ie:
sign_up_requires_approval: Limitar usator-registrationes sign_up_requires_approval: Limitar usator-registrationes
severity: Regul severity: Regul
notification_emails: notification_emails:
appeal: Alqui apella un decision moderatori
digest: Inviar compendies per email
favourite: Alqui favoritisat tui posta favourite: Alqui favoritisat tui posta
follow: Alqui sequet te follow: Alqui sequet te
follow_request: Alqui petit sequer te follow_request: Alqui petit sequer te
mention: Alqui mentionat te mention: Alqui mentionat te
pending_account: Nov conto besonant inspection pending_account: Nov conto besonant inspection
reblog: Alqui boostat tui posta
report: Nov raporte es submisset report: Nov raporte es submisset
software_updates: software_updates:
all: Notificar pri omni nov actualisationes all: Notificar pri omni nov actualisationes
critical: Notificar solmen pri critical actualisationes critical: Notificar solmen pri critical actualisationes
label: Un nov version de Mastodon es disponibil label: Un nov version de Mastodon es disponibil
none: Nequande notificar pri actualisationes (ne recomandat)
patch: Notificar pri problema-fixant actualisationes
trending_tag: Nov tendentie besonant inspection trending_tag: Nov tendentie besonant inspection
rule: rule:
text: Regul text: Regul
settings:
indexable: Includer profil-pagine in serchatores
show_application: Monstrar de quel aplication tu fat un posta
tag: tag:
listable: Permisser que ti hashtag apari in serchas e suggestiones
name: Hashtag name: Hashtag
trendable: Permisse que ti-ci hashtag apari sub tendenties trendable: Permisse que ti-ci hashtag apari sub tendenties
usable: Permisser que postas usa ti hashtag
user: user:
role: Rol role: Rol
time_zone: Zone temporal time_zone: Zone temporal
user_role: user_role:
color: Color del insignie color: Color del insignie
highlighted: Monstrar rol quam insigne sur usator-profiles
name: Nómine name: Nómine
permissions_as_keys: Permissiones permissions_as_keys: Permissiones
position: Prioritá position: Prioritá

View File

@ -149,6 +149,8 @@ sk:
text: Prečo sa k nám chceš pridať? text: Prečo sa k nám chceš pridať?
ip_block: ip_block:
comment: Komentár comment: Komentár
severities:
sign_up_requires_approval: Obmedz registrácie
severity: Pravidlo severity: Pravidlo
notification_emails: notification_emails:
digest: Zasielať súhrnné emaily digest: Zasielať súhrnné emaily

View File

@ -374,6 +374,7 @@ sk:
view: Ukáž blokovanie domén view: Ukáž blokovanie domén
email_domain_blocks: email_domain_blocks:
add_new: Pridaj nový add_new: Pridaj nový
allow_registrations_with_approval: Povoľ registrovanie so schválením
created_msg: Emailová doména bola úspešne pridaná do zoznamu zakázaných created_msg: Emailová doména bola úspešne pridaná do zoznamu zakázaných
delete: Vymaž delete: Vymaž
dns: dns:

View File

@ -439,6 +439,7 @@ sl:
view: Pokaži domenski blok view: Pokaži domenski blok
email_domain_blocks: email_domain_blocks:
add_new: Dodaj novo add_new: Dodaj novo
allow_registrations_with_approval: Dovoli registracije z odobritvijo
attempts_over_week: attempts_over_week:
few: "%{count} poskusi prijave zadnji teden" few: "%{count} poskusi prijave zadnji teden"
one: "%{count} poskus prijave zadnji teden" one: "%{count} poskus prijave zadnji teden"

View File

@ -425,6 +425,7 @@ sq:
view: Shihni bllokim përkatësie view: Shihni bllokim përkatësie
email_domain_blocks: email_domain_blocks:
add_new: Shtoni të ri add_new: Shtoni të ri
allow_registrations_with_approval: Lejo regjistrim me miratim
attempts_over_week: attempts_over_week:
one: "%{count} përpjekje gjatë javës së shkuar" one: "%{count} përpjekje gjatë javës së shkuar"
other: "%{count} përpjekje regjistrimi gjatë javës së kaluar" other: "%{count} përpjekje regjistrimi gjatë javës së kaluar"

View File

@ -432,6 +432,7 @@ sr-Latn:
view: Pročitaj blok domena view: Pročitaj blok domena
email_domain_blocks: email_domain_blocks:
add_new: Dodaj novi add_new: Dodaj novi
allow_registrations_with_approval: Dozvoli registraciju uz odobrenje
attempts_over_week: attempts_over_week:
few: "%{count} pokušaja tokom prethodne nedelje" few: "%{count} pokušaja tokom prethodne nedelje"
one: "%{count} pokušaj tokom prethodne nedelje" one: "%{count} pokušaj tokom prethodne nedelje"

View File

@ -432,6 +432,7 @@ sr:
view: Прочитај блок домена view: Прочитај блок домена
email_domain_blocks: email_domain_blocks:
add_new: Додај нови add_new: Додај нови
allow_registrations_with_approval: Дозволи регистрацију уз одобрење
attempts_over_week: attempts_over_week:
few: "%{count} покушаја током претходне недеље" few: "%{count} покушаја током претходне недеље"
one: "%{count} покушај током претходне недеље" one: "%{count} покушај током претходне недеље"

View File

@ -418,6 +418,7 @@ th:
view: ดูการปิดกั้นโดเมน view: ดูการปิดกั้นโดเมน
email_domain_blocks: email_domain_blocks:
add_new: เพิ่มใหม่ add_new: เพิ่มใหม่
allow_registrations_with_approval: อนุญาตการลงทะเบียนด้วยการอนุมัติ
attempts_over_week: attempts_over_week:
other: "%{count} ความพยายามในการลงทะเบียนในช่วงสัปดาห์ที่ผ่านมา" other: "%{count} ความพยายามในการลงทะเบียนในช่วงสัปดาห์ที่ผ่านมา"
created_msg: ปิดกั้นโดเมนอีเมลสำเร็จ created_msg: ปิดกั้นโดเมนอีเมลสำเร็จ

View File

@ -425,6 +425,7 @@ tr:
view: Alan adı bloğunu görüntüle view: Alan adı bloğunu görüntüle
email_domain_blocks: email_domain_blocks:
add_new: Yeni ekle add_new: Yeni ekle
allow_registrations_with_approval: Onaylı kayıtlara izin ver
attempts_over_week: attempts_over_week:
one: Son haftada %{count} deneme one: Son haftada %{count} deneme
other: Son haftada %{count} kayıt denemesi other: Son haftada %{count} kayıt denemesi

View File

@ -439,6 +439,7 @@ uk:
view: Переглянути заблоковані домени view: Переглянути заблоковані домени
email_domain_blocks: email_domain_blocks:
add_new: Додати add_new: Додати
allow_registrations_with_approval: Дозволити реєстрації із затвердженням
attempts_over_week: attempts_over_week:
few: "%{count} спроби входу за останній тиждень" few: "%{count} спроби входу за останній тиждень"
many: "%{count} спроб входу за останній тиждень" many: "%{count} спроб входу за останній тиждень"

View File

@ -418,6 +418,7 @@ vi:
view: Xem máy chủ chặn view: Xem máy chủ chặn
email_domain_blocks: email_domain_blocks:
add_new: Thêm mới add_new: Thêm mới
allow_registrations_with_approval: Cho đăng ký nhưng duyệt thủ công
attempts_over_week: attempts_over_week:
other: "%{count} lần thử đăng ký vào tuần trước" other: "%{count} lần thử đăng ký vào tuần trước"
created_msg: Đã chặn tên miền email này created_msg: Đã chặn tên miền email này

View File

@ -418,6 +418,7 @@ zh-CN:
view: 查看域名屏蔽 view: 查看域名屏蔽
email_domain_blocks: email_domain_blocks:
add_new: 添加新条目 add_new: 添加新条目
allow_registrations_with_approval: 注册时需要批准
attempts_over_week: attempts_over_week:
other: 上周有 %{count} 次注册尝试 other: 上周有 %{count} 次注册尝试
created_msg: 成功屏蔽电子邮件域名 created_msg: 成功屏蔽电子邮件域名

View File

@ -418,6 +418,7 @@ zh-HK:
view: 顯示正被阻隔的網域 view: 顯示正被阻隔的網域
email_domain_blocks: email_domain_blocks:
add_new: 新增 add_new: 新增
allow_registrations_with_approval: 允許經批准的註冊
attempts_over_week: attempts_over_week:
other: 上週嘗試了註冊 %{count} 次 other: 上週嘗試了註冊 %{count} 次
created_msg: 已新增電郵網域阻隔 created_msg: 已新增電郵網域阻隔

View File

@ -22,11 +22,9 @@ class TruncatePreviewCards < ActiveRecord::Migration[5.1]
end end
def down def down
if ActiveRecord::Base.connection.table_exists? 'deprecated_preview_cards' raise ActiveRecord::IrreversibleMigration, 'Previous preview cards table has already been removed' unless ActiveRecord::Base.connection.table_exists? 'deprecated_preview_cards'
drop_table :preview_cards
rename_table :deprecated_preview_cards, :preview_cards drop_table :preview_cards
else rename_table :deprecated_preview_cards, :preview_cards
raise ActiveRecord::IrreversibleMigration, 'Previous preview cards table has already been removed'
end
end end
end end

View File

@ -105,7 +105,7 @@ class MigrateAccountConversations < ActiveRecord::Migration[5.2]
end end
end end
notifications_about_direct_statuses.includes(:account, mention: { status: [:account, mentions: :account] }).find_each do |notification| notifications_about_direct_statuses.includes(:account, mention: { status: [:account, { mentions: :account }] }).find_each do |notification|
MigrationAccountConversation.add_status(notification.account, notification.target_status) MigrationAccountConversation.add_status(notification.account, notification.target_status)
migrated += 1 migrated += 1

View File

@ -9,7 +9,7 @@ class PreserveOldLayoutForExistingUsers < ActiveRecord::Migration[5.2]
# on the to-be-changed default # on the to-be-changed default
User.where(User.arel_table[:current_sign_in_at].gteq(1.month.ago)).find_each do |user| User.where(User.arel_table[:current_sign_in_at].gteq(1.month.ago)).find_each do |user|
next if Setting.unscoped.where(thing_type: 'User', thing_id: user.id, var: 'advanced_layout').exists? next if Setting.unscoped.exists?(thing_type: 'User', thing_id: user.id, var: 'advanced_layout')
user.settings.advanced_layout = true user.settings.advanced_layout = true
end end

View File

@ -0,0 +1,7 @@
# frozen_string_literal: true
class AddAllowWithApprovalToEmailDomainBlocks < ActiveRecord::Migration[7.1]
def change
add_column :email_domain_blocks, :allow_with_approval, :boolean, default: false, null: false
end
end

View File

@ -6,36 +6,55 @@ class MigrateSettingsToUserRoles < ActiveRecord::Migration[6.1]
class UserRole < ApplicationRecord; end class UserRole < ApplicationRecord; end
def up def up
owner_role = UserRole.find_by(name: 'Owner') process_role_everyone
admin_role = UserRole.find_by(name: 'Admin') process_role_owner
moderator_role = UserRole.find_by(name: 'Moderator') process_role_admin
everyone_role = UserRole.find_by(id: -99) process_role_moderator
min_invite_role = Setting.min_invite_role
show_staff_badge = Setting.show_staff_badge
if everyone_role
everyone_role.permissions &= ~::UserRole::FLAGS[:invite_users] unless min_invite_role == 'user'
everyone_role.save
end
if owner_role
owner_role.highlighted = show_staff_badge
owner_role.save
end
if admin_role
admin_role.permissions |= ::UserRole::FLAGS[:invite_users] if %w(admin moderator).include?(min_invite_role)
admin_role.highlighted = show_staff_badge
admin_role.save
end
if moderator_role
moderator_role.permissions |= ::UserRole::FLAGS[:invite_users] if %w(moderator).include?(min_invite_role)
moderator_role.highlighted = show_staff_badge
moderator_role.save
end
end end
def down; end def down; end
private
def process_role_everyone
everyone_role = UserRole.find_by(id: -99)
return unless everyone_role
everyone_role.permissions &= ~::UserRole::FLAGS[:invite_users] unless min_invite_role == 'user'
everyone_role.save
end
def process_role_owner
owner_role = UserRole.find_by(name: 'Owner')
return unless owner_role
owner_role.highlighted = show_staff_badge
owner_role.save
end
def process_role_admin
admin_role = UserRole.find_by(name: 'Admin')
return unless admin_role
admin_role.permissions |= ::UserRole::FLAGS[:invite_users] if %w(admin moderator).include?(min_invite_role)
admin_role.highlighted = show_staff_badge
admin_role.save
end
def process_role_moderator
moderator_role = UserRole.find_by(name: 'Moderator')
return unless moderator_role
moderator_role.permissions |= ::UserRole::FLAGS[:invite_users] if %w(moderator).include?(min_invite_role)
moderator_role.highlighted = show_staff_badge
moderator_role.save
end
def min_invite_role
Setting.min_invite_role
end
def show_staff_badge
Setting.show_staff_badge
end
end end

View File

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.1].define(version: 2023_12_12_073317) do ActiveRecord::Schema[7.1].define(version: 2023_12_22_100226) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@ -435,6 +435,7 @@ ActiveRecord::Schema[7.1].define(version: 2023_12_12_073317) do
t.datetime "created_at", precision: nil, null: false t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false
t.bigint "parent_id" t.bigint "parent_id"
t.boolean "allow_with_approval", default: false, null: false
t.index ["domain"], name: "index_email_domain_blocks_on_domain", unique: true t.index ["domain"], name: "index_email_domain_blocks_on_domain", unique: true
end end

View File

@ -48,19 +48,31 @@ module Mastodon::CLI
exit(1) unless ask('Type in the domain of the server to confirm:') == Rails.configuration.x.local_domain exit(1) unless ask('Type in the domain of the server to confirm:') == Rails.configuration.x.local_domain
say('This operation WILL NOT be reversible.', :yellow) say(<<~WARNING, :yellow)
say('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.', :yellow) This operation WILL NOT be reversible.
say('The deletion process itself may take a long time, and will be handled by Sidekiq, so do not shut it down until it has finished (you will be able to re-run this command to see the state of the self-destruct process).', :yellow) While the data won't be erased locally, the server will be in a BROKEN STATE afterwards.
The deletion process itself may take a long time, and will be handled by Sidekiq, so do not shut it down until it has finished (you will be able to re-run this command to see the state of the self-destruct process).
WARNING
exit(1) if no?('Are you sure you want to proceed?') exit(1) if no?('Are you sure you want to proceed?')
self_destruct_value = Rails.application.message_verifier('self-destruct').generate(Rails.configuration.x.local_domain) say(<<~INSTRUCTIONS, :green)
say('To switch Mastodon to self-destruct mode, add the following variable to your evironment (e.g. by adding a line to your `.env.production`) and restart all Mastodon processes:', :green) To switch Mastodon to self-destruct mode, add the following variable to your evironment (e.g. by adding a line to your `.env.production`) and restart all Mastodon processes:
say(" SELF_DESTRUCT=#{self_destruct_value}", :green) SELF_DESTRUCT=#{self_destruct_value}
say("\nYou can re-run this command to see the state of the self-destruct process.", :green) You can re-run this command to see the state of the self-destruct process.
INSTRUCTIONS
rescue Interrupt rescue Interrupt
exit(1) exit(1)
end end
private
def self_destruct_value
Rails
.application
.message_verifier('self-destruct')
.generate(Rails.configuration.x.local_domain)
end
end end
end end
end end

View File

@ -34,7 +34,7 @@ REDIS_CACHE_PARAMS = {
driver: :hiredis, driver: :hiredis,
url: ENV['CACHE_REDIS_URL'], url: ENV['CACHE_REDIS_URL'],
expires_in: 10.minutes, expires_in: 10.minutes,
namespace: cache_namespace, namespace: "#{cache_namespace}:7.1",
connect_timeout: 5, connect_timeout: 5,
pool: { pool: {
size: Sidekiq.server? ? Sidekiq[:concurrency] : Integer(ENV['MAX_THREADS'] || 5), size: Sidekiq.server? ? Sidekiq[:concurrency] : Integer(ENV['MAX_THREADS'] || 5),

View File

@ -205,7 +205,7 @@
"prettier": "^3.0.0", "prettier": "^3.0.0",
"react-test-renderer": "^18.2.0", "react-test-renderer": "^18.2.0",
"stylelint": "^16.0.2", "stylelint": "^16.0.2",
"stylelint-config-standard-scss": "^12.0.0", "stylelint-config-standard-scss": "^13.0.0",
"typescript": "^5.0.4", "typescript": "^5.0.4",
"webpack-dev-server": "^3.11.3", "webpack-dev-server": "^3.11.3",
"yargs": "^17.7.2" "yargs": "^17.7.2"

View File

@ -12,13 +12,14 @@ RSpec.describe Admin::EmailDomainBlocksController do
describe 'GET #index' do describe 'GET #index' do
around do |example| around do |example|
default_per_page = EmailDomainBlock.default_per_page default_per_page = EmailDomainBlock.default_per_page
EmailDomainBlock.paginates_per 1 EmailDomainBlock.paginates_per 2
example.run example.run
EmailDomainBlock.paginates_per default_per_page EmailDomainBlock.paginates_per default_per_page
end end
it 'returns http success' do it 'returns http success' do
2.times { Fabricate(:email_domain_block) } 2.times { Fabricate(:email_domain_block) }
Fabricate(:email_domain_block, allow_with_approval: true)
get :index, params: { page: 2 } get :index, params: { page: 2 }
expect(response).to have_http_status(200) expect(response).to have_http_status(200)
end end
@ -34,6 +35,16 @@ RSpec.describe Admin::EmailDomainBlocksController do
describe 'POST #create' do describe 'POST #create' do
context 'when resolve button is pressed' do context 'when resolve button is pressed' do
before do before do
resolver = instance_double(Resolv::DNS)
allow(resolver).to receive(:getresources)
.with('example.com', Resolv::DNS::Resource::IN::MX)
.and_return([])
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
allow(resolver).to receive(:timeouts=).and_return(nil)
allow(Resolv::DNS).to receive(:open).and_yield(resolver)
post :create, params: { email_domain_block: { domain: 'example.com' } } post :create, params: { email_domain_block: { domain: 'example.com' } }
end end

View File

@ -135,6 +135,25 @@ RSpec.describe Auth::RegistrationsController do
end end
end end
context 'when user has an email address requiring approval' do
subject do
Setting.registrations_mode = 'open'
Fabricate(:email_domain_block, allow_with_approval: true, domain: 'example.com')
request.headers['Accept-Language'] = accept_language
post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', agreement: 'true' } }
end
it 'creates unapproved user and redirects to setup' do
subject
expect(response).to redirect_to auth_setup_path
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)
end
end
context 'with Approval-based registrations without invite' do context 'with Approval-based registrations without invite' do
subject do subject do
Setting.registrations_mode = 'approved' Setting.registrations_mode = 'approved'

View File

@ -22,7 +22,7 @@ describe 'Admin::Accounts' do
context 'without selecting any accounts' do context 'without selecting any accounts' do
it 'displays a notice about account selection' do it 'displays a notice about account selection' do
click_button button_for_suspend click_on button_for_suspend
expect(page).to have_content(selection_error_text) expect(page).to have_content(selection_error_text)
end end
@ -32,7 +32,7 @@ describe 'Admin::Accounts' do
it 'suspends the account' do it 'suspends the account' do
batch_checkbox_for(approved_user_account).check batch_checkbox_for(approved_user_account).check
click_button button_for_suspend click_on button_for_suspend
expect(approved_user_account.reload).to be_suspended expect(approved_user_account.reload).to be_suspended
end end
@ -42,7 +42,7 @@ describe 'Admin::Accounts' do
it 'approves the account user' do it 'approves the account user' do
batch_checkbox_for(unapproved_user_account).check batch_checkbox_for(unapproved_user_account).check
click_button button_for_approve click_on button_for_approve
expect(unapproved_user_account.reload.user).to be_approved expect(unapproved_user_account.reload.user).to be_approved
end end
@ -52,7 +52,7 @@ describe 'Admin::Accounts' do
it 'rejects and removes the account' do it 'rejects and removes the account' do
batch_checkbox_for(unapproved_user_account).check batch_checkbox_for(unapproved_user_account).check
click_button button_for_reject click_on button_for_reject
expect { unapproved_user_account.reload }.to raise_error(ActiveRecord::RecordNotFound) expect { unapproved_user_account.reload }.to raise_error(ActiveRecord::RecordNotFound)
end end

View File

@ -16,7 +16,7 @@ describe 'Admin::CustomEmojis' do
context 'without selecting any records' do context 'without selecting any records' do
it 'displays a notice about selection' do it 'displays a notice about selection' do
click_button button_for_enable click_on button_for_enable
expect(page).to have_content(selection_error_text) expect(page).to have_content(selection_error_text)
end end

View File

@ -14,7 +14,7 @@ describe 'blocking domains through the moderation interface' do
fill_in 'domain_block_domain', with: 'example.com' fill_in 'domain_block_domain', with: 'example.com'
select I18n.t('admin.domain_blocks.new.severity.silence'), from: 'domain_block_severity' select I18n.t('admin.domain_blocks.new.severity.silence'), from: 'domain_block_severity'
click_button I18n.t('admin.domain_blocks.new.create') click_on I18n.t('admin.domain_blocks.new.create')
expect(DomainBlock.exists?(domain: 'example.com', severity: 'silence')).to be true expect(DomainBlock.exists?(domain: 'example.com', severity: 'silence')).to be true
expect(DomainBlockWorker).to have_received(:perform_async) expect(DomainBlockWorker).to have_received(:perform_async)
@ -27,14 +27,14 @@ describe 'blocking domains through the moderation interface' do
fill_in 'domain_block_domain', with: 'example.com' fill_in 'domain_block_domain', with: 'example.com'
select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity' select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity'
click_button I18n.t('admin.domain_blocks.new.create') click_on I18n.t('admin.domain_blocks.new.create')
# It doesn't immediately block but presents a confirmation screen # It doesn't immediately block but presents a confirmation screen
expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com')) expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com'))
expect(DomainBlockWorker).to_not have_received(:perform_async) expect(DomainBlockWorker).to_not have_received(:perform_async)
# Confirming creates a block # Confirming creates a block
click_button I18n.t('admin.domain_blocks.confirm_suspension.confirm') click_on I18n.t('admin.domain_blocks.confirm_suspension.confirm')
expect(DomainBlock.exists?(domain: 'example.com', severity: 'suspend')).to be true expect(DomainBlock.exists?(domain: 'example.com', severity: 'suspend')).to be true
expect(DomainBlockWorker).to have_received(:perform_async) expect(DomainBlockWorker).to have_received(:perform_async)
@ -49,14 +49,14 @@ describe 'blocking domains through the moderation interface' do
fill_in 'domain_block_domain', with: 'example.com' fill_in 'domain_block_domain', with: 'example.com'
select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity' select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity'
click_button I18n.t('admin.domain_blocks.new.create') click_on I18n.t('admin.domain_blocks.new.create')
# It doesn't immediately block but presents a confirmation screen # It doesn't immediately block but presents a confirmation screen
expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com')) expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com'))
expect(DomainBlockWorker).to_not have_received(:perform_async) expect(DomainBlockWorker).to_not have_received(:perform_async)
# Confirming updates the block # Confirming updates the block
click_button I18n.t('admin.domain_blocks.confirm_suspension.confirm') click_on I18n.t('admin.domain_blocks.confirm_suspension.confirm')
expect(domain_block.reload.severity).to eq 'suspend' expect(domain_block.reload.severity).to eq 'suspend'
expect(DomainBlockWorker).to have_received(:perform_async) expect(DomainBlockWorker).to have_received(:perform_async)
@ -71,14 +71,14 @@ describe 'blocking domains through the moderation interface' do
fill_in 'domain_block_domain', with: 'subdomain.example.com' fill_in 'domain_block_domain', with: 'subdomain.example.com'
select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity' select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity'
click_button I18n.t('admin.domain_blocks.new.create') click_on I18n.t('admin.domain_blocks.new.create')
# It doesn't immediately block but presents a confirmation screen # It doesn't immediately block but presents a confirmation screen
expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'subdomain.example.com')) expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'subdomain.example.com'))
expect(DomainBlockWorker).to_not have_received(:perform_async) expect(DomainBlockWorker).to_not have_received(:perform_async)
# Confirming creates the block # Confirming creates the block
click_button I18n.t('admin.domain_blocks.confirm_suspension.confirm') click_on I18n.t('admin.domain_blocks.confirm_suspension.confirm')
expect(DomainBlock.where(domain: 'subdomain.example.com', severity: 'suspend')).to exist expect(DomainBlock.where(domain: 'subdomain.example.com', severity: 'suspend')).to exist
expect(DomainBlockWorker).to have_received(:perform_async) expect(DomainBlockWorker).to have_received(:perform_async)
@ -96,14 +96,14 @@ describe 'blocking domains through the moderation interface' do
visit edit_admin_domain_block_path(domain_block) visit edit_admin_domain_block_path(domain_block)
select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity' select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity'
click_button I18n.t('generic.save_changes') click_on I18n.t('generic.save_changes')
# It doesn't immediately block but presents a confirmation screen # It doesn't immediately block but presents a confirmation screen
expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com')) expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com'))
expect(DomainBlockWorker).to_not have_received(:perform_async) expect(DomainBlockWorker).to_not have_received(:perform_async)
# Confirming updates the block # Confirming updates the block
click_button I18n.t('admin.domain_blocks.confirm_suspension.confirm') click_on I18n.t('admin.domain_blocks.confirm_suspension.confirm')
expect(DomainBlockWorker).to have_received(:perform_async) expect(DomainBlockWorker).to have_received(:perform_async)
expect(domain_block.reload.severity).to eq 'suspend' expect(domain_block.reload.severity).to eq 'suspend'

View File

@ -16,7 +16,7 @@ describe 'Admin::EmailDomainBlocks' do
context 'without selecting any records' do context 'without selecting any records' do
it 'displays a notice about selection' do it 'displays a notice about selection' do
click_button button_for_delete click_on button_for_delete
expect(page).to have_content(selection_error_text) expect(page).to have_content(selection_error_text)
end end

View File

@ -16,7 +16,7 @@ describe 'Admin::IpBlocks' do
context 'without selecting any records' do context 'without selecting any records' do
it 'displays a notice about selection' do it 'displays a notice about selection' do
click_button button_for_delete click_on button_for_delete
expect(page).to have_content(selection_error_text) expect(page).to have_content(selection_error_text)
end end

View File

@ -11,13 +11,13 @@ describe 'finding software updates through the admin interface' do
it 'shows a link to the software updates page, which links to release notes' do it 'shows a link to the software updates page, which links to release notes' do
visit settings_profile_path visit settings_profile_path
click_link I18n.t('admin.critical_update_pending') click_on I18n.t('admin.critical_update_pending')
expect(page).to have_title(I18n.t('admin.software_updates.title')) expect(page).to have_title(I18n.t('admin.software_updates.title'))
expect(page).to have_content('99.99.99') expect(page).to have_content('99.99.99')
click_link I18n.t('admin.software_updates.release_notes') click_on I18n.t('admin.software_updates.release_notes')
expect(page).to have_current_path('https://github.com/mastodon/mastodon/releases/v99', url: true) expect(page).to have_current_path('https://github.com/mastodon/mastodon/releases/v99', url: true)
end end
end end

View File

@ -17,7 +17,7 @@ describe 'Admin::Statuses' do
context 'without selecting any records' do context 'without selecting any records' do
it 'displays a notice about selection' do it 'displays a notice about selection' do
click_button button_for_report click_on button_for_report
expect(page).to have_content(selection_error_text) expect(page).to have_content(selection_error_text)
end end

View File

@ -16,7 +16,7 @@ describe 'Admin::Trends::Links::PreviewCardProviders' do
context 'without selecting any records' do context 'without selecting any records' do
it 'displays a notice about selection' do it 'displays a notice about selection' do
click_button button_for_allow click_on button_for_allow
expect(page).to have_content(selection_error_text) expect(page).to have_content(selection_error_text)
end end

View File

@ -16,7 +16,7 @@ describe 'Admin::Trends::Links' do
context 'without selecting any records' do context 'without selecting any records' do
it 'displays a notice about selection' do it 'displays a notice about selection' do
click_button button_for_allow click_on button_for_allow
expect(page).to have_content(selection_error_text) expect(page).to have_content(selection_error_text)
end end

Some files were not shown because too many files have changed in this diff Show More