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

Conflicts:
- `app/controllers/activitypub/collections_controller.rb`:
  Upstream renamed a helper method everywhere.
  There was one glitch-soc line involving changes because of the local-only post
  feature.
  Ported upstream's change.
pull/2710/head
Claire 2024-05-16 17:49:28 +02:00
commit 2810231180
64 changed files with 521 additions and 228 deletions

View File

@ -211,6 +211,11 @@ Style/PercentLiteralDelimiters:
Style/RedundantBegin: Style/RedundantBegin:
Enabled: false Enabled: false
# Reason: Prevailing style choice
# https://docs.rubocop.org/rubocop/cops_style.html#styleredundantfetchblock
Style/RedundantFetchBlock:
Enabled: false
# Reason: Overridden to reduce implicit StandardError rescues # Reason: Overridden to reduce implicit StandardError rescues
# https://docs.rubocop.org/rubocop/cops_style.html#stylerescuestandarderror # https://docs.rubocop.org/rubocop/cops_style.html#stylerescuestandarderror
Style/RescueStandardError: Style/RescueStandardError:

View File

@ -169,16 +169,6 @@ Style/RedundantConstantBase:
- 'config/environments/production.rb' - 'config/environments/production.rb'
- 'config/initializers/sidekiq.rb' - 'config/initializers/sidekiq.rb'
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: SafeForConstants.
Style/RedundantFetchBlock:
Exclude:
- 'config/initializers/1_hosts.rb'
- 'config/initializers/chewy.rb'
- 'config/initializers/devise.rb'
- 'config/initializers/paperclip.rb'
- 'config/puma.rb'
# This cop supports unsafe autocorrection (--autocorrect-all). # This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength. # Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength.
# AllowedMethods: present?, blank?, presence, try, try! # AllowedMethods: present?, blank?, presence, try, try!

View File

@ -1,22 +0,0 @@
# frozen_string_literal: true
if ENV['CI']
require 'simplecov-lcov'
SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true
SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter
else
SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
end
SimpleCov.start 'rails' do
enable_coverage :branch
add_filter 'lib/linter'
add_group 'Libraries', 'lib'
add_group 'Policies', 'app/policies'
add_group 'Presenters', 'app/presenters'
add_group 'Serializers', 'app/serializers'
add_group 'Services', 'app/services'
add_group 'Validators', 'app/validators'
end

View File

@ -132,7 +132,7 @@ group :test do
gem 'email_spec' gem 'email_spec'
# Extra RSpec extension methods and helpers for sidekiq # Extra RSpec extension methods and helpers for sidekiq
gem 'rspec-sidekiq', '~> 4.0' gem 'rspec-sidekiq', '~> 5.0'
# Browser integration testing # Browser integration testing
gem 'capybara', '~> 3.39' gem 'capybara', '~> 3.39'
@ -178,7 +178,7 @@ group :development do
# Preview mail in the browser # Preview mail in the browser
gem 'letter_opener', '~> 1.8' gem 'letter_opener', '~> 1.8'
gem 'letter_opener_web', '~> 2.0' gem 'letter_opener_web', '~> 3.0'
# Security analysis CLI tools # Security analysis CLI tools
gem 'brakeman', '~> 6.0', require: false gem 'brakeman', '~> 6.0', require: false

View File

@ -100,16 +100,16 @@ GEM
attr_required (1.0.2) attr_required (1.0.2)
awrence (1.2.1) awrence (1.2.1)
aws-eventstream (1.3.0) aws-eventstream (1.3.0)
aws-partitions (1.922.0) aws-partitions (1.929.0)
aws-sdk-core (3.194.1) aws-sdk-core (3.196.1)
aws-eventstream (~> 1, >= 1.3.0) aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0) aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.8) aws-sigv4 (~> 1.8)
jmespath (~> 1, >= 1.6.1) jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.80.0) aws-sdk-kms (1.81.0)
aws-sdk-core (~> 3, >= 3.193.0) aws-sdk-core (~> 3, >= 3.193.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.149.1) aws-sdk-s3 (1.151.0)
aws-sdk-core (~> 3, >= 3.194.0) aws-sdk-core (~> 3, >= 3.194.0)
aws-sdk-kms (~> 1) aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.8) aws-sigv4 (~> 1.8)
@ -272,7 +272,7 @@ GEM
fog-json (1.2.0) fog-json (1.2.0)
fog-core fog-core
multi_json (~> 1.10) multi_json (~> 1.10)
fog-openstack (1.1.0) fog-openstack (1.1.1)
fog-core (~> 2.1) fog-core (~> 2.1)
fog-json (>= 1.0) fog-json (>= 1.0)
formatador (1.1.0) formatador (1.1.0)
@ -389,10 +389,10 @@ GEM
addressable (~> 2.8) addressable (~> 2.8)
letter_opener (1.10.0) letter_opener (1.10.0)
launchy (>= 2.2, < 4) launchy (>= 2.2, < 4)
letter_opener_web (2.0.0) letter_opener_web (3.0.0)
actionmailer (>= 5.2) actionmailer (>= 6.1)
letter_opener (~> 1.7) letter_opener (~> 1.9)
railties (>= 5.2) railties (>= 6.1)
rexml rexml
link_header (0.0.8) link_header (0.0.8)
llhttp-ffi (0.5.0) llhttp-ffi (0.5.0)
@ -422,7 +422,7 @@ GEM
memory_profiler (1.0.1) memory_profiler (1.0.1)
mime-types (3.5.2) mime-types (3.5.2)
mime-types-data (~> 3.2015) mime-types-data (~> 3.2015)
mime-types-data (3.2024.0305) mime-types-data (3.2024.0507)
mini_mime (1.1.5) mini_mime (1.1.5)
mini_portile2 (2.8.6) mini_portile2 (2.8.6)
minitest (5.22.3) minitest (5.22.3)
@ -434,7 +434,7 @@ GEM
uri uri
net-http-persistent (4.0.2) net-http-persistent (4.0.2)
connection_pool (~> 2.2) connection_pool (~> 2.2)
net-imap (0.4.10) net-imap (0.4.11)
date date
net-protocol net-protocol
net-ldap (0.19.0) net-ldap (0.19.0)
@ -445,7 +445,7 @@ GEM
net-smtp (0.5.0) net-smtp (0.5.0)
net-protocol net-protocol
nio4r (2.7.1) nio4r (2.7.1)
nokogiri (1.16.4) nokogiri (1.16.5)
mini_portile2 (~> 2.8.2) mini_portile2 (~> 2.8.2)
racc (~> 1.4) racc (~> 1.4)
nsa (0.3.0) nsa (0.3.0)
@ -686,14 +686,15 @@ GEM
redlock (1.3.2) redlock (1.3.2)
redis (>= 3.0.0, < 6.0) redis (>= 3.0.0, < 6.0)
regexp_parser (2.9.0) regexp_parser (2.9.0)
reline (0.5.6) reline (0.5.7)
io-console (~> 0.5) io-console (~> 0.5)
request_store (1.6.0) request_store (1.6.0)
rack (>= 1.4) rack (>= 1.4)
responders (3.1.1) responders (3.1.1)
actionpack (>= 5.2) actionpack (>= 5.2)
railties (>= 5.2) railties (>= 5.2)
rexml (3.2.6) rexml (3.2.8)
strscan (>= 3.0.9)
rotp (6.3.0) rotp (6.3.0)
rouge (4.2.1) rouge (4.2.1)
rpam2 (4.0.2) rpam2 (4.0.2)
@ -708,7 +709,7 @@ GEM
rspec-support (~> 3.13.0) rspec-support (~> 3.13.0)
rspec-github (2.4.0) rspec-github (2.4.0)
rspec-core (~> 3.0) rspec-core (~> 3.0)
rspec-mocks (3.13.0) rspec-mocks (3.13.1)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0) rspec-support (~> 3.13.0)
rspec-rails (6.1.2) rspec-rails (6.1.2)
@ -719,7 +720,7 @@ GEM
rspec-expectations (~> 3.13) rspec-expectations (~> 3.13)
rspec-mocks (~> 3.13) rspec-mocks (~> 3.13)
rspec-support (~> 3.13) rspec-support (~> 3.13)
rspec-sidekiq (4.2.0) rspec-sidekiq (5.0.0)
rspec-core (~> 3.0) rspec-core (~> 3.0)
rspec-expectations (~> 3.0) rspec-expectations (~> 3.0)
rspec-mocks (~> 3.0) rspec-mocks (~> 3.0)
@ -774,7 +775,7 @@ GEM
scenic (1.8.0) scenic (1.8.0)
activerecord (>= 4.0.0) activerecord (>= 4.0.0)
railties (>= 4.0.0) railties (>= 4.0.0)
selenium-webdriver (4.20.1) selenium-webdriver (4.21.0)
base64 (~> 0.2) base64 (~> 0.2)
rexml (~> 3.2, >= 3.2.5) rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2, < 3.0) rubyzip (>= 1.2.2, < 3.0)
@ -815,6 +816,7 @@ GEM
stringio (3.1.0) stringio (3.1.0)
strong_migrations (1.8.0) strong_migrations (1.8.0)
activerecord (>= 5.2) activerecord (>= 5.2)
strscan (3.1.0)
swd (1.3.0) swd (1.3.0)
activesupport (>= 3) activesupport (>= 3)
attr_required (>= 0.0.5) attr_required (>= 0.0.5)
@ -893,7 +895,7 @@ GEM
xorcist (1.1.3) xorcist (1.1.3)
xpath (3.2.0) xpath (3.2.0)
nokogiri (~> 1.8) nokogiri (~> 1.8)
zeitwerk (2.6.13) zeitwerk (2.6.14)
PLATFORMS PLATFORMS
ruby ruby
@ -955,7 +957,7 @@ DEPENDENCIES
kaminari (~> 1.2) kaminari (~> 1.2)
kt-paperclip (~> 7.2) kt-paperclip (~> 7.2)
letter_opener (~> 1.8) letter_opener (~> 1.8)
letter_opener_web (~> 2.0) letter_opener_web (~> 3.0)
link_header (~> 0.0) link_header (~> 0.0)
lograge (~> 0.12) lograge (~> 0.12)
mail (~> 2.8) mail (~> 2.8)
@ -1012,7 +1014,7 @@ DEPENDENCIES
rqrcode (~> 2.2) rqrcode (~> 2.2)
rspec-github (~> 2.4) rspec-github (~> 2.4)
rspec-rails (~> 6.0) rspec-rails (~> 6.0)
rspec-sidekiq (~> 4.0) rspec-sidekiq (~> 5.0)
rubocop rubocop
rubocop-capybara rubocop-capybara
rubocop-performance rubocop-performance

View File

@ -25,7 +25,7 @@ class AccountsController < ApplicationController
limit = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE limit = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE
@statuses = filtered_statuses.without_reblogs.limit(limit) @statuses = filtered_statuses.without_reblogs.limit(limit)
@statuses = cache_collection(@statuses, Status) @statuses = preload_collection(@statuses, Status)
end end
format.json do format.json do

View File

@ -18,7 +18,7 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
def set_items def set_items
case params[:id] case params[:id]
when 'featured' when 'featured'
@items = for_signed_account { cache_collection(@account.pinned_statuses.not_local_only, Status) } @items = for_signed_account { preload_collection(@account.pinned_statuses.not_local_only, Status) }
@items = @items.map { |item| item.distributable? ? item : ActivityPub::TagManager.instance.uri_for(item) } @items = @items.map { |item| item.distributable? ? item : ActivityPub::TagManager.instance.uri_for(item) }
when 'tags' when 'tags'
@items = for_signed_account { @account.featured_tags } @items = for_signed_account { @account.featured_tags }

View File

@ -60,7 +60,7 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController
def set_statuses def set_statuses
return unless page_requested? return unless page_requested?
@statuses = cache_collection_paginated_by_id( @statuses = preload_collection_paginated_by_id(
AccountStatusesFilter.new(@account, signed_request_account).results, AccountStatusesFilter.new(@account, signed_request_account).results,
Status, Status,
LIMIT, LIMIT,

View File

@ -19,11 +19,11 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
end end
def load_statuses def load_statuses
@account.unavailable? ? [] : cached_account_statuses @account.unavailable? ? [] : preloaded_account_statuses
end end
def cached_account_statuses def preloaded_account_statuses
cache_collection_paginated_by_id( preload_collection_paginated_by_id(
AccountStatusesFilter.new(@account, current_account, params).results, AccountStatusesFilter.new(@account, current_account, params).results,
Status, Status,
limit_param(DEFAULT_STATUSES_LIMIT), limit_param(DEFAULT_STATUSES_LIMIT),

View File

@ -13,11 +13,11 @@ class Api::V1::BookmarksController < Api::BaseController
private private
def load_statuses def load_statuses
cached_bookmarks preloaded_bookmarks
end end
def cached_bookmarks def preloaded_bookmarks
cache_collection(results.map(&:status), Status) preload_collection(results.map(&:status), Status)
end end
def results def results

View File

@ -13,11 +13,11 @@ class Api::V1::FavouritesController < Api::BaseController
private private
def load_statuses def load_statuses
cached_favourites preloaded_favourites
end end
def cached_favourites def preloaded_favourites
cache_collection(results.map(&:status), Status) preload_collection(results.map(&:status), Status)
end end
def results def results

View File

@ -41,7 +41,7 @@ class Api::V1::Notifications::RequestsController < Api::BaseController
) )
NotificationRequest.preload_cache_collection(requests) do |statuses| NotificationRequest.preload_cache_collection(requests) do |statuses|
cache_collection(statuses, Status) preload_collection(statuses, Status)
end end
end end

View File

@ -50,7 +50,7 @@ class Api::V1::NotificationsController < Api::BaseController
) )
Notification.preload_cache_collection_target_statuses(notifications) do |target_statuses| Notification.preload_cache_collection_target_statuses(notifications) do |target_statuses|
cache_collection(target_statuses, Status) preload_collection(target_statuses, Status)
end end
end end

View File

@ -26,13 +26,13 @@ class Api::V1::StatusesController < Api::BaseController
DESCENDANTS_DEPTH_LIMIT = 20 DESCENDANTS_DEPTH_LIMIT = 20
def index def index
@statuses = cache_collection(@statuses, Status) @statuses = preload_collection(@statuses, Status)
render json: @statuses, each_serializer: REST::StatusSerializer render json: @statuses, each_serializer: REST::StatusSerializer
end end
def show def show
cache_if_unauthenticated! cache_if_unauthenticated!
@status = cache_collection([@status], Status).first @status = preload_collection([@status], Status).first
render json: @status, serializer: REST::StatusSerializer render json: @status, serializer: REST::StatusSerializer
end end
@ -51,8 +51,8 @@ class Api::V1::StatusesController < Api::BaseController
ancestors_results = @status.in_reply_to_id.nil? ? [] : @status.ancestors(ancestors_limit, current_account) ancestors_results = @status.in_reply_to_id.nil? ? [] : @status.ancestors(ancestors_limit, current_account)
descendants_results = @status.descendants(descendants_limit, current_account, descendants_depth_limit) descendants_results = @status.descendants(descendants_limit, current_account, descendants_depth_limit)
loaded_ancestors = cache_collection(ancestors_results, Status) loaded_ancestors = preload_collection(ancestors_results, Status)
loaded_descendants = cache_collection(descendants_results, Status) loaded_descendants = preload_collection(descendants_results, Status)
@context = Context.new(ancestors: loaded_ancestors, descendants: loaded_descendants) @context = Context.new(ancestors: loaded_ancestors, descendants: loaded_descendants)
statuses = [@status] + @context.ancestors + @context.descendants statuses = [@status] + @context.ancestors + @context.descendants

View File

@ -15,11 +15,11 @@ class Api::V1::Timelines::DirectController < Api::BaseController
private private
def load_statuses def load_statuses
cached_direct_statuses preloaded_direct_statuses
end end
def cached_direct_statuses def preloaded_direct_statuses
cache_collection direct_statuses, Status preload_collection direct_statuses, Status
end end
def direct_statuses def direct_statuses

View File

@ -21,11 +21,11 @@ class Api::V1::Timelines::HomeController < Api::V1::Timelines::BaseController
private private
def load_statuses def load_statuses
cached_home_statuses preloaded_home_statuses
end end
def cached_home_statuses def preloaded_home_statuses
cache_collection home_statuses, Status preload_collection home_statuses, Status
end end
def home_statuses def home_statuses

View File

@ -21,11 +21,11 @@ class Api::V1::Timelines::ListController < Api::V1::Timelines::BaseController
end end
def set_statuses def set_statuses
@statuses = cached_list_statuses @statuses = preloaded_list_statuses
end end
def cached_list_statuses def preloaded_list_statuses
cache_collection list_statuses, Status preload_collection list_statuses, Status
end end
def list_statuses def list_statuses

View File

@ -18,11 +18,11 @@ class Api::V1::Timelines::PublicController < Api::V1::Timelines::BaseController
end end
def load_statuses def load_statuses
cached_public_statuses_page preloaded_public_statuses_page
end end
def cached_public_statuses_page def preloaded_public_statuses_page
cache_collection(public_statuses, Status) preload_collection(public_statuses, Status)
end end
def public_statuses def public_statuses

View File

@ -23,11 +23,11 @@ class Api::V1::Timelines::TagController < Api::V1::Timelines::BaseController
end end
def load_statuses def load_statuses
cached_tagged_statuses preloaded_tagged_statuses
end end
def cached_tagged_statuses def preloaded_tagged_statuses
@tag.nil? ? [] : cache_collection(tag_timeline_statuses, Status) @tag.nil? ? [] : preload_collection(tag_timeline_statuses, Status)
end end
def tag_timeline_statuses def tag_timeline_statuses

View File

@ -20,7 +20,7 @@ class Api::V1::Trends::StatusesController < Api::BaseController
def set_statuses def set_statuses
@statuses = if enabled? @statuses = if enabled?
cache_collection(statuses_from_trends.offset(offset_param).limit(limit_param(DEFAULT_STATUSES_LIMIT)), Status) preload_collection(statuses_from_trends.offset(offset_param).limit(limit_param(DEFAULT_STATUSES_LIMIT)), Status)
else else
[] []
end end

View File

@ -9,6 +9,7 @@ class ApplicationController < ActionController::Base
include UserTrackingConcern include UserTrackingConcern
include SessionTrackingConcern include SessionTrackingConcern
include CacheConcern include CacheConcern
include PreloadingConcern
include DomainControlHelper include DomainControlHelper
include ThemingConcern include ThemingConcern
include DatabaseHelper include DatabaseHelper

View File

@ -45,20 +45,4 @@ module CacheConcern
Rails.cache.write(key, response.body, expires_in: expires_in, raw: true) Rails.cache.write(key, response.body, expires_in: expires_in, raw: true)
end end
end end
# TODO: Rename this method, as it does not perform any caching anymore.
def cache_collection(raw, klass)
return raw unless klass.respond_to?(:preload_cacheable_associations)
records = raw.to_a
klass.preload_cacheable_associations(records)
records
end
# TODO: Rename this method, as it does not perform any caching anymore.
def cache_collection_paginated_by_id(raw, klass, limit, options)
cache_collection raw.to_a_paginated_by_id(limit, options), klass
end
end end

View File

@ -0,0 +1,17 @@
# frozen_string_literal: true
module PreloadingConcern
extend ActiveSupport::Concern
def preload_collection(scope, klass)
return scope unless klass.respond_to?(:preload_cacheable_associations)
scope.to_a.tap do |records|
klass.preload_cacheable_associations(records)
end
end
def preload_collection_paginated_by_id(scope, klass, limit, options)
preload_collection scope.to_a_paginated_by_id(limit, options), klass
end
end

View File

@ -13,7 +13,7 @@ class Settings::ApplicationsController < Settings::BaseController
def new def new
@application = Doorkeeper::Application.new( @application = Doorkeeper::Application.new(
redirect_uri: Doorkeeper.configuration.native_redirect_uri, redirect_uri: Doorkeeper.configuration.native_redirect_uri,
scopes: 'read write follow' scopes: 'read:me'
) )
end end

View File

@ -45,7 +45,7 @@ class TagsController < ApplicationController
end end
def set_statuses def set_statuses
@statuses = cache_collection(TagFeed.new(@tag, nil, local: @local).get(limit_param), Status) @statuses = preload_collection(TagFeed.new(@tag, nil, local: @local).get(limit_param), Status)
end end
def limit_param def limit_param

View File

@ -241,11 +241,16 @@ module ApplicationHelper
EmojiFormatter.new(html, custom_emojis, other_options.merge(animate: prefers_autoplay?)).to_s EmojiFormatter.new(html, custom_emojis, other_options.merge(animate: prefers_autoplay?)).to_s
end end
def site_icon_path(type, size = '48') def instance_presenter
icon = SiteUpload.find_by(var: type) @instance_presenter ||= InstancePresenter.new
return nil unless icon end
icon.file.url(size) def favicon_path(size = '48')
instance_presenter.favicon&.file&.url(size)
end
def app_icon_path(size = '48')
instance_presenter.app_icon&.file&.url(size)
end end
# glitch-soc addition to handle the multiple flavors # glitch-soc addition to handle the multiple flavors

View File

@ -20,7 +20,7 @@ export function changeSetting(path, value) {
} }
const debouncedSave = debounce((dispatch, getState) => { const debouncedSave = debounce((dispatch, getState) => {
if (getState().getIn(['settings', 'saved'])) { if (getState().getIn(['settings', 'saved']) || !getState().getIn(['meta', 'me'])) {
return; return;
} }

View File

@ -474,6 +474,7 @@
"notification.follow_request": "Mae {name} wedi gwneud cais i'ch dilyn", "notification.follow_request": "Mae {name} wedi gwneud cais i'ch dilyn",
"notification.mention": "Crybwyllodd {name} amdanoch chi", "notification.mention": "Crybwyllodd {name} amdanoch chi",
"notification.moderation-warning.learn_more": "Dysgu mwy", "notification.moderation-warning.learn_more": "Dysgu mwy",
"notification.moderation_warning": "Rydych wedi derbyn rhybudd gan gymedrolwr",
"notification.moderation_warning.action_delete_statuses": "Mae rhai o'ch postiadau wedi'u dileu.", "notification.moderation_warning.action_delete_statuses": "Mae rhai o'ch postiadau wedi'u dileu.",
"notification.moderation_warning.action_disable": "Mae eich cyfrif wedi'i analluogi.", "notification.moderation_warning.action_disable": "Mae eich cyfrif wedi'i analluogi.",
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Mae rhai o'ch postiadau wedi'u marcio'n sensitif.", "notification.moderation_warning.action_mark_statuses_as_sensitive": "Mae rhai o'ch postiadau wedi'u marcio'n sensitif.",

View File

@ -308,6 +308,8 @@
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.", "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
"follow_suggestions.curated_suggestion": "Staff pick", "follow_suggestions.curated_suggestion": "Staff pick",
"follow_suggestions.dismiss": "Don't show again", "follow_suggestions.dismiss": "Don't show again",
"follow_suggestions.featured_longer": "Hand-picked by the {domain} team",
"follow_suggestions.friends_of_friends_longer": "Popular among people you follow",
"follow_suggestions.hints.featured": "This profile has been hand-picked by the {domain} team.", "follow_suggestions.hints.featured": "This profile has been hand-picked by the {domain} team.",
"follow_suggestions.hints.friends_of_friends": "This profile is popular among the people you follow.", "follow_suggestions.hints.friends_of_friends": "This profile is popular among the people you follow.",
"follow_suggestions.hints.most_followed": "This profile is one of the most followed on {domain}.", "follow_suggestions.hints.most_followed": "This profile is one of the most followed on {domain}.",
@ -315,6 +317,8 @@
"follow_suggestions.hints.similar_to_recently_followed": "This profile is similar to the profiles you have most recently followed.", "follow_suggestions.hints.similar_to_recently_followed": "This profile is similar to the profiles you have most recently followed.",
"follow_suggestions.personalized_suggestion": "Personalised suggestion", "follow_suggestions.personalized_suggestion": "Personalised suggestion",
"follow_suggestions.popular_suggestion": "Popular suggestion", "follow_suggestions.popular_suggestion": "Popular suggestion",
"follow_suggestions.popular_suggestion_longer": "Popular on {domain}",
"follow_suggestions.similar_to_recently_followed_longer": "Similar to profiles you recently followed",
"follow_suggestions.view_all": "View all", "follow_suggestions.view_all": "View all",
"follow_suggestions.who_to_follow": "Who to follow", "follow_suggestions.who_to_follow": "Who to follow",
"followed_tags": "Followed hashtags", "followed_tags": "Followed hashtags",
@ -469,6 +473,15 @@
"notification.follow": "{name} followed you", "notification.follow": "{name} followed you",
"notification.follow_request": "{name} has requested to follow you", "notification.follow_request": "{name} has requested to follow you",
"notification.mention": "{name} mentioned you", "notification.mention": "{name} mentioned you",
"notification.moderation-warning.learn_more": "Learn more",
"notification.moderation_warning": "You have received a moderation warning",
"notification.moderation_warning.action_delete_statuses": "Some of your posts have been removed.",
"notification.moderation_warning.action_disable": "Your account has been disabled.",
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Some of your posts have been marked as sensitive.",
"notification.moderation_warning.action_none": "Your account has received a moderation warning.",
"notification.moderation_warning.action_sensitive": "Your posts will be marked as sensitive from now on.",
"notification.moderation_warning.action_silence": "Your account has been limited.",
"notification.moderation_warning.action_suspend": "Your account has been suspended.",
"notification.own_poll": "Your poll has ended", "notification.own_poll": "Your poll has ended",
"notification.poll": "A poll you have voted in has ended", "notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} boosted your status", "notification.reblog": "{name} boosted your status",

View File

@ -92,7 +92,7 @@
"block_modal.remote_users_caveat": "Ímoslle pedir ao servidor {domain} que respecte a túa decisión. Emporiso, non hai garantía de que atenda a petición xa que os servidores xestionan os bloqueos de formas diferentes. As publicacións públicas poderían aínda ser visibles para usuarias que non iniciaron sesión.", "block_modal.remote_users_caveat": "Ímoslle pedir ao servidor {domain} que respecte a túa decisión. Emporiso, non hai garantía de que atenda a petición xa que os servidores xestionan os bloqueos de formas diferentes. As publicacións públicas poderían aínda ser visibles para usuarias que non iniciaron sesión.",
"block_modal.show_less": "Mostrar menos", "block_modal.show_less": "Mostrar menos",
"block_modal.show_more": "Mostrar máis", "block_modal.show_more": "Mostrar máis",
"block_modal.they_cant_mention": "Non te pode seguir nin mencionar.", "block_modal.they_cant_mention": "Non te poden seguir nin mencionar.",
"block_modal.they_cant_see_posts": "Non pode ver as túas publicacións nin ti as de ela.", "block_modal.they_cant_see_posts": "Non pode ver as túas publicacións nin ti as de ela.",
"block_modal.they_will_know": "Pode ver que a bloqueaches.", "block_modal.they_will_know": "Pode ver que a bloqueaches.",
"block_modal.title": "Bloquear usuaria?", "block_modal.title": "Bloquear usuaria?",
@ -474,6 +474,7 @@
"notification.follow_request": "{name} solicitou seguirte", "notification.follow_request": "{name} solicitou seguirte",
"notification.mention": "{name} mencionoute", "notification.mention": "{name} mencionoute",
"notification.moderation-warning.learn_more": "Saber máis", "notification.moderation-warning.learn_more": "Saber máis",
"notification.moderation_warning": "Recibiches unha advertencia da moderación",
"notification.moderation_warning.action_delete_statuses": "Algunha das túas publicacións foron eliminadas.", "notification.moderation_warning.action_delete_statuses": "Algunha das túas publicacións foron eliminadas.",
"notification.moderation_warning.action_disable": "A túa conta foi desactivada.", "notification.moderation_warning.action_disable": "A túa conta foi desactivada.",
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Algunha das túas publicacións foron marcadas como sensibles.", "notification.moderation_warning.action_mark_statuses_as_sensitive": "Algunha das túas publicacións foron marcadas como sensibles.",

View File

@ -295,6 +295,7 @@
"follow_suggestions.personalized_suggestion": "Prispôsobený návrh", "follow_suggestions.personalized_suggestion": "Prispôsobený návrh",
"follow_suggestions.popular_suggestion": "Obľúbený návrh", "follow_suggestions.popular_suggestion": "Obľúbený návrh",
"follow_suggestions.popular_suggestion_longer": "Populárne na {domain}", "follow_suggestions.popular_suggestion_longer": "Populárne na {domain}",
"follow_suggestions.similar_to_recently_followed_longer": "Podobné profilom, ktoré si nedávno nasledoval/a",
"follow_suggestions.view_all": "Zobraziť všetky", "follow_suggestions.view_all": "Zobraziť všetky",
"follow_suggestions.who_to_follow": "Koho sledovať", "follow_suggestions.who_to_follow": "Koho sledovať",
"followed_tags": "Sledované hashtagy", "followed_tags": "Sledované hashtagy",
@ -445,10 +446,14 @@
"notification.follow_request": "{name} vás žiada sledovať", "notification.follow_request": "{name} vás žiada sledovať",
"notification.mention": "{name} vás spomína", "notification.mention": "{name} vás spomína",
"notification.moderation-warning.learn_more": "Zisti viac", "notification.moderation-warning.learn_more": "Zisti viac",
"notification.moderation_warning.action_disable": "Tvoj účet bol vypnutý.",
"notification.moderation_warning.action_silence": "Tvoj účet bol obmedzený.",
"notification.moderation_warning.action_suspend": "Tvoj účet bol pozastavený.",
"notification.own_poll": "Vaša anketa sa skončila", "notification.own_poll": "Vaša anketa sa skončila",
"notification.poll": "Anketa, v ktorej ste hlasovali, sa skončila", "notification.poll": "Anketa, v ktorej ste hlasovali, sa skončila",
"notification.reblog": "{name} zdieľa váš príspevok", "notification.reblog": "{name} zdieľa váš príspevok",
"notification.relationships_severance_event": "Stratené prepojenia s {name}", "notification.relationships_severance_event": "Stratené prepojenia s {name}",
"notification.relationships_severance_event.account_suspension": "Správca z {from} pozastavil/a {target}, čo znamená, že od nich viac nemôžeš dostávať aktualizácie, alebo s nimi interaktovať.",
"notification.relationships_severance_event.learn_more": "Zisti viac", "notification.relationships_severance_event.learn_more": "Zisti viac",
"notification.status": "{name} uverejňuje niečo nové", "notification.status": "{name} uverejňuje niečo nové",
"notification.update": "{name} upravuje príspevok", "notification.update": "{name} upravuje príspevok",

View File

@ -474,7 +474,7 @@
"notification.follow_request": "{name} size takip isteği gönderdi", "notification.follow_request": "{name} size takip isteği gönderdi",
"notification.mention": "{name} senden bahsetti", "notification.mention": "{name} senden bahsetti",
"notification.moderation-warning.learn_more": "Daha fazlası", "notification.moderation-warning.learn_more": "Daha fazlası",
"notification.moderation_warning": "Bir denetim uyarısı aldınız", "notification.moderation_warning": "Hesabınız bir denetim uyarısı aldı",
"notification.moderation_warning.action_delete_statuses": "Bazı gönderileriniz kaldırıldı.", "notification.moderation_warning.action_delete_statuses": "Bazı gönderileriniz kaldırıldı.",
"notification.moderation_warning.action_disable": "Hesabınız devre dışı bırakıldı.", "notification.moderation_warning.action_disable": "Hesabınız devre dışı bırakıldı.",
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Bazı gönderileriniz hassas olarak işaretlendi.", "notification.moderation_warning.action_mark_statuses_as_sensitive": "Bazı gönderileriniz hassas olarak işaretlendi.",

View File

@ -4365,10 +4365,6 @@ a.status-card {
outline: $ui-button-focus-outline; outline: $ui-button-focus-outline;
} }
.no-reduce-motion .icon {
transition: transform 0.15s ease-in-out;
}
&.active { &.active {
color: $primary-text-color; color: $primary-text-color;
@ -4387,6 +4383,10 @@ a.status-card {
} }
} }
.no-reduce-motion .column-header__button .icon {
transition: transform 150ms ease-in-out;
}
.column-header__collapsible { .column-header__collapsible {
max-height: 70vh; max-height: 70vh;
overflow: hidden; overflow: hidden;

View File

@ -25,14 +25,11 @@ class Admin::Metrics::Dimension::SoftwareVersionsDimension < Admin::Metrics::Dim
end end
def ruby_version def ruby_version
yjit = defined?(RubyVM::YJIT) && RubyVM::YJIT.enabled?
value = "#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}#{yjit ? ' +YJIT' : ''}"
{ {
key: 'ruby', key: 'ruby',
human_key: 'Ruby', human_key: 'Ruby',
value: value, value: "#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}",
human_value: value, human_value: RUBY_DESCRIPTION,
} }
end end

View File

@ -13,7 +13,7 @@
# #
class AccountModerationNote < ApplicationRecord class AccountModerationNote < ApplicationRecord
CONTENT_SIZE_LIMIT = 500 CONTENT_SIZE_LIMIT = 2_000
belongs_to :account belongs_to :account
belongs_to :target_account, class_name: 'Account' belongs_to :target_account, class_name: 'Account'

View File

@ -13,7 +13,7 @@
# #
class ReportNote < ApplicationRecord class ReportNote < ApplicationRecord
CONTENT_SIZE_LIMIT = 500 CONTENT_SIZE_LIMIT = 2_000
belongs_to :account belongs_to :account
belongs_to :report, inverse_of: :notes, touch: true belongs_to :report, inverse_of: :notes, touch: true

View File

@ -81,4 +81,16 @@ class InstancePresenter < ActiveModelSerializers::Model
def mascot def mascot
@mascot ||= Rails.cache.fetch('site_uploads/mascot') { SiteUpload.find_by(var: 'mascot') } @mascot ||= Rails.cache.fetch('site_uploads/mascot') { SiteUpload.find_by(var: 'mascot') }
end end
def favicon
return @favicon if defined?(@favicon)
@favicon ||= Rails.cache.fetch('site_uploads/favicon') { SiteUpload.find_by(var: 'favicon') }
end
def app_icon
return @app_icon if defined?(@app_icon)
@app_icon ||= Rails.cache.fetch('site_uploads/app_icon') { SiteUpload.find_by(var: 'app_icon') }
end
end end

View File

@ -27,7 +27,7 @@ class ManifestSerializer < ActiveModel::Serializer
def icons def icons
SiteUpload::ANDROID_ICON_SIZES.map do |size| SiteUpload::ANDROID_ICON_SIZES.map do |size|
src = site_icon_path('app_icon', size.to_i) src = app_icon_path(size.to_i)
src = URI.join(root_url, src).to_s if src.present? src = URI.join(root_url, src).to_s if src.present?
{ {

View File

@ -62,14 +62,16 @@
.report-notes .report-notes
= render partial: 'admin/report_notes/report_note', collection: @moderation_notes = render partial: 'admin/report_notes/report_note', collection: @moderation_notes
= simple_form_for @account_moderation_note, url: admin_account_moderation_notes_path do |f| = simple_form_for @account_moderation_note, url: admin_account_moderation_notes_path do |form|
= f.hidden_field :target_account_id = form.hidden_field :target_account_id
= render 'shared/error_messages', object: @account_moderation_note
.field-group .field-group
= f.input :content, placeholder: t('admin.reports.notes.placeholder'), rows: 6 = form.input :content, input_html: { placeholder: t('admin.reports.notes.placeholder'), maxlength: AccountModerationNote::CONTENT_SIZE_LIMIT, rows: 6, autofocus: @account_moderation_note.errors.any? }
.actions .actions
= f.button :button, t('admin.account_moderation_notes.create'), type: :submit = form.button :button, t('admin.account_moderation_notes.create'), type: :submit
%hr.spacer/ %hr.spacer/

View File

@ -83,15 +83,17 @@
.report-notes .report-notes
= render @report_notes = render @report_notes
= simple_form_for @report_note, url: admin_report_notes_path do |f| = simple_form_for @report_note, url: admin_report_notes_path do |form|
= f.input :report_id, as: :hidden = form.input :report_id, as: :hidden
= render 'shared/error_messages', object: @report_note
.field-group .field-group
= f.input :content, placeholder: t('admin.reports.notes.placeholder'), rows: 6 = form.input :content, input_html: { placeholder: t('admin.reports.notes.placeholder'), maxlength: ReportNote::CONTENT_SIZE_LIMIT, rows: 6, autofocus: @report_note.errors.any? }
.actions .actions
- if @report.unresolved? - if @report.unresolved?
= f.button :button, t('admin.reports.notes.create_and_resolve'), name: :create_and_resolve, type: :submit = form.button :button, t('admin.reports.notes.create_and_resolve'), name: :create_and_resolve, type: :submit
- else - else
= f.button :button, t('admin.reports.notes.create_and_unresolve'), name: :create_and_unresolve, type: :submit = form.button :button, t('admin.reports.notes.create_and_unresolve'), name: :create_and_unresolve, type: :submit
= f.button :button, t('admin.reports.notes.create'), type: :submit = form.button :button, t('admin.reports.notes.create'), type: :submit

View File

@ -11,13 +11,13 @@
- if storage_host? - if storage_host?
%link{ rel: 'dns-prefetch', href: storage_host }/ %link{ rel: 'dns-prefetch', href: storage_host }/
%link{ rel: 'icon', href: site_icon_path('favicon', 'ico') || '/favicon.ico', type: 'image/x-icon' }/ %link{ rel: 'icon', href: favicon_path('ico') || '/favicon.ico', type: 'image/x-icon' }/
- SiteUpload::FAVICON_SIZES.each do |size| - SiteUpload::FAVICON_SIZES.each do |size|
%link{ rel: 'icon', sizes: "#{size}x#{size}", href: site_icon_path('favicon', size.to_i) || frontend_asset_path("icons/favicon-#{size}x#{size}.png"), type: 'image/png' }/ %link{ rel: 'icon', sizes: "#{size}x#{size}", href: favicon_path(size.to_i) || frontend_asset_path("icons/favicon-#{size}x#{size}.png"), type: 'image/png' }/
- SiteUpload::APPLE_ICON_SIZES.each do |size| - SiteUpload::APPLE_ICON_SIZES.each do |size|
%link{ rel: 'apple-touch-icon', sizes: "#{size}x#{size}", href: site_icon_path('app_icon', size.to_i) || frontend_asset_path("icons/apple-touch-icon-#{size}x#{size}.png") }/ %link{ rel: 'apple-touch-icon', sizes: "#{size}x#{size}", href: app_icon_path(size.to_i) || frontend_asset_path("icons/apple-touch-icon-#{size}x#{size}.png") }/
%link{ rel: 'mask-icon', href: frontend_asset_path('images/logo-symbol-icon.svg'), color: '#6364FF' }/ %link{ rel: 'mask-icon', href: frontend_asset_path('images/logo-symbol-icon.svg'), color: '#6364FF' }/
%link{ rel: 'manifest', href: manifest_path(format: :json) }/ %link{ rel: 'manifest', href: manifest_path(format: :json) }/

View File

@ -11,6 +11,7 @@
.fields-group .fields-group
= f.input :redirect_uri, = f.input :redirect_uri,
label: t('activerecord.attributes.doorkeeper/application.redirect_uri'), hint: t('doorkeeper.applications.help.redirect_uri'), label: t('activerecord.attributes.doorkeeper/application.redirect_uri'), hint: t('doorkeeper.applications.help.redirect_uri'),
required: true,
wrapper: :with_block_label wrapper: :with_block_label
%p.hint= t('doorkeeper.applications.help.native_redirect_uri', native_redirect_uri: content_tag(:code, Doorkeeper.configuration.native_redirect_uri)).html_safe %p.hint= t('doorkeeper.applications.help.native_redirect_uri', native_redirect_uri: content_tag(:code, Doorkeeper.configuration.native_redirect_uri)).html_safe

View File

@ -3,6 +3,9 @@
class Scheduler::UserCleanupScheduler class Scheduler::UserCleanupScheduler
include Sidekiq::Worker include Sidekiq::Worker
UNCONFIRMED_ACCOUNTS_MAX_AGE_DAYS = 7
DISCARDED_STATUSES_MAX_AGE_DAYS = 30
sidekiq_options retry: 0, lock: :until_executed, lock_ttl: 1.day.to_i sidekiq_options retry: 0, lock: :until_executed, lock_ttl: 1.day.to_i
def perform def perform
@ -13,7 +16,7 @@ class Scheduler::UserCleanupScheduler
private private
def clean_unconfirmed_accounts! def clean_unconfirmed_accounts!
User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', 2.days.ago).reorder(nil).find_in_batches do |batch| User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', UNCONFIRMED_ACCOUNTS_MAX_AGE_DAYS.days.ago).reorder(nil).find_in_batches do |batch|
# We have to do it separately because of missing database constraints # We have to do it separately because of missing database constraints
AccountModerationNote.where(target_account_id: batch.map(&:account_id)).delete_all AccountModerationNote.where(target_account_id: batch.map(&:account_id)).delete_all
Account.where(id: batch.map(&:account_id)).delete_all Account.where(id: batch.map(&:account_id)).delete_all
@ -22,7 +25,7 @@ class Scheduler::UserCleanupScheduler
end end
def clean_discarded_statuses! def clean_discarded_statuses!
Status.unscoped.discarded.where('deleted_at <= ?', 30.days.ago).find_in_batches do |statuses| Status.unscoped.discarded.where('deleted_at <= ?', DISCARDED_STATUSES_MAX_AGE_DAYS.days.ago).find_in_batches do |statuses|
RemovalWorker.push_bulk(statuses) do |status| RemovalWorker.push_bulk(statuses) do |status|
[status.id, { 'immediate' => true, 'skip_streaming' => true }] [status.id, { 'immediate' => true, 'skip_streaming' => true }]
end end

View File

@ -0,0 +1,13 @@
# frozen_string_literal: true
# Automatically enable YJIT as of Ruby 3.3, as it brings very
# sizeable performance improvements.
# If you are deploying to a memory constrained environment
# you may want to delete this file, but otherwise it's free
# performance.
if defined?(RubyVM::YJIT.enable)
Rails.application.config.after_initialize do
RubyVM::YJIT.enable
end
end

View File

@ -53,10 +53,12 @@ if ENV.keys.any? { |name| name.match?(/OTEL_.*_ENDPOINT/) }
}, },
}) })
prefix = ENV.fetch('OTEL_SERVICE_NAME_PREFIX', 'mastodon')
c.service_name = case $PROGRAM_NAME c.service_name = case $PROGRAM_NAME
when /puma/ then 'mastodon/web' when /puma/ then "#{prefix}/web"
else else
"mastodon/#{$PROGRAM_NAME.split('/').last}" "#{prefix}/#{$PROGRAM_NAME.split('/').last}"
end end
c.service_version = Mastodon::Version.to_s c.service_version = Mastodon::Version.to_s
end end

View File

@ -0,0 +1,19 @@
# frozen_string_literal: true
# TODO: https://github.com/simplecov-ruby/simplecov/pull/1084
# Patches this missing condition, monitor for upstream fix
module SimpleCov
module SourceFileExtensions
def build_branches
coverage_branch_data = coverage_data.fetch('branches', {}) || {} # Add the final empty hash in case where 'branches' is present, but returns nil
branches = coverage_branch_data.flat_map do |condition, coverage_branches|
build_branches_from(condition, coverage_branches)
end
process_skipped_branches(branches)
end
end
end
SimpleCov::SourceFile.prepend(SimpleCov::SourceFileExtensions) if defined?(SimpleCov::SourceFile)

View File

@ -86,9 +86,13 @@ ia:
destroyed: A revider! Tu conto esseva cancellate con successo. Nos spera vider te novemente tosto. destroyed: A revider! Tu conto esseva cancellate con successo. Nos spera vider te novemente tosto.
signed_up_but_pending: Un message con un ligamine de confirmation esseva inviate a tu conto de email. Post que tu clicca le ligamine, nos revidera tu application. Tu essera notificate si illo es approbate. signed_up_but_pending: Un message con un ligamine de confirmation esseva inviate a tu conto de email. Post que tu clicca le ligamine, nos revidera tu application. Tu essera notificate si illo es approbate.
updated: Tu conto ha essite actualisate con successo. updated: Tu conto ha essite actualisate con successo.
sessions:
signed_in: Connexe con successo.
signed_out: Disconnexe con successo.
unlocks: unlocks:
unlocked: Tu conto ha essite disblocate con successo. Initia session a continuar. unlocked: Tu conto ha essite disblocate con successo. Initia session a continuar.
errors: errors:
messages: messages:
already_confirmed: jam esseva confirmate, tenta initiar session already_confirmed: jam esseva confirmate, tenta initiar session
not_found: non trovate not_found: non trovate
not_locked: non era blocate

View File

@ -174,6 +174,7 @@ en-GB:
read:filters: see your filters read:filters: see your filters
read:follows: see your follows read:follows: see your follows
read:lists: see your lists read:lists: see your lists
read:me: read only your account's basic information
read:mutes: see your mutes read:mutes: see your mutes
read:notifications: see your notifications read:notifications: see your notifications
read:reports: see your reports read:reports: see your reports

View File

@ -4,6 +4,7 @@ ia:
attributes: attributes:
doorkeeper/application: doorkeeper/application:
name: Nomine de application name: Nomine de application
scopes: Ambitos
website: Sito web de application website: Sito web de application
errors: errors:
models: models:
@ -28,12 +29,14 @@ ia:
empty: Tu non ha applicationes. empty: Tu non ha applicationes.
name: Nomine name: Nomine
new: Nove application new: Nove application
scopes: Ambitos
show: Monstrar show: Monstrar
title: Tu applicationes title: Tu applicationes
new: new:
title: Nove application title: Nove application
show: show:
actions: Actiones actions: Actiones
application_id: Clave del cliente
scopes: Ambitos scopes: Ambitos
title: 'Application: %{name}' title: 'Application: %{name}'
authorizations: authorizations:
@ -42,13 +45,20 @@ ia:
deny: Negar deny: Negar
error: error:
title: Ocurreva un error title: Ocurreva un error
new:
review_permissions: Revisionar le permissos
title: Autorisation necessari
authorized_applications: authorized_applications:
buttons:
revoke: Revocar
confirmations: confirmations:
revoke: Es tu secur? revoke: Es tu secur?
index: index:
authorized_at: Autorisate le %{date}
last_used_at: Ultime uso in %{date} last_used_at: Ultime uso in %{date}
never_used: Nunquam usate never_used: Nunquam usate
scopes: Permissiones scopes: Permissiones
superapp: Interne
title: Tu applicationes autorisate title: Tu applicationes autorisate
flash: flash:
applications: applications:
@ -58,12 +68,21 @@ ia:
notice: Application delite. notice: Application delite.
update: update:
notice: Application actualisate. notice: Application actualisate.
authorized_applications:
destroy:
notice: Application revocate.
grouped_scopes: grouped_scopes:
access:
read: Accesso de sol lectura
read/write: Accesso de lectura e scriptura
write: Accesso de sol scriptura
title: title:
accounts: Contos accounts: Contos
admin/accounts: Gestion de contos admin/accounts: Gestion de contos
admin/all: Tote le functiones administrative
admin/reports: Gestion de reportos admin/reports: Gestion de reportos
all: Accesso plen a tu conto de Mastodon all: Accesso plen a tu conto de Mastodon
blocks: Blocadas
bookmarks: Marcapaginas bookmarks: Marcapaginas
conversations: Conversationes conversations: Conversationes
favourites: Favoritos favourites: Favoritos
@ -84,7 +103,9 @@ ia:
oauth2_provider: Fornitor OAuth2 oauth2_provider: Fornitor OAuth2
scopes: scopes:
admin:read: leger tote le datos in le servitor admin:read: leger tote le datos in le servitor
admin:read:accounts: leger information sensibile de tote le contos
admin:write: modificar tote le datos in le servitor admin:write: modificar tote le datos in le servitor
follow: modificar relationes del contos
read: leger tote le datos de tu conto read: leger tote le datos de tu conto
read:accounts: vider informationes de conto read:accounts: vider informationes de conto
read:bookmarks: vider tu marcapaginas read:bookmarks: vider tu marcapaginas

View File

@ -751,6 +751,7 @@ en-GB:
desc_html: This relies on external scripts from hCaptcha, which may be a security and privacy concern. In addition, <strong>this can make the registration process significantly less accessible to some (especially disabled) people</strong>. For these reasons, please consider alternative measures such as approval-based or invite-based registration. desc_html: This relies on external scripts from hCaptcha, which may be a security and privacy concern. In addition, <strong>this can make the registration process significantly less accessible to some (especially disabled) people</strong>. For these reasons, please consider alternative measures such as approval-based or invite-based registration.
title: Require new users to solve a CAPTCHA to confirm their account title: Require new users to solve a CAPTCHA to confirm their account
content_retention: content_retention:
danger_zone: Danger zone
preamble: Control how user-generated content is stored in Mastodon. preamble: Control how user-generated content is stored in Mastodon.
title: Content retention title: Content retention
default_noindex: default_noindex:

View File

@ -997,6 +997,7 @@ ia:
body_remote: Alcuno de %{domain} ha reportate %{target} body_remote: Alcuno de %{domain} ha reportate %{target}
subject: Nove reporto pro %{instance} (#%{id}) subject: Nove reporto pro %{instance} (#%{id})
new_software_updates: new_software_updates:
body: Nove versiones de Mastodon ha essite publicate, tu poterea voler actualisar!
subject: Nove versiones de Mastodon es disponibile pro %{instance}! subject: Nove versiones de Mastodon es disponibile pro %{instance}!
new_trends: new_trends:
body: 'Le sequente elementos besoniar de un recension ante que illos pote esser monstrate publicamente:' body: 'Le sequente elementos besoniar de un recension ante que illos pote esser monstrate publicamente:'
@ -1048,6 +1049,7 @@ ia:
hint_html: Justo un altere cosa! Nos debe confirmar que tu es un human (isto es assi proque nos pote mantener foras le spam!). Solve le CAPTCHA infra e clicca "Continuar". hint_html: Justo un altere cosa! Nos debe confirmar que tu es un human (isto es assi proque nos pote mantener foras le spam!). Solve le CAPTCHA infra e clicca "Continuar".
title: Controlo de securitate title: Controlo de securitate
confirmations: confirmations:
awaiting_review: Tu adresse email es confirmate! Le personal de %{domain} ora revide tu registration. Tu recipera un email si illes approba tu conto!
awaiting_review_title: Tu registration es revidite awaiting_review_title: Tu registration es revidite
clicking_this_link: cliccante iste ligamine clicking_this_link: cliccante iste ligamine
login_link: acceder login_link: acceder
@ -1066,6 +1068,7 @@ ia:
logout: Clauder le session logout: Clauder le session
migrate_account: Move a un conto differente migrate_account: Move a un conto differente
or_log_in_with: O accede con or_log_in_with: O accede con
privacy_policy_agreement_html: Io ha legite e acceptar le <a href="<a href="%{privacy_policy_path}" target="_blank">politica de confidentialitate</a>
progress: progress:
confirm: Confirma le email confirm: Confirma le email
details: Tu detalios details: Tu detalios
@ -1075,29 +1078,69 @@ ia:
cas: CAS cas: CAS
saml: SAML saml: SAML
register: Inscribe te register: Inscribe te
registration_closed: "%{instance} non accepta nove membros"
resend_confirmation: Reinviar ligamine de confirmation resend_confirmation: Reinviar ligamine de confirmation
reset_password: Remontar le contrasigno reset_password: Remontar le contrasigno
rules: rules:
accept: Acceptar accept: Acceptar
back: Retro back: Retro
invited_by: 'Tu pote junger te a %{domain} gratias al invitation que tu ha recipite de:'
preamble: Illos es predefinite e fortiarte per le moderatores de %{domain}.
preamble_invited: Ante que tu continua, considera le regulas base definite per le moderatores de %{domain}.
title: Alcun regulas base. title: Alcun regulas base.
title_invited: Tu ha essite invitate.
security: Securitate security: Securitate
set_new_password: Definir un nove contrasigno set_new_password: Definir un nove contrasigno
setup:
email_below_hint_html: Verifica tu plica de spam, o pete un altero. Tu pote corriger tu adresse email si illo es errate.
email_settings_hint_html: Clicca le ligamine que nos te inviava pro verificar %{email}.
link_not_received: Non obteneva tu un ligamine?
new_confirmation_instructions_sent: Tu recipera un nove email con le ligamine de confirmation in alcun minutas!
title: Verifica tu cassa de ingresso
sign_in:
preamble_html: Accede con tu <strong>%{domain}</strong> credentiales. Si tu conto es hospite sur un differente servitor, tu non potera authenticar te ci.
title: Acceder a %{domain}
sign_up:
manual_review: Le inscriptiones sur %{domain} passa per revision manual de nostre moderatores. Pro adjutar nos a processar tu registration, scribe un poco re te mesme e perque tu vole un conto sur %{domain}.
preamble: Con un conto sur iste servitor de Mastodon, tu potera sequer ulle altere persona in rete, sin reguardo de ubi lor conto es hospite.
title: Lassa que nos te configura sur %{domain}.
status: status:
account_status: Stato del conto account_status: Stato del conto
confirming: Attendente esser completate email de confirmation.
functional: Tu conto es plenmente operative.
pending: Tu application es pendente de revision per nostre personal. Isto pote prender alcun tempore. Tu recipera un email si tu application es approbate.
redirecting_to: Tu conto es inactive perque illo es actualmente re-adressa a %{acct}.
self_destruct: Dum %{domain} va clauder, tu solo habera accesso limitate a tu conto.
view_strikes: Examinar le admonitiones passate contra tu conto view_strikes: Examinar le admonitiones passate contra tu conto
too_fast: Formulario inviate troppo velocemente, retenta.
use_security_key: Usar clave de securitate use_security_key: Usar clave de securitate
challenge: challenge:
confirm: Continuar confirm: Continuar
hint_html: "<strong>Consilio:</strong> Nos non te demandara tu contrasigno ancora pro le proxime hora."
invalid_password: Contrasigno non valide invalid_password: Contrasigno non valide
prompt: Confirma le contrasigno pro continuar prompt: Confirma le contrasigno pro continuar
crypto:
errors:
invalid_key: non es un clave Ed25519 o Curve25519 valide
invalid_signature: non es un valide firma Ed25519
date:
formats:
default: "%b %d, %Y"
with_month_name: "%B %d, %Y"
datetime: datetime:
distance_in_words: distance_in_words:
about_x_hours: "%{count}h"
about_x_months: "%{count}me"
about_x_years: "%{count}a"
almost_x_years: "%{count}a"
half_a_minute: Justo ora half_a_minute: Justo ora
less_than_x_minutes: "%{count} m"
less_than_x_seconds: Justo ora less_than_x_seconds: Justo ora
over_x_years: "%{count}a" over_x_years: "%{count}a"
x_days: "%{count}d" x_days: "%{count}d"
x_minutes: "%{count} m" x_minutes: "%{count} m"
x_months: "%{count}me"
x_seconds: "%{count}s"
deletes: deletes:
challenge_not_passed: Le informationes que tu ha inserite non era correcte challenge_not_passed: Le informationes que tu ha inserite non era correcte
confirm_password: Insere tu contrasigno actual pro verificar tu identitate confirm_password: Insere tu contrasigno actual pro verificar tu identitate
@ -1174,6 +1217,7 @@ ia:
download: Discargar tu archivo download: Discargar tu archivo
hint_html: Tu pote requirer un archivo de tu <strong>messages e medios cargate</strong>. Le datos exportate sera in le formato ActivityPub, legibile per ulle software conforme. hint_html: Tu pote requirer un archivo de tu <strong>messages e medios cargate</strong>. Le datos exportate sera in le formato ActivityPub, legibile per ulle software conforme.
in_progress: Compilante tu archivo... in_progress: Compilante tu archivo...
request: Pete tu archivo
size: Dimension size: Dimension
blocks: Tu ha blocate blocks: Tu ha blocate
bookmarks: Marcapaginas bookmarks: Marcapaginas
@ -1184,6 +1228,8 @@ ia:
storage: Immagazinage de medios storage: Immagazinage de medios
featured_tags: featured_tags:
add_new: Adder nove add_new: Adder nove
errors:
limit: Tu ha jam consiliate le maxime numero de hashtags
filters: filters:
contexts: contexts:
account: Profilos account: Profilos
@ -1196,17 +1242,33 @@ ia:
keywords: Parolas clave keywords: Parolas clave
statuses: Messages individual statuses: Messages individual
title: Modificar filtro title: Modificar filtro
errors:
invalid_context: Nulle o non valide contexto supplite
index: index:
contexts: Filtros in %{contexts}
delete: Deler delete: Deler
empty: Tu non ha filtros.
expires_in: Expira in %{distance}
expires_on: Expira le %{date}
keywords:
one: "%{count} parola clave"
other: "%{count} parolas clave"
statuses: statuses:
one: "%{count} message" one: "%{count} message"
other: "%{count} messages" other: "%{count} messages"
statuses_long:
one: "%{count} singule message celate"
other: "%{count} singule messages celate"
title: Filtros title: Filtros
new: new:
save: Salveguardar nove filtro save: Salveguardar nove filtro
title: Adder nove filtro title: Adder nove filtro
statuses: statuses:
back_to_filter: Retro al filtro
batch:
remove: Remover ab filtro
index: index:
hint: Iste filtro se applica pro seliger messages singule sin reguardo de altere criterios. Tu pote adder altere messages a iste filtro ab le interfacie web.
title: Messages filtrate title: Messages filtrate
generic: generic:
all: Toto all: Toto
@ -1215,16 +1277,27 @@ ia:
confirm: Confirmar confirm: Confirmar
copy: Copiar copy: Copiar
delete: Deler delete: Deler
deselect: Deseliger toto
none: Nemo none: Nemo
order_by: Ordinar per order_by: Ordinar per
save_changes: Salvar le cambios save_changes: Salvar le cambios
select_all_matching_items:
one: Selige %{count} elemento concordante tu recerca.
other: Selige %{count} elementos concordante tu recerca.
today: hodie today: hodie
validation_errors:
one: Alco non es multo bon ancora! Controla le error infra
other: Alco non es multo bon ancora! Controla %{count} errores infra
imports: imports:
errors: errors:
empty: File CSV vacue empty: File CSV vacue
incompatible_type: Incompatibile con le typo de importation seligite
invalid_csv_file: 'File CSV non valide. Error: %{error}' invalid_csv_file: 'File CSV non valide. Error: %{error}'
over_rows_processing_limit: contine plus que %{count} rangos
too_large: Le file es troppo longe too_large: Le file es troppo longe
failures: Fallimentos failures: Fallimentos
imported: Importate
mismatched_types_warning: Il appare que tu pote haber seligite le typo errate pro iste importation, controla duo vices.
modes: modes:
overwrite_long: Reimplaciar registros actual con le noves overwrite_long: Reimplaciar registros actual con le noves
overwrite_preambles: overwrite_preambles:
@ -1278,6 +1351,8 @@ ia:
max_uses: max_uses:
one: un uso one: un uso
other: "%{count} usos" other: "%{count} usos"
table:
expires_at: Expira
title: Invitar personas title: Invitar personas
login_activities: login_activities:
authentication_methods: authentication_methods:
@ -1316,32 +1391,84 @@ ia:
title: Nove requesta de sequimento title: Nove requesta de sequimento
mention: mention:
action: Responder action: Responder
title: Nove mention
poll: poll:
subject: Un inquesta de %{name} ha finite subject: Un inquesta de %{name} ha finite
otp_authentication: otp_authentication:
enable: Activar enable: Activar
setup: Configurar
pagination: pagination:
next: Sequente next: Sequente
prev: Previe
truncate: "&hellip;"
polls:
errors:
already_voted: Tu jam ha votate in iste sondage
duplicate_options: contine elementos duplicate
duration_too_long: il es troppo lontan in le futuro
duration_too_short: il es troppo tosto
expired: Le sondage ha jam finite
invalid_choice: Le option de voto eligite non existe
over_character_limit: non pote esser plus longe que %{max} characteres cata un
self_vote: Tu non pote vota in tu proprie sondages
too_few_options: debe haber plus que un elemento
too_many_options: non pote continer plus que %{max} elementos
preferences: preferences:
other: Altere other: Altere
posting_defaults: Publicationes predefinite
public_timelines: Chronologias public public_timelines: Chronologias public
privacy: privacy:
privacy: Confidentialitate privacy: Confidentialitate
reach: Portata
search: Cercar search: Cercar
title: Confidentialitate e portata
privacy_policy: privacy_policy:
title: Politica de confidentialitate title: Politica de confidentialitate
reactions:
errors:
limit_reached: Limite de reactiones differente attingite
unrecognized_emoji: non es un emoticone recognoscite
redirects:
prompt: Si tu te fide de iste ligamine, clicca lo pro continuar.
title: Tu va lassar %{instance}.
relationships: relationships:
activity: Activitate del conto activity: Activitate del conto
confirm_follow_selected_followers: Desira tu vermente remover le sequaces seligite?
confirm_remove_selected_followers: Desira tu vermente remover le sequaces seligite?
confirm_remove_selected_follows: Desira tu vermente remover le sequaces seligite?
dormant: Dormiente
follow_failure: Impossibile sequer alcun del contos seligite.
follow_selected_followers: Sequer le sequaces seligite
followers: Sequaces
following: Sequente
invited: Invitate invited: Invitate
last_active: Ultimo active
most_recent: Plus recente most_recent: Plus recente
moved: Movite moved: Movite
mutual: Mutue mutual: Mutue
primary: Primari primary: Primari
relationship: Relation
remove_selected_domains: Remover tote le sequaces ab le dominios seligite
remove_selected_followers: Remover le sequaces seligite
remove_selected_follows: Non plus sequer le usatores seligite
status: Stato del conto status: Stato del conto
remote_follow:
missing_resource: Impossibile trovar le requirite re-adresse URL pro tu conto
reports:
errors:
invalid_rules: non referentia regulas valide
rss: rss:
content_warning: 'Advertimento de contento:' content_warning: 'Advertimento de contento:'
descriptions: descriptions:
account: Messages public de @%{acct} account: Messages public de @%{acct}
tag: 'Messages public plachettate #%{hashtag}'
scheduled_statuses:
over_daily_limit: Tu ha excedite le limite de %{limit} messages programmate pro hodie
over_total_limit: Tu ha excedite le limite de %{limit} messages programmate
too_soon: Le data programmate debe esser in le futuro
self_destruct:
lead_html: Infortunatemente, <strong>%{domain}</strong> va clauder permanentemente. Si tu habeva un conto illac, tu non potera continuar a usar lo, ma tu pote ancora peter un salveguarda de tu datos.
title: Iste servitor va clauder
sessions: sessions:
activity: Ultime activitate activity: Ultime activitate
browser: Navigator browser: Navigator
@ -1368,6 +1495,7 @@ ia:
current_session: Session actual current_session: Session actual
date: Data date: Data
description: "%{browser} sur %{platform}" description: "%{browser} sur %{platform}"
explanation: Il ha navigatores del web actualmente connexe a tu conto Mastodon.
ip: IP ip: IP
platforms: platforms:
adobe_air: Adobe Air adobe_air: Adobe Air
@ -1383,11 +1511,16 @@ ia:
windows: Windows windows: Windows
windows_mobile: Windows Mobile windows_mobile: Windows Mobile
windows_phone: Windows Phone windows_phone: Windows Phone
revoke: Revocar
revoke_success: Session revocate con successo
title: Sessiones title: Sessiones
view_authentication_history: Vider chronologia de authentication de tu conto
settings: settings:
account: Conto account: Conto
account_settings: Parametros de conto account_settings: Parametros de conto
aliases: Aliases de conto
appearance: Apparentia appearance: Apparentia
authorized_apps: Apps autorisate
delete: Deletion de conto delete: Deletion de conto
development: Disveloppamento development: Disveloppamento
edit_profile: Modificar profilo edit_profile: Modificar profilo
@ -1417,6 +1550,13 @@ ia:
private_long: Solmente monstrar a sequitores private_long: Solmente monstrar a sequitores
public: Public public: Public
statuses_cleanup: statuses_cleanup:
keep_pinned_hint: Non dele alcuno de tu messages appunctate
keep_polls: Mantener sondages
keep_polls_hint: Non dele ulle de tu sondages
keep_self_bookmark: Mantener messages que tu marcava con marcapaginas
keep_self_bookmark_hint: Non dele tu proprie messages si tu los ha marcate con marcapaginas
keep_self_fav: Mantene messages que tu favoriva
keep_self_fav_hint: Non dele tu proprie messages si tu los ha favorite
min_age: min_age:
'1209600': 2 septimanas '1209600': 2 septimanas
'15778476': 6 menses '15778476': 6 menses
@ -1426,6 +1566,7 @@ ia:
'604800': 1 septimana '604800': 1 septimana
'63113904': 2 annos '63113904': 2 annos
'7889238': 3 menses '7889238': 3 menses
min_age_label: Limine de etate
stream_entries: stream_entries:
sensitive_content: Contento sensibile sensitive_content: Contento sensibile
strikes: strikes:

View File

@ -77,11 +77,13 @@ cy:
warn: Cuddiwch y cynnwys wedi'i hidlo y tu ôl i rybudd sy'n sôn am deitl yr hidlydd warn: Cuddiwch y cynnwys wedi'i hidlo y tu ôl i rybudd sy'n sôn am deitl yr hidlydd
form_admin_settings: form_admin_settings:
activity_api_enabled: Cyfrif o bostiadau a gyhoeddir yn lleol, defnyddwyr gweithredol, a chofrestriadau newydd mewn bwcedi wythnosol activity_api_enabled: Cyfrif o bostiadau a gyhoeddir yn lleol, defnyddwyr gweithredol, a chofrestriadau newydd mewn bwcedi wythnosol
app_icon: WEBP, PNG, GIF neu JPG. Yn diystyru'r eicon ap rhagosodedig ar ddyfeisiau symudol gydag eicon cyfaddas.
backups_retention_period: Mae gan ddefnyddwyr y gallu i gynhyrchu archifau o'u postiadau i'w llwytho i lawr yn ddiweddarach. Pan gânt eu gosod i werth positif, bydd yr archifau hyn yn cael eu dileu'n awtomatig o'ch storfa ar ôl y nifer penodedig o ddyddiau. backups_retention_period: Mae gan ddefnyddwyr y gallu i gynhyrchu archifau o'u postiadau i'w llwytho i lawr yn ddiweddarach. Pan gânt eu gosod i werth positif, bydd yr archifau hyn yn cael eu dileu'n awtomatig o'ch storfa ar ôl y nifer penodedig o ddyddiau.
bootstrap_timeline_accounts: Bydd y cyfrifon hyn yn cael eu pinio i frig argymhellion dilynol defnyddwyr newydd. bootstrap_timeline_accounts: Bydd y cyfrifon hyn yn cael eu pinio i frig argymhellion dilynol defnyddwyr newydd.
closed_registrations_message: Yn cael eu dangos pan fydd cofrestriadau wedi cau closed_registrations_message: Yn cael eu dangos pan fydd cofrestriadau wedi cau
content_cache_retention_period: Bydd yr holl bostiadau gan weinyddion eraill (gan gynnwys hwb ac atebion) yn cael eu dileu ar ôl y nifer penodedig o ddyddiau, heb ystyried unrhyw ryngweithio defnyddiwr lleol â'r postiadau hynny. Mae hyn yn cynnwys postiadau lle mae defnyddiwr lleol wedi ei farcio fel nodau tudalen neu ffefrynnau. Bydd cyfeiriadau preifat rhwng defnyddwyr o wahanol achosion hefyd yn cael eu colli ac yn amhosibl eu hadfer. Mae'r defnydd o'r gosodiad hwn wedi'i fwriadu ar gyfer achosion pwrpas arbennig ac mae'n torri llawer o ddisgwyliadau defnyddwyr pan gaiff ei weithredu at ddibenion cyffredinol. content_cache_retention_period: Bydd yr holl bostiadau gan weinyddion eraill (gan gynnwys hwb ac atebion) yn cael eu dileu ar ôl y nifer penodedig o ddyddiau, heb ystyried unrhyw ryngweithio defnyddiwr lleol â'r postiadau hynny. Mae hyn yn cynnwys postiadau lle mae defnyddiwr lleol wedi ei farcio fel nodau tudalen neu ffefrynnau. Bydd cyfeiriadau preifat rhwng defnyddwyr o wahanol achosion hefyd yn cael eu colli ac yn amhosibl eu hadfer. Mae'r defnydd o'r gosodiad hwn wedi'i fwriadu ar gyfer achosion pwrpas arbennig ac mae'n torri llawer o ddisgwyliadau defnyddwyr pan gaiff ei weithredu at ddibenion cyffredinol.
custom_css: Gallwch gymhwyso arddulliau cyfaddas ar fersiwn gwe Mastodon. custom_css: Gallwch gymhwyso arddulliau cyfaddas ar fersiwn gwe Mastodon.
favicon: WEBP, PNG, GIF neu JPG. Yn diystyru'r favicon Mastodon rhagosodedig gydag eicon cyfaddas.
mascot: Yn diystyru'r darlun yn y rhyngwyneb gwe uwch. mascot: Yn diystyru'r darlun yn y rhyngwyneb gwe uwch.
media_cache_retention_period: Mae ffeiliau cyfryngau o bostiadau a wneir gan ddefnyddwyr o bell yn cael eu storio ar eich gweinydd. Pan gaiff ei osod i werth positif, bydd y cyfryngau yn cael eu dileu ar ôl y nifer penodedig o ddyddiau. Os gofynnir am y data cyfryngau ar ôl iddo gael ei ddileu, caiff ei ail-lwytho i lawr, os yw'r cynnwys ffynhonnell yn dal i fod ar gael. Oherwydd cyfyngiadau ar ba mor aml y mae cardiau rhagolwg cyswllt yn pleidleisio i wefannau trydydd parti, argymhellir gosod y gwerth hwn i o leiaf 14 diwrnod, neu ni fydd cardiau rhagolwg cyswllt yn cael eu diweddaru ar alw cyn yr amser hwnnw. media_cache_retention_period: Mae ffeiliau cyfryngau o bostiadau a wneir gan ddefnyddwyr o bell yn cael eu storio ar eich gweinydd. Pan gaiff ei osod i werth positif, bydd y cyfryngau yn cael eu dileu ar ôl y nifer penodedig o ddyddiau. Os gofynnir am y data cyfryngau ar ôl iddo gael ei ddileu, caiff ei ail-lwytho i lawr, os yw'r cynnwys ffynhonnell yn dal i fod ar gael. Oherwydd cyfyngiadau ar ba mor aml y mae cardiau rhagolwg cyswllt yn pleidleisio i wefannau trydydd parti, argymhellir gosod y gwerth hwn i o leiaf 14 diwrnod, neu ni fydd cardiau rhagolwg cyswllt yn cael eu diweddaru ar alw cyn yr amser hwnnw.
peers_api_enabled: Rhestr o enwau parth y mae'r gweinydd hwn wedi dod ar eu traws yn y ffediws. Nid oes unrhyw ddata wedi'i gynnwys yma ynghylch a ydych chi'n ffedereiddio â gweinydd penodol, dim ond bod eich gweinydd yn gwybod amdano. Defnyddir hwn gan wasanaethau sy'n casglu ystadegau ar ffedereiddio mewn ystyr cyffredinol. peers_api_enabled: Rhestr o enwau parth y mae'r gweinydd hwn wedi dod ar eu traws yn y ffediws. Nid oes unrhyw ddata wedi'i gynnwys yma ynghylch a ydych chi'n ffedereiddio â gweinydd penodol, dim ond bod eich gweinydd yn gwybod amdano. Defnyddir hwn gan wasanaethau sy'n casglu ystadegau ar ffedereiddio mewn ystyr cyffredinol.

View File

@ -77,10 +77,15 @@ en-GB:
warn: Hide the filtered content behind a warning mentioning the filter's title warn: Hide the filtered content behind a warning mentioning the filter's title
form_admin_settings: form_admin_settings:
activity_api_enabled: Counts of locally published posts, active users, and new registrations in weekly buckets activity_api_enabled: Counts of locally published posts, active users, and new registrations in weekly buckets
app_icon: WEBP, PNG, GIF or JPG. Overrides the default app icon on mobile devices with a custom icon.
backups_retention_period: Users have the ability to generate archives of their posts to download later. When set to a positive value, these archives will be automatically deleted from your storage after the specified number of days.
bootstrap_timeline_accounts: These accounts will be pinned to the top of new users' follow recommendations. bootstrap_timeline_accounts: These accounts will be pinned to the top of new users' follow recommendations.
closed_registrations_message: Displayed when sign-ups are closed closed_registrations_message: Displayed when sign-ups are closed
content_cache_retention_period: All posts from other servers (including boosts and replies) will be deleted after the specified number of days, without regard to any local user interaction with those posts. This includes posts where a local user has marked it as bookmarks or favorites. Private mentions between users from different instances will also be lost and impossible to restore. Use of this setting is intended for special purpose instances and breaks many user expectations when implemented for general purpose use.
custom_css: You can apply custom styles on the web version of Mastodon. custom_css: You can apply custom styles on the web version of Mastodon.
favicon: WEBP, PNG, GIF or JPG. Overrides the default Mastodon favicon with a custom icon.
mascot: Overrides the illustration in the advanced web interface. mascot: Overrides the illustration in the advanced web interface.
media_cache_retention_period: Media files from posts made by remote users are cached on your server. When set to a positive value, media will be deleted after the specified number of days. If the media data is requested after it is deleted, it will be re-downloaded, if the source content is still available. Due to restrictions on how often link preview cards poll third-party sites, it is recommended to set this value to at least 14 days, or link preview cards will not be updated on demand before that time.
peers_api_enabled: A list of domain names this server has encountered in the fediverse. No data is included here about whether you federate with a given server, just that your server knows about it. This is used by services that collect statistics on federation in a general sense. peers_api_enabled: A list of domain names this server has encountered in the fediverse. No data is included here about whether you federate with a given server, just that your server knows about it. This is used by services that collect statistics on federation in a general sense.
profile_directory: The profile directory lists all users who have opted-in to be discoverable. profile_directory: The profile directory lists all users who have opted-in to be discoverable.
require_invite_text: When sign-ups require manual approval, make the “Why do you want to join?” text input mandatory rather than optional require_invite_text: When sign-ups require manual approval, make the “Why do you want to join?” text input mandatory rather than optional
@ -240,6 +245,7 @@ en-GB:
backups_retention_period: User archive retention period backups_retention_period: User archive retention period
bootstrap_timeline_accounts: Always recommend these accounts to new users bootstrap_timeline_accounts: Always recommend these accounts to new users
closed_registrations_message: Custom message when sign-ups are not available closed_registrations_message: Custom message when sign-ups are not available
content_cache_retention_period: Remote content retention period
custom_css: Custom CSS custom_css: Custom CSS
mascot: Custom mascot (legacy) mascot: Custom mascot (legacy)
media_cache_retention_period: Media cache retention period media_cache_retention_period: Media cache retention period

View File

@ -254,9 +254,12 @@ sk:
destroy_status_html: "%{name} zmazal/a príspevok od %{target}" destroy_status_html: "%{name} zmazal/a príspevok od %{target}"
destroy_unavailable_domain_html: "%{name} znova spustil/a doručovanie pre doménu %{target}" destroy_unavailable_domain_html: "%{name} znova spustil/a doručovanie pre doménu %{target}"
destroy_user_role_html: "%{name} vymazal/a rolu pre %{target}" destroy_user_role_html: "%{name} vymazal/a rolu pre %{target}"
enable_custom_emoji_html: "%{name} povolil/a emotikonu %{target}"
enable_user_html: "%{name} povolil/a prihlásenie pre používateľa %{target}" enable_user_html: "%{name} povolil/a prihlásenie pre používateľa %{target}"
memorialize_account_html: "%{name} zmenil/a účet %{target} na pamätnú stránku" memorialize_account_html: "%{name} zmenil/a účet %{target} na pamätnú stránku"
promote_user_html: "%{name} povýšil/a užívateľa %{target}"
reject_appeal_html: "%{name} zamietol/la námietku moderovacieho rozhodnutia od %{target}" reject_appeal_html: "%{name} zamietol/la námietku moderovacieho rozhodnutia od %{target}"
reject_user_html: "%{name} odmietol/la registráciu od %{target}"
remove_avatar_user_html: "%{name} vymazal/a %{target}/ov/in avatar" remove_avatar_user_html: "%{name} vymazal/a %{target}/ov/in avatar"
reopen_report_html: "%{name} znovu otvoril/a nahlásenie %{target}" reopen_report_html: "%{name} znovu otvoril/a nahlásenie %{target}"
resend_user_html: "%{name} znovu odoslal/a potvrdzovací email pre %{target}" resend_user_html: "%{name} znovu odoslal/a potvrdzovací email pre %{target}"
@ -266,7 +269,9 @@ sk:
silence_account_html: "%{name} obmedzil/a účet %{target}" silence_account_html: "%{name} obmedzil/a účet %{target}"
suspend_account_html: "%{name} zablokoval/a účet používateľa %{target}" suspend_account_html: "%{name} zablokoval/a účet používateľa %{target}"
unassigned_report_html: "%{name} odobral/a report od %{target}" unassigned_report_html: "%{name} odobral/a report od %{target}"
unblock_email_account_html: "%{name} odblokoval/a %{target}ovu/inu emailovú adresu"
unsensitive_account_html: "%{name} odznačil/a médium od %{target} ako chúlostivé" unsensitive_account_html: "%{name} odznačil/a médium od %{target} ako chúlostivé"
unsilence_account_html: "%{name} zrušil/a obmedzenie %{target}ovho/inho účtu"
unsuspend_account_html: "%{name} spojazdnil/a účet %{target}" unsuspend_account_html: "%{name} spojazdnil/a účet %{target}"
update_announcement_html: "%{name} aktualizoval/a oboznámenie %{target}" update_announcement_html: "%{name} aktualizoval/a oboznámenie %{target}"
update_custom_emoji_html: "%{name} aktualizoval/a emotikonu %{target}" update_custom_emoji_html: "%{name} aktualizoval/a emotikonu %{target}"
@ -529,6 +534,9 @@ sk:
actions: actions:
suspend_description_html: Tento účet a všetok jeho obsah bude nedostupný a nakoniec zmazaný, interaktovať s ním bude nemožné. Zvrátiteľné v rámci 30 dní. Uzatvára všetky hlásenia voči tomuto účtu. suspend_description_html: Tento účet a všetok jeho obsah bude nedostupný a nakoniec zmazaný, interaktovať s ním bude nemožné. Zvrátiteľné v rámci 30 dní. Uzatvára všetky hlásenia voči tomuto účtu.
add_to_report: Pridaj viac do hlásenia add_to_report: Pridaj viac do hlásenia
already_suspended_badges:
local: Na tomto serveri už vylúčený/á
remote: Už vylúčený/á na ich serveri
are_you_sure: Si si istý/á? are_you_sure: Si si istý/á?
assign_to_self: Priraď sebe assign_to_self: Priraď sebe
assigned: Priradený moderátor assigned: Priradený moderátor
@ -538,6 +546,7 @@ sk:
comment: comment:
none: Žiadne none: Žiadne
confirm: Potvrď confirm: Potvrď
confirm_action: Potvrď moderovací úkon proti @%{acct}
created_at: Nahlásené created_at: Nahlásené
delete_and_resolve: Vymaž príspevky delete_and_resolve: Vymaž príspevky
forwarded: Preposlané forwarded: Preposlané
@ -592,8 +601,14 @@ sk:
delete: Vymaž delete: Vymaž
edit: Uprav postavenie %{name} edit: Uprav postavenie %{name}
everyone: Východzie oprávnenia everyone: Východzie oprávnenia
permissions_count:
few: "%{count} povolení"
many: "%{count} povolení"
one: "%{count} povolenie"
other: "%{count} povolenia"
privileges: privileges:
administrator: Správca administrator: Správca
administrator_description: Užívatelia s týmto povolením, obídu všetky povolenia
delete_user_data: Vymaž užívateľské dáta delete_user_data: Vymaž užívateľské dáta
invite_users: Pozvi užívateľov invite_users: Pozvi užívateľov
manage_announcements: Spravuj oboznámenia manage_announcements: Spravuj oboznámenia

View File

@ -42,7 +42,7 @@ SimpleNavigation::Configuration.run do |navigation|
end end
n.item :invites, safe_join([fa_icon('user-plus fw'), t('invites.title')]), invites_path, if: -> { current_user.can?(:invite_users) && current_user.functional? && !self_destruct } n.item :invites, safe_join([fa_icon('user-plus fw'), t('invites.title')]), invites_path, if: -> { current_user.can?(:invite_users) && current_user.functional? && !self_destruct }
n.item :development, safe_join([fa_icon('code fw'), t('settings.development')]), settings_applications_path, if: -> { current_user.functional? && !self_destruct } n.item :development, safe_join([fa_icon('code fw'), t('settings.development')]), settings_applications_path, highlights_on: %r{/settings/applications}, if: -> { current_user.functional? && !self_destruct }
n.item :trends, safe_join([fa_icon('fire fw'), t('admin.trends.title')]), admin_trends_statuses_path, if: -> { current_user.can?(:manage_taxonomies) && !self_destruct } do |s| n.item :trends, safe_join([fa_icon('fire fw'), t('admin.trends.title')]), admin_trends_statuses_path, if: -> { current_user.can?(:manage_taxonomies) && !self_destruct } do |s|
s.item :statuses, safe_join([fa_icon('comments-o fw'), t('admin.trends.statuses.title')]), admin_trends_statuses_path, highlights_on: %r{/admin/trends/statuses} s.item :statuses, safe_join([fa_icon('comments-o fw'), t('admin.trends.statuses.title')]), admin_trends_statuses_path, highlights_on: %r{/admin/trends/statuses}
@ -51,8 +51,8 @@ SimpleNavigation::Configuration.run do |navigation|
end end
n.item :moderation, safe_join([fa_icon('gavel fw'), t('moderation.title')]), nil, if: -> { current_user.can?(:manage_reports, :view_audit_log, :manage_users, :manage_invites, :manage_taxonomies, :manage_federation, :manage_blocks) && !self_destruct } do |s| n.item :moderation, safe_join([fa_icon('gavel fw'), t('moderation.title')]), nil, if: -> { current_user.can?(:manage_reports, :view_audit_log, :manage_users, :manage_invites, :manage_taxonomies, :manage_federation, :manage_blocks) && !self_destruct } do |s|
s.item :reports, safe_join([fa_icon('flag fw'), t('admin.reports.title')]), admin_reports_path, highlights_on: %r{/admin/reports}, if: -> { current_user.can?(:manage_reports) } s.item :reports, safe_join([fa_icon('flag fw'), t('admin.reports.title')]), admin_reports_path, highlights_on: %r{/admin/reports|admin/report_notes}, if: -> { current_user.can?(:manage_reports) }
s.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_path(origin: 'local'), highlights_on: %r{/admin/accounts|/admin/pending_accounts|/admin/disputes|/admin/users}, if: -> { current_user.can?(:manage_users) } s.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_path(origin: 'local'), highlights_on: %r{/admin/accounts|admin/account_moderation_notes|/admin/pending_accounts|/admin/disputes|/admin/users}, if: -> { current_user.can?(:manage_users) }
s.item :invites, safe_join([fa_icon('user-plus fw'), t('admin.invites.title')]), admin_invites_path, if: -> { current_user.can?(:manage_invites) } s.item :invites, safe_join([fa_icon('user-plus fw'), t('admin.invites.title')]), admin_invites_path, if: -> { current_user.can?(:manage_invites) }
s.item :follow_recommendations, safe_join([fa_icon('user-plus fw'), t('admin.follow_recommendations.title')]), admin_follow_recommendations_path, highlights_on: %r{/admin/follow_recommendations}, if: -> { current_user.can?(:manage_taxonomies) } s.item :follow_recommendations, safe_join([fa_icon('user-plus fw'), t('admin.follow_recommendations.title')]), admin_follow_recommendations_path, highlights_on: %r{/admin/follow_recommendations}, if: -> { current_user.can?(:manage_taxonomies) }
s.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_path(limited: limited_federation_mode? ? nil : '1'), highlights_on: %r{/admin/instances|/admin/domain_blocks|/admin/domain_allows}, if: -> { current_user.can?(:manage_federation) } s.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_path(limited: limited_federation_mode? ? nil : '1'), highlights_on: %r{/admin/instances|/admin/domain_blocks|/admin/domain_allows}, if: -> { current_user.can?(:manage_federation) }

View File

@ -128,7 +128,7 @@ module Mastodon::CLI
model_name = path_segments.first.classify model_name = path_segments.first.classify
attachment_name = path_segments[1].singularize attachment_name = path_segments[1].singularize
record_id = path_segments[2..-2].join.to_i record_id = path_segments[2...-2].join.to_i
file_name = path_segments.last file_name = path_segments.last
record = record_map.dig(model_name, record_id) record = record_map.dig(model_name, record_id)
attachment = record&.public_send(attachment_name) attachment = record&.public_send(attachment_name)
@ -172,7 +172,7 @@ module Mastodon::CLI
end end
model_name = path_segments.first.classify model_name = path_segments.first.classify
record_id = path_segments[2..-2].join.to_i record_id = path_segments[2...-2].join.to_i
attachment_name = path_segments[1].singularize attachment_name = path_segments[1].singularize
file_name = path_segments.last file_name = path_segments.last
@ -297,7 +297,7 @@ module Mastodon::CLI
fail_with_message 'Not a media URL' unless VALID_PATH_SEGMENTS_SIZE.include?(path_segments.size) fail_with_message 'Not a media URL' unless VALID_PATH_SEGMENTS_SIZE.include?(path_segments.size)
model_name = path_segments.first.classify model_name = path_segments.first.classify
record_id = path_segments[2..-2].join.to_i record_id = path_segments[2...-2].join.to_i
fail_with_message "Cannot find corresponding model: #{model_name}" unless PRELOAD_MODEL_WHITELIST.include?(model_name) fail_with_message "Cannot find corresponding model: #{model_name}" unless PRELOAD_MODEL_WHITELIST.include?(model_name)
@ -353,7 +353,7 @@ module Mastodon::CLI
next unless VALID_PATH_SEGMENTS_SIZE.include?(segments.size) next unless VALID_PATH_SEGMENTS_SIZE.include?(segments.size)
model_name = segments.first.classify model_name = segments.first.classify
record_id = segments[2..-2].join.to_i record_id = segments[2...-2].join.to_i
next unless PRELOAD_MODEL_WHITELIST.include?(model_name) next unless PRELOAD_MODEL_WHITELIST.include?(model_name)

View File

@ -24,10 +24,19 @@ RSpec.describe Admin::AccountModerationNotesController do
end end
end end
context 'when parameters are invalid' do context 'when the content is too short' do
let(:params) { { account_moderation_note: { target_account_id: target_account.id, content: '' } } } let(:params) { { account_moderation_note: { target_account_id: target_account.id, content: '' } } }
it 'falls to create a note' do it 'fails to create a note' do
expect { subject }.to_not change(AccountModerationNote, :count)
expect(response).to render_template 'admin/accounts/show'
end
end
context 'when the content is too long' do
let(:params) { { account_moderation_note: { target_account_id: target_account.id, content: 'test' * AccountModerationNote::CONTENT_SIZE_LIMIT } } }
it 'fails to create a note' do
expect { subject }.to_not change(AccountModerationNote, :count) expect { subject }.to_not change(AccountModerationNote, :count)
expect(response).to render_template 'admin/accounts/show' expect(response).to render_template 'admin/accounts/show'
end end

View File

@ -22,7 +22,7 @@ describe Admin::ReportNotesController do
let(:account_id) { nil } let(:account_id) { nil }
context 'when create_and_resolve flag is on' do context 'when create_and_resolve flag is on' do
let(:params) { { report_note: { content: 'test content', report_id: report.id }, create_and_resolve: nil } } let(:params) { { report_note: { report_id: report.id, content: 'test content' }, create_and_resolve: nil } }
it 'creates a report note and resolves report' do it 'creates a report note and resolves report' do
expect { subject }.to change(ReportNote, :count).by(1) expect { subject }.to change(ReportNote, :count).by(1)
@ -32,7 +32,7 @@ describe Admin::ReportNotesController do
end end
context 'when create_and_resolve flag is false' do context 'when create_and_resolve flag is false' do
let(:params) { { report_note: { content: 'test content', report_id: report.id } } } let(:params) { { report_note: { report_id: report.id, content: 'test content' } } }
it 'creates a report note and does not resolve report' do it 'creates a report note and does not resolve report' do
expect { subject }.to change(ReportNote, :count).by(1) expect { subject }.to change(ReportNote, :count).by(1)
@ -47,7 +47,7 @@ describe Admin::ReportNotesController do
let(:account_id) { user.account.id } let(:account_id) { user.account.id }
context 'when create_and_unresolve flag is on' do context 'when create_and_unresolve flag is on' do
let(:params) { { report_note: { content: 'test content', report_id: report.id }, create_and_unresolve: nil } } let(:params) { { report_note: { report_id: report.id, content: 'test content' }, create_and_unresolve: nil } }
it 'creates a report note and unresolves report' do it 'creates a report note and unresolves report' do
expect { subject }.to change(ReportNote, :count).by(1) expect { subject }.to change(ReportNote, :count).by(1)
@ -57,7 +57,7 @@ describe Admin::ReportNotesController do
end end
context 'when create_and_unresolve flag is false' do context 'when create_and_unresolve flag is false' do
let(:params) { { report_note: { content: 'test content', report_id: report.id } } } let(:params) { { report_note: { report_id: report.id, content: 'test content' } } }
it 'creates a report note and does not unresolve report' do it 'creates a report note and does not unresolve report' do
expect { subject }.to change(ReportNote, :count).by(1) expect { subject }.to change(ReportNote, :count).by(1)
@ -68,12 +68,24 @@ describe Admin::ReportNotesController do
end end
end end
context 'when parameter is invalid' do context 'when content is too short' do
let(:params) { { report_note: { content: '', report_id: report.id } } } let(:params) { { report_note: { report_id: report.id, content: '' } } }
let(:action_taken) { nil } let(:action_taken) { nil }
let(:account_id) { nil } let(:account_id) { nil }
it 'renders admin/reports/show' do it 'renders admin/reports/show' do
expect { subject }.to_not change(ReportNote, :count)
expect(subject).to render_template 'admin/reports/show'
end
end
context 'when content is too long' do
let(:params) { { report_note: { report_id: report.id, content: 'test' * ReportNote::CONTENT_SIZE_LIMIT } } }
let(:action_taken) { nil }
let(:account_id) { nil }
it 'renders admin/reports/show' do
expect { subject }.to_not change(ReportNote, :count)
expect(subject).to render_template 'admin/reports/show' expect(subject).to render_template 'admin/reports/show'
end end
end end

View File

@ -2,20 +2,20 @@
require 'rails_helper' require 'rails_helper'
RSpec.describe CacheConcern do RSpec.describe PreloadingConcern do
controller(ApplicationController) do controller(ApplicationController) do
include CacheConcern include PreloadingConcern
def empty_array def empty_array
render plain: cache_collection([], Status).size render plain: preload_collection([], Status).size
end end
def empty_relation def empty_relation
render plain: cache_collection(Status.none, Status).size render plain: preload_collection(Status.none, Status).size
end end
def account_statuses_favourites def account_statuses_favourites
render plain: cache_collection(Status.where(account_id: params[:id]), Status).map(&:favourites_count) render plain: preload_collection(Status.where(account_id: params[:id]), Status).map(&:favourites_count)
end end
end end
@ -27,7 +27,7 @@ RSpec.describe CacheConcern do
end end
end end
describe '#cache_collection' do describe '#preload_collection' do
context 'when given an empty array' do context 'when given an empty array' do
it 'returns an empty array' do it 'returns an empty array' do
get :empty_array get :empty_array

View File

@ -288,26 +288,31 @@ describe ApplicationHelper do
end end
end end
describe '#site_icon_path' do describe 'favicon' do
context 'when an icon exists' do context 'when an icon exists' do
let!(:favicon) { Fabricate(:site_upload, var: 'favicon') } let!(:favicon) { Fabricate(:site_upload, var: 'favicon') }
let!(:app_icon) { Fabricate(:site_upload, var: 'app_icon') }
it 'returns the URL of the icon' do it 'returns the URL of the icon' do
expect(helper.site_icon_path('favicon')).to eq(favicon.file.url('48')) expect(helper.favicon_path).to eq(favicon.file.url('48'))
expect(helper.app_icon_path).to eq(app_icon.file.url('48'))
end end
it 'returns the URL of the icon with size parameter' do it 'returns the URL of the icon with size parameter' do
expect(helper.site_icon_path('favicon', 16)).to eq(favicon.file.url('16')) expect(helper.favicon_path(16)).to eq(favicon.file.url('16'))
expect(helper.app_icon_path(16)).to eq(app_icon.file.url('16'))
end end
end end
context 'when an icon does not exist' do context 'when an icon does not exist' do
it 'returns nil' do it 'returns nil' do
expect(helper.site_icon_path('favicon')).to be_nil expect(helper.favicon_path).to be_nil
expect(helper.app_icon_path).to be_nil
end end
it 'returns nil with size parameter' do it 'returns nil with size parameter' do
expect(helper.site_icon_path('favicon', 16)).to be_nil expect(helper.favicon_path(16)).to be_nil
expect(helper.app_icon_path(16)).to be_nil
end end
end end
end end

View File

@ -2,6 +2,31 @@
ENV['RAILS_ENV'] ||= 'test' ENV['RAILS_ENV'] ||= 'test'
unless ENV['DISABLE_SIMPLECOV'] == 'true'
require 'simplecov'
SimpleCov.start 'rails' do
if ENV['CI']
require 'simplecov-lcov'
formatter SimpleCov::Formatter::LcovFormatter
formatter.config.report_with_single_file = true
else
formatter SimpleCov::Formatter::HTMLFormatter
end
enable_coverage :branch
add_filter 'lib/linter'
add_group 'Libraries', 'lib'
add_group 'Policies', 'app/policies'
add_group 'Presenters', 'app/presenters'
add_group 'Serializers', 'app/serializers'
add_group 'Services', 'app/services'
add_group 'Validators', 'app/validators'
end
end
# This needs to be defined before Rails is initialized # This needs to be defined before Rails is initialized
STREAMING_PORT = ENV.fetch('TEST_STREAMING_PORT', '4020') STREAMING_PORT = ENV.fetch('TEST_STREAMING_PORT', '4020')
ENV['STREAMING_API_BASE_URL'] = "http://localhost:#{STREAMING_PORT}" ENV['STREAMING_API_BASE_URL'] = "http://localhost:#{STREAMING_PORT}"

View File

@ -1,9 +1,5 @@
# frozen_string_literal: true # frozen_string_literal: true
unless ENV['DISABLE_SIMPLECOV'] == 'true'
require 'simplecov' # Configuration details loaded from .simplecov
end
RSpec.configure do |config| RSpec.configure do |config|
config.example_status_persistence_file_path = 'tmp/rspec/examples.txt' config.example_status_persistence_file_path = 'tmp/rspec/examples.txt'
config.expect_with :rspec do |expectations| config.expect_with :rspec do |expectations|

View File

@ -14,7 +14,7 @@ describe Scheduler::UserCleanupScheduler do
before do before do
# Need to update the already-existing users because their initialization overrides confirmation_sent_at # Need to update the already-existing users because their initialization overrides confirmation_sent_at
new_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: Time.now.utc) new_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: Time.now.utc)
old_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: 1.week.ago) old_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: 10.days.ago)
confirmed_user.update!(confirmed_at: 1.day.ago) confirmed_user.update!(confirmed_at: 1.day.ago)
end end

112
yarn.lock
View File

@ -1617,15 +1617,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@csstools/postcss-cascade-layers@npm:^4.0.5": "@csstools/postcss-cascade-layers@npm:^4.0.6":
version: 4.0.5 version: 4.0.6
resolution: "@csstools/postcss-cascade-layers@npm:4.0.5" resolution: "@csstools/postcss-cascade-layers@npm:4.0.6"
dependencies: dependencies:
"@csstools/selector-specificity": "npm:^3.1.0" "@csstools/selector-specificity": "npm:^3.1.1"
postcss-selector-parser: "npm:^6.0.13" postcss-selector-parser: "npm:^6.0.13"
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
checksum: 10c0/2b6dd33b51df349dd89b12ebe3240d65accb0ba03e40288a72e26cf2307a7bdd742c42d9ff7a3f886cab19b2f8813978075f6ee61a985b0b7ceac7e2cbb29e04 checksum: 10c0/134019e9b3f71de39034658e2a284f549883745a309f774d8d272871f9e65680e0981c893766537a8a56ed7f41dba2d0f9fc3cb4fa4057c227bc193976a2ec79
languageName: node languageName: node
linkType: hard linkType: hard
@ -1749,15 +1749,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@csstools/postcss-is-pseudo-class@npm:^4.0.7": "@csstools/postcss-is-pseudo-class@npm:^4.0.8":
version: 4.0.7 version: 4.0.8
resolution: "@csstools/postcss-is-pseudo-class@npm:4.0.7" resolution: "@csstools/postcss-is-pseudo-class@npm:4.0.8"
dependencies: dependencies:
"@csstools/selector-specificity": "npm:^3.1.0" "@csstools/selector-specificity": "npm:^3.1.1"
postcss-selector-parser: "npm:^6.0.13" postcss-selector-parser: "npm:^6.0.13"
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
checksum: 10c0/43668987df4608f822dbc323d3ac567fa7c192235b55933fd5d1855977ead80184512eb64a3f45a020fdd93711952ba8e9f9a280f4e981625b68a9ff074f9a01 checksum: 10c0/82f191571c3e0973354a54ef15feeb17f9408b4abbefad19fc0f087683b1212fc854cdf09a47324267dd47be4c5cb47d63b8d083695a67c3f8f3e53df3d561f6
languageName: node languageName: node
linkType: hard linkType: hard
@ -1983,12 +1983,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@csstools/selector-specificity@npm:^3.0.3, @csstools/selector-specificity@npm:^3.1.0": "@csstools/selector-specificity@npm:^3.0.3, @csstools/selector-specificity@npm:^3.1.1":
version: 3.1.0 version: 3.1.1
resolution: "@csstools/selector-specificity@npm:3.1.0" resolution: "@csstools/selector-specificity@npm:3.1.1"
peerDependencies: peerDependencies:
postcss-selector-parser: ^6.0.13 postcss-selector-parser: ^6.0.13
checksum: 10c0/7f77f8377b637dcca7f7a9d6ace3329cf60f02cbd75f14241de30b1f5d00c961ec167572bc93517cdb2f106405a91119f026389a0f96dabae8dd67d1c7710e60 checksum: 10c0/1d4a3f8015904d6aeb3203afe0e1f6db09b191d9c1557520e3e960c9204ad852df9db4cbde848643f78a26f6ea09101b4e528dbb9193052db28258dbcc8a6e1d
languageName: node languageName: node
linkType: hard linkType: hard
@ -3053,8 +3053,8 @@ __metadata:
linkType: hard linkType: hard
"@reduxjs/toolkit@npm:^2.0.1": "@reduxjs/toolkit@npm:^2.0.1":
version: 2.2.4 version: 2.2.5
resolution: "@reduxjs/toolkit@npm:2.2.4" resolution: "@reduxjs/toolkit@npm:2.2.5"
dependencies: dependencies:
immer: "npm:^10.0.3" immer: "npm:^10.0.3"
redux: "npm:^5.0.1" redux: "npm:^5.0.1"
@ -3068,7 +3068,7 @@ __metadata:
optional: true optional: true
react-redux: react-redux:
optional: true optional: true
checksum: 10c0/fdbf510210a5aa4864432397e1a9469367e297cd1d9c09a82e68638df7555672c2f8511fe76f933b00efbbb233c534831591772a44e8c41233e34f3cd0f54569 checksum: 10c0/be0593bf26852482fb8716b9248531466c6e8782a3114b823ae680fce90267d8c5512a3231cfecc30b17eff81a4604112772b49ad7ca6a3366ddd4f2a838e53c
languageName: node languageName: node
linkType: hard linkType: hard
@ -6391,9 +6391,9 @@ __metadata:
linkType: hard linkType: hard
"core-js@npm:^3.30.2": "core-js@npm:^3.30.2":
version: 3.37.0 version: 3.37.1
resolution: "core-js@npm:3.37.0" resolution: "core-js@npm:3.37.1"
checksum: 10c0/7e00331f346318ca3f595c08ce9e74ddae744715aef137486c1399163afd79792fb94c3161280863adfdc3e30f8026912d56bd3036f93cacfc689d33e185f2ee checksum: 10c0/440eb51a7a39128a320225fe349f870a3641b96c9ecd26470227db730ef8c161ea298eaea621db66ec0ff622a85299efb4e23afebf889c0a1748616102307675
languageName: node languageName: node
linkType: hard linkType: hard
@ -6587,16 +6587,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"css-has-pseudo@npm:^6.0.4": "css-has-pseudo@npm:^6.0.5":
version: 6.0.4 version: 6.0.5
resolution: "css-has-pseudo@npm:6.0.4" resolution: "css-has-pseudo@npm:6.0.5"
dependencies: dependencies:
"@csstools/selector-specificity": "npm:^3.1.0" "@csstools/selector-specificity": "npm:^3.1.1"
postcss-selector-parser: "npm:^6.0.13" postcss-selector-parser: "npm:^6.0.13"
postcss-value-parser: "npm:^4.2.0" postcss-value-parser: "npm:^4.2.0"
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
checksum: 10c0/e9d440de483e15092ebaadb483502243f43e0457d4214c8012ebdba7a959e74d40714254bf97247780e65735512f248a55feda0b3975d9a5eaea9c746f7518f0 checksum: 10c0/946930b7e699d6dbcb8426ebcd593228ee0e2143a148fb2399111ea4c9ed8d6eb3447e944251f1be44ae987d5ab16e450b0b006ca197f318c2a3760ba431fbb9
languageName: node languageName: node
linkType: hard linkType: hard
@ -13066,13 +13066,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"pino-std-serializers@npm:^6.0.0":
version: 6.2.2
resolution: "pino-std-serializers@npm:6.2.2"
checksum: 10c0/8f1c7f0f0d8f91e6c6b5b2a6bfb48f06441abeb85f1c2288319f736f9c6d814fbeebe928d2314efc2ba6018fa7db9357a105eca9fc99fc1f28945a8a8b28d3d5
languageName: node
linkType: hard
"pino-std-serializers@npm:^7.0.0": "pino-std-serializers@npm:^7.0.0":
version: 7.0.0 version: 7.0.0
resolution: "pino-std-serializers@npm:7.0.0" resolution: "pino-std-serializers@npm:7.0.0"
@ -13081,23 +13074,23 @@ __metadata:
linkType: hard linkType: hard
"pino@npm:^9.0.0": "pino@npm:^9.0.0":
version: 9.0.0 version: 9.1.0
resolution: "pino@npm:9.0.0" resolution: "pino@npm:9.1.0"
dependencies: dependencies:
atomic-sleep: "npm:^1.0.0" atomic-sleep: "npm:^1.0.0"
fast-redact: "npm:^3.1.1" fast-redact: "npm:^3.1.1"
on-exit-leak-free: "npm:^2.1.0" on-exit-leak-free: "npm:^2.1.0"
pino-abstract-transport: "npm:^1.2.0" pino-abstract-transport: "npm:^1.2.0"
pino-std-serializers: "npm:^6.0.0" pino-std-serializers: "npm:^7.0.0"
process-warning: "npm:^3.0.0" process-warning: "npm:^3.0.0"
quick-format-unescaped: "npm:^4.0.3" quick-format-unescaped: "npm:^4.0.3"
real-require: "npm:^0.2.0" real-require: "npm:^0.2.0"
safe-stable-stringify: "npm:^2.3.1" safe-stable-stringify: "npm:^2.3.1"
sonic-boom: "npm:^3.7.0" sonic-boom: "npm:^4.0.1"
thread-stream: "npm:^2.6.0" thread-stream: "npm:^3.0.0"
bin: bin:
pino: bin.js pino: bin.js
checksum: 10c0/10ef10aee0cf80af8ed83468cff2e29d642b6794b53cf641e1abcaf9e9958d8bcbc6e09d62757054aef3b4415c45d66a5018da11d43b81a23ba299ef5dc4e8b1 checksum: 10c0/d060530ae2e4e8f21d04bb0f44f009f94d207d7f4337f508f618416514214ddaf1b29f8c5c265153a19ce3b6480b451461f40020f916ace9d53a5aa07624b79c
languageName: node languageName: node
linkType: hard linkType: hard
@ -13572,16 +13565,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"postcss-nesting@npm:^12.1.3": "postcss-nesting@npm:^12.1.4":
version: 12.1.3 version: 12.1.4
resolution: "postcss-nesting@npm:12.1.3" resolution: "postcss-nesting@npm:12.1.4"
dependencies: dependencies:
"@csstools/selector-resolve-nested": "npm:^1.1.0" "@csstools/selector-resolve-nested": "npm:^1.1.0"
"@csstools/selector-specificity": "npm:^3.1.0" "@csstools/selector-specificity": "npm:^3.1.1"
postcss-selector-parser: "npm:^6.0.13" postcss-selector-parser: "npm:^6.0.13"
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
checksum: 10c0/6b2d3a4823e85592965c6c11f749c5357703256e7334388147d6a3bb72a3abbe47789afaa8535bdd7a9bd6d0099eb12ffec6c154050d8e8b8286b1adbed5b397 checksum: 10c0/b3408de4c04b58a88a56fa81aeff59b12615c78d4f5a57e09c1ee47e74cff51f8c9cad1684da0059067303cf65b4b688f85f0c5ca8d54af8c4ab998f727ab9fd
languageName: node languageName: node
linkType: hard linkType: hard
@ -13736,10 +13729,10 @@ __metadata:
linkType: hard linkType: hard
"postcss-preset-env@npm:^9.5.2": "postcss-preset-env@npm:^9.5.2":
version: 9.5.12 version: 9.5.13
resolution: "postcss-preset-env@npm:9.5.12" resolution: "postcss-preset-env@npm:9.5.13"
dependencies: dependencies:
"@csstools/postcss-cascade-layers": "npm:^4.0.5" "@csstools/postcss-cascade-layers": "npm:^4.0.6"
"@csstools/postcss-color-function": "npm:^3.0.16" "@csstools/postcss-color-function": "npm:^3.0.16"
"@csstools/postcss-color-mix-function": "npm:^2.0.16" "@csstools/postcss-color-mix-function": "npm:^2.0.16"
"@csstools/postcss-exponential-functions": "npm:^1.0.7" "@csstools/postcss-exponential-functions": "npm:^1.0.7"
@ -13749,7 +13742,7 @@ __metadata:
"@csstools/postcss-hwb-function": "npm:^3.0.15" "@csstools/postcss-hwb-function": "npm:^3.0.15"
"@csstools/postcss-ic-unit": "npm:^3.0.6" "@csstools/postcss-ic-unit": "npm:^3.0.6"
"@csstools/postcss-initial": "npm:^1.0.1" "@csstools/postcss-initial": "npm:^1.0.1"
"@csstools/postcss-is-pseudo-class": "npm:^4.0.7" "@csstools/postcss-is-pseudo-class": "npm:^4.0.8"
"@csstools/postcss-light-dark-function": "npm:^1.0.5" "@csstools/postcss-light-dark-function": "npm:^1.0.5"
"@csstools/postcss-logical-float-and-clear": "npm:^2.0.1" "@csstools/postcss-logical-float-and-clear": "npm:^2.0.1"
"@csstools/postcss-logical-overflow": "npm:^1.0.1" "@csstools/postcss-logical-overflow": "npm:^1.0.1"
@ -13771,7 +13764,7 @@ __metadata:
autoprefixer: "npm:^10.4.19" autoprefixer: "npm:^10.4.19"
browserslist: "npm:^4.22.3" browserslist: "npm:^4.22.3"
css-blank-pseudo: "npm:^6.0.2" css-blank-pseudo: "npm:^6.0.2"
css-has-pseudo: "npm:^6.0.4" css-has-pseudo: "npm:^6.0.5"
css-prefers-color-scheme: "npm:^9.0.1" css-prefers-color-scheme: "npm:^9.0.1"
cssdb: "npm:^8.0.0" cssdb: "npm:^8.0.0"
postcss-attribute-case-insensitive: "npm:^6.0.3" postcss-attribute-case-insensitive: "npm:^6.0.3"
@ -13791,7 +13784,7 @@ __metadata:
postcss-image-set-function: "npm:^6.0.3" postcss-image-set-function: "npm:^6.0.3"
postcss-lab-function: "npm:^6.0.16" postcss-lab-function: "npm:^6.0.16"
postcss-logical: "npm:^7.0.1" postcss-logical: "npm:^7.0.1"
postcss-nesting: "npm:^12.1.3" postcss-nesting: "npm:^12.1.4"
postcss-opacity-percentage: "npm:^2.0.0" postcss-opacity-percentage: "npm:^2.0.0"
postcss-overflow-shorthand: "npm:^5.0.1" postcss-overflow-shorthand: "npm:^5.0.1"
postcss-page-break: "npm:^3.0.4" postcss-page-break: "npm:^3.0.4"
@ -13801,7 +13794,7 @@ __metadata:
postcss-selector-not: "npm:^7.0.2" postcss-selector-not: "npm:^7.0.2"
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
checksum: 10c0/3e0276b2061baa396547f9c0090fcb0c6149d3735c7aefa99a8e520701aae0b7265578b59d5e4efa9f5e61659c161e39590a5d63bac49469b99da1c549b63231 checksum: 10c0/5bbb6e87b1b3acc816ef445836f85df5f50ac96bdc3d571952a83794c80863c652d27ab14c66f6b88f86f5664119d49b357e4184162022cc3436676f3fbe833b
languageName: node languageName: node
linkType: hard linkType: hard
@ -15846,7 +15839,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"sonic-boom@npm:^3.0.0, sonic-boom@npm:^3.7.0": "sonic-boom@npm:^3.0.0":
version: 3.7.0 version: 3.7.0
resolution: "sonic-boom@npm:3.7.0" resolution: "sonic-boom@npm:3.7.0"
dependencies: dependencies:
@ -15855,6 +15848,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"sonic-boom@npm:^4.0.1":
version: 4.0.1
resolution: "sonic-boom@npm:4.0.1"
dependencies:
atomic-sleep: "npm:^1.0.0"
checksum: 10c0/7b467f2bc8af7ff60bf210382f21c59728cc4b769af9b62c31dd88723f5cc472752d2320736cc366acc7c765ddd5bec3072c033b0faf249923f576a7453ba9d3
languageName: node
linkType: hard
"source-list-map@npm:^2.0.0": "source-list-map@npm:^2.0.0":
version: 2.0.1 version: 2.0.1
resolution: "source-list-map@npm:2.0.1" resolution: "source-list-map@npm:2.0.1"
@ -16800,12 +16802,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"thread-stream@npm:^2.6.0": "thread-stream@npm:^3.0.0":
version: 2.6.0 version: 3.0.0
resolution: "thread-stream@npm:2.6.0" resolution: "thread-stream@npm:3.0.0"
dependencies: dependencies:
real-require: "npm:^0.2.0" real-require: "npm:^0.2.0"
checksum: 10c0/276e2545b33273232eb2c22c53fc11844951c1322f8a78c522477af716ebcfe0d106ccf1fbc455f6e48d928e93231fed6377ce91fdcb3885086e8ffa1f011c88 checksum: 10c0/1f4da5a8c93b170cdc7c1ad774af49bb2af43f73cfd9a7f8fb02b766255b483eb6d0b734502c880397baa95c0ce3490088b9a487cff32d4e481aab6fe76560f5
languageName: node languageName: node
linkType: hard linkType: hard