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`.
shrike
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
libretranslate:
image: libretranslate/libretranslate:v1.5.2
image: libretranslate/libretranslate:v1.5.3
restart: unless-stopped
volumes:
- lt-data:/home/libretranslate/.local

View File

@ -118,15 +118,10 @@ Rails/UnusedIgnoredColumns:
Rails/NegateInclude:
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
RSpec/FilePath:
CustomTransform:
ActivityPub: activitypub
DeepL: deepl
FetchOEmbedService: fetch_oembed_service
OEmbedController: oembed_controller
OStatus: ostatus
Enabled: false
# Reason:
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecnamedsubject

View File

@ -1,6 +1,6 @@
# This configuration was generated by
# `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
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
@ -26,7 +26,7 @@ Lint/NonLocalExitFromIterator:
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
Metrics/AbcSize:
Max: 100
Max: 82
# Configuration parameters: CountBlocks, Max.
Metrics/BlockNesting:
@ -50,7 +50,7 @@ RSpec/MultipleExpectations:
# Configuration parameters: AllowSubject.
RSpec/MultipleMemoizedHelpers:
Max: 21
Max: 17
# Configuration parameters: AllowedGroups.
RSpec/NestedGroups:
@ -66,7 +66,6 @@ Rails/ApplicationController:
Rails/HasAndBelongsToMany:
Exclude:
- 'app/models/concerns/account/associations.rb'
- 'app/models/preview_card.rb'
- 'app/models/status.rb'
- 'app/models/tag.rb'
@ -144,7 +143,6 @@ Rails/WhereExists:
Exclude:
- 'app/controllers/activitypub/inboxes_controller.rb'
- 'app/controllers/admin/email_domain_blocks_controller.rb'
- 'app/controllers/auth/registrations_controller.rb'
- 'app/lib/activitypub/activity/create.rb'
- 'app/lib/delivery_failure_tracker.rb'
- 'app/lib/feed_manager.rb'
@ -160,24 +158,16 @@ Rails/WhereExists:
- 'app/serializers/rest/announcement_serializer.rb'
- 'app/serializers/rest/tag_serializer.rb'
- 'app/services/activitypub/fetch_remote_status_service.rb'
- 'app/services/app_sign_up_service.rb'
- 'app/services/vote_service.rb'
- 'app/validators/reaction_validator.rb'
- 'app/validators/vote_validator.rb'
- 'app/workers/move_worker.rb'
- 'db/migrate/20190529143559_preserve_old_layout_for_existing_users.rb'
- 'lib/tasks/tests.rake'
- 'spec/models/account_spec.rb'
- 'spec/services/activitypub/process_collection_service_spec.rb'
- 'spec/services/purge_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).
# Configuration parameters: AllowedMethods, AllowedPatterns.
# AllowedMethods: ==, equal?, eql?
@ -205,8 +195,8 @@ Style/FetchEnvVar:
- 'config/initializers/devise.rb'
- 'config/initializers/paperclip.rb'
- 'config/initializers/vapid.rb'
- 'lib/premailer_webpack_strategy.rb'
- 'lib/mastodon/redis_config.rb'
- 'lib/premailer_webpack_strategy.rb'
- 'lib/tasks/repo.rake'
- 'spec/features/profile_spec.rb'
@ -223,7 +213,6 @@ Style/FormatStringToken:
# This cop supports unsafe autocorrection (--autocorrect-all).
Style/GlobalStdStream:
Exclude:
- 'config/boot.rb'
- 'config/environments/development.rb'
- 'config/environments/production.rb'
@ -253,8 +242,6 @@ Style/GuardClause:
- 'app/workers/redownload_media_worker.rb'
- 'app/workers/remote_account_refresh_worker.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_pam_authenticatable.rb'
- 'lib/mastodon/cli/accounts.rb'
@ -275,7 +262,6 @@ Style/HashAsLastArrayItem:
- 'app/models/status.rb'
- 'app/services/batched_remove_status_service.rb'
- 'app/services/notify_service.rb'
- 'db/migrate/20181024224956_migrate_account_conversations.rb'
# This cop supports unsafe autocorrection (--autocorrect-all).
Style/HashTransformValues:
@ -415,8 +401,8 @@ Style/TrailingCommaInHashLiteral:
- 'config/environments/test.rb'
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle, MinSize, WordRegex.
# Configuration parameters: WordRegex.
# SupportedStyles: percent, brackets
Style/WordArray:
Exclude:
- 'app/helpers/languages_helper.rb'
EnforcedStyle: percent
MinSize: 3

View File

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

View File

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

View File

@ -40,7 +40,7 @@ module Admin
(@email_domain_block.other_domains || []).uniq.each do |domain|
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
end
end
@ -65,7 +65,7 @@ module Admin
end
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
def form_email_domain_block_batch_params

View File

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

View File

@ -3,150 +3,6 @@
module CacheConcern
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
def vary_by(value, **kwargs)
before_action(**kwargs) do |controller|
@ -196,11 +52,7 @@ module CacheConcern
raw = raw.cache_ids.to_a if raw.is_a?(ActiveRecord::Relation)
return [] if raw.empty?
cached_keys_with_value = begin
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
cached_keys_with_value = Rails.cache.read_multi(*raw).transform_keys(&:id)
uncached_ids = raw.map(&:id) - cached_keys_with_value.keys
@ -208,10 +60,7 @@ module CacheConcern
unless uncached_ids.empty?
uncached = klass.where(id: uncached_ids).with_includes.index_by(&:id)
uncached.each_value do |item|
Rails.cache.write(item, ActiveRecordCoder.dump(item))
end
Rails.cache.write_multi(uncached.values.to_h { |i| [i, i] })
end
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
@account = begin
if username == Rails.configuration.x.local_domain
if username == Rails.configuration.x.local_domain || username == Rails.configuration.x.web_domain
Account.representative
else
Account.find_local!(username)

View File

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

View File

@ -260,6 +260,9 @@
"filter_modal.select_filter.subtitle": "Χρησιμοποιήστε μια υπάρχουσα κατηγορία ή δημιουργήστε μια νέα",
"filter_modal.select_filter.title": "Φιλτράρισμα αυτής της ανάρτησης",
"filter_modal.title.status": "Φιλτράρισμα μιας ανάρτησης",
"firehose.all": "Όλα",
"firehose.local": "Αυτός ο διακομιστής",
"firehose.remote": "Άλλοι διακομιστές",
"follow_request.authorize": "Εξουσιοδότησε",
"follow_request.reject": "Απέρριψε",
"follow_requests.unlocked_explanation": "Παρόλο που ο λογαριασμός σου δεν είναι κλειδωμένος, το προσωπικό του {domain} θεώρησαν πως ίσως να θέλεις να ελέγξεις χειροκίνητα αυτά τα αιτήματα ακολούθησης.",
@ -285,11 +288,15 @@
"hashtag.column_settings.tag_toggle": "Προσθήκη επιπλέον ταμπελών για την κολώνα",
"hashtag.follow": "Παρακολούθηση ετικέτας",
"hashtag.unfollow": "Διακοπή παρακολούθησης ετικέτας",
"home.actions.go_to_suggestions": "Βρείτε άτομα για να ακολουθήσετε",
"home.column_settings.basic": "Βασικές ρυθμίσεις",
"home.column_settings.show_reblogs": "Εμφάνιση προωθήσεων",
"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.title": "Αυτό είναι το σπίτι σας στο Mastodon.",
"home.hide_announcements": "Απόκρυψη ανακοινώσεων",
"home.pending_critical_update.link": "Δείτε ενημερώσεις",
"home.pending_critical_update.title": "Κρίσιμη ενημέρωση ασφαλείας διαθέσιμη!",
"home.show_announcements": "Εμφάνιση ανακοινώσεων",
"interaction_modal.description.follow": "Με έναν λογαριασμό Mastodon, μπορείς να ακολουθήσεις τον/την {name} ώστε να λαμβάνεις τις αναρτήσεις του/της στη δική σου ροή.",
"interaction_modal.description.reblog": "Με ένα λογαριασμό Mastodon, μπορείς να ενισχύσεις αυτή την ανάρτηση για να τη μοιραστείς με τους δικούς σου ακολούθους.",
@ -314,6 +321,7 @@
"keyboard_shortcuts.direct": "για το άνοιγμα της στήλης ιδιωτικών επισημάνσεων",
"keyboard_shortcuts.down": "κίνηση προς τα κάτω στη λίστα",
"keyboard_shortcuts.enter": "Εμφάνιση ανάρτησης",
"keyboard_shortcuts.favourite": "Αγαπημένη δημοσίευση",
"keyboard_shortcuts.federated": "Άνοιγμα ροής συναλλαγών",
"keyboard_shortcuts.heading": "Συντομεύσεις πληκτρολογίου",
"keyboard_shortcuts.home": "Άνοιγμα ροής αρχικής σελίδας",
@ -358,6 +366,7 @@
"lists.search": "Αναζήτησε μεταξύ των ανθρώπων που ακουλουθείς",
"lists.subheading": "Οι λίστες σου",
"load_pending": "{count, plural, one {# νέο στοιχείο} other {# νέα στοιχεία}}",
"loading_indicator.label": "Φόρτωση…",
"media_gallery.toggle_visible": "{number, plural, one {Απόκρυψη εικόνας} other {Απόκρυψη εικόνων}}",
"moved_to_account_banner.text": "Ο λογαριασμός σου {disabledAccount} είναι προσωρινά απενεργοποιημένος επειδή μεταφέρθηκες στον {movedToAccount}.",
"mute_modal.duration": "Διάρκεια",
@ -380,6 +389,7 @@
"navigation_bar.lists": "Λίστες",
"navigation_bar.logout": "Αποσύνδεση",
"navigation_bar.mutes": "Αποσιωπημένοι χρήστες",
"navigation_bar.opened_in_classic_interface": "Δημοσιεύσεις, λογαριασμοί και άλλες συγκεκριμένες σελίδες ανοίγονται από προεπιλογή στην κλασική διεπαφή ιστού.",
"navigation_bar.personal": "Προσωπικά",
"navigation_bar.pins": "Καρφιτσωμένες αναρτήσεις",
"navigation_bar.preferences": "Προτιμήσεις",
@ -403,6 +413,7 @@
"notifications.column_settings.admin.report": "Νέες αναφορές:",
"notifications.column_settings.admin.sign_up": "Νέες εγγραφές:",
"notifications.column_settings.alert": "Ειδοποιήσεις επιφάνειας εργασίας",
"notifications.column_settings.favourite": "Αγαπημένα:",
"notifications.column_settings.filter_bar.advanced": "Εμφάνιση όλων των κατηγοριών",
"notifications.column_settings.filter_bar.category": "Μπάρα γρήγορου φίλτρου",
"notifications.column_settings.filter_bar.show_bar": "Εμφάνιση μπάρας φίλτρου",

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.badges.group": "Gruppo",
"account.block": "Blocar @{name}",
@ -21,9 +25,12 @@
"bundle_column_error.return": "Retornar al initio",
"bundle_modal_error.close": "Clauder",
"bundle_modal_error.retry": "Tentar novemente",
"column.about": "A proposito de",
"column.blocks": "Usatores blocate",
"column.bookmarks": "Marcapaginas",
"column.directory": "Navigar profilos",
"column.favourites": "Favoritos",
"column.firehose": "Fluxos in directe",
"column.home": "Initio",
"column.lists": "Listas",
"column.notifications": "Notificationes",
@ -33,23 +40,28 @@
"compose.language.change": "Cambiar le lingua",
"compose.language.search": "Cercar linguas...",
"compose.published.open": "Aperir",
"compose_form.direct_message_warning_learn_more": "Apprender plus",
"compose_form.poll.add_option": "Adder un option",
"compose_form.poll.remove_option": "Remover iste option",
"confirmation_modal.cancel": "Cancellar",
"confirmations.delete.confirm": "Deler",
"confirmations.delete_list.confirm": "Deler",
"confirmations.edit.confirm": "Modificar",
"confirmations.logout.confirm": "Clauder le session",
"copy_icon_button.copied": "Copiate al area de transferentia",
"copypaste.copied": "Copiate",
"copypaste.copy_to_clipboard": "Copiar al area de transferentia",
"disabled_account_banner.account_settings": "Parametros de conto",
"dismissable_banner.dismiss": "Dimitter",
"emoji_button.activity": "Activitate",
"emoji_button.clear": "Rader",
"emoji_button.custom": "Personalisate",
"emoji_button.search_results": "Resultatos de recerca",
"empty_column.account_unavailable": "Profilo non disponibile",
"errors.unexpected_crash.report_issue": "Signalar un defecto",
"explore.search_results": "Resultatos de recerca",
"explore.trending_links": "Novas",
"filter_modal.select_filter.prompt_new": "Nove categoria: {name}",
"firehose.all": "Toto",
"firehose.local": "Iste servitor",
"firehose.remote": "Altere servitores",
@ -62,23 +74,50 @@
"keyboard_shortcuts.my_profile": "Aperir tu profilo",
"lightbox.close": "Clauder",
"lightbox.next": "Sequente",
"lightbox.previous": "Precedente",
"link_preview.author": "Per {name}",
"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.hide_notifications": "Celar notificationes de iste usator?",
"navigation_bar.about": "A proposito de",
"navigation_bar.advanced_interface": "Aperir in un interfacie web avantiate",
"navigation_bar.blocks": "Usatores blocate",
"navigation_bar.discover": "Discoperir",
"navigation_bar.edit_profile": "Modificar profilo",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.lists": "Listas",
"navigation_bar.logout": "Clauder le session",
"navigation_bar.preferences": "Preferentias",
"navigation_bar.search": "Cercar",
"navigation_bar.security": "Securitate",
"notifications.column_settings.alert": "Notificationes de scriptorio",
"notifications.column_settings.filter_bar.advanced": "Monstrar tote le categorias",
"notifications.column_settings.sound": "Reproducer sono",
"notifications.filter.all": "Toto",
"notifications.filter.favourites": "Favoritos",
"notifications.grant_permission": "Conceder permission.",
"notifications.group": "{count} notificationes",
"onboarding.compose.template": "Salute #Mastodon!",
"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.share_profile.body": "Informe a tus amigos komo toparte en Mastodon",
"onboarding.steps.share_profile.title": "Partaja tu profil de Mastodon",
"password_confirmation.mismatching": "Los dos kodes son desferentes",
"picture_in_picture.restore": "Restora",
"poll.closed": "Serrado",
"poll.refresh": "Arefreska",

View File

@ -606,7 +606,7 @@
"search.quick_action.status_search": "Innlegg som samsvarer med {x}",
"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_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.options": "Søkjealternativ",
"search_popout.quick_actions": "Hurtighandlinger",

View File

@ -606,7 +606,7 @@
"search.quick_action.status_search": "Innlegg som samsvarer med {x}",
"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_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.options": "Alternativer for søk",
"search_popout.quick_actions": "Hurtighandlinger",

View File

@ -32,6 +32,7 @@
"account.featured_tags.last_status_never": "Pa postime",
"account.featured_tags.title": "Hashtagë të zgjedhur të {name}",
"account.follow": "Ndiqeni",
"account.follow_back": "Ndiqe gjithashtu",
"account.followers": "Ndjekës",
"account.followers.empty": "Këtë përdorues ende se ndjek kush.",
"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_short": "Mos i shfaq",
"account.muted": "Heshtuar",
"account.mutual": "Reciproke",
"account.no_bio": "Su dha përshkrim.",
"account.open_original_page": "Hap faqen origjinale",
"account.posts": "Mesazhe",

View File

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

View File

@ -10,7 +10,7 @@ class ContentSecurityPolicy
end
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
private
@ -27,6 +27,15 @@ class ContentSecurityPolicy
s3_alias_host || s3_cloudfront_host || azure_alias_host || s3_hostname_host
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
host_to_url(base_host)
end

View File

@ -11,11 +11,12 @@ module Attachmentable
# For some file extensions, there exist different content
# type variants, and browsers often send the wrong one,
# 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
# `file` utility instead
INCORRECT_CONTENT_TYPES = %w(
audio/vorbis
audio/opus
video/ogg
video/webm
).freeze

View File

@ -17,23 +17,8 @@
class CustomFilter < ApplicationRecord
self.ignored_columns += %w(whole_word irreversible)
# NOTE: We previously used `alias_attribute` but this does not play nicely
# with cache
def title
phrase
end
def title=(value)
self.phrase = value
end
def filter_action
action
end
def filter_action=(value)
self.action = value
end
alias_attribute :title, :phrase
alias_attribute :filter_action, :action
VALID_CONTEXTS = %w(
home
@ -143,6 +128,10 @@ class CustomFilter < ApplicationRecord
end
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

View File

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

View File

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

View File

@ -418,7 +418,7 @@ class User < ApplicationRecord
def set_approved
self.approved = begin
if sign_up_from_ip_requires_approval?
if sign_up_from_ip_requires_approval? || sign_up_email_requires_approval?
false
else
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?
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?
Setting.registrations_mode == 'open'
end

View File

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

View File

@ -47,6 +47,7 @@ class EmailMxValidator < ActiveModel::Validator
dns.timeouts = 5
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|
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 })
- if email_domain_block.allow_with_approval?
·
= t('admin.email_domain_blocks.allow_registrations_with_approval')

View File

@ -7,6 +7,9 @@
.fields-group
= 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)
%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.
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
# not contain `.rb` files, or that should not be reloaded or eager loaded.
# 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.
# 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.
# This matches the behaviour of all other callbacks.
# 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:
attributes:
user:
email: Adresse de e-mail
password: Contrasigno
user/account:
username: Nomine de usator

View File

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

View File

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

View File

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

View File

@ -453,6 +453,7 @@ cy:
view: Gweld bloc parth
email_domain_blocks:
add_new: Ychwanegu
allow_registrations_with_approval: Caniatáu cofrestriadau wedi'u cymeradwyo
attempts_over_week:
few: "%{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
email_domain_blocks:
add_new: Tilføj ny
allow_registrations_with_approval: Tillad registreringer med godkendelse
attempts_over_week:
one: "%{count} tilmeldingsforsøg over den seneste uge"
other: "%{count} tilmeldingsforsøg over den seneste uge"

View File

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

View File

@ -1 +1,25 @@
---
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
two_factor_enabled:
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:
subject: 'Mastodon: Desserral instructiones'
webauthn_credential:
added:
subject: 'Mastodon: Nov clave de securitá'
title: Un nov clave de securitá ha esset adjuntet
deleted:
subject: 'Mastodon: Clave de securitá deletet'
webauthn_disabled:
subject: 'Mastodon: Autentication con claves de securitá desactivisat'
title: Claves de securitá desactivisat
webauthn_enabled:
title: Claves de securitá activisat
omniauth_callbacks:
failure: Ne posset autenticar te de %{kind} pro "%{reason}".
success: Successosimen autenticat de conto %{kind}.
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.
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
not_found: ne trovat
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: Σελιδοδείκτες
conversations: Συνομιλίες
crypto: Κρυπτογράφηση από άκρο σε άκρο
favourites: Αγαπημένα
filters: Φίλτρα
follow: Ακολουθείτε, σε Σίγαση και Αποκλεισμοί
follows: Ακολουθείτε
@ -169,9 +170,10 @@ el:
read:accounts: να βλέπει τα στοιχεία λογαριασμών
read:blocks: να βλέπει τους αποκλεισμένους σου
read:bookmarks: εμφάνιση των σελιδοδεικτών σας
read:favourites: δείτε τα αγαπημένα σας
read:filters: να βλέπει τα φίλτρα σου
read:follows: να βλέπει ποιους ακολουθείς
read:lists: να βλέπει τις λίστες σου
read:follows: δές ποιους ακολουθείς
read:lists: δές τις λίστες σου
read:mutes: να βλέπει ποιους αποσιωπείς
read:notifications: να βλέπει τις ειδοποιήσεις σου
read:reports: να βλέπει τις καταγγελίες σου
@ -183,8 +185,8 @@ el:
write:bookmarks: προσθήκη σελιδοδεικτών
write:conversations: σίγαση και διαγραφή συνομιλιών
write:filters: να δημιουργεί φίλτρα
write:follows: να ακολουθεί ανθρώπους
write:lists: να δημιουργεί λίστες
write:follows: ακολουθήστε ανθρώπους
write:lists: δημιουργία λιστών
write:media: να ανεβάζει πολυμέσα
write:mutes: να αποσιωπεί ανθρώπους και συζητήσεις
write:notifications: να καθαρίζει τις ειδοποιήσεις σου

View File

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

View File

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

View File

@ -425,6 +425,7 @@ en:
view: View domain block
email_domain_blocks:
add_new: Add new
allow_registrations_with_approval: Allow registrations with approval
attempts_over_week:
one: "%{count} attempt 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
email_domain_blocks:
add_new: Agregar nuevo
allow_registrations_with_approval: Permitir crear cuentas con aprobación
attempts_over_week:
one: "%{count} intento durante la última semana"
other: "%{count} intentos durante la última semana"

View File

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

View File

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

View File

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

View File

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

View File

@ -425,6 +425,7 @@ fy:
view: Domeinblokkade besjen
email_domain_blocks:
add_new: Nije tafoegje
allow_registrations_with_approval: Ynskriuwingen mei tastimming tastean
attempts_over_week:
one: "%{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
email_domain_blocks:
add_new: Engadir novo
allow_registrations_with_approval: Permitir crear contas con aprobación
attempts_over_week:
one: "%{count} intento na última semana"
other: "%{count} intentos de conexión na última semana"

View File

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

View File

@ -425,6 +425,7 @@ hu:
view: Domain tiltásának megtekintése
email_domain_blocks:
add_new: Új hozzáadása
allow_registrations_with_approval: Regisztráció engedélyezése jóváhagyással
attempts_over_week:
one: "%{count} próbálkozás 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
'2629746': 1 mense
'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
email_domain_blocks:
add_new: Adjunter un nov
allow_registrations_with_approval: Permisser registrationes con aprobation
attempts_over_week:
one: "%{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
no_email_domain_block_selected: Null email-dominia-bloccas esset changeat pro que null esset selectet
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}
title: Bloccat email-dominias
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.
edit: Modificar rol '%{name}'
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:
one: "%{count} permission"
other: "%{count} permissiones"
privileges:
administrator: Administrator
administrator_description: Usatores con ti permission va trapassar omni permission
delete_user_data: Deleter Data de Usator
delete_user_data_description: Possibilisa que usatores mey deleter li data de altri usatores strax
invite_users: Invitar Usatores
@ -726,6 +730,8 @@ ie:
settings:
about:
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
appearance:
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.
title: Exige que nov usatores solue un CAPTCHA por confirmar lor conto
content_retention:
preamble: Decider qualmen usator-generat contenete es inmagasinat in Mastodon.
title: Retention de contenete
default_noindex:
desc_html: Afecta omni usatores qui ne ha changeat ti parametre personalmen
discovery:
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.
@ -771,11 +780,13 @@ ie:
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.
documentation_link: Aprender plu
release_notes: Version-notas
title: Actualisationes disponibil
type: Specie
types:
major: Majori lansament
minor: Minori lansament
patch: Lapp-version — bug-corectiones e changes facil a aplicar
version: Version
statuses:
account: Autor
@ -967,6 +978,7 @@ ie:
body: Nov versiones de Mastodon ha esset lansat, vu fórsan vole actualisar!
subject: Nov versiones Mastodon es disponibil por %{instance}!
new_trends:
body: 'Li sequent elementes besona un revision ante que on posse monstrar les publicmen:'
new_trending_links:
title: Populari ligamentes
new_trending_statuses:
@ -1385,10 +1397,12 @@ ie:
media_attachments:
validations:
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
migrations:
acct: Translocat a
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.
errors:
already_moved: es li sam conto a equel tu ha ja translocat
@ -1397,6 +1411,9 @@ ie:
not_found: ne posset esser trovat
followers_count: Sequitores al témpor de translocation
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.
past_migrations: Passat migrationes
proceed_with_move: Translocar sequitores
@ -1406,7 +1423,12 @@ ie:
warning:
backreference_required: Li nov conto deve in prim esser configurat por retroreferentiar ti-ci conto
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
redirect: Li profil de tui actual conto va esser actualisat con un anuncie de redirection e va esser excludet de serchas
moderation:
title: Moderation
move_handler:
@ -1805,6 +1827,7 @@ ie:
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.'
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.
verification: Verification
verified_links: Tui verificat ligamentes
@ -1815,9 +1838,12 @@ ie:
success: Tui clave de securitá esset adjuntet con successe.
delete: Deleter
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:
error: Un problema evenit durant li deletion de tui clave de securitá. Ples provar denov.
success: Tui clave de securitá esset successosimen deletet.
invalid_credential: Ínvalid clave de securitá
not_enabled: Tu ancor ne ha possibilisat WebAuthn
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}

View File

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

View File

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

View File

@ -383,7 +383,11 @@ lad:
confirm_suspension:
cancel: Anula
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}
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
destroyed_msg: El bloko de domeno se dezizo
domain: Domeno
@ -772,6 +776,8 @@ lad:
type: Tipo
types:
major: Versyon prinsipala
minor: Versyon minora
patch: Versyon de remendo koreksyones de yerros i trokamientos simples
version: Versyon
statuses:
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
software_version_critical_check:
action: Amostra aktualizasyones desponivles
message_html: Una aktualizasyon kritika de Mastodon esta desponivle. Por favor aktualiza pishin.
software_version_patch_check:
action: Amostra aktualizasyones desponivles
message_html: Una aktualizasyon de Mastodon kon koreksyon de yerros esta desponivle.
upload_check_privacy_error:
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>"
@ -945,6 +953,7 @@ lad:
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}"
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}!
new_pending_account:
body: Los peratim del muevo kuento estan abashos. Puedes achetar o refuzar esta aplikasyon.
@ -1045,13 +1054,17 @@ lad:
accept: Acheta
back: Atras
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_invited: Fuites envitado.
security: Sigurita
set_new_password: Establese muevo kod
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_settings_hint_html: Klika el atadjiko ke te embimos para verifikar %{email}. Asperaremos aki.
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:
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}
@ -1246,9 +1259,11 @@ lad:
imports:
errors:
empty: Dosya CSV vaziya
incompatible_type: Inkompativle kon el tipo de importo eskojido
invalid_csv_file: 'Dosya CSV no valida. Yerro: %{error}'
over_rows_processing_limit: kontiene mas de %{count} filas
too_large: Dosya es mas grande
failures: Yerros
imported: Importado
modes:
merge: Une
@ -1671,6 +1686,9 @@ lad:
month: "%b %Y"
time: "%H:%M"
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:
add: Adjusta
disable: Inkapasita autentifikasyon en dos pasos
@ -1750,9 +1768,12 @@ lad:
title: Bienvenido, %{name}!
users:
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
otp_lost_help_html: Si pedriste akseso a los dos, puedes kontaktarte kon %{email}
signed_in_as: 'Konektado komo:'
verification:
here_is_how: Ansina es komo
verification: Verifikasyon
verified_links: Tus atadijos verifikados
webauthn_credentials:

View File

@ -169,6 +169,7 @@ lt:
undo: Atkurti domeno bloką
email_domain_blocks:
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šą
delete: Ištrinti
domain: Domenas

View File

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

View File

@ -425,6 +425,7 @@ nn:
view: Vis domeneblokkering
email_domain_blocks:
add_new: Lag ny
allow_registrations_with_approval: Tillat registreringer med godkjenning
attempts_over_week:
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"

View File

@ -425,6 +425,7 @@
view: Vis domeneblokkering
email_domain_blocks:
add_new: Lag ny
allow_registrations_with_approval: Tillat registreringer med godkjenning
attempts_over_week:
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"

View File

@ -439,6 +439,7 @@ pl:
view: Zobacz blokadę domeny
email_domain_blocks:
add_new: Dodaj nową
allow_registrations_with_approval: Zezwól na rejestracje po zatwierdzeniu
attempts_over_week:
few: "%{count} próby 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
email_domain_blocks:
add_new: Adicionar novo
allow_registrations_with_approval: Permitir inscrições com aprovação
attempts_over_week:
one: "%{count} tentativa 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
email_domain_blocks:
add_new: Adicionar novo
allow_registrations_with_approval: Permitir inscrições com aprovação
attempts_over_week:
one: "%{count} tentativa na última semana"
other: "%{count} tentativas de inscrição na última semana"

View File

@ -1 +1,46 @@
---
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.
indexable: Tui public postas posse aparir in sercha-resultates sur Mastodon. E in omni casu, tis qui ha interactet con tui postas va posser serchar e trovar les.
note: 'Tu posse @mentionar altri persones o #hashtags.'
show_collections: Gente va posser navigar tra tui sequentes e sequitores. Gente quem tu seque va vider que tu seque les sin egarda.
unlocked: Persones va posser sequer te sin petir aprobation. Desselecte si tu vole manualmen tractar petitiones de sequer e decider ca acceptar o rejecter nov sequitores.
account_alias:
acct: Specificar li usatornomine@dominia del conto ex quel tu vole translocar
@ -58,6 +59,14 @@ ie:
setting_display_media_default: Celar medie marcat quam sensitiv
setting_display_media_hide_all: Sempre celar 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:
name: 'Vi quelc hashtags usat max recentmen de te:'
filters:
@ -66,8 +75,12 @@ ie:
hide: Celar completmen li contenete filtrat, quam si it ne existe
warn: Celar li contenete filtrat detra un avise mentionant li titul del filtre
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.
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.
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.
@ -86,6 +99,7 @@ ie:
ip_block:
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.
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:
no_access: Bloccar accesse a omni ressurses
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
rule:
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:
role: Permissiones de usator decidet per su rol
user_role:
@ -111,6 +129,7 @@ ie:
name: Etiquette
value: Contenete
indexable: Includer public postas in resultates de sercha
unlocked: Automaticmen acceptar nov sequitores
account_alias:
acct: Usator-nómine del anteyan conto
account_migration:
@ -158,6 +177,7 @@ ie:
max_uses: Max grand númere de usas
new_password: Nov passa-parol
note: Biografie
otp_attempt: 2-factor code
password: Passa-parol
phrase: Clave-parol o frase
setting_advanced_layout: Possibilisar web-interfacie avansat
@ -165,10 +185,13 @@ ie:
setting_default_language: Lingue in quel postar
setting_default_privacy: Privatie de postada
setting_default_sensitive: Sempre marcar medie quam sensitiv
setting_display_media: Exposition de medie
setting_display_media_default: Predefinitiones
setting_display_media_hide_all: Celar omno
setting_display_media_show_all: Monstrar omno
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_theme: Tema de situ
setting_trends: Monstrar li hodial tendenties
@ -179,7 +202,10 @@ ie:
title: Titul
type: Specie de importation
username: Nómine de usator
username_or_email: Usator-nómine o E-posta
whole_word: Plen parol
email_domain_block:
with_dns_records: Includer archives MX e IPs del dominia
featured_tag:
name: Hashtag
filters:
@ -187,22 +213,36 @@ ie:
hide: Celar completmen
warn: Celar con un admonition
form_admin_settings:
activity_api_enabled: Publicar agregat statisticas pri usator-activitá in li API
backups_retention_period: Periode de retener archives de usator
bootstrap_timeline_accounts: Sempre recomandar ti-ci contos a nov usatores
closed_registrations_message: Customisat missage quande registration ne disponibil
content_cache_retention_period: Periode de retention por cachat contenete
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
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_rationale: Monstrar pro quo cert dominias esset bloccat
site_contact_email: Contact e-mail adresse
site_contact_username: Usator-nómine de contact
site_extended_description: Extendet descrition
site_short_description: Descrition del servitor
site_terms: Politica pri Privatie
site_title: Nómine de servitor
status_page_url: URL de statu-págine
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
trends: Possibilisar tendenties
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:
comment: Comentar
invite_request:
@ -216,27 +256,38 @@ ie:
sign_up_requires_approval: Limitar usator-registrationes
severity: Regul
notification_emails:
appeal: Alqui apella un decision moderatori
digest: Inviar compendies per email
favourite: Alqui favoritisat tui posta
follow: Alqui sequet te
follow_request: Alqui petit sequer te
mention: Alqui mentionat te
pending_account: Nov conto besonant inspection
reblog: Alqui boostat tui posta
report: Nov raporte es submisset
software_updates:
all: Notificar pri omni nov actualisationes
critical: Notificar solmen pri critical actualisationes
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
rule:
text: Regul
settings:
indexable: Includer profil-pagine in serchatores
show_application: Monstrar de quel aplication tu fat un posta
tag:
listable: Permisser que ti hashtag apari in serchas e suggestiones
name: Hashtag
trendable: Permisse que ti-ci hashtag apari sub tendenties
usable: Permisser que postas usa ti hashtag
user:
role: Rol
time_zone: Zone temporal
user_role:
color: Color del insignie
highlighted: Monstrar rol quam insigne sur usator-profiles
name: Nómine
permissions_as_keys: Permissiones
position: Prioritá

View File

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

View File

@ -374,6 +374,7 @@ sk:
view: Ukáž blokovanie domén
email_domain_blocks:
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
delete: Vymaž
dns:

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -105,7 +105,7 @@ class MigrateAccountConversations < ActiveRecord::Migration[5.2]
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)
migrated += 1

View File

@ -9,7 +9,7 @@ class PreserveOldLayoutForExistingUsers < ActiveRecord::Migration[5.2]
# on the to-be-changed default
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
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
def up
owner_role = UserRole.find_by(name: 'Owner')
admin_role = UserRole.find_by(name: 'Admin')
moderator_role = UserRole.find_by(name: 'Moderator')
everyone_role = UserRole.find_by(id: -99)
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
process_role_everyone
process_role_owner
process_role_admin
process_role_moderator
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

View File

@ -10,7 +10,7 @@
#
# 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
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 "updated_at", precision: nil, null: false
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
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
say('This operation WILL NOT be reversible.', :yellow)
say('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.', :yellow)
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)
say(<<~WARNING, :yellow)
This operation WILL NOT be reversible.
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?')
self_destruct_value = Rails.application.message_verifier('self-destruct').generate(Rails.configuration.x.local_domain)
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)
say(" SELF_DESTRUCT=#{self_destruct_value}", :green)
say("\nYou can re-run this command to see the state of the self-destruct process.", :green)
say(<<~INSTRUCTIONS, :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:
SELF_DESTRUCT=#{self_destruct_value}
You can re-run this command to see the state of the self-destruct process.
INSTRUCTIONS
rescue Interrupt
exit(1)
end
private
def self_destruct_value
Rails
.application
.message_verifier('self-destruct')
.generate(Rails.configuration.x.local_domain)
end
end
end
end

View File

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

View File

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

View File

@ -12,13 +12,14 @@ RSpec.describe Admin::EmailDomainBlocksController do
describe 'GET #index' do
around do |example|
default_per_page = EmailDomainBlock.default_per_page
EmailDomainBlock.paginates_per 1
EmailDomainBlock.paginates_per 2
example.run
EmailDomainBlock.paginates_per default_per_page
end
it 'returns http success' do
2.times { Fabricate(:email_domain_block) }
Fabricate(:email_domain_block, allow_with_approval: true)
get :index, params: { page: 2 }
expect(response).to have_http_status(200)
end
@ -34,6 +35,16 @@ RSpec.describe Admin::EmailDomainBlocksController do
describe 'POST #create' do
context 'when resolve button is pressed' 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' } }
end

View File

@ -135,6 +135,25 @@ RSpec.describe Auth::RegistrationsController do
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
subject do
Setting.registrations_mode = 'approved'

View File

@ -22,7 +22,7 @@ describe 'Admin::Accounts' do
context 'without selecting any accounts' 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)
end
@ -32,7 +32,7 @@ describe 'Admin::Accounts' do
it 'suspends the account' do
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
end
@ -42,7 +42,7 @@ describe 'Admin::Accounts' do
it 'approves the account user' do
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
end
@ -52,7 +52,7 @@ describe 'Admin::Accounts' do
it 'rejects and removes the account' do
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)
end

View File

@ -16,7 +16,7 @@ describe 'Admin::CustomEmojis' do
context 'without selecting any records' 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)
end

View File

@ -14,7 +14,7 @@ describe 'blocking domains through the moderation interface' do
fill_in 'domain_block_domain', with: 'example.com'
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(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'
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
expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com'))
expect(DomainBlockWorker).to_not have_received(:perform_async)
# 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(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'
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
expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com'))
expect(DomainBlockWorker).to_not have_received(:perform_async)
# 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(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'
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
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)
# 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(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)
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
expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com'))
expect(DomainBlockWorker).to_not have_received(:perform_async)
# 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(domain_block.reload.severity).to eq 'suspend'

View File

@ -16,7 +16,7 @@ describe 'Admin::EmailDomainBlocks' do
context 'without selecting any records' 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)
end

View File

@ -16,7 +16,7 @@ describe 'Admin::IpBlocks' do
context 'without selecting any records' 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)
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
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_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)
end
end

View File

@ -17,7 +17,7 @@ describe 'Admin::Statuses' do
context 'without selecting any records' 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)
end

View File

@ -16,7 +16,7 @@ describe 'Admin::Trends::Links::PreviewCardProviders' do
context 'without selecting any records' 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)
end

View File

@ -16,7 +16,7 @@ describe 'Admin::Trends::Links' do
context 'without selecting any records' 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)
end

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