diff --git a/.github/renovate.json5 b/.github/renovate.json5 index a7998ddfdc954a..dab99829a1be87 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -99,6 +99,16 @@ matchUpdateTypes: ['patch', 'minor'], groupName: 'eslint (non-major)', }, + { + // Group actions/*-artifact in the same PR + matchManagers: ['github-actions'], + matchPackageNames: [ + 'actions/download-artifact', + 'actions/upload-artifact', + ], + matchUpdateTypes: ['major'], + groupName: 'artifact actions (major)', + }, { // Update @types/* packages every week, with one grouped PR matchPackagePrefixes: '@types/', diff --git a/.haml-lint_todo.yml b/.haml-lint_todo.yml index 6b26a60d34370c..9bdeeefdd20427 100644 --- a/.haml-lint_todo.yml +++ b/.haml-lint_todo.yml @@ -1,23 +1,18 @@ # This configuration was generated by # `haml-lint --auto-gen-config` -# on 2023-10-26 09:32:34 -0400 using Haml-Lint version 0.51.0. +# on 2023-12-15 11:02:19 -0500 using Haml-Lint version 0.52.0. # The point is for the user to remove these configuration records # one by one as the lints are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of Haml-Lint, may require this file to be generated again. linters: - # Offense count: 16 + # Offense count: 11 LineLength: exclude: - - 'app/views/admin/account_actions/new.html.haml' - - 'app/views/admin/accounts/index.html.haml' - - 'app/views/admin/ip_blocks/new.html.haml' - 'app/views/admin/roles/_form.html.haml' - - 'app/views/admin/settings/discovery/show.html.haml' - 'app/views/auth/registrations/edit.html.haml' - 'app/views/auth/registrations/new.html.haml' - - 'app/views/filters/_filter_fields.html.haml' - 'app/views/media/player.html.haml' - 'app/views/settings/applications/_fields.html.haml' - 'app/views/settings/imports/index.html.haml' @@ -25,15 +20,12 @@ linters: - 'app/views/settings/preferences/notifications/show.html.haml' - 'app/views/settings/preferences/other/show.html.haml' - 'app/views/settings/preferences/reaching/show.html.haml' - - 'app/views/settings/profiles/show.html.haml' - 'app/views/settings/privacy_extra/show.html.haml' + - 'app/views/settings/profiles/show.html.haml' # Offense count: 9 RuboCop: exclude: - - 'app/views/admin/accounts/_buttons.html.haml' - - 'app/views/admin/accounts/_local_account.html.haml' - - 'app/views/admin/roles/_form.html.haml' - 'app/views/home/index.html.haml' ViewLength: diff --git a/.nvmrc b/.nvmrc index 48ef2c10babeda..d4c3d320cc8dc8 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.9 +20.10 diff --git a/.rubocop.yml b/.rubocop.yml index a897c8562132a0..333b632670062d 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -117,6 +117,21 @@ Rails/Exit: - 'config/boot.rb' - 'lib/mastodon/cli/*.rb' +Rails/SkipsModelValidations: + Exclude: + - 'db/*migrate/**/*' + +# Reason: We want to preserve the ability to migrate from arbitrary old versions, +# and cannot guarantee that every installation has run every migration as they upgrade. +# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsunusedignoredcolumns +Rails/UnusedIgnoredColumns: + Enabled: false + +# Reason: Prevailing style choice +# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsnegateinclude +Rails/NegateInclude: + Enabled: false + # Reason: Some single letter camel case files shouldn't be split # https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecfilepath RSpec/FilePath: diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 099a53f9296d9e..b21f98e62983eb 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -26,7 +26,7 @@ Lint/NonLocalExitFromIterator: # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes. Metrics/AbcSize: - Max: 125 + Max: 100 # Configuration parameters: CountBlocks, Max. Metrics/BlockNesting: @@ -121,23 +121,6 @@ Rails/LexicallyScopedActionFilter: - 'app/controllers/auth/passwords_controller.rb' - 'app/controllers/auth/registrations_controller.rb' -# This cop supports unsafe autocorrection (--autocorrect-all). -Rails/NegateInclude: - Exclude: - - 'app/controllers/concerns/signature_verification.rb' - - 'app/helpers/jsonld_helper.rb' - - 'app/lib/activitypub/activity/create.rb' - - 'app/lib/activitypub/activity/move.rb' - - 'app/lib/feed_manager.rb' - - 'app/lib/link_details_extractor.rb' - - 'app/models/concerns/attachmentable.rb' - - 'app/models/concerns/remotable.rb' - - 'app/models/custom_filter.rb' - - 'app/services/activitypub/process_status_update_service.rb' - - 'app/services/fetch_link_card_service.rb' - - 'app/workers/web/push_notification_worker.rb' - - 'lib/paperclip/color_extractor.rb' - Rails/OutputSafety: Exclude: - 'config/initializers/simple_form.rb' @@ -183,22 +166,6 @@ Rails/SkipsModelValidations: - 'app/workers/move_worker.rb' - 'app/workers/scheduler/ip_cleanup_scheduler.rb' - 'app/workers/scheduler/scheduled_statuses_scheduler.rb' - - 'db/migrate/20161203164520_add_from_account_id_to_notifications.rb' - - 'db/migrate/20170105224407_add_shortcode_to_media_attachments.rb' - - 'db/migrate/20170209184350_add_reply_to_statuses.rb' - - 'db/migrate/20170304202101_add_type_to_media_attachments.rb' - - 'db/migrate/20180528141303_fix_accounts_unique_index.rb' - - 'db/migrate/20180609104432_migrate_web_push_subscriptions2.rb' - - 'db/migrate/20181207011115_downcase_custom_emoji_domains.rb' - - 'db/migrate/20190511134027_add_silenced_at_suspended_at_to_accounts.rb' - - 'db/migrate/20191007013357_update_pt_locales.rb' - - 'db/migrate/20220316233212_update_kurdish_locales.rb' - - 'db/post_migrate/20190511152737_remove_suspended_silenced_account_fields.rb' - - 'db/post_migrate/20200917193528_migrate_notifications_type.rb' - - 'db/post_migrate/20201017234926_fill_account_suspension_origin.rb' - - 'db/post_migrate/20220617202502_migrate_roles.rb' - - 'db/post_migrate/20221101190723_backfill_admin_action_logs.rb' - - 'db/post_migrate/20221206114142_backfill_admin_action_logs_again.rb' - 'lib/mastodon/cli/accounts.rb' - 'lib/mastodon/cli/maintenance.rb' - 'spec/lib/activitypub/activity/follow_spec.rb' @@ -214,19 +181,6 @@ Rails/UniqueValidationWithoutIndex: - 'app/models/identity.rb' - 'app/models/webauthn_credential.rb' -# Configuration parameters: Include. -# Include: app/models/**/*.rb -Rails/UnusedIgnoredColumns: - Exclude: - - 'app/models/account.rb' - - 'app/models/account_stat.rb' - - 'app/models/admin/action_log.rb' - - 'app/models/custom_filter.rb' - - 'app/models/email_domain_block.rb' - - 'app/models/report.rb' - - 'app/models/status_edit.rb' - - 'app/models/user.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle. # SupportedStyles: exists, where @@ -380,22 +334,6 @@ Style/IfUnlessModifier: - 'config/initializers/devise.rb' - 'config/initializers/ffmpeg.rb' -# This cop supports unsafe autocorrection (--autocorrect-all). -# Configuration parameters: InverseMethods, InverseBlocks. -Style/InverseMethods: - Exclude: - - 'app/models/custom_filter.rb' - - 'app/services/update_account_service.rb' - - 'spec/controllers/activitypub/replies_controller_spec.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle. -# SupportedStyles: line_count_dependent, lambda, literal -Style/Lambda: - Exclude: - - 'config/initializers/simple_form.rb' - - 'config/routes.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). Style/MapToHash: Exclude: @@ -460,15 +398,6 @@ Style/RedundantFetchBlock: - 'config/initializers/paperclip.rb' - 'config/puma.rb' -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: AllowMultipleReturnValues. -Style/RedundantReturn: - Exclude: - - 'app/controllers/api/v1/directories_controller.rb' - - 'app/controllers/auth/confirmations_controller.rb' - - 'app/lib/ostatus/tag_manager.rb' - - 'app/models/form/import.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength. # AllowedMethods: present?, blank?, presence, try, try! @@ -489,11 +418,6 @@ Style/SingleArgumentDig: Exclude: - 'lib/webpacker/manifest_extensions.rb' -# This cop supports safe autocorrection (--autocorrect). -Style/StderrPuts: - Exclude: - - 'config/boot.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: Mode. Style/StringConcatenation: @@ -513,13 +437,6 @@ Style/StringLiterals: - 'config/routes.rb' - 'db/schema.rb' -# This cop supports unsafe autocorrection (--autocorrect-all). -# Configuration parameters: AllowMethodsWithArguments, AllowedMethods, AllowedPatterns, AllowComments. -# AllowedMethods: define_method, mail, respond_to -Style/SymbolProc: - Exclude: - - 'config/initializers/3_omniauth.rb' - # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: EnforcedStyle, AllowSafeAssignment. # SupportedStyles: require_parentheses, require_no_parentheses, require_parentheses_when_complex diff --git a/Gemfile.lock b/Gemfile.lock index 26f6862647c069..cc81946e87115c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -131,20 +131,20 @@ GEM attr_required (1.0.1) awrence (1.2.1) aws-eventstream (1.3.0) - aws-partitions (1.857.0) - aws-sdk-core (3.188.0) - aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (1.860.0) + aws-sdk-core (3.189.0) + aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.5) + aws-sigv4 (~> 1.8) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.73.0) + aws-sdk-kms (1.74.0) aws-sdk-core (~> 3, >= 3.188.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.140.0) - aws-sdk-core (~> 3, >= 3.188.0) + aws-sdk-s3 (1.141.0) + aws-sdk-core (~> 3, >= 3.189.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.6) - aws-sigv4 (1.7.0) + aws-sigv4 (~> 1.8) + aws-sigv4 (1.8.0) aws-eventstream (~> 1, >= 1.0.2) azure-storage-blob (2.0.3) azure-storage-common (~> 2.0) @@ -168,7 +168,7 @@ GEM erubi (~> 1.4) parser (>= 2.4) smart_properties - bigdecimal (3.1.4) + bigdecimal (3.1.5) bindata (2.4.15) binding_of_caller (1.0.0) debug_inspector (>= 0.0.1) @@ -197,7 +197,7 @@ GEM activesupport cbor (0.5.9.6) charlock_holmes (0.7.7) - chewy (7.3.5) + chewy (7.4.0) activesupport (>= 5.2) elasticsearch (>= 7.12.0, < 7.14.0) elasticsearch-dsl @@ -515,7 +515,7 @@ GEM openssl (> 2.0) orm_adapter (0.5.0) ox (2.14.17) - parallel (1.23.0) + parallel (1.24.0) parser (3.2.2.4) ast (~> 2.4.1) racc @@ -681,10 +681,10 @@ GEM rubocop (~> 1.41) rubocop-factory_bot (2.24.0) rubocop (~> 1.33) - rubocop-performance (1.19.1) - rubocop (>= 1.7.0, < 2.0) - rubocop-ast (>= 0.4.0) - rubocop-rails (2.22.2) + rubocop-performance (1.20.0) + rubocop (>= 1.48.1, < 2.0) + rubocop-ast (>= 1.30.0, < 2.0) + rubocop-rails (2.23.0) activesupport (>= 4.2.0) rack (>= 1.1) rubocop (>= 1.33.0, < 2.0) diff --git a/app/controllers/admin/follow_recommendations_controller.rb b/app/controllers/admin/follow_recommendations_controller.rb index 841e3cc7fbf86a..a54e41bd8c1c13 100644 --- a/app/controllers/admin/follow_recommendations_controller.rb +++ b/app/controllers/admin/follow_recommendations_controller.rb @@ -8,7 +8,7 @@ def show authorize :follow_recommendation, :show? @form = Form::AccountBatch.new - @accounts = filtered_follow_recommendations + @accounts = filtered_follow_recommendations.page(params[:page]) end def update diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index a9d771de0b032e..20e1c8223b1413 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -108,6 +108,10 @@ def require_not_suspended! render json: { error: 'Your login is currently disabled' }, status: 403 if current_user&.account&.unavailable? end + def require_valid_pagination_options! + render json: { error: 'Pagination values for `offset` and `limit` must be positive' }, status: 400 if pagination_options_invalid? + end + def require_user! if !current_user render json: { error: 'This method requires an authenticated user' }, status: 422 @@ -136,6 +140,10 @@ def disallow_unauthenticated_api_access? private + def pagination_options_invalid? + params.slice(:limit, :offset).values.map(&:to_i).any?(&:negative?) + end + def respond_with_error(code) render json: { error: Rack::Utils::HTTP_STATUS_CODES[code] }, status: code end diff --git a/app/controllers/api/v1/accounts/notes_controller.rb b/app/controllers/api/v1/accounts/notes_controller.rb index 032e807d11ff94..6d115631a2b2d8 100644 --- a/app/controllers/api/v1/accounts/notes_controller.rb +++ b/app/controllers/api/v1/accounts/notes_controller.rb @@ -25,6 +25,6 @@ def set_account end def relationships_presenter - AccountRelationshipsPresenter.new([@account.id], current_user.account_id) + AccountRelationshipsPresenter.new([@account], current_user.account_id) end end diff --git a/app/controllers/api/v1/accounts/pins_controller.rb b/app/controllers/api/v1/accounts/pins_controller.rb index 73f845c6143a04..0eb13c048ce759 100644 --- a/app/controllers/api/v1/accounts/pins_controller.rb +++ b/app/controllers/api/v1/accounts/pins_controller.rb @@ -25,6 +25,6 @@ def set_account end def relationships_presenter - AccountRelationshipsPresenter.new([@account.id], current_user.account_id) + AccountRelationshipsPresenter.new([@account], current_user.account_id) end end diff --git a/app/controllers/api/v1/accounts/relationships_controller.rb b/app/controllers/api/v1/accounts/relationships_controller.rb index e5ae5b007ba937..d43832177a54bb 100644 --- a/app/controllers/api/v1/accounts/relationships_controller.rb +++ b/app/controllers/api/v1/accounts/relationships_controller.rb @@ -5,7 +5,7 @@ class Api::V1::Accounts::RelationshipsController < Api::BaseController before_action :require_user! def index - @accounts = Account.where(id: account_ids).select('id') + @accounts = Account.where(id: account_ids).select(:id, :domain) @accounts.merge!(Account.without_suspended) unless truthy_param?(:with_suspended) render json: @accounts, each_serializer: REST::RelationshipSerializer, relationships: relationships end diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb index 3031f8098ed580..1886919d92dcef 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts_controller.rb @@ -88,7 +88,7 @@ def check_account_confirmation end def relationships(**options) - AccountRelationshipsPresenter.new([@account.id], current_user.account_id, **options) + AccountRelationshipsPresenter.new([@account], current_user.account_id, **options) end def account_params diff --git a/app/controllers/api/v1/directories_controller.rb b/app/controllers/api/v1/directories_controller.rb index 35c504a7ff0965..e79b20ce429fe1 100644 --- a/app/controllers/api/v1/directories_controller.rb +++ b/app/controllers/api/v1/directories_controller.rb @@ -12,7 +12,7 @@ def show private def require_enabled! - return not_found unless Setting.profile_directory + not_found unless Setting.profile_directory end def set_accounts diff --git a/app/controllers/api/v1/follow_requests_controller.rb b/app/controllers/api/v1/follow_requests_controller.rb index 7c197ce6ba3179..ee717ebbcc404f 100644 --- a/app/controllers/api/v1/follow_requests_controller.rb +++ b/app/controllers/api/v1/follow_requests_controller.rb @@ -25,11 +25,11 @@ def reject private def account - Account.find(params[:id]) + @account ||= Account.find(params[:id]) end def relationships(**options) - AccountRelationshipsPresenter.new([params[:id]], current_user.account_id, **options) + AccountRelationshipsPresenter.new([account], current_user.account_id, **options) end def load_accounts diff --git a/app/controllers/api/v1/suggestions_controller.rb b/app/controllers/api/v1/suggestions_controller.rb index 9737ae5cb620da..9ba1cef63cab75 100644 --- a/app/controllers/api/v1/suggestions_controller.rb +++ b/app/controllers/api/v1/suggestions_controller.rb @@ -3,22 +3,23 @@ class Api::V1::SuggestionsController < Api::BaseController include Authorization - before_action -> { doorkeeper_authorize! :read } + before_action -> { doorkeeper_authorize! :read, :'read:accounts' }, only: :index + before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, except: :index before_action :require_user! + before_action :set_suggestions def index - suggestions = suggestions_source.get(current_account, limit: limit_param(DEFAULT_ACCOUNTS_LIMIT)) - render json: suggestions.map(&:account), each_serializer: REST::AccountSerializer + render json: @suggestions.get(limit_param(DEFAULT_ACCOUNTS_LIMIT), params[:offset].to_i).map(&:account), each_serializer: REST::AccountSerializer end def destroy - suggestions_source.remove(current_account, params[:id]) + @suggestions.remove(params[:id]) render_empty end private - def suggestions_source - AccountSuggestions::PastInteractionsSource.new + def set_suggestions + @suggestions = AccountSuggestions.new(current_account) end end diff --git a/app/controllers/api/v2/search_controller.rb b/app/controllers/api/v2/search_controller.rb index 28d3c23f87f497..a701cbe582e4fc 100644 --- a/app/controllers/api/v2/search_controller.rb +++ b/app/controllers/api/v2/search_controller.rb @@ -12,6 +12,7 @@ class Api::V2::SearchController < Api::BaseController before_action :query_pagination_error, if: :pagination_requested? before_action :remote_resolve_error, if: :remote_resolve_requested? end + before_action :require_valid_pagination_options! def index @search = Search.new(search_results) diff --git a/app/controllers/api/v2/suggestions_controller.rb b/app/controllers/api/v2/suggestions_controller.rb index 35eb276c01fb7d..8516796e8600e6 100644 --- a/app/controllers/api/v2/suggestions_controller.rb +++ b/app/controllers/api/v2/suggestions_controller.rb @@ -3,17 +3,23 @@ class Api::V2::SuggestionsController < Api::BaseController include Authorization - before_action -> { doorkeeper_authorize! :read } + before_action -> { doorkeeper_authorize! :read, :'read:accounts' }, only: :index + before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, except: :index before_action :require_user! before_action :set_suggestions def index - render json: @suggestions, each_serializer: REST::SuggestionSerializer + render json: @suggestions.get(limit_param(DEFAULT_ACCOUNTS_LIMIT), params[:offset].to_i), each_serializer: REST::SuggestionSerializer + end + + def destroy + @suggestions.remove(params[:id]) + render_empty end private def set_suggestions - @suggestions = AccountSuggestions.get(current_account, limit_param(DEFAULT_ACCOUNTS_LIMIT)) + @suggestions = AccountSuggestions.new(current_account) end end diff --git a/app/controllers/auth/confirmations_controller.rb b/app/controllers/auth/confirmations_controller.rb index 9f6be9c424d0c4..d9cd630905b418 100644 --- a/app/controllers/auth/confirmations_controller.rb +++ b/app/controllers/auth/confirmations_controller.rb @@ -62,7 +62,7 @@ def set_confirmation_user! end def captcha_user_bypass? - return true if @confirmation_user.nil? || @confirmation_user.confirmed? + @confirmation_user.nil? || @confirmation_user.confirmed? end def require_unconfirmed! diff --git a/app/controllers/relationships_controller.rb b/app/controllers/relationships_controller.rb index e87b5a656f1a48..dd794f3199eeec 100644 --- a/app/controllers/relationships_controller.rb +++ b/app/controllers/relationships_controller.rb @@ -33,7 +33,7 @@ def set_accounts end def set_relationships - @relationships = AccountRelationshipsPresenter.new(@accounts.pluck(:id), current_user.account_id) + @relationships = AccountRelationshipsPresenter.new(@accounts, current_user.account_id) end def form_account_batch_params diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index e7fb1e1cdfd9b4..2a189ea6024fb0 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -110,7 +110,7 @@ def class_for_scope(scope) def can?(action, record) return false if record.nil? - policy(record).public_send("#{action}?") + policy(record).public_send(:"#{action}?") end def fa_icon(icon, attributes = {}) diff --git a/app/javascript/mastodon/actions/accounts_typed.ts b/app/javascript/mastodon/actions/accounts_typed.ts index b908e7528eeb60..058a68a0991316 100644 --- a/app/javascript/mastodon/actions/accounts_typed.ts +++ b/app/javascript/mastodon/actions/accounts_typed.ts @@ -21,7 +21,7 @@ function actionWithSkipLoadingTrue(args: Args) { } export const followAccountSuccess = createAction( - 'accounts/followAccountSuccess', + 'accounts/followAccount/SUCCESS', actionWithSkipLoadingTrue<{ relationship: ApiRelationshipJSON; alreadyFollowing: boolean; @@ -29,7 +29,7 @@ export const followAccountSuccess = createAction( ); export const unfollowAccountSuccess = createAction( - 'accounts/unfollowAccountSuccess', + 'accounts/unfollowAccount/SUCCESS', actionWithSkipLoadingTrue<{ relationship: ApiRelationshipJSON; statuses: unknown; @@ -38,60 +38,60 @@ export const unfollowAccountSuccess = createAction( ); export const authorizeFollowRequestSuccess = createAction<{ id: string }>( - 'accounts/followRequestAuthorizeSuccess', + 'accounts/followRequestAuthorize/SUCCESS', ); export const rejectFollowRequestSuccess = createAction<{ id: string }>( - 'accounts/followRequestRejectSuccess', + 'accounts/followRequestReject/SUCCESS', ); export const followAccountRequest = createAction( - 'accounts/followRequest', + 'accounts/follow/REQUEST', actionWithSkipLoadingTrue<{ id: string; locked: boolean }>, ); export const followAccountFail = createAction( - 'accounts/followFail', + 'accounts/follow/FAIL', actionWithSkipLoadingTrue<{ id: string; error: string; locked: boolean }>, ); export const unfollowAccountRequest = createAction( - 'accounts/unfollowRequest', + 'accounts/unfollow/REQUEST', actionWithSkipLoadingTrue<{ id: string }>, ); export const unfollowAccountFail = createAction( - 'accounts/unfollowFail', + 'accounts/unfollow/FAIL', actionWithSkipLoadingTrue<{ id: string; error: string }>, ); export const blockAccountSuccess = createAction<{ relationship: ApiRelationshipJSON; statuses: unknown; -}>('accounts/blockSuccess'); +}>('accounts/block/SUCCESS'); export const unblockAccountSuccess = createAction<{ relationship: ApiRelationshipJSON; -}>('accounts/unblockSuccess'); +}>('accounts/unblock/SUCCESS'); export const muteAccountSuccess = createAction<{ relationship: ApiRelationshipJSON; statuses: unknown; -}>('accounts/muteSuccess'); +}>('accounts/mute/SUCCESS'); export const unmuteAccountSuccess = createAction<{ relationship: ApiRelationshipJSON; -}>('accounts/unmuteSuccess'); +}>('accounts/unmute/SUCCESS'); export const pinAccountSuccess = createAction<{ relationship: ApiRelationshipJSON; -}>('accounts/pinSuccess'); +}>('accounts/pin/SUCCESS'); export const unpinAccountSuccess = createAction<{ relationship: ApiRelationshipJSON; -}>('accounts/unpinSuccess'); +}>('accounts/unpin/SUCCESS'); export const fetchRelationshipsSuccess = createAction( - 'relationships/fetchSuccess', + 'relationships/fetch/SUCCESS', actionWithSkipLoadingTrue<{ relationships: ApiRelationshipJSON[] }>, ); diff --git a/app/javascript/mastodon/actions/domain_blocks_typed.ts b/app/javascript/mastodon/actions/domain_blocks_typed.ts index 08e0b4a1788e60..6a4cace0de91e7 100644 --- a/app/javascript/mastodon/actions/domain_blocks_typed.ts +++ b/app/javascript/mastodon/actions/domain_blocks_typed.ts @@ -5,9 +5,9 @@ import type { Account } from 'mastodon/models/account'; export const blockDomainSuccess = createAction<{ domain: string; accounts: Account[]; -}>('domain_blocks/blockSuccess'); +}>('domain_blocks/block/SUCCESS'); export const unblockDomainSuccess = createAction<{ domain: string; accounts: Account[]; -}>('domain_blocks/unblockSuccess'); +}>('domain_blocks/unblock/SUCCESS'); diff --git a/app/javascript/mastodon/components/dropdown_menu.jsx b/app/javascript/mastodon/components/dropdown_menu.jsx index 56705ee0cb25cd..d9cbcc32e5d706 100644 --- a/app/javascript/mastodon/components/dropdown_menu.jsx +++ b/app/javascript/mastodon/components/dropdown_menu.jsx @@ -257,7 +257,7 @@ class Dropdown extends PureComponent { }; findTarget = () => { - return this.target?.buttonRef?.current || this.target; // kmyblue fixed + return this.target?.buttonRef?.current ?? this.target; }; componentWillUnmount = () => { diff --git a/app/javascript/mastodon/features/__tests__/toggle-play.jsx b/app/javascript/mastodon/features/__tests__/toggle-play.jsx deleted file mode 100644 index 9c999db8677ced..00000000000000 --- a/app/javascript/mastodon/features/__tests__/toggle-play.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; - -import { render, fireEvent } from '@testing-library/react'; - -class Media extends Component { - - constructor(props) { - super(props); - - this.state = { - paused: props.paused || false, - }; - } - - handleMediaClick = () => { - const { onClick } = this.props; - - this.setState(prevState => ({ - paused: !prevState.paused, - })); - - if (typeof onClick === 'function') { - onClick(); - } - - const { title } = this.props; - const mediaElements = document.querySelectorAll(`div[title="${title}"]`); - - setTimeout(() => { - mediaElements.forEach(element => { - if (element !== this && !element.classList.contains('paused')) { - element.click(); - } - }); - }, 0); - }; - - render() { - const { title } = this.props; - const { paused } = this.state; - - return ( - - ); - } - -} - -Media.propTypes = { - title: PropTypes.string.isRequired, - onClick: PropTypes.func, - paused: PropTypes.bool, -}; - -describe('Media attachments test', () => { - let currentMedia = null; - const togglePlayMock = jest.fn(); - - it('plays a new media file and pauses others that were playing', () => { - const container = render( -
- - -
, - ); - - fireEvent.click(container.getByTitle('firstMedia')); - expect(togglePlayMock).toHaveBeenCalledTimes(1); - currentMedia = container.getByTitle('firstMedia'); - expect(currentMedia.textContent).toMatch(/Playing/); - - fireEvent.click(container.getByTitle('secondMedia')); - expect(togglePlayMock).toHaveBeenCalledTimes(2); - currentMedia = container.getByTitle('secondMedia'); - expect(currentMedia.textContent).toMatch(/Playing/); - }); -}); diff --git a/app/javascript/mastodon/features/audio/index.jsx b/app/javascript/mastodon/features/audio/index.jsx index fac43416c961bd..7a7d0910fa8f70 100644 --- a/app/javascript/mastodon/features/audio/index.jsx +++ b/app/javascript/mastodon/features/audio/index.jsx @@ -20,7 +20,6 @@ import { formatTime, getPointerPosition, fileNameFromURL } from 'mastodon/featur import { Blurhash } from '../../components/blurhash'; import { displayMedia, useBlurhash } from '../../initial_state'; -import { currentMedia, setCurrentMedia } from '../../reducers/media_attachments'; import Visualizer from './visualizer'; @@ -166,32 +165,15 @@ class Audio extends PureComponent { } togglePlay = () => { - const audios = document.querySelectorAll('audio'); - - audios.forEach((audio) => { - const button = audio.previousElementSibling; - button.addEventListener('click', () => { - if(audio.paused) { - audios.forEach((e) => { - if (e !== audio) { - e.pause(); - } - }); - audio.play(); - this.setState({ paused: false }); - } else { - audio.pause(); - this.setState({ paused: true }); - } - }); - }); - - if (currentMedia !== null) { - currentMedia.pause(); + if (!this.audioContext) { + this._initAudioContext(); } - this.audio.play(); - setCurrentMedia(this.audio); + if (this.state.paused) { + this.setState({ paused: false }, () => this.audio.play()); + } else { + this.setState({ paused: true }, () => this.audio.pause()); + } }; handleResize = debounce(() => { @@ -213,7 +195,6 @@ class Audio extends PureComponent { }; handlePause = () => { - this.audio.pause(); this.setState({ paused: true }); if (this.audioContext) { diff --git a/app/javascript/mastodon/features/video/index.jsx b/app/javascript/mastodon/features/video/index.jsx index 9ff6d3589ef39c..e908715e911cc5 100644 --- a/app/javascript/mastodon/features/video/index.jsx +++ b/app/javascript/mastodon/features/video/index.jsx @@ -22,7 +22,6 @@ import { Icon } from 'mastodon/components/icon'; import { playerSettings } from 'mastodon/settings'; import { displayMedia, useBlurhash } from '../../initial_state'; -import { currentMedia, setCurrentMedia } from '../../reducers/media_attachments'; import { isFullscreen, requestFullscreen, exitFullscreen } from '../ui/util/fullscreen'; const messages = defineMessages({ @@ -182,7 +181,6 @@ class Video extends PureComponent { }; handlePause = () => { - this.video.pause(); this.setState({ paused: true }); }; @@ -346,32 +344,11 @@ class Video extends PureComponent { }; togglePlay = () => { - const videos = document.querySelectorAll('video'); - - videos.forEach((video) => { - const button = video.nextElementSibling; - button.addEventListener('click', () => { - if (video.paused) { - videos.forEach((e) => { - if (e !== video) { - e.pause(); - } - }); - video.play(); - this.setState({ paused: false }); - } else { - video.pause(); - this.setState({ paused: true }); - } - }); - }); - - if (currentMedia !== null) { - currentMedia.pause(); + if (this.state.paused) { + this.setState({ paused: false }, () => this.video.play()); + } else { + this.setState({ paused: true }, () => this.video.pause()); } - - this.video.play(); - setCurrentMedia(this.video); }; toggleFullscreen = () => { diff --git a/app/javascript/mastodon/locales/fil.json b/app/javascript/mastodon/locales/fil.json index 0967ef424bce67..bc76358875372f 100644 --- a/app/javascript/mastodon/locales/fil.json +++ b/app/javascript/mastodon/locales/fil.json @@ -1 +1,145 @@ -{} +{ + "about.blocks": "Mga pinatimping server", + "about.contact": "Kontak:", + "about.disclaimer": "Ang Mastodon ay software na malaya at bukas-na-pinagmulan, at isang tatak-pangkalakal ng Mastodon gGmbH.", + "about.domain_blocks.no_reason_available": "Hindi makuha ang dahilan", + "about.domain_blocks.silenced.title": "Limitado", + "about.domain_blocks.suspended.title": "Suspendido", + "about.rules": "Mga alituntunin ng server", + "account.account_note_header": "Tala", + "account.add_or_remove_from_list": "I-dagdag o tanggalin mula sa mga listahan", + "account.badges.bot": "Pakusa", + "account.badges.group": "Pangkat", + "account.block": "Hadlangan si @{name}", + "account.block_domain": "Hadlangan ang domain na {domain}", + "account.block_short": "Hadlangan", + "account.blocked": "Hinadlangan", + "account.browse_more_on_origin_server": "Tingnan pa sa pangunahing profile", + "account.cancel_follow_request": "I-kansela ang pagsunod", + "account.copy": "I-sipi ang kawing sa profile", + "account.direct": "Palihim banggitin si @{name}", + "account.disable_notifications": "I-tigil ang pagpapaalam sa akin tuwing nagpopost si @{name}", + "account.domain_blocked": "Hinadlangan ang domain", + "account.edit_profile": "Baguhin ang profile", + "account.enable_notifications": "Ipaalam sa akin kapag nag-post si @{name}", + "account.endorse": "I-tampok sa profile", + "account.featured_tags.last_status_at": "Huling post noong {date}", + "account.featured_tags.last_status_never": "Walang mga post", + "account.featured_tags.title": "Nakatampok na hashtag ni {name}", + "account.follow": "Sundan", + "account.followers": "Mga tagasunod", + "account.followers.empty": "Wala pang sumusunod sa tagagamit na ito.", + "account.following": "Sinusundan", + "account.follows.empty": "Wala pang sinusundan ang tagagamit na ito.", + "account.follows_you": "Sinusunod ka", + "account.go_to_profile": "Pumunta sa profile", + "account.hide_reblogs": "Itago ang mga pagpapalakas mula sa {name}", + "account.in_memoriam": "Sa Alaala Ni.", + "account.joined_short": "Sumali", + "account.languages": "Palitan ang mga nakasumuscribing wika", + "account.link_verified_on": "Sinuri ang pagmamay-ari ng kawing ito sa {date}", + "account.locked_info": "Nakakandado ang pagsasariling kalagayan ng account na ito. Manomano sinusuri ng may-ari kung sino ang maaaring sumunod sa kanya.", + "account.media": "Medya", + "account.mention": "Banggitin si @{name}", + "account.moved_to": "Ipinahihiwatig ni {name} na ang kanilang bagong account ngayon ay:", + "bundle_column_error.error.title": "Naku!", + "bundle_column_error.network.body": "Nagkaroon ng kamalian habang sinusubukang i-karga ang pahinang ito. Maaaring dahil ito sa pansamantalang problema ng iyong koneksyon sa internet o ang server na ito.", + "bundle_column_error.network.title": "Kamaliang network", + "bundle_column_error.retry": "Subukang muli", + "bundle_column_error.return": "Bumalik sa tahanan", + "bundle_column_error.routing.body": "Hindi mahanap ang hiniling na pahina. Sigurado ka ba na ang URL sa address bar ay tama?", + "bundle_column_error.routing.title": "404", + "bundle_modal_error.close": "I-sara", + "bundle_modal_error.message": "May nangyaring mali habang kinakarga ang bahaging ito.", + "bundle_modal_error.retry": "Subukang muli", + "closed_registrations.other_server_instructions": "Dahil desentralisado ang Mastodon, pwede kang gumawa ng account sa iba pang server at makipag-ugnayan pa rin dito.", + "closed_registrations_modal.description": "Hindi pa pwedeng gumawa ng account sa {domain}, pero tandaan na hindi mo kailangan ng account partikular sa {domain} para gamitin ang Mastodon.", + "closed_registrations_modal.find_another_server": "Maghanap ng iba pang server", + "closed_registrations_modal.preamble": "Dahil desentralisado ang Mastodon, kahit saan ka pa gumawa ng account, maaari ka pa ring sumunod at makipag-ugnayan sa kahit-sino rito sa server na ito. Pwede mo pang i-host nang pasarili!", + "closed_registrations_modal.title": "Pagrerehistro sa Mastodon", + "column.about": "Tungkol dito", + "column.blocks": "Nakahadlang na mga tagagamit", + "column.bookmarks": "Mga bookmark", + "column.community": "Lokal na timeline", + "column.direct": "Mga palihim na banggit", + "column.directory": "Tingnan ang mga profile", + "column.domain_blocks": "Nakahadlang na mga domain", + "column.favourites": "Mga paborito", + "column.firehose": "Mga live feed", + "column.follow_requests": "Mga hiling para sundan", + "column.home": "Tahanan", + "column.lists": "Mga listahan", + "column.mutes": "Mga pinatahimik na tagagamit", + "column.notifications": "Mga abiso", + "column.pins": "Mga nakapaskil na post", + "column.public": "Pinagsamang timeline", + "column_back_button.label": "Bumalik", + "column_header.hide_settings": "I-tago ang mga setting", + "column_header.moveLeft_settings": "I-lipat ang hanay pakaliwa", + "column_header.moveRight_settings": "I-lipat ang hanay pakanan", + "column_header.pin": "I-paskil", + "column_header.show_settings": "Ipakita ang mga setting", + "column_header.unpin": "Tanggalin sa pagkapaskil", + "column_subheading.settings": "Mga setting", + "community.column_settings.local_only": "Lokal lamang", + "community.column_settings.media_only": "Medya Lamang", + "community.column_settings.remote_only": "Liblib lamang", + "compose.language.change": "Magpalit ng wika", + "compose.language.search": "Maghanap ng mga wika...", + "compose.published.body": "Nailathala ang post.", + "compose.published.open": "Buksan", + "compose.saved.body": "Nai-save ang post.", + "compose_form.direct_message_warning_learn_more": "Matuto pa", + "compose_form.encryption_warning": "Ang mga post sa Mastodon ay hindi naka-encrypt nang dulo-dulo. Huwag magbahagi ng anumang sensitibong impormasyon sa Mastodon.", + "compose_form.hashtag_warning": "Hindi maililista ang post na ito sa anumang hashtag dahil hindi ito nakapubliko. Mga nakapublikong post lamang ang mahahanap ayon sa hashtag.", + "copy_icon_button.copied": "Sinipi sa clipboard", + "copypaste.copied": "Sinipi", + "copypaste.copy_to_clipboard": "I-sipi sa clipboard", + "directory.federated": "Mula sa kilalang fediverse", + "directory.local": "Mula sa {domain} lamang", + "directory.new_arrivals": "Mga bagong dating", + "directory.recently_active": "Kamakailang aktibo", + "disabled_account_banner.account_settings": "Mga setting ng account", + "disabled_account_banner.text": "Ang iyong account na {disabledAccount} ay hindi pinapagana ngayon.", + "dismissable_banner.community_timeline": "Ito ang mga pinakamakailang nakapublikong post mula sa mga taong ang mga account hinohost ng {domain}.", + "dismissable_banner.dismiss": "Alisin", + "dismissable_banner.explore_links": "Ito ang mga balitang kwento na pinaka-binabahagi sa social web ngayon. Ang mga mas bagong balitang kwento na pinost ng mas marami pang mga iba't ibang tao ay tinataasan ng antas.", + "dismissable_banner.explore_statuses": "Ito ang mga sumisikat na mga post sa iba't ibang bahagi ng social web ngayon. Ang mga mas bagong post na mas marami ang mga pagpapalakas at paborito ay tinataasan ng antas.", + "dismissable_banner.explore_tags": "Ito ang mga sumisikat na mga hashtag sa iba't ibang bahagi ng social web ngayon. Ang mga hashtag ginagamit ng mas maraming mga iba't ibang tao ay tinataasan ng antas.", + "dismissable_banner.public_timeline": "Ito ang mga pinakamakailang nakapublikong post mula sa mga taong nasa social web na sinusundan ng mga tao sa {domain}.", + "embed.instructions": "I-embed ang post na ito sa iyong pook-sapot sa pamamagitan ng pagsipi ng kodigo sa ilalim.", + "embed.preview": "Ito ang magiging itsura:", + "emoji_button.activity": "Aktibidad", + "emoji_button.clear": "Linisin", + "emoji_button.custom": "Pasadya", + "emoji_button.flags": "Mga watawat", + "emoji_button.food": "Pagkain at Inumin", + "emoji_button.label": "Maglagay ng emoji", + "emoji_button.nature": "Kalikasan", + "emoji_button.not_found": "Walang mahanap na mga tugmang emoji", + "emoji_button.objects": "Mga bagay", + "emoji_button.people": "Mga tao", + "emoji_button.recent": "Madalas na ginagamit", + "emoji_button.search": "Maghanap...", + "emoji_button.search_results": "Resulta ng paghahanap", + "emoji_button.symbols": "Mga tanda", + "emoji_button.travel": "Paglakbay at Mga Lugar", + "empty_column.account_hides_collections": "Pinili ng tagagamit na ito na hindi makuha ang impormasyong ito", + "empty_column.account_suspended": "Sinuspinde ang account", + "empty_column.account_timeline": "Walang mga post dito!", + "empty_column.account_unavailable": "Hindi makuha ang profile", + "empty_column.blocks": "Hindi ka pa naghahadlang ng sinumang tagagamit.", + "empty_column.bookmarked_statuses": "Wala ka pang naka-bookmark na post. Kapag nag-bookmark ka ng isa, makikita yun dito.", + "empty_column.community": "Walang laman ang lokal na timeline. Magsulat ng anuman papubliko para makaandar tayo!", + "empty_column.direct": "Wala ka pang mga palihim na banggit. Kapag nagpadala o tumanggap ka ng isa, makikita yun dito.", + "empty_column.domain_blocks": "Wala pang nakahadlang na domain.", + "empty_column.explore_statuses": "Wala pang sumisikat sa ngayon. Balik na lang sa muli!", + "empty_column.favourited_statuses": "Wala ka pang mga paboritong post. Kapag nag-paborito ka ng isa, makikita yun dito.", + "empty_column.favourites": "Wala pang may paborito ng post na ito. Kung may sinumang nagpaborito, makikita sila rito.", + "empty_column.follow_requests": "Wala ka pang mga hiling para sundan ka. Kapag nakatanggap ka ng isa, makikita yun dito.", + "empty_column.followed_tags": "Wala ka pang sinusunod na hashtag. Kapag may sinundan ka na, makikita sila rito.", + "empty_column.hashtag": "Wala pang laman ang hashtag na ito.", + "empty_column.home": "Walang laman ang timeline ng tahanan mo! Sumunod sa marami pang tao para mapunan ito.", + "empty_column.list": "Wala pang laman ang listahang ito. Kapag naglathala ng mga bagong post ang mga miyembro ng listahang ito, makikita iyon dito.", + "empty_column.lists": "Wala ka pang mga listahan. Kapag gumawa ka ng isa, makikita yun dito." +} diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json new file mode 100644 index 00000000000000..917a0346670c68 --- /dev/null +++ b/app/javascript/mastodon/locales/ia.json @@ -0,0 +1,23 @@ +{ + "account.add_or_remove_from_list": "Adder o remover ab listas", + "account.copy": "Copiar ligamine a profilo", + "bundle_column_error.network.title": "Error de rete", + "bundle_modal_error.close": "Clauder", + "column.home": "Initio", + "column_subheading.settings": "Parametros", + "compose.language.search": "Cercar linguas...", + "compose.published.open": "Aperir", + "confirmation_modal.cancel": "Cancellar", + "confirmations.logout.confirm": "Clauder le session", + "copypaste.copy_to_clipboard": "Copiar al area de transferentia", + "dismissable_banner.dismiss": "Dimitter", + "firehose.local": "Iste servitor", + "footer.about": "A proposito de", + "home.pending_critical_update.link": "Vider actualisationes", + "keyboard_shortcuts.my_profile": "Aperir tu profilo", + "lightbox.close": "Clauder", + "lightbox.next": "Sequente", + "link_preview.author": "Per {name}", + "lists.account.add": "Adder al lista", + "navigation_bar.about": "A proposito de" +} diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json new file mode 100644 index 00000000000000..9f91bf2cefe4b8 --- /dev/null +++ b/app/javascript/mastodon/locales/ie.json @@ -0,0 +1,737 @@ +{ + "about.blocks": "Moderat servitores", + "about.contact": "Contacter:", + "about.disclaimer": "Mastodon es programmatura líber e con fonte apert, e un marca de fabrica de Mastodon dGmbH.", + "about.domain_blocks.no_reason_available": "Rason ne disponibil", + "about.domain_blocks.preamble": "Mastodon generalmen possibilisa regardar li contenete de, e li interaction con usatores de quelcunc altri servitor in li fediverse. Ci trova se li exceptiones fat de ti-ci particulari servitor.", + "about.domain_blocks.silenced.explanation": "Generalmen, li profiles e contenete de ti-ci servitor ne va aparir, except si on sercha les explicitmen o optionalisa it per sequer.", + "about.domain_blocks.silenced.title": "Limitat", + "about.domain_blocks.suspended.explanation": "Necun data de ti-ci servitor va esser tractat, inmagasinat o exchangeat, quel inpossibilisa li interaction o comunication de usatores de ti-ci servitor.", + "about.domain_blocks.suspended.title": "Suspendet", + "about.not_available": "On ne ha disponibilisat ti-ci information sur ti-ci servitor.", + "about.powered_by": "Decentralisat social medie disponibilisat de {mastodon}", + "about.rules": "Regules del servitor", + "account.account_note_header": "Nota", + "account.add_or_remove_from_list": "Adjunter o remover de listes", + "account.badges.bot": "Automatisat", + "account.badges.group": "Gruppe", + "account.block": "Bloccar @{name}", + "account.block_domain": "Bloccar dominia {domain}", + "account.block_short": "Bloccar", + "account.blocked": "Bloccat", + "account.browse_more_on_origin_server": "Navigar plu sur li profil original", + "account.cancel_follow_request": "Anullar sequer", + "account.copy": "Copiar ligament al profil", + "account.direct": "Privatmen mentionar @{name}", + "account.disable_notifications": "Cessa notificar me quande @{name} posta", + "account.domain_blocked": "Dominia bloccat", + "account.edit_profile": "Redacter profil", + "account.enable_notifications": "Notificar me quande @{name} posta", + "account.endorse": "Recomandar sur profil", + "account.featured_tags.last_status_at": "Ultim posta ye {date}", + "account.featured_tags.last_status_never": "Null postas", + "account.featured_tags.title": "Recomandat hashtags de {name}", + "account.follow": "Sequer", + "account.followers": "Sequitores", + "account.followers.empty": "Ancor nequi seque ti-ci usator.", + "account.followers_counter": "{count, plural, one {{counter} Sequitor} other {{counter} Sequitor}}", + "account.following": "Sequent", + "account.following_counter": "{count, plural, one {{counter} Sequent} other {{counter} Sequent}}", + "account.follows.empty": "Ti-ci usator ancor ne seque quemcunc.", + "account.follows_you": "Seque te", + "account.go_to_profile": "Ear a profil", + "account.hide_reblogs": "Celar boosts de @{name}", + "account.in_memoriam": "In Memoriam.", + "account.joined_short": "Adheret", + "account.languages": "Changear lingues de subscrition", + "account.link_verified_on": "Proprietá de ti-ci ligament esset verificat ye {date}", + "account.locked_info": "Li statu de confidentialitá de ti-ci conto es configurat quam cludet. Li proprietario decide manualmen qui posse sequer.", + "account.media": "Medie", + "account.mention": "Mentionar @{name}", + "account.moved_to": "{name} ha indicat que su nov conto es ja:", + "account.mute": "Silentiar @{name}", + "account.mute_notifications_short": "Silentiar notificationes", + "account.mute_short": "Silentiar", + "account.muted": "Silentiat", + "account.no_bio": "Null descrition providet.", + "account.open_original_page": "Aperter li págine original", + "account.posts": "Postas", + "account.posts_with_replies": "Postas e replicas", + "account.report": "Raportar @{name}", + "account.requested": "Atendent aprobation. Cliccar por anullar li petition de sequer", + "account.requested_follow": "{name} ha petit sequer te", + "account.share": "Distribuer li profil de @{name}", + "account.show_reblogs": "Monstrar boosts de @{name}", + "account.statuses_counter": "{count, plural, one {{counter} Posta} other {{counter} Postas}}", + "account.unblock": "Desbloccar @{name}", + "account.unblock_domain": "Desbloccar dominia {domain}", + "account.unblock_short": "Desbloccar", + "account.unendorse": "Ne recomandar sur profil", + "account.unfollow": "Dessequer", + "account.unmute": "Dessilentiar @{name}", + "account.unmute_notifications_short": "Dessilentiar notificationes", + "account.unmute_short": "Dessilentiar", + "account_note.placeholder": "Clicca por adjunter un nota", + "admin.dashboard.daily_retention": "Usator-retention per die pos registration", + "admin.dashboard.monthly_retention": "Usator-retention per mensu pos registration", + "admin.dashboard.retention.average": "Medial", + "admin.dashboard.retention.cohort": "Mensu de registration", + "admin.dashboard.retention.cohort_size": "Nov usatores", + "admin.impact_report.instance_accounts": "Conto-profiles to-ci vell deleter", + "admin.impact_report.instance_followers": "Sequitores queles nor usatores vell perdir", + "admin.impact_report.instance_follows": "Sequitores queles lor usatores vell perdir", + "admin.impact_report.title": "Resumate de impact", + "alert.rate_limited.message": "Ples reprovar pos {retry_time, time, medium}.", + "alert.rate_limited.title": "Frequentie limitat", + "alert.unexpected.message": "Un ínexpectat erra ha evenit.", + "alert.unexpected.title": "Ups!", + "announcement.announcement": "Proclamation", + "attachments_list.unprocessed": "(íntractat)", + "audio.hide": "Celar audio", + "autosuggest_hashtag.per_week": "{count} per semane", + "boost_modal.combo": "Li proxim vez tu posse pressar {combo} por passar to-ci", + "bundle_column_error.copy_stacktrace": "Copiar erra-raporte", + "bundle_column_error.error.body": "Li demandat págine ne posset esser rendit. Fórsan it es un problema in nor code, o un problema de compatibilitá con li navigator.", + "bundle_column_error.error.title": "O ve!", + "bundle_column_error.network.body": "Un erra evenit durant li cargation de ti-ci págine, possibilmen pro un temporari problema de tui conexion del internet o de ti-ci servitor.", + "bundle_column_error.network.title": "Erra de retage", + "bundle_column_error.retry": "Provar denov", + "bundle_column_error.return": "Retornar al comense", + "bundle_column_error.routing.body": "Li demandat págine ne trovat se. Esque tu es cert que li URL in li adresse-barre es corect?", + "bundle_column_error.routing.title": "404", + "bundle_modal_error.close": "Cluder", + "bundle_modal_error.message": "Alquo errat durant li cargation de ti-ci componente.", + "bundle_modal_error.retry": "Provar denov", + "closed_registrations.other_server_instructions": "Pro que Mastodon es decentralisat, on posse crear un conto che un altri servitor e ancor interacter con ti-ci.", + "closed_registrations_modal.description": "Crear un conto che {domain} ne es possibil actualmen, ma ples memorar que on ne besona un conto specificmen che {domain} por usar Mastodon.", + "closed_registrations_modal.find_another_server": "Serchar altri servitor", + "closed_registrations_modal.preamble": "Mastodon es descentralisat, do on posse ser e interacter con quicunc che ti-ci servitor, sin egarda de u on crea su conto. On mem posse self-albergar it!", + "closed_registrations_modal.title": "Registrar sur Mastodon", + "column.about": "Information", + "column.blocks": "Bloccat usatores", + "column.bookmarks": "Marcatores", + "column.community": "Local témpor-linea", + "column.direct": "Privat mentiones", + "column.directory": "Navigar profiles", + "column.domain_blocks": "Bloccat dominia", + "column.favourites": "Favorites", + "column.firehose": "Témpor-lineas", + "column.follow_requests": "Petitiones de sequer", + "column.home": "Comense", + "column.lists": "Listes", + "column.mutes": "Silentiat usatores", + "column.notifications": "Notificationes", + "column.pins": "Pinglat postas", + "column.public": "Federat témpor-linea", + "column_back_button.label": "Retornar", + "column_header.hide_settings": "Celar parametres", + "column_header.moveLeft_settings": "Mover columne al levul", + "column_header.moveRight_settings": "Mover columne al dextri", + "column_header.pin": "Pinglar", + "column_header.show_settings": "Monstrar parametres", + "column_header.unpin": "Despinglar", + "column_subheading.settings": "Parametres", + "community.column_settings.local_only": "Solmen local", + "community.column_settings.media_only": "Solmen medie", + "community.column_settings.remote_only": "Solmen external", + "compose.language.change": "Changear lingue", + "compose.language.search": "Serchar lingues...", + "compose.published.body": "Posta publicat.", + "compose.published.open": "Aperter", + "compose.saved.body": "Posta conservat.", + "compose_form.direct_message_warning_learn_more": "Aprender plu", + "compose_form.encryption_warning": "Postas in Mastodon ne es inciffrat de comense a fine. Ne posta quelcunc information sensitiv per Mastodon.", + "compose_form.hashtag_warning": "Ti-ci posta ne va esser listat sur quelcunc hashtag pro que it ne es public. Solmen public postas posse esser serchat per hashtag.", + "compose_form.lock_disclaimer": "Tui conto ne es {locked}. Quicunc posse sequer te por vider tui postas solmen por sequitores.", + "compose_form.lock_disclaimer.lock": "cludet", + "compose_form.placeholder": "Quo es in tui spiritu?", + "compose_form.poll.add_option": "Adjunter un option", + "compose_form.poll.duration": "Duration del balotation", + "compose_form.poll.option_placeholder": "Option {number}", + "compose_form.poll.remove_option": "Remover ti-ci option", + "compose_form.poll.switch_to_multiple": "Changea li balotation por permisser multiplic selectiones", + "compose_form.poll.switch_to_single": "Changea li balotation por permisser un singul selection", + "compose_form.publish": "Publicar", + "compose_form.publish_form": "Nov posta", + "compose_form.publish_loud": "{publish}!", + "compose_form.save_changes": "Conservar changes", + "compose_form.sensitive.hide": "{count, plural, one {Marcar medie quam sensitiv} other {Marcar medie quam sensitiv}}", + "compose_form.sensitive.marked": "{count, plural, one {Medie es marcat quam sensitiv} other {Medie es marcat quam sensitiv}}", + "compose_form.sensitive.unmarked": "{count, plural, one {Medie ne es marcat quam sensitiv} other {Medie ne es marcat quam sensitiv}}", + "compose_form.spoiler.marked": "Remover avise pri li contenete", + "compose_form.spoiler.unmarked": "Adjunter avise pri li contenete", + "compose_form.spoiler_placeholder": "Scri tui avise ci", + "confirmation_modal.cancel": "Anullar", + "confirmations.block.block_and_report": "Bloccar & Raportar", + "confirmations.block.confirm": "Bloccar", + "confirmations.block.message": "Esque tu vermen vole bloccar {name}?", + "confirmations.cancel_follow_request.confirm": "Retraer petition", + "confirmations.cancel_follow_request.message": "Esque tu vermen vole retraer tui petition sequer {name}?", + "confirmations.delete.confirm": "Deleter", + "confirmations.delete.message": "Esque tu vermen vole deleter ti-ci posta?", + "confirmations.delete_list.confirm": "Deleter", + "confirmations.delete_list.message": "Esque tu vermen vole permanentmen deleter ti-ci liste?", + "confirmations.discard_edit_media.confirm": "Forjettar", + "confirmations.discard_edit_media.message": "Tu have ínconservat changes al descrition de medie o al previse, forjettar les sin egarda?", + "confirmations.domain_block.confirm": "Bloccar li tot dominia", + "confirmations.domain_block.message": "Esque tu es certissim que tu vole bloccar li tot {domain}? In mult casus, bloccar o silentiar quelc specific contos es suficent e preferibil. Tu ne va vider contenete de ti dominia in quelcunc public témpor-linea o in tui notificationes. Tui sequitores de ti dominia va esser removet.", + "confirmations.edit.confirm": "Redacter", + "confirmations.edit.message": "Redacter nu va remplazzar li missage quel tu actualmen composi. Esque tu vermen vole proceder?", + "confirmations.logout.confirm": "Exear", + "confirmations.logout.message": "Esque tu vermen vole exear?", + "confirmations.mute.confirm": "Silentiar", + "confirmations.mute.explanation": "To-ci va celar postas de ilu e postas mentionant ilu, ma it ancor va permisser ilu vider tui postas e sequer te.", + "confirmations.mute.message": "Esque tu vermen vole silentiar {name}?", + "confirmations.redraft.confirm": "Deleter & redacter", + "confirmations.redraft.message": "Esque tu vermen vole deleter ti-ci posta e redacter it? Favorites e boosts va esser perdit, e responses al posta original va esser orfanat.", + "confirmations.reply.confirm": "Responder", + "confirmations.reply.message": "Responder nu va remplazzar li missage quel tu actualmen composi. Esque tu vermen vole proceder?", + "confirmations.unfollow.confirm": "Dessequer", + "confirmations.unfollow.message": "Esque tu vermen vole dessequer {name}?", + "conversation.delete": "Deleter conversation", + "conversation.mark_as_read": "Marcar quam leet", + "conversation.open": "Vider conversation", + "conversation.with": "Con {names}", + "copypaste.copied": "Copiat", + "directory.federated": "Del conosset fediverse", + "directory.local": "De solmen {domain}", + "directory.new_arrivals": "Nov arivantes", + "directory.recently_active": "Recentmen activ", + "disabled_account_banner.account_settings": "Parametres del conto", + "disabled_account_banner.text": "Tui conto {disabledAccount} es actualmen desactivisat.", + "dismissable_banner.community_timeline": "Tis-ci es li postas max recent de gente con contos che {domain}.", + "dismissable_banner.dismiss": "Demisser", + "dismissable_banner.explore_links": "Tis-ci es li novas max distribuet che li social retage hodie. Novas plu nov, postat de plu diferent persones, es monstrat plu alt.", + "dismissable_banner.explore_statuses": "Tis-ci es postas del social retage queles es popular hodie. Nov postas con plu mult boosts e favorites es monstrat plu alt.", + "dismissable_banner.explore_tags": "Tis-ci es hashtags queles es popular che li social retage hodie. Hashtags usat de plu mult persones diferent es monstrat plu alt.", + "dismissable_banner.public_timeline": "Tis-ci es li max recent public postas de persones che li social retage quem gente che {domain} seque.", + "embed.instructions": "Inbedar ti-ci posta per copiar li code in infra.", + "embed.preview": "Vi qualmen it va aspecter:", + "emoji_button.activity": "Activitá", + "emoji_button.clear": "Efaciar", + "emoji_button.custom": "Custom", + "emoji_button.flags": "Flaggas", + "emoji_button.food": "Manjage & Trincage", + "emoji_button.label": "Inserter emoji", + "emoji_button.nature": "Natura", + "emoji_button.not_found": "Null acordant emoji trovat", + "emoji_button.objects": "Objectes", + "emoji_button.people": "Gente", + "emoji_button.recent": "Frequentmen usat", + "emoji_button.search": "Sercha...", + "emoji_button.search_results": "Resultates de sercha", + "emoji_button.symbols": "Simboles", + "emoji_button.travel": "Viageation & Locos", + "empty_column.account_hides_collections": "Ti-ci usator ha selectet ne publicar ti-ci information", + "empty_column.account_suspended": "Conto suspendet", + "empty_column.account_timeline": "Null postas ci!", + "empty_column.account_unavailable": "Profil índisponibil", + "empty_column.blocks": "Tu ancor ha bloccat null usatores.", + "empty_column.bookmarked_statuses": "Tu ancor have null marcat postas. Quande tu marca un, it va aparir ci.", + "empty_column.community": "Li local témpor-linea es vacui. Scri alquo publicmen por initiar la festa!", + "empty_column.direct": "Tu ancor have null privat mentiones. Quande tu misse o recive un, it va aparir ci.", + "empty_column.domain_blocks": "Ancor hay null bloccat dominias.", + "empty_column.explore_statuses": "Nequo es popular actualmen. Retorna plu tarde!", + "empty_column.favourited_statuses": "Tu ancor have null favorit postas. Quande tu favoritisa un, it va aparir ci.", + "empty_column.favourites": "Ancor nequi ha favoritisat ti-ci posta. Quande alqui fa it, ilu va aparir ci.", + "empty_column.follow_requests": "Tu ancor have null petitiones de sequer. Quande tu recive un, it va aparir ci.", + "empty_column.followed_tags": "Tu ancor ha sequet null hashtags. Quande tu seque un, it va aparir ci.", + "empty_column.hashtag": "Hay nullcos en ti-ci hashtag ancor.", + "empty_column.home": "Tui hemal témpor-linea es vacui! Sequer plu gente por plenar it.", + "empty_column.list": "Ancor ne hay quocunc in ti-ci liste. Quande membres de ti-ci liste publica nov postas, ili va aparir ci.", + "empty_column.lists": "Tu ancor have null listes. Quande tu crea un, it va aparir ci.", + "empty_column.mutes": "Tu ancor ha silentiat null usatores.", + "empty_column.notifications": "Tu have null notificationes. Quande altri persones interacte con te, tu va vider it ci.", + "empty_column.public": "Hay nullcos ci! Scri alquo publicmen, o manualmen seque usatores de altri servitores por plenar to-ci", + "error.unexpected_crash.explanation": "Pro un error in nor code o un problema de compatibilitá in li navigator, ti-ci págine ne posset esser monstrat correctmen.", + "error.unexpected_crash.explanation_addons": "Ti-ci págine ne posset esser monstrat correctmen. Li error es probabilmen causat de un extension al navigator o instrumentes por automatic traduction.", + "error.unexpected_crash.next_steps": "Prova recargar li págine. Si to ne auxilia, tu fórsan posse usar Mastodon per un diferent navigator o aplication.", + "error.unexpected_crash.next_steps_addons": "Prova desactivisar les e recargar li págine. Si to ne auxilia, tu fórsan posse usar Mastodon per un diferent navigator o aplication.", + "errors.unexpected_crash.report_issue": "Raportar un problema", + "explore.search_results": "Resultates de sercha", + "explore.suggested_follows": "Gente", + "explore.title": "Explorar", + "explore.trending_links": "Novas", + "explore.trending_statuses": "Postas", + "explore.trending_tags": "Hashtags", + "filter_modal.added.context_mismatch_explanation": "Ti-ci filtre-categorie ne aplica al contextu in quel tu ha accessat ti-ci posta. Si tu vole que li posta es filtrat anc in ti-ci contextu, tu deve redacter li filtre.", + "filter_modal.added.context_mismatch_title": "Contextu íncompatibil!", + "filter_modal.added.expired_explanation": "Ti-ci filtre-categorie ha expirat, tu deve changear li date de expiration por far it aplicar.", + "filter_modal.added.expired_title": "Expirat filtre!", + "filter_modal.added.review_and_configure": "Por reviser e configurar ti-ci filtre-categorie, ea a {settings_link}.", + "filter_modal.added.review_and_configure_title": "Parametres pri filtres", + "filter_modal.added.settings_link": "págine por parametres", + "filter_modal.added.short_explanation": "Ti-ci post ha esset adjuntet al sequente filtre-categorie: {title}.", + "filter_modal.added.title": "Filtre adjuntet!", + "filter_modal.select_filter.context_mismatch": "ne aplica a ti-ci contextu", + "filter_modal.select_filter.expired": "expirat", + "filter_modal.select_filter.prompt_new": "Nov categorie: {name}", + "filter_modal.select_filter.search": "Serchar o crear", + "filter_modal.select_filter.subtitle": "Usar un existent categorie o crear nov", + "filter_modal.select_filter.title": "Filtrar ti-ci posta", + "filter_modal.title.status": "Filtrar un posta", + "firehose.all": "Omno", + "firehose.local": "Ti-ci servitor", + "firehose.remote": "Altri servitores", + "follow_request.authorize": "Autorisar", + "follow_request.reject": "Rejecter", + "follow_requests.unlocked_explanation": "Benque tu conto ne es cludet, li administratores de {domain} pensat que tu fórsan vell voler tractar seque-petitiones de tis-ci contos manualmen.", + "followed_tags": "Sequet hashtags", + "footer.about": "Information", + "footer.directory": "Profilarium", + "footer.get_app": "Obtener li aplication", + "footer.invite": "Invitar gente", + "footer.privacy_policy": "Politica pri privatie", + "footer.source_code": "Vider li fonte-code", + "footer.status": "Statu", + "generic.saved": "Conservat", + "getting_started.heading": "Qualmen comensar", + "hashtag.column_header.tag_mode.all": "e {additional}", + "hashtag.column_header.tag_mode.any": "o {additional}", + "hashtag.column_header.tag_mode.none": "sin {additional}", + "hashtag.column_settings.select.no_options_message": "Null suggestiones trovat", + "hashtag.column_settings.select.placeholder": "Inscrir hashtags…", + "hashtag.column_settings.tag_mode.all": "Omni tis", + "hashtag.column_settings.tag_mode.any": "Quelcunc de tis", + "hashtag.column_settings.tag_mode.none": "Necun de tis", + "hashtag.column_settings.tag_toggle": "Include additional hashtags in ti-ci columne", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}", + "hashtag.counter_by_uses": "{count, plural, one {{counter} posta} other {{counter} postas}}", + "hashtag.counter_by_uses_today": "{count, plural, one {{counter} posta} other {{counter} postas}} hodie", + "hashtag.follow": "Sequer hashtag", + "hashtag.unfollow": "Dessequer hashtag", + "hashtags.and_other": "…e {count, plural, other {# in plu}}", + "home.actions.go_to_explore": "Vider lu populari", + "home.actions.go_to_suggestions": "Trovar gente por sequer", + "home.column_settings.basic": "Basic", + "home.column_settings.show_reblogs": "Monstrar boosts", + "home.column_settings.show_replies": "Monstrar responses", + "home.explore_prompt.body": "Tui hemal témpor-linea have un mixtura del hashtags queles tu selectet sequer, li gente quem tu selectet sequer, e li postas queles ili boosta. Si to sembla tro quiet, tu fórsan vole:", + "home.explore_prompt.title": "To-ci es tui hemal págine in Mastodon.", + "home.hide_announcements": "Celar proclamationes", + "home.pending_critical_update.body": "Ples actualisar tui Mastodon-servitor tam rapid quam es possibil!", + "home.pending_critical_update.link": "Vider actualisationes", + "home.pending_critical_update.title": "Urgent actualisation de securitá disponibil!", + "home.show_announcements": "Monstrar proclamationes", + "interaction_modal.description.favourite": "Con un conto de Mastodon, tu posse favoritisar ti-ci posta por informar li autor pri quant mult tu aprecia it e conservar it por plu tard.", + "interaction_modal.description.follow": "Con un conto de Mastodon, tu posse sequer {name} por reciver su postas in tui hemal témpor-linea.", + "interaction_modal.description.reblog": "Con un conto de Mastodon, tu posse boostar ti-ci posta por distribuer it a tui propri sequitores.", + "interaction_modal.description.reply": "Con un conto de Mastodon, tu posse responder a ti-ci posta.", + "interaction_modal.login.action": "Retorna a hem", + "interaction_modal.login.prompt": "Dominia de tui hemal servitor, p.ex. mastodon.social", + "interaction_modal.no_account_yet": "Ne sur Mastodon?", + "interaction_modal.on_another_server": "Sur un servitor diferent", + "interaction_modal.on_this_server": "Sur ti-ci servitor", + "interaction_modal.sign_in": "Tu ne ha initiat session che ti-ci servitor. U logia tui conto?", + "interaction_modal.sign_in_hint": "Nota: To es li websitu u tu adheret. Si tu ne rememora, sercha li benevenit-email in tui inbuxe. Tu anc posse introducter tui plen usator-nómine! (p.ex. @Mastodon@mastodon.social)", + "interaction_modal.title.favourite": "Favoritisar li posta de {name}", + "interaction_modal.title.follow": "Sequer {name}", + "interaction_modal.title.reblog": "Boostar li posta de {name}", + "interaction_modal.title.reply": "Responder al posta de {name}", + "intervals.full.days": "{number, plural, one {# die} other {# dies}}", + "intervals.full.hours": "{number, plural, one {# hor} other {# hores}}", + "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", + "keyboard_shortcuts.back": "Retroear", + "keyboard_shortcuts.blocked": "Aperter li lista de bloccat usatores", + "keyboard_shortcuts.boost": "Boostar posta", + "keyboard_shortcuts.column": "Infocar columne", + "keyboard_shortcuts.compose": "Infocar li text-area de composition", + "keyboard_shortcuts.description": "Descrition", + "keyboard_shortcuts.direct": "por aperter li columne de privat mentiones", + "keyboard_shortcuts.down": "Mover ad-infra in li liste", + "keyboard_shortcuts.enter": "Aperter posta", + "keyboard_shortcuts.favourite": "Favoritisar posta", + "keyboard_shortcuts.favourites": "Aperter li liste de favorites", + "keyboard_shortcuts.federated": "Aperter li federat témpor-linea", + "keyboard_shortcuts.home": "Aperter li hemal témpor-linea", + "keyboard_shortcuts.local": "Aperter li local témpor-linea", + "keyboard_shortcuts.mention": "Mentionar li autor", + "keyboard_shortcuts.muted": "Aperter li lista de silentiat usatores", + "keyboard_shortcuts.my_profile": "Aperter tui profil", + "keyboard_shortcuts.notifications": "Aperter li columne de notificationes", + "keyboard_shortcuts.open_media": "Aperter medie", + "keyboard_shortcuts.pinned": "Aperter li liste de pinglat postas", + "keyboard_shortcuts.profile": "Aperter profil del autor", + "keyboard_shortcuts.reply": "Responder al posta", + "keyboard_shortcuts.requests": "Aperter liste de seque-petitiones", + "keyboard_shortcuts.search": "Infocar sercha-barre", + "keyboard_shortcuts.spoilers": "Monstrar/celar CW camp", + "keyboard_shortcuts.start": "Aperter \"Qualmen comensar\" columne", + "keyboard_shortcuts.toggle_hidden": "Monstrar/celar text detra CW", + "keyboard_shortcuts.toggle_sensitivity": "Monstrar/celar medie", + "keyboard_shortcuts.toot": "Crear un nov posta", + "keyboard_shortcuts.unfocus": "Desinfocar text-area de composition/serchar", + "keyboard_shortcuts.up": "Mover ad-supra in li liste", + "lightbox.close": "Cluder", + "lightbox.compress": "Compresser vise-buxe de image", + "lightbox.expand": "Expander vise-buxe de image", + "lightbox.next": "Sequent", + "lightbox.previous": "Precedent", + "limited_account_hint.action": "Monstrar profil totvez", + "limited_account_hint.title": "Ti-ci profil ha esset celat del moderatores de {domain}.", + "link_preview.author": "De {name}", + "lists.account.add": "Adjunter a liste", + "lists.account.remove": "Remover de liste", + "lists.delete": "Deleter liste", + "lists.edit": "Redacter liste", + "lists.edit.submit": "Changear titul", + "lists.exclusive": "Celar ti-ci postas del hemal témpor-linea", + "lists.new.create": "Adjunter liste", + "lists.new.title_placeholder": "Titul del nov liste", + "lists.replies_policy.followed": "Quelcunc sequet usator", + "lists.replies_policy.list": "Membres del liste", + "lists.replies_policy.none": "Nequi", + "lists.replies_policy.title": "Monstrar responses a:", + "lists.search": "Serchar inter li persones quem tu seque", + "lists.subheading": "Tui listes", + "load_pending": "{count, plural, one {# nov element} other {# nov elementes}}", + "loading_indicator.label": "Cargant…", + "media_gallery.toggle_visible": "{number, plural, one {Celar image} other {Celar images}}", + "moved_to_account_banner.text": "Tui conto {disabledAccount} es actualmen desactivisat pro que tu movet te a {movedToAccount}.", + "mute_modal.duration": "Duration", + "mute_modal.hide_notifications": "Celar notificationes de ti-ci usator?", + "mute_modal.indefinite": "Índefinit", + "navigation_bar.about": "Information", + "navigation_bar.advanced_interface": "Aperter in li web-interfacie avansat", + "navigation_bar.blocks": "Bloccat usatores", + "navigation_bar.bookmarks": "Marcatores", + "navigation_bar.community_timeline": "Local témpor-linea", + "navigation_bar.compose": "Composir un nov posta", + "navigation_bar.direct": "Privat mentiones", + "navigation_bar.discover": "Decovrir", + "navigation_bar.domain_blocks": "Bloccat dominias", + "navigation_bar.edit_profile": "Redacter profil", + "navigation_bar.explore": "Explorar", + "navigation_bar.favourites": "Favorites", + "navigation_bar.filters": "Silentiat paroles", + "navigation_bar.follow_requests": "Petitiones de sequer", + "navigation_bar.followed_tags": "Sequet hashtags", + "navigation_bar.follows_and_followers": "Sequetes e sequitores", + "navigation_bar.lists": "Listes", + "navigation_bar.logout": "Exear", + "navigation_bar.mutes": "Silentiat usatores", + "navigation_bar.opened_in_classic_interface": "Postas, contos e altri specific págines es customalmen apertet in li classic web-interfacie.", + "navigation_bar.personal": "Personal", + "navigation_bar.pins": "Pinglat postas", + "navigation_bar.preferences": "Preferenties", + "navigation_bar.public_timeline": "Federat témpor-linea", + "navigation_bar.search": "Sercha", + "navigation_bar.security": "Securitá", + "not_signed_in_indicator.not_signed_in": "On deve aperter session por accesser ti-ci ressurse.", + "notification.admin.report": "{name} raportat {target}", + "notification.admin.sign_up": "{name} adheret", + "notification.favourite": "{name} favoritisat tui posta", + "notification.follow": "{name} sequet te", + "notification.follow_request": "{name} ha petit sequer te", + "notification.mention": "{name} mentionat te", + "notification.own_poll": "Tui balotation ha finit", + "notification.poll": "Un balotation in quel tu votat ha finit", + "notification.reblog": "{name} boostat tui posta", + "notification.status": "{name} just postat", + "notification.update": "{name} modificat un posta", + "notifications.clear": "Aclarar notificationes", + "notifications.clear_confirmation": "Vole tu vermen permanentmen aclarar omni tui notificationes?", + "notifications.column_settings.admin.report": "Nov raportas:", + "notifications.column_settings.admin.sign_up": "Nov registrationes:", + "notifications.column_settings.alert": "Notificationes sur li computator", + "notifications.column_settings.favourite": "Favorites:", + "notifications.column_settings.filter_bar.advanced": "Monstrar omni categories", + "notifications.column_settings.filter_bar.category": "Rapid filtre-barre", + "notifications.column_settings.filter_bar.show_bar": "Monstrar filtre-barre", + "notifications.column_settings.follow": "Nov sequitores:", + "notifications.column_settings.follow_request": "Nov petitiones de sequer:", + "notifications.column_settings.mention": "Mentiones:", + "notifications.column_settings.poll": "Resultates del balotation:", + "notifications.column_settings.push": "Notificationes push", + "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.show": "Monstrar in columne", + "notifications.column_settings.sound": "Far son", + "notifications.column_settings.status": "Nov postas:", + "notifications.column_settings.unread_notifications.category": "Ínleet notificationes", + "notifications.column_settings.unread_notifications.highlight": "Marcar ínleet notificationes", + "notifications.column_settings.update": "Redactiones:", + "notifications.filter.all": "Omni", + "notifications.filter.boosts": "Boosts", + "notifications.filter.favourites": "Favorites", + "notifications.filter.follows": "Seques", + "notifications.filter.mentions": "Mentiones", + "notifications.filter.polls": "Resultates del balotation", + "notifications.filter.statuses": "Actualisationes de gente quem tu seque", + "notifications.grant_permission": "Dar permission.", + "notifications.group": "{count} notificationes", + "notifications.mark_as_read": "Marcar omni notificationes quam leet", + "notifications.permission_denied": "Notificationes sur li computator es índisponibil pro que on ha previamen rejectet un petition por navigator-permissiones", + "notifications.permission_denied_alert": "Notificationes sur li computator ne posse esser activisat, pro que navigator-permission ha esset previamen rejectet", + "notifications.permission_required": "Notificationes sur li computator es índisponibil pro que li besonat permission ne ha esset dat.", + "notifications_permission_banner.enable": "Activisar notificationes sur li computator", + "notifications_permission_banner.how_to_control": "Por reciver notificationes quande Mastodon ne es apert, activisa notificationes sur li computator. Tu posse decider precisimen quel species de interactiones genera notificationes per li buton {icon} in-supra quande ili es activisat.", + "notifications_permission_banner.title": "Nequande preterlassa quocunc", + "onboarding.action.back": "Retroear", + "onboarding.actions.back": "Retroear", + "onboarding.actions.go_to_explore": "Ear a vider lu populari", + "onboarding.actions.go_to_home": "Ear al hemal témpor-linea", + "onboarding.compose.template": "Salute #Mastodon!", + "onboarding.follows.empty": "Ínfortunatmen, null resultates posse esser monstrat actualmen. Tu posse provar serchar o usar li \"Explorar\" págine por trovar gente por sequer, o prova denov plu tard.", + "onboarding.follows.lead": "Tui hemal témpor-linea es li primari maniere de experir Mastodon. Plu persones quem tu seque, plu activ e interessant it va esser. Por auxiliar te comensar, vi quelc suggestiones:", + "onboarding.follows.title": "Personalisar tui hemal témpor-linea", + "onboarding.profile.discoverable": "Fa mi profil decovribil", + "onboarding.profile.discoverable_hint": "Quande tu opta esser decovribil in Mastodon, tui postas posse aparir in resultates de sercha e tendenties, e tui profil posse esser suggestet a persones con interesses simil a tui.", + "onboarding.profile.display_name": "Nómine a monstrar", + "onboarding.profile.display_name_hint": "Tui complet nómine o tui amusant nómine…", + "onboarding.profile.lead": "Tu sempre posse completar ti-ci plu tard in li parametres, u mem plu optiones de customisation es disponibil.", + "onboarding.profile.note": "Biografie", + "onboarding.profile.note_hint": "Tu posse @mentionar altri persones o #hashtags…", + "onboarding.profile.save_and_continue": "Conservar e avansar", + "onboarding.profile.title": "Popular tu profil", + "onboarding.profile.upload_avatar": "Cargar profil-portrete", + "onboarding.profile.upload_header": "Cargar cap-image", + "onboarding.share.lead": "Di gente qualmen ili posse trovar te che Mastodon!", + "onboarding.share.message": "Yo es {username} che #Mastodon! Veni e seque me a {url}", + "onboarding.share.next_steps": "Possibil sequent passus:", + "onboarding.share.title": "Partir tui profil", + "onboarding.start.lead": "Tu es ja un parte de Mastodon, un unic, decentralisat platform de medie social in quel tu—ne un algoritme—selectiona tui propri experientie. Lass nos departer sur un nov frontiera social:", + "onboarding.start.skip": "Auxilie por comensar ne besonat?", + "onboarding.start.title": "Tu ha successat!", + "onboarding.steps.follow_people.body": "Sequer interessant gente es to quo importa in Mastodon.", + "onboarding.steps.follow_people.title": "Personalisar tui hemal témpor-linea", + "onboarding.steps.publish_status.body": "Saluta li munde con text, images, videos o balotationes {emoji}", + "onboarding.steps.publish_status.title": "Crear tui unesim posta", + "onboarding.steps.setup_profile.body": "Ascresce tui interactiones per haver un profil detalliat.", + "onboarding.steps.setup_profile.title": "Personalisar tui profil", + "onboarding.steps.share_profile.body": "Di tui amics qualmen trovar te che Mastodon", + "onboarding.steps.share_profile.title": "Partir tui profil Mastodon", + "onboarding.tips.2fa": "Savet tu? Tu posse securisar tui conto per activisar 2-factor autentication in tui parametres de conto. Ti functiona con quelcunc aplication TOTP quel tu selecte, null númere de telefon besonat!", + "onboarding.tips.accounts_from_other_servers": "Savet tu? Pro que Mastodon es decentralisat, quelc profiles queles tu trova va esser logiat che servitores altri quam tui. Totvez tu posse interacter con les sin grates! Lor servitores es in li duesim demí de lor usator-nómines!", + "onboarding.tips.migration": "Savet tu? Si tu senti que {domain} ne es un bonissim servitor por te futurimen, tu posse mover te a un altri Mastodon-servitor sin perdir tui sequitores. Tu posse mem etablisser tui propri servitor!", + "onboarding.tips.verification": "Savet tu? Tu posse verificar tui conto per metter un ligament a tui Mastodon-profil in tui propri websitu e adjunter li websitu a tui profil. Null payament o documentes besonat!", + "password_confirmation.exceeds_maxlength": "Confirmation de passa-parol transpassa li maxim longore de passa-paroles", + "password_confirmation.mismatching": "Confirmation de passa-parol ne egala", + "picture_in_picture.restore": "Restaurar", + "poll.closed": "Finit", + "poll.refresh": "Recargar", + "poll.reveal": "Vider resultates", + "poll.total_people": "{count, plural, one {# person} other {# persones}}", + "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", + "poll.vote": "Votar", + "poll.voted": "Tu votat por ti-ci option", + "poll.votes": "{votes, plural, one {# vote} other {# votes}}", + "poll_button.add_poll": "Adjunter un balotation", + "poll_button.remove_poll": "Remover balotation", + "privacy.change": "Changear li privatie del posta", + "privacy.direct.long": "Visibil solmen a mentionat usatores", + "privacy.direct.short": "Solmen persones mentionat", + "privacy.private.long": "Visibil solmen por sequitores", + "privacy.private.short": "Solmen sequitores", + "privacy.public.long": "Visibil a omnes", + "privacy.public.short": "Public", + "privacy.unlisted.long": "Visibil por omnes, ma excludet de functiones de decovrition", + "privacy.unlisted.short": "Delistat", + "privacy_policy.last_updated": "Ultimmen actualisat ye {date}", + "privacy_policy.title": "Politica pri Privatie", + "recommended": "Recomandat", + "refresh": "Recargar", + "regeneration_indicator.label": "Cargant…", + "regeneration_indicator.sublabel": "On es preparant tui hemal témpor-linea!", + "relative_time.days": "{number}d", + "relative_time.full.days": "Ante {number, plural, one {# die} other {# dies}}", + "relative_time.full.hours": "Ante {number, plural, one {# hor} other {# hores}}", + "relative_time.full.just_now": "just nu", + "relative_time.full.minutes": "Ante {number, plural, one {# minute} other {# minutes}}", + "relative_time.full.seconds": "Ante {number, plural, one {# second} other {# secondes}}", + "relative_time.hours": "{number}h", + "relative_time.just_now": "nu", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "relative_time.today": "hodie", + "reply_indicator.cancel": "Anullar", + "report.block": "Bloccar", + "report.block_explanation": "Tu ne va vider su postas. Li usator ni va posser vider tui postas, ni sequer te, ni va posser saver pri li statu de esser bloccat.", + "report.categories.legal": "Legal", + "report.categories.other": "Altricos", + "report.categories.spam": "Spam", + "report.categories.violation": "Contenete violant un o pluri regules del servitor", + "report.category.subtitle": "Selecte li max bon option", + "report.category.title": "Di nos quo passa con ti-ci {type}", + "report.category.title_account": "profil", + "report.category.title_status": "posta", + "report.close": "Finit", + "report.comment.title": "Hay alquo plu quel tu pensa que noi deve saver?", + "report.forward": "Misser anc a {target}", + "report.forward_hint": "Ti-ci conto es de un altri servitor. Misser un anonimisat copie del raporte anc a ta?", + "report.mute": "Silentiar", + "report.mute_explanation": "Tu ne va vider su postas. Ilu ancor posse sequer te e vider tui postas e ne va saver que ilu es silentiat.", + "report.next": "Sequent", + "report.placeholder": "Additional comentas", + "report.reasons.dislike": "It ne plese me", + "report.reasons.dislike_description": "It es alquo quel displese te", + "report.reasons.legal": "It es ínlegal", + "report.reasons.legal_description": "Tu crede que it viola un lege del land de te o de tui servitor", + "report.reasons.other": "It es altricos", + "report.reasons.other_description": "Li problema ne apartene in li altri categories", + "report.reasons.spam": "It es spam", + "report.reasons.spam_description": "Maliciosi ligamentes, fals activitá, o repetitiv responses", + "report.reasons.violation": "It viola li regules del servitor", + "report.reasons.violation_description": "Tu save que it viola specific regules", + "report.rules.subtitle": "Selecte omnes queles aplica", + "report.rules.title": "Quel regules es violat?", + "report.statuses.subtitle": "Selecte omnes queles aplica", + "report.statuses.title": "Hay postas queles posse subtener ti-ci raporte?", + "report.submit": "Misser", + "report.target": "Raportant {target}", + "report.thanks.take_action": "Tis-ci es tui optiones por controlar ti quel tu vide che Mastodon:", + "report.thanks.take_action_actionable": "Durante que noi tracta ti-ci, tu posse far lu sequent contra @{name}:", + "report.thanks.title": "Vole tu ne vider to?", + "report.thanks.title_actionable": "Mersí pro raportar, noi va investigar to.", + "report.unfollow": "Dessequer @{name}", + "report.unfollow_explanation": "Tu seque ti-ci conto. Por ne vider su postas en tui hemal témpor-linea, dessequer it.", + "report_notification.attached_statuses": "{count, plural, one {{count} posta} other {{count} postas}} atachat", + "report_notification.categories.legal": "Legal", + "report_notification.categories.other": "Altricos", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Violation de regul", + "report_notification.open": "Aperter raporta", + "search.no_recent_searches": "Null recent serchas", + "search.placeholder": "Serchar", + "search.quick_action.account_search": "Profiles acordant con {x}", + "search.quick_action.go_to_account": "Ear al profil {x}", + "search.quick_action.go_to_hashtag": "Ear al hashtag {x}", + "search.quick_action.open_url": "Aperter URL in Mastodon", + "search.quick_action.status_search": "Postas acordant con {x}", + "search.search_or_paste": "Serchar o glutinar URL", + "search_popout.full_text_search_disabled_message": "Ne disponibil che {domain}.", + "search_popout.full_text_search_logged_out_message": "Solmen disponibil con session initiat.", + "search_popout.options": "Sercha-parametres", + "search_popout.quick_actions": "Rapid actiones", + "search_popout.recent": "Recent serchas", + "search_popout.specific_date": "specific date", + "search_popout.user": "usator", + "search_results.accounts": "Profiles", + "search_results.all": "Omni", + "search_results.hashtags": "Hashtags", + "search_results.nothing_found": "Trovat se nullcos por ti término de sercha", + "search_results.see_all": "Vider omni", + "search_results.statuses": "Postas", + "search_results.title": "Sercha por {q}", + "server_banner.about_active_users": "Gente usant ti-ci servitor durant li ultim 30 dies (Mensual Activ Usatores)", + "server_banner.active_users": "activ usatores", + "server_banner.administered_by": "Administrat de:", + "server_banner.introduction": "{domain} es un part del decentralisat social retage constructet sur {mastodon}.", + "server_banner.learn_more": "Aprender plu", + "server_banner.server_stats": "Statisticas pri li servitor:", + "sign_in_banner.create_account": "Crear un conto", + "sign_in_banner.sign_in": "Intrar", + "sign_in_banner.sso_redirect": "Intrar o registrar se", + "sign_in_banner.text": "Intrar por sequer profiles o hashtags, favoritisar, partir e responder a postas. Tu posse anc interacter per tui conto che un diferent servitor.", + "status.admin_account": "Aperter interfacie de moderation por @{name}", + "status.admin_domain": "Aperter interfacie de moderation por {domain}", + "status.admin_status": "Aperter ti-ci posta in li interfacie de moderation", + "status.block": "Bloccar @{name}", + "status.bookmark": "Marcar", + "status.cancel_reblog_private": "Desboostar", + "status.cannot_reblog": "Ti-ci posta ne posse esser boostat", + "status.copy": "Copiar ligament al posta", + "status.delete": "Deleter", + "status.detailed_status": "Detalliat vise de conversation", + "status.direct": "Privatmen mentionar @{name}", + "status.direct_indicator": "Privat mention", + "status.edit": "Modificar", + "status.edited": "Modificat ye {date}", + "status.edited_x_times": "Modificat {count, plural, one {{count} vez} other {{count} vezes}}", + "status.embed": "Inbedar", + "status.favourite": "Favoritisar", + "status.filter": "Filtrar ti-ci posta", + "status.filtered": "Filtrat", + "status.hide": "Celar posta", + "status.history.created": "creat de {name} ye {date}", + "status.history.edited": "modificat de {name} ye {date}", + "status.load_more": "Cargar plu", + "status.media.open": "Cliccar por aperter", + "status.media.show": "Cliccar por monstrar", + "status.media_hidden": "Medie celat", + "status.mention": "Mentionar @{name}", + "status.more": "Plu", + "status.mute": "Silentiar @{name}", + "status.mute_conversation": "Silentiar conversation", + "status.open": "Expander ti-ci posta", + "status.pin": "Pinglar sur profil", + "status.pinned": "Pinglat posta", + "status.read_more": "Leer plu", + "status.reblog": "Boostar", + "status.reblog_private": "Boostar con li original visibilitá", + "status.reblogged_by": "{name} boostat", + "status.reblogs.empty": "Ancor nequi ha boostat ti-ci posta. Quande alqui fa it, ilu va aparir ci.", + "status.redraft": "Deleter & redacter", + "status.remove_bookmark": "Remover marcator", + "status.replied_to": "Respondet a {name}", + "status.reply": "Responder", + "status.replyAll": "Responder al fil", + "status.report": "Raportar @{name}", + "status.sensitive_warning": "Sensitiv contenete", + "status.share": "Partir", + "status.show_filter_reason": "Monstrar totvez", + "status.show_less": "Monstrar minu", + "status.show_less_all": "Monstrar minu por omno", + "status.show_more": "Monstrar plu", + "status.show_more_all": "Monstrar plu por omno", + "status.show_original": "Monstrar li original", + "status.title.with_attachments": "{user} postat {attachmentCount, plural, one {un atachament} other {{attachmentCount} atachamentes}}", + "status.translate": "Traducter", + "status.translated_from_with": "Traductet de {lang} per {provider}", + "status.uncached_media_warning": "Previse ne disponibil", + "status.unmute_conversation": "Dessilentiar conversation", + "status.unpin": "Despinglar de profil", + "subscribed_languages.lead": "Solmen postas in selectet lingues va aparir in tui hemal e listal témpor-lineas pos li change. Selecte null por reciver postas in omni lingues.", + "subscribed_languages.save": "Conservar changes", + "subscribed_languages.target": "Changear abonnat lingues por {target}", + "tabs_bar.home": "Hem", + "tabs_bar.notifications": "Notificationes", + "time_remaining.days": "{number, plural, one {# die} other {# dies}} resta", + "time_remaining.hours": "{number, plural, one {# hor} other {# hores}} resta", + "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} resta", + "time_remaining.moments": "Momentes resta", + "time_remaining.seconds": "{number, plural, one {# second} other {# secondes}} resta", + "timeline_hint.remote_resource_not_displayed": "{resource} de altri servitores ne es monstrat.", + "timeline_hint.resources.followers": "Sequitores", + "timeline_hint.resources.follows": "Sequetes", + "timeline_hint.resources.statuses": "Plu old postas", + "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} persones}} durant li ultim {days, plural, one {die} other {{days} dies}}", + "trends.trending_now": "Actualmen populari", + "ui.beforeunload": "Tui íncomplet posta va esser perdit si tu lassa Mastodon.", + "units.short.billion": "{count}B", + "units.short.million": "{count}M", + "units.short.thousand": "{count}K", + "upload_area.title": "Trenar & lassar cader por cargar", + "upload_button.label": "Adjunter images, un video o un audio-file", + "upload_error.limit": "Límite de medie-cargationes transpassat.", + "upload_error.poll": "On ne es permisset cargar medie con balotationes.", + "upload_form.audio_description": "Descrir por persones qui es surd o ne audi bon", + "upload_form.description": "Descrir por persones qui es ciec o have mal vision", + "upload_form.description_missing": "Null descrition adjuntet", + "upload_form.edit": "Redacter", + "upload_form.thumbnail": "Changear previsual image", + "upload_form.undo": "Deleter", + "upload_form.video_description": "Descrir por persones qui es surd, ciec, ne audi bon, o have mal vision", + "upload_modal.analyzing_picture": "Analisant image…", + "upload_modal.apply": "Aplicar", + "upload_modal.applying": "Aplicant…", + "upload_modal.choose_image": "Selecter image", + "upload_modal.description_placeholder": "Li Europan lingues es membres del sam familie. Lor separat existentie es un mite", + "upload_modal.detect_text": "Detecter text del image", + "upload_modal.edit_media": "Redacter medie", + "upload_modal.hint": "Clicca o trena li circul por selecter li focal punctu quel va esser sempre visibil in omni previse-images.", + "upload_modal.preparing_ocr": "Preparant OCR…", + "upload_modal.preview_label": "Previse ({ratio})", + "upload_progress.label": "Cargant...", + "upload_progress.processing": "Tractant…", + "username.taken": "Ti usator-nómine es ja prendet. Trova altri", + "video.close": "Cluder video", + "video.download": "Descargar file", + "video.exit_fullscreen": "Exear plen-ecran", + "video.expand": "Expander video", + "video.fullscreen": "Plen-ecran", + "video.hide": "Celar video", + "video.mute": "Silentiar li son", + "video.pause": "Pausar", + "video.play": "Reproducter", + "video.unmute": "Dessilentiar li son" +} diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 552debdb50bdc9..ba44408935fa4d 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -20,6 +20,7 @@ "account.blocked": "Blokusita", "account.browse_more_on_origin_server": "Videz pluse che la originala profilo", "account.cancel_follow_request": "Desendez sequodemando", + "account.copy": "Kopiez ligilo al profilo", "account.direct": "Private mencionez @{name}", "account.disable_notifications": "Cesez avizar me kande @{name} postas", "account.domain_blocked": "Domain hidden", @@ -38,7 +39,8 @@ "account.follows.empty": "Ca uzanto ne sequa irgu til nun.", "account.follows_you": "Sequas tu", "account.go_to_profile": "Irez al profilo", - "account.hide_reblogs": "Celez busti de @{name}", + "account.hide_reblogs": "Celez repeti de @{name}", + "account.in_memoriam": "Memorige.", "account.joined_short": "Juntita", "account.languages": "Chanjez abonita lingui", "account.link_verified_on": "Proprieteso di ca ligilo kontrolesis ye {date}", @@ -58,7 +60,7 @@ "account.requested": "Vartante aprobo", "account.requested_follow": "{name} demandis sequar tu", "account.share": "Partigez profilo di @{name}", - "account.show_reblogs": "Montrez busti de @{name}", + "account.show_reblogs": "Montrez repeti de @{name}", "account.statuses_counter": "{count, plural, one {{counter} Posto} other {{counter} Posti}}", "account.unblock": "Desblokusar @{name}", "account.unblock_domain": "Desblokusar {domain}", @@ -86,7 +88,7 @@ "attachments_list.unprocessed": "(neprocedita)", "audio.hide": "Celez audio", "autosuggest_hashtag.per_week": "{count} dum singla semano", - "boost_modal.combo": "Tu povas presar sur {combo} por omisar co en la venonta foyo", + "boost_modal.combo": "Vu povas pulsar {combo} por omisar co venontafoye", "bundle_column_error.copy_stacktrace": "Kopierorraporto", "bundle_column_error.error.body": "La demandita pagino ne povas strukturigesar. Forsan ol esas eroro en kodexo hike o vidilkoncilieblesproblemo.", "bundle_column_error.error.title": "Ach!", @@ -180,7 +182,7 @@ "confirmations.mute.explanation": "Co celigos posti de oli e posti quo mencionas oli, ma ol ankore permisas oli vidar vua posti e sequar vu.", "confirmations.mute.message": "Ka vu certe volas silencigar {name}?", "confirmations.redraft.confirm": "Efacez e riskisez", - "confirmations.redraft.message": "Ka vu certe volas efacar ca posto e riskisigar ol? Favoriziti e busti esos perdita, e respondi al posto originala esos orfanigita.", + "confirmations.redraft.message": "Ka vu certe volas efacar ca posto e riskisigar ol? Favoriziti e repeti esos perdita, e respondi al posto originala esos orfanigita.", "confirmations.reply.confirm": "Respondez", "confirmations.reply.message": "Respondar nun remplos mesajo quon vu nun igas. Ka vu certe volas durar?", "confirmations.unfollow.confirm": "Desequez", @@ -189,6 +191,7 @@ "conversation.mark_as_read": "Markizez quale lektita", "conversation.open": "Videz konverso", "conversation.with": "Kun {names}", + "copy_icon_button.copied": "Kopiita", "copypaste.copied": "Kopiesis", "copypaste.copy_to_clipboard": "Kopiez", "directory.federated": "De savita fediverso", @@ -200,7 +203,7 @@ "dismissable_banner.community_timeline": "Co esas maxim recenta publika posti de personi quo havas konto quo hostigesas da {domain}.", "dismissable_banner.dismiss": "Ignorez", "dismissable_banner.explore_links": "Ca nova rakonti parolesas da personi che ca e altra servili di necentraligita situo nun.", - "dismissable_banner.explore_statuses": "Yen posti del tota reto sociala qui esas populara hodie. Posti plu nova kun plu busti e favoriziti esas rangizita plu alte.", + "dismissable_banner.explore_statuses": "Yen posti del tota reto sociala qui esas populara hodie. Posti plu nova kun plu repeti e favoriziti esas rangizita plu alte.", "dismissable_banner.explore_tags": "Ca hashtagi bezonas plu famoza inter personi che ca e altra servili di la necentraligita situo nun.", "dismissable_banner.public_timeline": "Yen la posti maxim recenta da personi che la reto sociala quin personi che {domain} sequas.", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -220,6 +223,7 @@ "emoji_button.search_results": "Trovuri", "emoji_button.symbols": "Simboli", "emoji_button.travel": "Vizito & Plasi", + "empty_column.account_hides_collections": "Ca uzanto selektis ne publikigar ca informo", "empty_column.account_suspended": "Konto restriktesis", "empty_column.account_timeline": "No toots here!", "empty_column.account_unavailable": "Profilo esas nedisponebla", @@ -294,14 +298,18 @@ "hashtag.column_settings.tag_mode.any": "Irga co", "hashtag.column_settings.tag_mode.none": "Nula co", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} partoprenanto} other {{counter} partoprenanti}}", + "hashtag.counter_by_uses": "{count, plural, one {{counter} posto} other {{counter} posti}}", + "hashtag.counter_by_uses_today": "{count, plural, one {{counter} posto} other {{counter} posti}} hodie", "hashtag.follow": "Sequez hashtago", "hashtag.unfollow": "Desequez hashtago", + "hashtags.and_other": "…e {count, plural, one {# plusa}other {# plusa}}", "home.actions.go_to_explore": "Videz quo es populara nun", "home.actions.go_to_suggestions": "Trovez personi por sequar", "home.column_settings.basic": "Simpla", "home.column_settings.show_reblogs": "Montrar repeti", "home.column_settings.show_replies": "Montrar respondi", - "home.explore_prompt.body": "Vua hemala fluo havos mixuro de la hashtagi quin vu selektis sequar, la personi quin vu selektis sequar, e la posti quin ili bustis. Se to semblas tro tacanta, vu darfas volar:", + "home.explore_prompt.body": "Vua hemala fluo havos mixuro de la hashtagi quin vu selektis sequar, la personi quin vu selektis sequar, e la posti quin ili repetis. Se to semblas tro tacanta, vu darfas volar:", "home.explore_prompt.title": "Co es vua hemo en Mastodon.", "home.hide_announcements": "Celez anunci", "home.pending_critical_update.body": "Voluntez aktualigar vua Mastodon-servilo tam balde kam es posibla!", @@ -310,7 +318,7 @@ "home.show_announcements": "Montrez anunci", "interaction_modal.description.favourite": "Kun konto che Mastodon, vu povas favorizar ca posto por savigar la autoro ke vu prizas ol e sparar ol por pose.", "interaction_modal.description.follow": "Per konto che Mastodon, vu povas sequar {name} por ganar ola posti en vua hemniuzeto.", - "interaction_modal.description.reblog": "Per konto che Mastodon, vu povas bustizar ca posti por partigar kun sua sequanti.", + "interaction_modal.description.reblog": "Per konto che Mastodon, vu povas repetar ca posti por dissemar lo a vua propra sequati.", "interaction_modal.description.reply": "Per konto che Mastodon, vu povas respondar ca posto.", "interaction_modal.login.action": "Irar a hemo", "interaction_modal.login.prompt": "Domeno di vua hemala servilo, ex. mastodon.social", @@ -321,14 +329,14 @@ "interaction_modal.sign_in_hint": "Averto: To es la retsituo ube vu kreis konto. Se vu ne rimemoras, serchez vua bonvenanta e-posto. Vu anke povas enpozar vua kompleta uzantnomo! (ex. @Mastodon@mastodon.social)", "interaction_modal.title.favourite": "Favorizez ca posto da {name}", "interaction_modal.title.follow": "Sequez {name}", - "interaction_modal.title.reblog": "Bustizez posto di {name}", + "interaction_modal.title.reblog": "Repetez posto di {name}", "interaction_modal.title.reply": "Respondez posto di {name}", "intervals.full.days": "{number, plural, one {# dio} other {# dii}}", "intervals.full.hours": "{number, plural, one {# horo} other {# hori}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# minuti}}", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.blocked": "to open blocked users list", - "keyboard_shortcuts.boost": "to boost", + "keyboard_shortcuts.boost": "Repetez posto", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", "keyboard_shortcuts.description": "Deskripto", @@ -383,6 +391,7 @@ "lists.search": "Trovez inter personi quon vu sequas", "lists.subheading": "Vua listi", "load_pending": "{count, plural, one {# nova kozo} other {# nova kozi}}", + "loading_indicator.label": "Kargante…", "media_gallery.toggle_visible": "Chanjar videbleso", "moved_to_account_banner.text": "Vua konto {disabledAccount} es nune desaktiva pro ke vu movis a {movedToAccount}.", "mute_modal.duration": "Durado", @@ -448,7 +457,7 @@ "notifications.column_settings.unread_notifications.highlight": "Briligez nelektita avizi", "notifications.column_settings.update": "Modifikati:", "notifications.filter.all": "Omna", - "notifications.filter.boosts": "Busti", + "notifications.filter.boosts": "Repeti", "notifications.filter.favourites": "Favoriziti", "notifications.filter.follows": "Sequati", "notifications.filter.mentions": "Mencioni", @@ -471,6 +480,17 @@ "onboarding.follows.empty": "Regretinde, nula rezultajo povas montresar nune. Vu povas esforcar serchar, o irar al explorala pagino por trovar personi sequinda, o esforcar itere pose.", "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", "onboarding.follows.title": "Popular on Mastodon", + "onboarding.profile.discoverable": "Trovebligez mea profilo", + "onboarding.profile.discoverable_hint": "Se vu selektas deskovrebleso che Mastodon, vua posti povas aparar en sercho-rezultaji e populari, e vua profilo forsan sugestesos a personi kun interesi simila a vua.", + "onboarding.profile.display_name": "Publika nomo", + "onboarding.profile.display_name_hint": "Vua tota nomo o vua gaya nomo…", + "onboarding.profile.lead": "Vu sempre povas kompletigar co plu tarde en la opcioni, ube mem plua personalizanta opcioni es disponebla.", + "onboarding.profile.note": "Biografio", + "onboarding.profile.note_hint": "Vu povas @mencionar altra personi o #hashtagi…", + "onboarding.profile.save_and_continue": "Preservez e avancez", + "onboarding.profile.title": "Kompletigez la profilo", + "onboarding.profile.upload_avatar": "Kargez profiloportreto", + "onboarding.profile.upload_header": "Kargez profilokapimajo", "onboarding.share.lead": "Savigez personi quale ili povas trovar vu che Mastodon!", "onboarding.share.message": "Me esas {username} che #Mastodon! Venez e sequez me ye {url}", "onboarding.share.next_steps": "Kozi quin vu darfas volar facar sequante:", @@ -482,7 +502,7 @@ "onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}", "onboarding.steps.publish_status.body": "Say hello to the world.", "onboarding.steps.publish_status.title": "Facar vua unesma posto", - "onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.", + "onboarding.steps.setup_profile.body": "Vu interagos plue kun profilo detalizita.", "onboarding.steps.setup_profile.title": "Customize your profile", "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.title": "Share your profile", @@ -510,6 +530,7 @@ "privacy.unlisted.short": "Ne enlistigota", "privacy_policy.last_updated": "Antea novajo ye {date}", "privacy_policy.title": "Privatesguidilo", + "recommended": "Rekomendata", "refresh": "Rifreshez", "regeneration_indicator.label": "Chargas…", "regeneration_indicator.sublabel": "Vua hemniuzeto preparesas!", @@ -580,6 +601,8 @@ "search.quick_action.status_search": "Posti qui asortas {x}", "search.search_or_paste": "Serchar o pozar URL", "search_popout.full_text_search_disabled_message": "Nedisponebla che {domain}.", + "search_popout.full_text_search_logged_out_message": "Nur disponebla enirite.", + "search_popout.language_code": "ISO linguokodexo", "search_popout.options": "Opcioni serchala", "search_popout.quick_actions": "Agi rapida", "search_popout.recent": "Lasta serchi", @@ -607,8 +630,8 @@ "status.admin_status": "Open this status in the moderation interface", "status.block": "Restriktez @{name}", "status.bookmark": "Libromarko", - "status.cancel_reblog_private": "Debustez", - "status.cannot_reblog": "Ca posto ne povas bustesas", + "status.cancel_reblog_private": "Desrepetez", + "status.cannot_reblog": "Ca posto ne povas repetesar", "status.copy": "Copy link to status", "status.delete": "Efacar", "status.detailed_status": "Detala konversvido", @@ -636,10 +659,10 @@ "status.pin": "Pinglagez che profilo", "status.pinned": "Pinned toot", "status.read_more": "Lektez pluse", - "status.reblog": "Repetar", - "status.reblog_private": "Bustez kun originala videbleso", - "status.reblogged_by": "{name} repetita", - "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.reblog": "Repetez", + "status.reblog_private": "Repetez kun originala videbleso", + "status.reblogged_by": "{name} repetis", + "status.reblogs.empty": "Nulu ja repetis ca posto. Kande ulu facas lo, lu montresos hike.", "status.redraft": "Efacez e riskisigez", "status.remove_bookmark": "Efacez libromarko", "status.replied_to": "Respondis a {name}", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json new file mode 100644 index 00000000000000..1b501c710aa87a --- /dev/null +++ b/app/javascript/mastodon/locales/lad.json @@ -0,0 +1,698 @@ +{ + "about.blocks": "Sirvidores moderados", + "about.contact": "Kontakto:", + "about.disclaimer": "Mastodon es un programario libero, kon kodiche avierto i una marka komersiala de Mastodon gGmbH.", + "about.domain_blocks.no_reason_available": "Razon no desponivle", + "about.domain_blocks.preamble": "Mastodon djeneralmente te permete ver kontenido de i enteraktuar kon utilizadores de kualseker otro sirvidor en el fediverso. Estas son las eksepsiones en este sirvidor en partikolar.", + "about.domain_blocks.silenced.explanation": "\"Djeneralmente no veras profiles i kontenido de este sirvidor, salvo ke eksplisitamente lo bushkes o sigas algun kuento de el.", + "about.domain_blocks.silenced.title": "Limitado", + "about.domain_blocks.suspended.explanation": "Dingunos datos de este sirvidor sera prosesado, magazinado o enterkambiado kon este sirvidor. Enteraksyon o komunikasyon kon sus utilizadores sera imposivle.", + "about.domain_blocks.suspended.title": "Suspendido", + "about.not_available": "Esta enformasyon no esta desponivle en este sirvidor.", + "about.powered_by": "Redes sosyalas desentralizadas kon uzo de {mastodon}", + "about.rules": "Reglas del sirvidor", + "account.account_note_header": "Nota", + "account.add_or_remove_from_list": "Adjusta a o kita de listas", + "account.badges.bot": "Bot", + "account.badges.group": "Grupo", + "account.block": "Bloka @{name}", + "account.block_domain": "Bloka el domeno {domain}", + "account.block_short": "Bloka", + "account.blocked": "Blokado", + "account.browse_more_on_origin_server": "Ve mas en el profil orijinal", + "account.cancel_follow_request": "Anula solisitud de segir", + "account.copy": "Kopia atadijo de profil", + "account.direct": "Enmenta a @{name} en privado", + "account.disable_notifications": "No me avizes mas sovre publikasyones de @{name}", + "account.domain_blocked": "Domeno blokado", + "account.edit_profile": "Edita profil", + "account.enable_notifications": "Avizame kuando @{name} publike", + "account.endorse": "Avalia en profil", + "account.featured_tags.last_status_at": "Ultima publikasyon de {date}", + "account.featured_tags.last_status_never": "\"No ay publikasyones", + "account.featured_tags.title": "Etiketas avaliadas de {name}", + "account.follow": "Sige", + "account.followers": "Suivantes", + "account.followers.empty": "Por agora dingun no sige a este utilizador.", + "account.followers_counter": "{count, plural, one {{counter} suivante} other {{counter} suivantes}}", + "account.following": "Sigiendo", + "account.following_counter": "{count, plural, other {Sigiendo a {counter}}}", + "account.follows.empty": "Este utilizador ainda no sige a ningun.", + "account.follows_you": "Te sige", + "account.go_to_profile": "Va al profil", + "account.hide_reblogs": "Eskonde repartajasyones de @{name}", + "account.in_memoriam": "De bendicha memoria.", + "account.joined_short": "Adjunto", + "account.languages": "Troka linguas suskrividas", + "account.link_verified_on": "La propriedad de este atadijo fue verifikada el {date}", + "account.locked_info": "El estado de privasita de este konto esta konfigurado komo serado. El proprietario reviza manualmente kien le puede segir.", + "account.media": "Multimedia", + "account.mention": "Enmenta a @{name}", + "account.moved_to": "{name} tiene endikado ke su muevo kuento agora es:", + "account.mute": "Silensia a @{name}", + "account.mute_notifications_short": "Silensia avizos de @{name}", + "account.mute_short": "Silensia", + "account.muted": "Silensiado", + "account.no_bio": "No ay deskripsion.", + "account.open_original_page": "Avre pajina orijnala", + "account.posts": "Publikasyones", + "account.posts_with_replies": "Kon repuestas", + "account.report": "Raporta @{name}", + "account.requested": "Asperando achetasion. Klika para anular la solisitud de segimiento", + "account.requested_follow": "{name} tiene solisitado segirte", + "account.share": "Partaja el profil de @{name}", + "account.show_reblogs": "Amostra repartajasyones de @{name}", + "account.statuses_counter": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}}", + "account.unblock": "Dezbloka @{name}", + "account.unblock_domain": "Dezbloka domeno {domain}", + "account.unblock_short": "Dezbloka", + "account.unendorse": "No avalia en profil", + "account.unfollow": "Desige", + "account.unmute": "Desilensia a @{name}", + "account.unmute_notifications_short": "Desilensia avizos", + "account.unmute_short": "Desilensia", + "account_note.placeholder": "Klika para adjustar nota", + "admin.dashboard.daily_retention": "Proporsyon de retensyon de utilizadores por diya dempues de enrejistrasyon", + "admin.dashboard.monthly_retention": "Proporsyon de retensyon de utilizadores por mez dempues de enrejistrasyon", + "admin.dashboard.retention.average": "Media", + "admin.dashboard.retention.cohort": "Mez de enrejistrasyon", + "admin.dashboard.retention.cohort_size": "Muevos utilizadores", + "alert.rate_limited.message": "Por favor aprova dempues de {retry_time, time, medium}.", + "alert.rate_limited.title": "Trafiko limitado", + "alert.unexpected.message": "Afito un yerro no asperado.", + "alert.unexpected.title": "Atyo!", + "announcement.announcement": "Pregon", + "attachments_list.unprocessed": "(no prosesado)", + "audio.hide": "Eskonder audio", + "autosuggest_hashtag.per_week": "{count} por semana", + "boost_modal.combo": "Puedes klikar {combo} para ometer esto la proksima vez", + "bundle_column_error.copy_stacktrace": "Kopia el raporto de yerro", + "bundle_column_error.error.body": "La pajina solisitada no pudo ser renderada. Podria ser por un yerro en muestro kodiche o un problem de kompatibilita kon el navigador.", + "bundle_column_error.error.title": "Atyo, no!", + "bundle_column_error.network.body": "Uvo un yerro kon la prova de eskargar esta pajina. Esto puede ser por un problem temporal kon tu koneksyon a la internet o a este sirvidor.", + "bundle_column_error.network.title": "Yerro de red", + "bundle_column_error.retry": "Aprova de muevo", + "bundle_column_error.return": "Volta a la linya prinsipala", + "bundle_column_error.routing.body": "No se pudo trokar la pajina solisitada. Estas siguro ke el adreso URL en la vara de adreso es djusto?", + "bundle_column_error.routing.title": "404", + "bundle_modal_error.close": "Serra", + "bundle_modal_error.message": "Algo negro afito al eskargar este komponente.", + "bundle_modal_error.retry": "Aprova de muevo", + "closed_registrations.other_server_instructions": "Deke Mastodon es desentralizado, puedes kriyar un kuento en otro sirvidor i ainda enteraktuar kon este.", + "closed_registrations_modal.description": "Aktualmente no es posivle kriyar un kuento en {domain}, ama por favor akodrate de ke no ay menester de tener un kuento espesifikamente en {domain} para kulanear Mastodon.", + "closed_registrations_modal.find_another_server": "Bushka otro sirvidor", + "closed_registrations_modal.preamble": "Mastodon es desentralizado, estonses sin emportansya ande kriyas tu kuento, podras segir i enteraktuar kon kualseker persona en este sirvidor. Tamyen puedes balabayarlo tu mezmo!", + "closed_registrations_modal.title": "Enrerjistrate en Mastodon", + "column.about": "Sovre mozotros", + "column.blocks": "Utilizadores blokados", + "column.bookmarks": "Markadores", + "column.community": "Linya de tiempo lokala", + "column.direct": "Enmentaduras privadas", + "column.directory": "Eksplora profiles", + "column.domain_blocks": "Domenos blokados", + "column.favourites": "Te plazen", + "column.firehose": "Linyas en bivo", + "column.follow_requests": "Solisitudes de segimiento", + "column.home": "Linya prinsipala", + "column.lists": "Listas", + "column.mutes": "Utilizadores silensiados", + "column.notifications": "Avizos", + "column.pins": "Publikasyones fiksadas", + "column.public": "Linya de tiempo federada", + "column_back_button.label": "Atras", + "column_header.hide_settings": "Eskonde opsyones", + "column_header.moveLeft_settings": "Move kolumna a la siedra", + "column_header.moveRight_settings": "Move kolumna a la derecha", + "column_header.pin": "Fiksa", + "column_header.show_settings": "Amostra opsyones", + "column_header.unpin": "Defiksar", + "column_subheading.settings": "Opsyones", + "community.column_settings.local_only": "Solo lokalas", + "community.column_settings.media_only": "Solo multimedia", + "community.column_settings.remote_only": "Solo remotas", + "compose.language.change": "Troka lingua", + "compose.language.search": "Bushka linguas...", + "compose.published.body": "Publikasyon publikada.", + "compose.published.open": "Avre", + "compose.saved.body": "Publikasyon guadrada.", + "compose_form.direct_message_warning_learn_more": "Ambezate mas", + "compose_form.encryption_warning": "Publikasyones en Mastodon no son shifradas de lado a lado. No partajes dinguna enformasyon sensivle por Mastodon.", + "compose_form.hashtag_warning": "Esta publikasyon no sera amostrada debasho de dinguna etiketa si no es publika. Solo publikasyones publikas se pueden bushkar por la etiketa.", + "compose_form.lock_disclaimer": "Tu kuento no esta {locked}. Todos pueden segirte para ver tus publikasyones solo para suivantes.", + "compose_form.lock_disclaimer.lock": "serrado", + "compose_form.placeholder": "Ke haber?", + "compose_form.poll.add_option": "Adjusta opsyon", + "compose_form.poll.duration": "Durasion de anketa", + "compose_form.poll.option_placeholder": "Opsyon {number}", + "compose_form.poll.remove_option": "Kita esta opsyon", + "compose_form.poll.switch_to_multiple": "Trokar anketa para permeter a eskojer mas ke una opsyon", + "compose_form.poll.switch_to_single": "Trokar anketa para permeter a eskojer solo una opsyon", + "compose_form.publish": "Publika", + "compose_form.publish_form": "Mueva publikasyon", + "compose_form.publish_loud": "{publish}!", + "compose_form.save_changes": "Guadra trokamientos", + "compose_form.sensitive.hide": "{count, plural, one {Marka material komo sensivle} other {Marka material komo sensivle}}", + "compose_form.sensitive.marked": "{count, plural, one {Material markado komo sensivle} other {Material markado komo sensivle}}", + "compose_form.sensitive.unmarked": "{count, plural, one {Material no markado komo sensivle} other {Material no markado komo sensivle}}", + "compose_form.spoiler.marked": "Kita avertensya de kontenido", + "compose_form.spoiler.unmarked": "Adjusta avertensya de kontenido", + "compose_form.spoiler_placeholder": "Eskrive tu avertensya aki", + "confirmation_modal.cancel": "Anula", + "confirmations.block.block_and_report": "Bloka i raporta", + "confirmations.block.confirm": "Bloka", + "confirmations.block.message": "Estas siguro ke keres blokar a {name}?", + "confirmations.cancel_follow_request.confirm": "Anula solisitud", + "confirmations.cancel_follow_request.message": "Estas siguro ke keres anular tu solisitud de segir a {name}?", + "confirmations.delete.confirm": "Efasa", + "confirmations.delete.message": "Estas siguro ke keres efasar esta publikasyon?", + "confirmations.delete_list.confirm": "Efasa", + "confirmations.delete_list.message": "Estas siguro ke keres permanentemente efasar esta lista?", + "confirmations.discard_edit_media.confirm": "Anula", + "confirmations.discard_edit_media.message": "Tienes trokamientos no guadrados en la deskripsion o vista previa. Keres efasarlos entanto?", + "confirmations.domain_block.confirm": "Bloka domeno entero", + "confirmations.domain_block.message": "Estas totalmente siguro ke keres blokar todo el domeno {domain}? En djeneral unos kuantos blokos o silensiamientos son sufisientes i preferavles. No veras kontenido de akel domeno en dinguna linya de tiempo publika ni ent tus avizos. Tus suivantes de akel domeno seran kitados.", + "confirmations.edit.confirm": "Edita", + "confirmations.edit.message": "Editar agora kitara el mesaj kualo estas eskriviendo aktualmente. Estas siguro ke keres fazerlo?", + "confirmations.logout.confirm": "Sal", + "confirmations.logout.message": "Estas siguro ke keres salir de tu kuento?", + "confirmations.mute.confirm": "Silensia", + "confirmations.mute.explanation": "Esto eskondera las publikasyones de este kuento i publikasyones ke lo enmentan, pero ainda les permetera segirte.", + "confirmations.mute.message": "Estas siguro ke keres silensiar a {name}?", + "confirmations.redraft.confirm": "Efasar i reeskrivir", + "confirmations.redraft.message": "Estas siguro ke keres efasar esta publikasyon i reeskrivirla? Pedreras todos los favoritos i repartajasyones asosiados kon esta publikasyon i repuestas a eya seran guerfanadas.", + "confirmations.reply.confirm": "Arisponde", + "confirmations.reply.message": "Arispondir agora kitara el mesaj kualo estas eskriviendo aktualmente. Estas siguro ke keres fazerlo?", + "confirmations.unfollow.confirm": "Desige", + "confirmations.unfollow.message": "Estas siguro ke keres deshar de segir a {name}?", + "conversation.delete": "Efasa konversasyon", + "conversation.mark_as_read": "Marka komo meldado", + "conversation.open": "Ve konversasyon", + "conversation.with": "Kon {names}", + "copy_icon_button.copied": "Kopiado al portapapeles", + "copypaste.copied": "Kopiado", + "copypaste.copy_to_clipboard": "Kopia al portapapeles", + "directory.federated": "Dizde el fediverso konesido", + "directory.local": "Solo de {domain}", + "directory.new_arrivals": "Arivados resientemente", + "directory.recently_active": "Aktivos resientemente", + "disabled_account_banner.account_settings": "Preferensyas de kuento", + "disabled_account_banner.text": "Tu kuento {disabledAccount} esta aktualmente inkapasitado.", + "dismissable_banner.community_timeline": "Estas son las publikasyones publikas mas resientes de las personas kualos kuentos estan balabayados en {domain}.", + "dismissable_banner.dismiss": "Kita", + "dismissable_banner.explore_links": "Estos haberes estan diskutidos agora por djente en este sirvidor i otros de la red desentralizada.", + "dismissable_banner.explore_statuses": "Estas publikasyones de este sirvidor i otros de la red desentralizada estan agora popularas. Publikasyones mas muevas, kon mas repartajasiones i favoritadas por mas djente aparesen primero.", + "dismissable_banner.explore_tags": "Estas etiketas estan agora popularas en la red sosyala. Etiketas uzadas por mas djente aparesen primero.", + "dismissable_banner.public_timeline": "Estas son las publikasyones publikas mas resientes de personas en la red sosyala a las kualas la djente de {domain} sige.", + "embed.instructions": "Enkrusta esta publikasyon en tu sitio internetiko kopiando este kodiche.", + "embed.preview": "Ansi paresera:", + "emoji_button.activity": "Aktivita", + "emoji_button.clear": "Alimpia", + "emoji_button.custom": "Personalizado", + "emoji_button.flags": "Bandieras", + "emoji_button.food": "Kumidas i beverajes", + "emoji_button.label": "Adjustar emoji", + "emoji_button.nature": "Natura", + "emoji_button.not_found": "Emojis no topados", + "emoji_button.objects": "Objektos", + "emoji_button.people": "Djente", + "emoji_button.recent": "Uzados frekuentemente", + "emoji_button.search": "Bushka...", + "emoji_button.search_results": "Rizultados de bushkeda", + "emoji_button.symbols": "Simbolos", + "emoji_button.travel": "Viajes i lugares", + "empty_column.account_suspended": "Kuento suspendido", + "empty_column.account_timeline": "No ay publikasyones aki!", + "empty_column.account_unavailable": "Profil no desponivle", + "empty_column.blocks": "Ainda no tienes blokado a dingun utilizador.", + "empty_column.bookmarked_statuses": "Ainda no tienes dinguna publikasyon kon markador. Kuando adjustes un markador a una, se amostrara aki.", + "empty_column.community": "La linya de tiempo lokala esta vaziya. Eskrive algo publikamente para ampesar la fiesta!", + "empty_column.direct": "Ainda no tienes enmentaduras privadas. Kuando embies o risives una, se amostra aki.", + "empty_column.domain_blocks": "Ainda no ay domenos blokados.", + "empty_column.explore_statuses": "No ay dingunos trendes agora. Mira mas tadre!", + "empty_column.favourited_statuses": "Ainda no tienes publikasyones favoritas. Kuando indikes ke una te plaze, se amostrara aki.", + "empty_column.favourites": "Nadie tiene indikado ke le plaze una de tus publikasyones. Kuando algun lo aga, se amostrara aki.", + "empty_column.follow_requests": "No tienes dinguna solisitud de suivante. Kuando risivas una, se amostrara aki.", + "empty_column.followed_tags": "Ainda no tienes segido dinguna etiketa. Kuando lo agas, se amostraran aki.", + "empty_column.hashtag": "Ainda no ay niente en esta etiketa.", + "empty_column.home": "Tu linya de tiempo esta vaziya! Sige a mas personas para inchirla.", + "empty_column.list": "Ainda no ay niente en esta lista. Kuando miembros de esta lista publiken muevas publikasyones, se amostraran aki.", + "empty_column.lists": "Ainda no tienes dinguna lista. Kuando kriyes una, aperesera aki.", + "empty_column.mutes": "Ainda no tienes silensiado a dingun utilizador.", + "empty_column.notifications": "Ainda no tienes dingun avizo. Kuando otras personas enteraktuen kontigo, se amostraran aki.", + "empty_column.public": "No ay niente aki! Eskrive algo publikamente o manualmente sige utilizadores de otros sirvidores para inchirlo", + "error.unexpected_crash.explanation": "Por un yerro en muestro kodiche o un problem de kompatibilita kon el navigador, no se puede amostrar esta pajina djustamente.", + "error.unexpected_crash.explanation_addons": "No se puede amostrar esta pajina djustamente. Este yerro probavlemente fue kauzado por un komplimento del navigador o por un enstrumento de traduksion.", + "error.unexpected_crash.next_steps": "Aprova arefreskar la pajina. Si esto no ayuda, es posivle ke ainda puedas kulaenar Mastodon kon otro navigador u otra aplikasyon nativa.", + "error.unexpected_crash.next_steps_addons": "Aprova inkapasitarlos i arefreskar la pajina. Si esto no ayuda, es posivle ke ainda puedas kulanear Mastodon kon otro navigador u otra aplikasyon nativa.", + "errors.unexpected_crash.copy_stacktrace": "Kopiar stacktrace al portapapeles", + "errors.unexpected_crash.report_issue": "Raportar problema", + "explore.search_results": "Rizultados de bushkeda", + "explore.suggested_follows": "Djente", + "explore.title": "Eksplorar", + "explore.trending_links": "Haberes", + "explore.trending_statuses": "Publikasyones", + "explore.trending_tags": "Etiketas", + "filter_modal.added.context_mismatch_explanation": "Esta kategoria del filtro no se aplika al konteksto en ke tienes aksesido esta publikasyon. Si keres ke la publikasyon sea filtrada en este konteksto tamyen, kale editar el filtro.", + "filter_modal.added.context_mismatch_title": "El konteksto no koensida!", + "filter_modal.added.expired_explanation": "Esta kategoria de filtros tiene kadukado. Kale ke trokar la data de kadukasion para aplikarla.", + "filter_modal.added.expired_title": "Filtro kadukado!", + "filter_modal.added.review_and_configure": "Para revizar i konfigurar esta kategoria de filtros, va a {settings_link}.", + "filter_modal.added.review_and_configure_title": "Konfigurasyon de filtro", + "filter_modal.added.settings_link": "pajina de konfigurasyon", + "filter_modal.added.short_explanation": "Esta publikasyon fue adjustada a la sigiente kategoria de filtros: {title}.", + "filter_modal.added.title": "Filtro adjustado!", + "filter_modal.select_filter.context_mismatch": "no se aplika a este konteksto", + "filter_modal.select_filter.expired": "kadukado", + "filter_modal.select_filter.prompt_new": "Mueva kategoria: {name}", + "filter_modal.select_filter.search": "Bushkar o kriyar", + "filter_modal.select_filter.subtitle": "Kulanear una kategoria egzistente o kriya mueva", + "filter_modal.select_filter.title": "Filtrar esta publikasyon", + "filter_modal.title.status": "Filtrar una publikasyon", + "firehose.all": "Todo", + "firehose.local": "Este sirvidor", + "firehose.remote": "Otros sirvidores", + "follow_request.authorize": "Autoriza", + "follow_request.reject": "Refuza", + "follow_requests.unlocked_explanation": "Aunke tu kuento no esta serrado, la taifa de {domain} kreye ke talvez keres revizar manualmente las solisitudes de segimento de estos kuentos.", + "followed_tags": "Etiketas segidas", + "footer.about": "Sovre mozotros", + "footer.directory": "Katalogo de profiles", + "footer.get_app": "Abasha aplikasyon", + "footer.invite": "Envitar a djente", + "footer.keyboard_shortcuts": "Akortamientos de klavye", + "footer.privacy_policy": "Politika de privasita", + "footer.source_code": "Ve kodiche fuente", + "footer.status": "Estado", + "generic.saved": "Guadrado", + "getting_started.heading": "Primos pasos", + "hashtag.column_header.tag_mode.all": "i {additional}", + "hashtag.column_header.tag_mode.any": "o {additional}", + "hashtag.column_header.tag_mode.none": "sin {additional}", + "hashtag.column_settings.select.no_options_message": "Rekomendasyones no topadas", + "hashtag.column_settings.select.placeholder": "Meter etiketas…", + "hashtag.column_settings.tag_mode.all": "Todos estos", + "hashtag.column_settings.tag_mode.any": "Kualsekera de estos", + "hashtag.column_settings.tag_mode.none": "Dinguno de estos", + "hashtag.column_settings.tag_toggle": "Inkluir etiketas adisionalas en esta kolumna", + "hashtag.counter_by_uses_today": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}} oy", + "hashtag.follow": "Segir etiketa", + "hashtag.unfollow": "Desegir etiketa", + "hashtags.and_other": "…i {count, plural, one {}other {# mas}}", + "home.actions.go_to_explore": "Ve los trendes", + "home.actions.go_to_suggestions": "Topa a djente para segir", + "home.column_settings.basic": "Opsyones bazikas", + "home.column_settings.show_reblogs": "Amostrar repartajasyones", + "home.column_settings.show_replies": "Amostrar repuestas", + "home.hide_announcements": "Eskonde pregones", + "home.pending_critical_update.body": "Por favor aktualiza tu sirvidor de Mastodon pishin!", + "home.pending_critical_update.link": "Ve aktualizasyones", + "home.show_announcements": "Amostra pregones", + "interaction_modal.description.favourite": "Kon un kuento en Mastodon, puedes markar esta publikasyon komo favorita para ke el autor sepa ke te plaze i para guadrarla para dempues.", + "interaction_modal.description.follow": "Kon un kuento en Mastodon, puedes segir a {name} para risivir sus publikasyones en tu linya temporal prinsipala.", + "interaction_modal.description.reblog": "Kon un kuento en Mastodon, puedes repartajar esta publikasyon para amostrarla a tus suivantes.", + "interaction_modal.description.reply": "Kon un kuento en Mastodon, puedes arispondir a esta publikasyon.", + "interaction_modal.login.prompt": "Domeno del sirvidor de tu kuento, por enshemplo mastodon.social", + "interaction_modal.no_account_yet": "No tyenes kuento de Mastodon?", + "interaction_modal.on_another_server": "En otro sirvidor", + "interaction_modal.on_this_server": "En este sirvidor", + "interaction_modal.title.favourite": "Endika ke te plaze publikasyon de {name}", + "interaction_modal.title.follow": "Sige a {name}", + "interaction_modal.title.reblog": "Repartaja publikasyon de {name}", + "interaction_modal.title.reply": "Arisponde a publikasyon de {name}", + "intervals.full.days": "{number, plural, one {# diya} other {# diyas}}", + "intervals.full.hours": "{number, plural, one {# ora} other {# oras}}", + "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}", + "keyboard_shortcuts.back": "Volta atras", + "keyboard_shortcuts.blocked": "Avre lista de utilizadores blokados", + "keyboard_shortcuts.boost": "Repartaja publikasyon", + "keyboard_shortcuts.column": "Enfoka en una kolumna", + "keyboard_shortcuts.compose": "Enfoka en el area de eskrivir publikasyon", + "keyboard_shortcuts.description": "Deskripsyon", + "keyboard_shortcuts.direct": "Avre la kolumna de enmentaduras privadas", + "keyboard_shortcuts.down": "Move verso abasho en la lista", + "keyboard_shortcuts.enter": "Avre publikasyon", + "keyboard_shortcuts.favourite": "Endika ke te plaze una publikasyon", + "keyboard_shortcuts.favourites": "Avre lista de favoritos", + "keyboard_shortcuts.federated": "Avre linya federada", + "keyboard_shortcuts.heading": "Akortamientos de klavye", + "keyboard_shortcuts.home": "Avre linya prinsipala", + "keyboard_shortcuts.hotkey": "Klave rapido", + "keyboard_shortcuts.legend": "Amostra esta lejenda", + "keyboard_shortcuts.local": "Avre linya lokala", + "keyboard_shortcuts.mention": "Enmenta al autor", + "keyboard_shortcuts.muted": "Avre lista de utilizadores silensiados", + "keyboard_shortcuts.my_profile": "Avre tu profil", + "keyboard_shortcuts.notifications": "Avre kolumna de avizos", + "keyboard_shortcuts.open_media": "Avre multimedia", + "keyboard_shortcuts.pinned": "Avre lista de publikasyones fiksadas", + "keyboard_shortcuts.profile": "Avre profil del autor", + "keyboard_shortcuts.reply": "Arisponde a publikasyon", + "keyboard_shortcuts.requests": "Avre lista de solisitudes de suivantes", + "keyboard_shortcuts.search": "Enfoka en la vara de bushkeda", + "keyboard_shortcuts.spoilers": "Amostra/eskonde el kampo de avertensya de kontenido (CW)", + "keyboard_shortcuts.start": "Avre la kolumna \"para ampesar\"", + "keyboard_shortcuts.toggle_hidden": "Amostra/eskonde teksto detras de avertensya de kontenido (CW)", + "keyboard_shortcuts.toggle_sensitivity": "Amostra/eskonde multimedia", + "keyboard_shortcuts.toot": "Eskrive mueva publikasyon", + "keyboard_shortcuts.unfocus": "No enfoka en el area de eskrivir/bushkeda", + "keyboard_shortcuts.up": "Move verso arriva en la lista", + "lightbox.close": "Serra", + "lightbox.compress": "Kompresa kuadro de imaje", + "lightbox.expand": "Espande kuadro de imaje", + "lightbox.next": "Sigiente", + "lightbox.previous": "Anterior", + "limited_account_hint.action": "Amostra el profil entanto", + "limited_account_hint.title": "Este profil fue eskondido por los moderadores de {domain}.", + "link_preview.author": "Publikasyon de {name}", + "lists.account.add": "Adjusta a lista", + "lists.account.remove": "Kita de lista", + "lists.delete": "Efasa lista", + "lists.edit": "Edita lista", + "lists.edit.submit": "Troka titolo", + "lists.new.create": "Adjusta lista", + "lists.new.title_placeholder": "Titolo de mueva lista", + "lists.replies_policy.followed": "Kualseker utilizardo segido", + "lists.replies_policy.list": "Miembros de la lista", + "lists.replies_policy.none": "Dinguno", + "lists.replies_policy.title": "Amostra repuestas a:", + "lists.search": "Bushka entre personas a las kualas siges", + "lists.subheading": "Tus listas", + "load_pending": "{count, plural, one {# muevo elemento} other {# muevos elementos}}", + "loading_indicator.label": "Eskargando…", + "media_gallery.toggle_visible": "{number, plural, one {Eskonde imaje} other {Eskonde imajes}}", + "moved_to_account_banner.text": "Tu kuento {disabledAccount} esta aktualmente inkapasitado porke transferates a {movedToAccount}.", + "mute_modal.duration": "Durasyon", + "mute_modal.hide_notifications": "Eskonder avizos de este utilizador?", + "mute_modal.indefinite": "Indefinida", + "navigation_bar.about": "Sovre mozotros", + "navigation_bar.advanced_interface": "Avre en la enterfaz avanzada", + "navigation_bar.blocks": "Utilizadores blokados", + "navigation_bar.bookmarks": "Markadores", + "navigation_bar.community_timeline": "Linya de tiempo lokala", + "navigation_bar.compose": "Eskrivir mueva publikasyon", + "navigation_bar.direct": "Enmentaduras privadas", + "navigation_bar.discover": "Diskuvre", + "navigation_bar.domain_blocks": "Domenos blokados", + "navigation_bar.edit_profile": "Edita profil", + "navigation_bar.explore": "Eksplorar", + "navigation_bar.favourites": "Te plazen", + "navigation_bar.filters": "Biervos silensiados", + "navigation_bar.follow_requests": "Solisitudes de segimiento", + "navigation_bar.followed_tags": "Etiketas segidas", + "navigation_bar.follows_and_followers": "Segidos i suivantes", + "navigation_bar.lists": "Listas", + "navigation_bar.logout": "Salir", + "navigation_bar.mutes": "Utilizadores silensiados", + "navigation_bar.personal": "Personal", + "navigation_bar.pins": "Publikasyones fiksadas", + "navigation_bar.preferences": "Preferensyas", + "navigation_bar.public_timeline": "Linya de tiempo federada", + "navigation_bar.search": "Bushka", + "navigation_bar.security": "Segurita", + "not_signed_in_indicator.not_signed_in": "Nesesitas konektarse kon tu kuento para akseder este rekurso.", + "notification.admin.report": "{name} raporto {target}", + "notification.admin.sign_up": "{name} kriyo un konto", + "notification.favourite": "A {name} le plaze tu publikasyon", + "notification.follow": "{name} te ampeso a segir", + "notification.follow_request": "{name} tiene solisitado segirte", + "notification.mention": "{name} te enmento", + "notification.own_poll": "Tu anketa eskapo", + "notification.poll": "Anketa en ke votates eskapo", + "notification.reblog": "{name} repartajo tu publikasyon", + "notification.status": "{name} publiko algo", + "notification.update": "{name} edito una publikasyon", + "notifications.clear": "Efasar avizos", + "notifications.clear_confirmation": "Estas siguro ke keres permanentemente efasar todos tus avizos?", + "notifications.column_settings.admin.report": "Muveos raportos:", + "notifications.column_settings.admin.sign_up": "Muevas enrejistrasyones:", + "notifications.column_settings.alert": "Avizos de ensimameza", + "notifications.column_settings.favourite": "Te plazen:", + "notifications.column_settings.filter_bar.advanced": "Amostra todas las kategorias", + "notifications.column_settings.filter_bar.category": "Vara de filtrado rapido", + "notifications.column_settings.filter_bar.show_bar": "Amostra vara de filtros", + "notifications.column_settings.follow": "Muevos suivantes:", + "notifications.column_settings.follow_request": "Muevas solisitudes de segimiento:", + "notifications.column_settings.mention": "Enmentaduras:", + "notifications.column_settings.poll": "Rizultados de anketas:", + "notifications.column_settings.push": "Avizos arrepushados", + "notifications.column_settings.reblog": "Repartajasyones:", + "notifications.column_settings.show": "Amostra en kolumna", + "notifications.column_settings.sound": "Reproduzir son", + "notifications.column_settings.status": "Publikasyones muevas:", + "notifications.column_settings.unread_notifications.category": "Avizos no meldados", + "notifications.column_settings.unread_notifications.highlight": "Avaliar avizos no meldados", + "notifications.column_settings.update": "Edisyones:", + "notifications.filter.all": "Todos", + "notifications.filter.boosts": "Repartajasyones", + "notifications.filter.favourites": "Te plazen", + "notifications.filter.follows": "Segidos", + "notifications.filter.mentions": "Enmentaduras", + "notifications.filter.polls": "Rizultados de anketa", + "notifications.filter.statuses": "Aktualizasyones de personas a las kualas siges", + "notifications.grant_permission": "Da permiso.", + "notifications.group": "{count} avizos", + "notifications.mark_as_read": "Marka todos avizos komo meldados", + "notifications.permission_denied": "Avizos de ensimameza no estan desponivles porke ya se tiene refuzado el permiso", + "notifications.permission_denied_alert": "\"No se pueden kapasitar los avizos de ensimameza, porke ya se tiene refuzado el permiso de navigador", + "notifications.permission_required": "Avizos de ensimameza no estan desponivles porke los nesesarios permisos no tienen sido risividos.", + "notifications_permission_banner.enable": "Kapasitar avizos de ensimameza", + "notifications_permission_banner.how_to_control": "Para risivir avizos kuando Mastodon no esta avierto, kapasita avizos de ensimameza. Puedes kontrolar presizamente kualos tipos de enteraksiones djeneren avizos de ensimameza kon el boton {icon} arriva kuando esten kapasitadas.", + "notifications_permission_banner.title": "Nunka te piedres niente", + "onboarding.action.back": "Va atras", + "onboarding.actions.back": "Va atras", + "onboarding.compose.template": "Ke haber, #Mastodon?", + "onboarding.follows.title": "Personaliza tu linya prinsipala", + "onboarding.profile.display_name": "Nombre amostrado", + "onboarding.profile.display_name_hint": "Tu nombre para amostrar.", + "onboarding.profile.note": "Tu deskripsyon", + "onboarding.profile.save_and_continue": "Guadra i kontinua", + "onboarding.profile.title": "Konfigurasyon de profil", + "onboarding.profile.upload_avatar": "Karga imaje de profil", + "onboarding.profile.upload_header": "Karga kavesera de profil", + "onboarding.share.title": "Partaja tu profil", + "onboarding.start.skip": "No nesesitas ayudo para ampesar?", + "onboarding.steps.follow_people.title": "Personaliza tu linya prinsipala", + "onboarding.steps.publish_status.title": "Eskrive tu primera publikasyon", + "onboarding.steps.setup_profile.title": "Personaliza tu profil", + "onboarding.steps.share_profile.title": "Partaja tu profil de Mastodon", + "picture_in_picture.restore": "Restora", + "poll.closed": "Serrado", + "poll.refresh": "Arefreska", + "poll.reveal": "Mira los rezultados", + "poll.total_people": "{count, plural, one {# persona} other {# personas}}", + "poll.total_votes": "{count, plural, one {# voto} other {# votos}}", + "poll.vote": "Vota", + "poll.voted": "Votates por esta repuesta", + "poll.votes": "{votes, plural, one {# voto} other {# votos}}", + "poll_button.add_poll": "Adjusta anketa", + "poll_button.remove_poll": "Kita anketa", + "privacy.change": "Troka privasita de publikasyon", + "privacy.direct.long": "Vizivle solo para utilizadores enmentados", + "privacy.direct.short": "Solo personas enmentadas", + "privacy.private.long": "Vizivle solo para suivantes", + "privacy.private.short": "Solo suivantes", + "privacy.public.long": "Vizivle para todos", + "privacy.public.short": "Publiko", + "privacy.unlisted.long": "Vizivle para todos, ama eskluido de las fonksiones de diskuvrimyento", + "privacy.unlisted.short": "No listado", + "privacy_policy.last_updated": "Ultima aktualizasyon: {date}", + "privacy_policy.title": "Politika de privasita", + "recommended": "Rekomendado", + "refresh": "Arefreska", + "regeneration_indicator.label": "Eskargando…", + "regeneration_indicator.sublabel": "Tu linya de tiempo prinsipala esta preparando!", + "relative_time.days": "{number} d", + "relative_time.full.days": "antes {number, plural, one {# diya} other {# diyas}}", + "relative_time.full.hours": "antes {number, plural, one {# ora} other {# oras}}", + "relative_time.full.just_now": "agora", + "relative_time.full.minutes": "antes {number, plural, one {# minuto} other {# minutos}}", + "relative_time.full.seconds": "antes {number, plural, one {# sigundo} other {# sigundos}}", + "relative_time.hours": "{number} o", + "relative_time.just_now": "agora", + "relative_time.minutes": "{number} m", + "relative_time.seconds": "{number} s", + "relative_time.today": "oy", + "reply_indicator.cancel": "Anula", + "report.block": "Bloka", + "report.block_explanation": "No veras sus publikasyones. No podra ver tus publikasyones ni segirte. Podra saver ke le blokates.", + "report.categories.other": "Otros", + "report.categories.spam": "Spam", + "report.categories.violation": "El kontenido viola una o mas reglas del sirvidor", + "report.category.subtitle": "Eskoje la mijor koensidensya", + "report.category.title": "Deskrive el problem kon {type}", + "report.category.title_account": "profil", + "report.category.title_status": "publikasyon", + "report.close": "Fecho", + "report.comment.title": "Ay algo mas ke deveriamos saver?", + "report.forward": "Reembiar a {target}", + "report.forward_hint": "Este kuento es de otro sirvidor. Embiar una kopia anonimizada del raporto ayi tamyen?", + "report.mute": "Silensia", + "report.mute_explanation": "No veras sus publikasyones. Ainda pueden segirte i no va saver ke le silensiates.", + "report.next": "Sigiente", + "report.placeholder": "Otros komentos", + "report.reasons.dislike": "No me plaze", + "report.reasons.dislike_description": "\"No es algo ke kero ver", + "report.reasons.legal": "Es ilegal", + "report.reasons.other": "Es otra koza", + "report.reasons.other_description": "El problem no es de las otras kategorias", + "report.reasons.spam": "Es spam", + "report.reasons.spam_description": "Atadijos malisiozos, enteraksyones falsas o repuestas repetitivas", + "report.reasons.violation": "Viola las reglas del sirvidor", + "report.reasons.violation_description": "Saves ke viola reglas espesifikas", + "report.rules.subtitle": "Eskoje todas ke korespondan", + "report.rules.title": "Kualas reglas estan violadas?", + "report.statuses.subtitle": "Eskoje todas ke korespondan", + "report.statuses.title": "Ay alguna publikasyon ke suporta este raporto?", + "report.submit": "Embiar", + "report.target": "Raportando a {target}", + "report.thanks.take_action": "Aki estan tus opsyones para kontrolar lo ke ves en Mastodon:", + "report.thanks.take_action_actionable": "Mientres revizamos esto, puedes tomar aksyones kontra @{name}:", + "report.thanks.title": "No keres ver esto?", + "report.thanks.title_actionable": "Mersi por raportarlo, vamos revizarlo.", + "report.unfollow": "Desegir a @{name}", + "report.unfollow_explanation": "Estas sigiendo este kuento. Para no ver sus publikasyones en tu linya de tiempo, puedes deshar de segirlo.", + "report_notification.attached_statuses": "{count, plural, one {{count} publikasyon} other {{count} publikasyones}} atadas", + "report_notification.categories.other": "Otros", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Violasion de reglas", + "report_notification.open": "Avre raporto", + "search.no_recent_searches": "No ay bushkedas resientes", + "search.placeholder": "Bushka", + "search.quick_action.account_search": "Profiles ke koresponden kon {x}", + "search.quick_action.go_to_account": "Va al profil {x}", + "search.quick_action.go_to_hashtag": "Va a la etiketa {x}", + "search.quick_action.open_url": "Avre URL en Mastodon", + "search.quick_action.status_search": "Publikasyones ke koresponden kon {x}", + "search.search_or_paste": "Bushka o apega URL", + "search_popout.full_text_search_disabled_message": "No desponivle en {domain}.", + "search_popout.full_text_search_logged_out_message": "Solo desponivle kuando estas konektado kon tu kuento.", + "search_popout.language_code": "kodiche ISO de lingua", + "search_popout.options": "Opsyones de bushkeda", + "search_popout.quick_actions": "Aksiones rapidas", + "search_popout.recent": "Bushkedas resientes", + "search_popout.user": "utilizador", + "search_results.accounts": "Profiles", + "search_results.all": "Todos", + "search_results.hashtags": "Etiketas", + "search_results.nothing_found": "No se pudo topar niente para estos terminos de bushkeda", + "search_results.see_all": "Ve todo", + "search_results.statuses": "Publikasyones", + "search_results.title": "Bushka por {q}", + "server_banner.about_active_users": "Utilizadores aktivos en este sirvidor durante los ultimos 30 diyas (utilizadores aktivos mensuales)", + "server_banner.active_users": "utilizadores aktivos", + "server_banner.administered_by": "Administrado por:", + "server_banner.introduction": "{domain} es parte de la red sosyala desentralizada liderada por {mastodon}.", + "server_banner.learn_more": "Ambezate mas", + "server_banner.server_stats": "Estatistikas del sirvidor:", + "sign_in_banner.create_account": "Kriya kuento", + "sign_in_banner.sign_in": "Konektate", + "sign_in_banner.sso_redirect": "Konektate o enrejistrate", + "status.admin_account": "Avre la enterfaz de moderasyon para @{name}", + "status.admin_domain": "Avre la enterfaz de moderasyon para @{domain}", + "status.admin_status": "Avre esto en la enterfaz de moderasyon", + "status.block": "Bloka a @{name}", + "status.bookmark": "Marka", + "status.cancel_reblog_private": "No repartaja", + "status.cannot_reblog": "Esta publikasyon no se puede repartajar", + "status.copy": "Kopia atadijo de publikasyon", + "status.delete": "Efasa", + "status.direct": "Enmenta a @{name} en privado", + "status.direct_indicator": "Enmentadura privada", + "status.edit": "Edita", + "status.edited": "Editado {date}", + "status.embed": "Inkrusta", + "status.favourite": "Te plaze", + "status.filter": "Filtra esta publikasyon", + "status.filtered": "Filtrado", + "status.hide": "Eskonde publikasyon", + "status.history.created": "{name} kriyo {date}", + "status.history.edited": "{name} edito {date}", + "status.load_more": "Eskarga mas", + "status.media.open": "Klika para avrir", + "status.media.show": "Klika para amostrar", + "status.media_hidden": "Multimedia eskondidos", + "status.mention": "Enmenta a @{name}", + "status.more": "Mas", + "status.mute": "Silensia a @{name}", + "status.mute_conversation": "Silensia konversasyon", + "status.open": "Espande publikasyon", + "status.pin": "Fiksa en profil", + "status.pinned": "Publikasyon fiksada", + "status.read_more": "Melda mas", + "status.reblog": "Repartaja", + "status.reblog_private": "Repartaja kon vizibilita orijinala", + "status.reblogged_by": "{name} repartajo", + "status.reblogs.empty": "Ainda nadie tiene repartajado esta publikasyon. Kuando algien lo aga, se amostrara aki.", + "status.redraft": "Efasa i eskrive de muevo", + "status.remove_bookmark": "Kita markador", + "status.replied_to": "Arispondio a {name}", + "status.reply": "Arisponde", + "status.replyAll": "Arisponde al filo", + "status.report": "Raporta @{name}", + "status.sensitive_warning": "Kontenido sensivle", + "status.share": "Partaja", + "status.show_filter_reason": "Amostra entanto", + "status.show_less": "Amostra manko", + "status.show_less_all": "Amostra manko para todo", + "status.show_more": "Amostra mas", + "status.show_more_all": "Amostra mas para todo", + "status.show_original": "Amostra orijinal", + "status.translate": "Trezlada", + "status.translated_from_with": "Trezladado dizde {lang} kon {provider}", + "status.uncached_media_warning": "Vista previa no desponivle", + "status.unmute_conversation": "Desilensiar konversasyon", + "status.unpin": "Defiksar del profil", + "subscribed_languages.lead": "Solo publikasyones en linguas eskojidas se amostraran en tus linya de tiempo prinsipala i listas dempues del trokamiento. Eskoje dinguna para risivir publikasyones en todas las linguas.", + "subscribed_languages.save": "Guadra trokamientos", + "subscribed_languages.target": "Troka linguas abonadas para {target}", + "tabs_bar.home": "Linya prinsipala", + "tabs_bar.notifications": "Avizos", + "time_remaining.days": "{number, plural, one {# diya restante} other {# diyas restantes}}", + "time_remaining.hours": "{number, plural, one {# ora restante} other {# oras restantes}}", + "time_remaining.minutes": "{number, plural, one {# minuto restante} other {# minutos restantes}}", + "time_remaining.moments": "Momentos restantes", + "time_remaining.seconds": "{number, plural, one {# sigundo restante} other {# sigundos restantes}}", + "timeline_hint.remote_resource_not_displayed": "{resource} de otros sirvidores no se amostran.", + "timeline_hint.resources.followers": "Suivantes", + "timeline_hint.resources.follows": "Segidos", + "timeline_hint.resources.statuses": "Publikasyones mas viejas", + "trends.counter_by_accounts": "{count, plural, one {{counter} kuento} other {{counter} kuentos}} en los ultimos {days, plural, one {diyas} other {{days} diyas}}", + "trends.trending_now": "Trendes", + "ui.beforeunload": "La publikasyon ke estas eskriviendo se pedrera si sales de Mastodon.", + "units.short.billion": "{count} MM", + "units.short.million": "{count} M", + "units.short.thousand": "{count} K", + "upload_area.title": "Arastra i mete para kargar", + "upload_button.label": "Adjusta imajes, un video or una dosya audio", + "upload_error.limit": "Limito de dosyas kargadas eksedido.", + "upload_error.poll": "No se permite kargar dosyas kon anketas.", + "upload_form.audio_description": "Deskrive para personas sodras o kon problemes auditivos", + "upload_form.description": "Deskrive para personas siegas o kon problemes vizuales", + "upload_form.description_missing": "No adjustates deskripsion", + "upload_form.edit": "Edita", + "upload_form.thumbnail": "Troka minyatura", + "upload_form.undo": "Efasa", + "upload_form.video_description": "Deskrive para personas sodras, kon problemes auditivos, siegas o kon problemes vizuales", + "upload_modal.analyzing_picture": "Analizando imaje…", + "upload_modal.apply": "Aplika", + "upload_modal.applying": "Aplikando…", + "upload_modal.choose_image": "Eskoje imaje", + "upload_modal.description_placeholder": "Lorem ipsum dolor sit amet", + "upload_modal.detect_text": "Detektar teksto de la imaje", + "upload_modal.edit_media": "Edita multimedia", + "upload_modal.hint": "Klika o arrastra el sirkolo en la vista previa para eskojer el punto fokal ke siempre estara en vista en todas las minyaturas.", + "upload_modal.preparing_ocr": "Preparando OCR…", + "upload_modal.preview_label": "Vista previa ({ratio})", + "upload_progress.label": "Kargando...", + "upload_progress.processing": "Prosesando…", + "video.close": "Serra video", + "video.download": "Abasha dosya", + "video.exit_fullscreen": "Sal de ekran kompleto", + "video.expand": "Espande video", + "video.fullscreen": "Ekran kompleto", + "video.hide": "Eskonde video", + "video.mute": "Silensia son", + "video.pause": "Pauza", + "video.play": "Reproduze", + "video.unmute": "Desilensia son" +} diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index 7faf279719dee5..708d8c3e98196f 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -1,25 +1,39 @@ { "about.contact": "ਸੰਪਰਕ:", + "about.domain_blocks.silenced.title": "ਸੀਮਿਤ", "about.domain_blocks.suspended.title": "ਮੁਅੱਤਲ ਕੀਤੀ", + "about.rules": "ਸਰਵਰ ਨਿਯਮ", "account.account_note_header": "ਨੋਟ", - "account.badges.bot": "Bot", + "account.add_or_remove_from_list": "ਸੂਚੀ ਵਿੱਚ ਜੋੜੋ ਜਾਂ ਹਟਾਓ", + "account.badges.bot": "ਆਟੋਮੇਟ ਕੀਤਾ", "account.badges.group": "ਗਰੁੱਪ", + "account.block": "@{name} ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ", + "account.block_domain": "{domain} ਡੋਮੇਨ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ", + "account.block_short": "ਪਾਬੰਦੀ", "account.blocked": "ਪਾਬੰਦੀਸ਼ੁਦਾ", - "account.cancel_follow_request": "Withdraw follow request", - "account.follow": "ਪ੍ਰਸ਼ੰਸਕ ਬਣੋ", - "account.followers": "ਪ੍ਰਸ਼ੰਸਕ", - "account.following": "ਪ੍ਰਸ਼ੰਸਕ ਹਾਂ", + "account.cancel_follow_request": "ਫ਼ਾਲੋ ਕਰਨ ਨੂੰ ਰੱਦ ਕਰੋ", + "account.edit_profile": "ਪਰੋਫਾਈਲ ਨੂੰ ਸੋਧੋ", + "account.follow": "ਫ਼ਾਲੋ", + "account.followers": "ਫ਼ਾਲੋਅਰ", + "account.followers.empty": "ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਹਾਲੇ ਕੋਈ ਫ਼ਾਲੋ ਨਹੀਂ ਕਰਦਾ ਹੈ।", + "account.following": "ਫ਼ਾਲੋ ਕੀਤਾ", + "account.follows.empty": "ਇਹ ਵਰਤੋਂਕਾਰ ਹਾਲੇ ਕਿਸੇ ਨੂੰ ਫ਼ਾਲੋ ਨਹੀਂ ਕਰਦਾ ਹੈ।", + "account.follows_you": "ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕਰੋ", "account.media": "ਮੀਡੀਆ", "account.muted": "ਮੌਨ ਕੀਤੀਆਂ", - "account.posts": "Toots", - "account.posts_with_replies": "Toots and replies", - "account.requested": "Awaiting approval", + "account.posts": "ਪੋਸਟਾਂ", + "account.posts_with_replies": "ਪੋਸਤਾਂ ਅਤੇ ਜਵਾਬ", + "account.requested": "ਮਨਜ਼ੂਰੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ। ਫ਼ਾਲੋ ਬੇਨਤੀਆਂ ਨੂੰ ਰੱਦ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ", + "account.requested_follow": "{name} ਨੇ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ", "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", + "account.unblock": "@{name} ਤੋਂ ਪਾਬੰਦੀ ਹਟਾਓ", + "account.unblock_domain": "{domain} ਡੋਮੇਨ ਤੋਂ ਪਾਬੰਦੀ ਹਟਾਓ", "account.unblock_short": "ਪਾਬੰਦੀ ਹਟਾਓ", - "account.unfollow": "ਪ੍ਰਸ਼ੰਸਕੀ ਰੱਦ ਕਰੋ", + "account.unfollow": "ਅਣ-ਫ਼ਾਲੋ", "account.unmute_short": "ਮੌਨ-ਰਹਿਤ ਕਰੋ", "account_note.placeholder": "Click to add a note", "admin.dashboard.retention.average": "ਔਸਤ", + "admin.dashboard.retention.cohort_size": "ਨਵੇਂ ਵਰਤੋਂਕਾਰ", "alert.unexpected.title": "ਓਹੋ!", "announcement.announcement": "ਹੋਕਾ", "bundle_column_error.network.title": "ਨੈੱਟਵਰਕ ਦੀ ਸਮੱਸਿਆ", @@ -27,35 +41,50 @@ "bundle_modal_error.close": "ਬੰਦ ਕਰੋ", "bundle_modal_error.retry": "ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ", "column.about": "ਸਾਡੇ ਬਾਰੇ", + "column.blocks": "ਪਾਬੰਦੀ ਲਾਏ ਵਰਤੋਂਕਾਰ", "column.bookmarks": "ਬੁੱਕਮਾਰਕ", - "column.home": "ਮੁੱਖ ਪੰਨਾ", + "column.community": "ਲੋਕਲ ਸਮਾਂ-ਲਾਈਨ", + "column.direct": "ਨਿੱਜੀ ਜ਼ਿਕਰ", + "column.favourites": "ਮਨਪਸੰਦ", + "column.follow_requests": "ਫ਼ਾਲੋ ਦੀਆਂ ਬੇਨਤੀਆਂ", + "column.home": "ਮੁੱਖ ਸਫ਼ਾ", "column.lists": "ਸੂਚੀਆਂ", "column.notifications": "ਸੂਚਨਾਵਾਂ", - "column.pins": "Pinned toot", + "column.pins": "ਟੰਗੀਆਂ ਪੋਸਟਾਂ", "column_back_button.label": "ਪਿੱਛੇ", + "column_header.pin": "ਟੰਗੋ", + "column_header.show_settings": "ਸੈਟਿੰਗਾਂ ਦਿਖਾਓ", + "column_header.unpin": "ਲਾਹੋ", "column_subheading.settings": "ਸੈਟਿੰਗਾਂ", - "community.column_settings.media_only": "Media only", + "community.column_settings.local_only": "ਸਿਰਫ ਲੋਕਲ ਹੀ", + "community.column_settings.media_only": "ਸਿਰਫ ਮੀਡੀਆ ਹੀ", + "community.column_settings.remote_only": "ਸਿਰਫ਼ ਰਿਮੋਟ ਹੀ", + "compose.language.change": "ਭਾਸ਼ਾ ਬਦਲੋ", + "compose.language.search": "ਭਾਸ਼ਾਵਾਂ ਦੀ ਖੋਜ...", + "compose.published.open": "ਖੋਲ੍ਹੋ", + "compose.saved.body": "ਪੋਸਟ ਸੰਭਾਲੀ ਗਈ।", "compose_form.direct_message_warning_learn_more": "ਹੋਰ ਜਾਣੋ", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", + "compose_form.lock_disclaimer.lock": "ਲਾਕ ਹੈ", "compose_form.placeholder": "What is on your mind?", "compose_form.publish": "ਪ੍ਰਕਾਸ਼ਨ ਕਰੋ", "compose_form.publish_form": "Publish", "compose_form.save_changes": "ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ", - "compose_form.spoiler.marked": "Text is hidden behind warning", - "compose_form.spoiler.unmarked": "Text is not hidden", + "compose_form.spoiler.marked": "ਸਮੱਗਰੀ ਚੇਤਾਵਨੀ ਨੂੰ ਹਟਾਓ", + "compose_form.spoiler.unmarked": "ਸਮੱਗਰੀ ਬਾਰੇ ਚੇਤਾਵਨੀ ਜੋੜੋ", "confirmation_modal.cancel": "ਰੱਦ ਕਰੋ", - "confirmations.block.confirm": "ਬਲਾਕ", - "confirmations.delete.confirm": "ਮਿਟਾਓ", - "confirmations.delete.message": "Are you sure you want to delete this status?", - "confirmations.delete_list.confirm": "ਮਿਟਾਓ", + "confirmations.block.confirm": "ਪਾਬੰਦੀ", + "confirmations.delete.confirm": "ਹਟਾਓ", + "confirmations.delete.message": "ਕੀ ਤੁਸੀਂ ਇਹ ਪੋਸਟ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?", + "confirmations.delete_list.confirm": "ਹਟਾਓ", "confirmations.discard_edit_media.confirm": "ਰੱਦ ਕਰੋ", - "confirmations.domain_block.confirm": "Hide entire domain", + "confirmations.domain_block.confirm": "ਪੂਰੀ ਡੋਮੇਨ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ", "confirmations.edit.confirm": "ਸੋਧ", "confirmations.logout.confirm": "ਬਾਹਰ ਹੋਵੋ", "confirmations.mute.confirm": "ਮੌਨ ਕਰੋ", "confirmations.reply.confirm": "ਜਵਾਬ ਦੇਵੋ", - "confirmations.unfollow.confirm": "ਪ੍ਰਸ਼ੰਸਕੀ ਰੱਦ ਕਰੋ", + "confirmations.unfollow.confirm": "ਅਣ-ਫ਼ਾਲੋ", "copypaste.copied": "ਕਾਪੀ ਕੀਤਾ", "copypaste.copy_to_clipboard": "ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰੋ", "disabled_account_banner.account_settings": "ਖਾਤੇ ਦੀਆਂ ਸੈਟਿੰਗਾਂ", @@ -63,165 +92,252 @@ "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", "embed.instructions": "Embed this status on your website by copying the code below.", - "emoji_button.activity": "ਗਤੀਵਿਧੀਆਂ", - "emoji_button.clear": "ਸਾਫ਼ ਕਰੋ", + "emoji_button.activity": "ਗਤੀਵਿਧੀ", + "emoji_button.clear": "ਮਿਟਾਓ", "emoji_button.custom": "ਕਸਟਮ", "emoji_button.flags": "ਝੰਡੀਆਂ", "emoji_button.food": "ਖਾਣਾ-ਪੀਣਾ", "emoji_button.nature": "ਕੁਦਰਤ", "emoji_button.objects": "ਇਕਾਈ", "emoji_button.people": "ਲੋਕ", - "empty_column.account_timeline": "No toots here!", + "emoji_button.search": "ਖੋਜ ਕਰੋ...", + "emoji_button.search_results": "ਖੋਜ ਨਤੀਜੇ", + "emoji_button.symbols": "ਚਿੰਨ੍ਹ", + "emoji_button.travel": "ਸੈਰ ਸਪਾਟਾ ਤੇ ਥਾਵਾਂ", + "empty_column.account_timeline": "ਇੱਥੇ ਕੋਈ ਪੋਸਟ ਨਹੀਂ ਹੈ!", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", - "empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}", + "empty_column.home": "ਤੁਹਾਡੀ ਟਾਈਮ-ਲਾਈਨ ਖਾਲੀ ਹੈ! ਇਸ ਨੂੰ ਭਰਨ ਲਈ ਹੋਰ ਲੋਕਾਂ ਨੂੰ ਫ਼ਾਲੋ ਕਰੋ।", "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", "errors.unexpected_crash.report_issue": "ਮੁੱਦੇ ਦੀ ਰਿਪੋਰਟ ਕਰੋ", "explore.suggested_follows": "ਲੋਕ", "explore.title": "ਪੜਚੋਲ ਕਰੋ", "explore.trending_links": "ਖ਼ਬਰਾਂ", - "explore.trending_statuses": "ਸੰਪਾਦਨਾਵਾਂ", - "follow_request.reject": "ਅਸਵੀਕਾਰ ਕਰੋ", + "explore.trending_statuses": "ਪੋਸਟਾਂ", + "explore.trending_tags": "ਹੈਸ਼ਟੈਗ", + "filter_modal.added.settings_link": "ਸੈਟਿੰਗਾਂ ਸਫ਼ਾ", + "firehose.all": "ਸਭ", + "firehose.local": "ਇਹ ਸਰਵਰ", + "firehose.remote": "ਹੋਰ ਸਰਵਰ", + "follow_request.reject": "ਰੱਦ ਕਰੋ", "footer.about": "ਸਾਡੇ ਬਾਰੇ", + "footer.get_app": "ਐਪ ਲਵੋ", + "footer.invite": "ਲੋਕਾਂ ਨੂੰ ਸੱਦਾ ਭੇਜੋ", "footer.keyboard_shortcuts": "ਕੀਬੋਰਡ ਸ਼ਾਰਟਕੱਟ", + "footer.privacy_policy": "ਪਰਦੇਦਾਰੀ ਨੀਤੀ", + "footer.source_code": "ਸਰੋਤ ਕੋਡ ਵੇਖੋ", "footer.status": "ਹਾਲਤ", "generic.saved": "ਸਾਂਭੀ ਗਈ", + "getting_started.heading": "ਸ਼ੁਰੂ ਕਰੀਏ", + "hashtag.column_header.tag_mode.all": "ਅਤੇ {additional}", + "hashtag.column_header.tag_mode.any": "ਜਾਂ {additional}", + "hashtag.column_header.tag_mode.none": "{additional} ਬਿਨਾਂ", + "hashtag.column_settings.tag_mode.any": "ਇਹਨਾਂ ਵਿੱਚੋਂ ਕੋਈ", + "hashtag.column_settings.tag_mode.none": "ਇਹਨਾਂ ਵਿੱਚੋਂ ਕੋਈ ਨਹੀਂ", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "hashtag.follow": "ਹੈਸ਼ਟੈਗ ਨੂੰ ਫ਼ਾਲੋ ਕਰੋ", + "hashtag.unfollow": "ਹੈਸ਼ਟੈਗ ਨੂੰ ਅਣ-ਫ਼ਾਲੋ ਕਰੋ", "home.column_settings.basic": "ਆਮ", - "keyboard_shortcuts.back": "to navigate back", - "keyboard_shortcuts.blocked": "to open blocked users list", - "keyboard_shortcuts.boost": "to boost", - "keyboard_shortcuts.column": "to focus a status in one of the columns", + "interaction_modal.title.follow": "{name} ਨੂੰ ਫ਼ਾਲੋ ਕਰੋ", + "keyboard_shortcuts.back": "ਪਿੱਛੇ ਜਾਓ", + "keyboard_shortcuts.blocked": "ਪਾਬੰਦੀ ਲਾਏ ਵਰਤੋਂਕਾਰਾਂ ਦੀ ਸੂਚੀ ਖੋਲ੍ਹੋ", + "keyboard_shortcuts.boost": "ਪੋਸਟ ਨੂੰ ਬੂਸਟ ਕਰੋ", + "keyboard_shortcuts.column": "ਫੋਕਸ ਕਾਲਮ", "keyboard_shortcuts.compose": "to focus the compose textarea", "keyboard_shortcuts.description": "ਵਰਣਨ", "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.federated": "to open federated timeline", - "keyboard_shortcuts.heading": "Keyboard Shortcuts", + "keyboard_shortcuts.heading": "ਕੀਬੋਰਡ ਸ਼ਾਰਟਕੱਟ", "keyboard_shortcuts.home": "to open home timeline", "keyboard_shortcuts.legend": "to display this legend", "keyboard_shortcuts.local": "to open local timeline", "keyboard_shortcuts.mention": "to mention author", "keyboard_shortcuts.muted": "to open muted users list", "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", + "keyboard_shortcuts.notifications": "ਨੋਟੀਫਿਕੇਸ਼ਨ ਕਾਲਮ ਖੋਲ੍ਹੋ", "keyboard_shortcuts.open_media": "to open media", "keyboard_shortcuts.pinned": "to open pinned toots list", - "keyboard_shortcuts.profile": "to open author's profile", - "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.profile": "ਲੇਖਕ ਦਾ ਪਰੋਫਾਈਲ ਖੋਲ੍ਹੋ", + "keyboard_shortcuts.reply": "ਪੋਸਟ ਨੂੰ ਜਵਾਬ ਦਿਓ", "keyboard_shortcuts.requests": "to open follow requests list", "keyboard_shortcuts.search": "to focus search", "keyboard_shortcuts.spoilers": "to show/hide CW field", "keyboard_shortcuts.start": "to open \"get started\" column", "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", - "keyboard_shortcuts.toggle_sensitivity": "to show/hide media", - "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.toggle_sensitivity": "ਮੀਡੀਆ ਦਿਖਾਉਣ/ਲੁਕਾਉਣ ਲਈ", + "keyboard_shortcuts.toot": "ਨਵੀਂ ਪੋਸਟ ਸ਼ੁਰੂ ਕਰੋ", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "to move up in the list", "lightbox.close": "ਬੰਦ ਕਰੋ", "lightbox.next": "ਅਗਲੀ", "lightbox.previous": "ਪਿਛਲੀ", - "lists.delete": "ਸੂਚੀ ਮਿਟਾਓ", + "link_preview.author": "{name} ਵਲੋਂ", + "lists.account.add": "ਸੂਚੀ ਵਿੱਚ ਜੋੜੋ", + "lists.account.remove": "ਸੂਚੀ ਵਿਚੋਂ ਹਟਾਓ", + "lists.delete": "ਸੂਚੀ ਹਟਾਓ", + "lists.replies_policy.followed": "ਕੋਈ ਵੀ ਫ਼ਾਲੋ ਕੀਤਾ ਵਰਤੋਂਕਾਰ", + "lists.replies_policy.none": "ਕੋਈ ਨਹੀਂ", + "loading_indicator.label": "ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ…", "mute_modal.duration": "ਮਿਆਦ", - "navigation_bar.about": "ਸਾਡੇ ਬਾਰੇ", + "navigation_bar.about": "ਇਸ ਬਾਰੇ", + "navigation_bar.advanced_interface": "ਤਕਨੀਕੀ ਵੈੱਬ ਇੰਟਰਫੇਸ ਵਿੱਚ ਖੋਲ੍ਹੋ", + "navigation_bar.blocks": "ਪਾਬੰਦੀ ਲਾਏ ਵਰਤੋਂਕਾਰ", "navigation_bar.bookmarks": "ਬੁੱਕਮਾਰਕ", - "navigation_bar.compose": "Compose new toot", + "navigation_bar.community_timeline": "ਲੋਕਲ ਸਮਾਂ-ਲਾਈਨ", + "navigation_bar.compose": "ਨਵੀਂ ਪੋਸਟ ਲਿਖੋ", + "navigation_bar.direct": "ਨਿੱਜੀ ਜ਼ਿਕਰ", "navigation_bar.discover": "ਖੋਜ", - "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.domain_blocks": "ਪਾਬੰਦੀ ਲਾਏ ਡੋਮੇਨ", + "navigation_bar.edit_profile": "ਪਰੋਫਾਈਲ ਨੂੰ ਸੋਧੋ", "navigation_bar.explore": "ਪੜਚੋਲ ਕਰੋ", + "navigation_bar.favourites": "ਮਨਪਸੰਦ", + "navigation_bar.follow_requests": "ਫ਼ਾਲੋ ਦੀਆਂ ਬੇਨਤੀਆਂ", + "navigation_bar.followed_tags": "ਫ਼ਾਲੋ ਕੀਤੇ ਹੈਸ਼ਟੈਗ", + "navigation_bar.follows_and_followers": "ਫ਼ਾਲੋ ਅਤੇ ਫ਼ਾਲੋ ਕਰਨ ਵਾਲੇ", "navigation_bar.lists": "ਸੂਚੀਆਂ", - "navigation_bar.logout": "ਲਾੱਗ ਆਊਟ, ਬਾਹਰ ਆਉਣਾ", + "navigation_bar.logout": "ਲਾਗ ਆਉਟ", "navigation_bar.personal": "ਨਿੱਜੀ", - "navigation_bar.pins": "Pinned toots", - "navigation_bar.preferences": "ਤਰਜੀਹਾਂ", + "navigation_bar.pins": "ਟੰਗੀਆਂ ਪੋਸਟਾਂ", + "navigation_bar.preferences": "ਪਸੰਦਾਂ", "navigation_bar.search": "ਖੋਜੋ", "navigation_bar.security": "ਸੁਰੱਖਿਆ", - "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", + "not_signed_in_indicator.not_signed_in": "ਇਹ ਸਰੋਤ ਵਰਤਣ ਲਈ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।", + "notification.follow": "{name} ਨੇ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕੀਤਾ", + "notification.follow_request": "{name} ਨੇ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ", "notification.reblog": "{name} boosted your status", - "notifications.column_settings.status": "New toots:", + "notifications.column_settings.follow": "ਨਵੇਂ ਫ਼ਾਲੋਅਰ:", + "notifications.column_settings.follow_request": "ਨਵੀਆਂ ਫ਼ਾਲੋ ਬੇਨਤੀਆਂ:", + "notifications.column_settings.status": "ਨਵੀਆਂ ਪੋਸਟਾਂ:", + "notifications.column_settings.update": "ਸੋਧ:", "notifications.filter.all": "ਸਭ", - "notifications.filter.follows": "ਪ੍ਰਸ਼ੰਸਕ ਬਣਨ 'ਤੇ", - "onboarding.actions.go_to_explore": "See what's trending", - "onboarding.actions.go_to_home": "Go to your home feed", - "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", - "onboarding.follows.title": "Popular on Mastodon", + "notifications.filter.boosts": "ਬੂਸਟ", + "notifications.filter.favourites": "ਮਨਪਸੰਦ", + "notifications.filter.follows": "ਫ਼ਾਲੋ", + "notifications.filter.mentions": "ਜ਼ਿਕਰ", + "onboarding.actions.go_to_explore": "ਮੈਨੂੰ ਰੁਝਾਨ ਵੇਖਾਓ", + "onboarding.actions.go_to_home": "ਮੇਰੀ ਮੁੱਖ ਫੀਡ ਉੱਤੇ ਲੈ ਜਾਓ", + "onboarding.follows.lead": "", + "onboarding.follows.title": "ਆਪਣੀ ਹੋਮ ਫੀਡ ਨੂੰ ਨਿੱਜੀ ਬਣਾਓ", + "onboarding.profile.note": "ਜਾਣਕਾਰੀ", + "onboarding.profile.save_and_continue": "ਸੰਭਾਲੋ ਅਤੇ ਜਾਰੀ ਰੱਖੋ", + "onboarding.profile.title": "ਪਰੋਫਾਈਲ ਸੈਟਅੱਪ", + "onboarding.profile.upload_avatar": "ਪਰੋਫਾਈਲ ਤਸਵੀਰ ਅੱਪਲੋਡ ਕਰੋ", + "onboarding.share.title": "ਆਪਣਾ ਪਰੋਫਾਈਲ ਸਾਂਝਾ ਕਰੋ", "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", - "onboarding.start.skip": "Want to skip right ahead?", - "onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", - "onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}", + "onboarding.start.skip": "ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਮਦਦ ਨਹੀਂ ਚਾਹੀਦੀ ਹੈ?", + "onboarding.start.title": "ਤੁਸੀਂ ਪੂਰਾ ਕਰਨ ਲਿਆ!", + "onboarding.steps.follow_people.body": "ਦਿਲਚਸਪ ਲੋਕਾਂ ਨੂੰ ਫ਼ਾਲੋ ਕਰੋ, ਇਹ ਤਾਂ ਮਸਟਾਡੋਨ ਹੈ।", + "onboarding.steps.follow_people.title": "ਆਪਣੀ ਹੋਮ ਫੀਡ ਨੂੰ ਨਿੱਜੀ ਬਣਾਓ", "onboarding.steps.publish_status.body": "Say hello to the world.", + "onboarding.steps.publish_status.title": "ਆਪਣੀ ਪਹਿਲੀ ਪੋਸਟ ਕਰੋ", "onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.", - "onboarding.steps.setup_profile.title": "Customize your profile", - "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", - "onboarding.steps.share_profile.title": "Share your profile", - "poll.closed": "ਬੰਦ ਹੋਇਆ", + "onboarding.steps.setup_profile.title": "ਆਪਣੇ ਪਰੋਫਾਈਲ ਨੂੰ ਆਪਣਾ ਬਣਾਓ", + "onboarding.steps.share_profile.body": "ਆਪਣੇ ਮਿੱਤਰਾਂ ਨੂੰ ਦੱਸੋ ਤੁਹਾਨੂੰ ਮਸਟਾਡੋਨ ਕਿਵੇਂ ਲੱਗਿਆ", + "onboarding.steps.share_profile.title": "ਆਪਣੇ ਮਸਟਾਡੋਨ ਪਰੋਫਾਈਲ ਨੂੰ ਸਾਂਝਾ ਕਰੋ", + "poll.closed": "ਬੰਦ ਹੈ", "poll.refresh": "ਤਾਜ਼ਾ ਕਰੋ", "poll.vote": "ਵੋਟ ਪਾਓ", - "privacy.change": "Adjust status privacy", - "privacy.direct.short": "Direct", - "privacy.private.short": "Followers-only", + "privacy.change": "ਪੋਸਟ ਦੀ ਪਰਦੇਦਾਰੀ ਨੂੰ ਬਦਲੋ", + "privacy.direct.short": "ਸਿੱਧਾ ਲੋਕਾਂ ਦਾ ਜ਼ਿਕਰ ਕਰੋ", + "privacy.private.short": "ਸਿਰਫ਼ ਫ਼ਾਲੋਅਰ", "privacy.public.short": "ਜਨਤਕ", "privacy_policy.title": "ਪਰਦੇਦਾਰੀ ਨੀਤੀ", "refresh": "ਤਾਜ਼ਾ ਕਰੋ", "regeneration_indicator.label": "ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ...", "relative_time.full.just_now": "ਹੁਣੇ ਹੀ", + "relative_time.just_now": "ਹੁਣੇ", + "relative_time.minutes": "{number}ਮਿੰ", + "relative_time.seconds": "{number}ਸ", "relative_time.today": "ਅੱਜ", "reply_indicator.cancel": "ਰੱਦ ਕਰੋ", "report.block": "ਬਲਾਕ", + "report.categories.legal": "ਕਨੂੰਨੀ", "report.categories.other": "ਬਾਕੀ", - "report.categories.spam": "ਸਪਾਮ", - "report.category.title_status": "ਸੰਪਾਦਨਾ", + "report.categories.spam": "ਸਪੈਮ", + "report.category.title_account": "ਪਰੋਫਾਈਲ", + "report.category.title_status": "ਪੋਸਟ", "report.close": "ਮੁਕੰਮਲ", "report.mute": "ਮੌਨ ਕਰੋ", "report.next": "ਅਗਲੀ", - "report.placeholder": "Type or paste additional comments", - "report.submit": "Submit report", - "report.target": "Report {target}", + "report.placeholder": "ਵਧੀਕ ਟਿੱਪਣੀਆਂ", + "report.reasons.dislike": "ਮੈਨੂੰ ਇਹ ਪਸੰਦ ਨਹੀਂ ਹੈ", + "report.reasons.spam": "ਇਹ ਸਪੈਮ ਹੈ", + "report.submit": "ਭੇਜੋ", + "report.target": "{target} ਰਿਪੋਰਟ", + "report.unfollow": "@{name} ਨੂੰ ਅਣ-ਫ਼ਾਲੋ ਕਰੋ", "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", "report_notification.categories.other": "ਬਾਕੀ", - "report_notification.categories.spam": "ਸਪਾਮ", + "report_notification.categories.spam": "ਸਪੈਮ", + "report_notification.categories.violation": "ਨਿਯਮ ਦੀ ਉਲੰਘਣਾ", "search.placeholder": "ਖੋਜੋ", + "search_popout.quick_actions": "ਫੌਰੀ ਕਾਰਵਾਈਆਂ", + "search_popout.specific_date": "ਖਾਸ ਤਾਰੀਖ", + "search_popout.user": "ਵਰਤੋਂਕਾਰ", + "search_results.accounts": "ਪਰੋਫਾਈਲ", "search_results.all": "ਸਭ", - "search_results.statuses": "Toots", + "search_results.hashtags": "ਹੈਸ਼ਟੈਗ", + "search_results.statuses": "ਪੋਸਟਾਂ", "server_banner.learn_more": "ਹੋਰ ਜਾਣੋ", "sign_in_banner.create_account": "ਖਾਤਾ ਬਣਾਓ", - "sign_in_banner.sign_in": "Sign in", - "status.admin_status": "Open this status in the moderation interface", - "status.copy": "Copy link to status", - "status.delete": "ਮਿਟਾਓ", + "sign_in_banner.sign_in": "ਲਾਗਇਨ", + "status.admin_status": "", + "status.block": "@{name} ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ", + "status.bookmark": "ਬੁੱਕਮਾਰਕ", + "status.copy": "ਪੋਸਟ ਲਈ ਲਿੰਕ ਕਾਪੀ ਕਰੋ", + "status.delete": "ਹਟਾਓ", "status.edit": "ਸੋਧ", + "status.edited": "{date} ਨੂੰ ਸੋਧਿਆ", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", "status.embed": "ਮੜ੍ਹੋ", + "status.favourite": "ਪਸੰਦ", + "status.history.created": "{name} ਨੇ {date} ਨੂੰ ਬਣਾਇਆ", + "status.history.edited": "{name} ਨੇ {date} ਨੂੰ ਸੋਧਿਆ", "status.load_more": "ਹੋਰ ਦਿਖਾਓ", + "status.media.open": "ਖੋਲ੍ਹਣ ਲਈ ਕਲਿੱਕ ਕਰੋ", + "status.media.show": "ਵੇਖਾਉਣ ਲਈ ਕਲਿੱਕ ਕਰੋ", + "status.mention": "@{name} ਦਾ ਜ਼ਿਕਰ", "status.more": "ਹੋਰ", - "status.open": "Expand this status", - "status.pinned": "Pinned toot", + "status.open": "ਇਹ ਪੋਸਟ ਨੂੰ ਫੈਲਾਓ", + "status.pin": "ਪਰੋਫਾਈਲ ਉੱਤੇ ਟੰਗੋ", + "status.pinned": "ਟੰਗੀ ਹੋਈ ਪੋਸਟ", "status.read_more": "ਹੋਰ ਪੜ੍ਹੋ", "status.reblog": "ਵਧਾਓ", "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.replied_to": "{name} ਨੂੰ ਜਵਾਬ ਦਿੱਤਾ", "status.reply": "ਜਵਾਬ ਦੇਵੋ", + "status.replyAll": "ਮਾਮਲੇ ਨੂੰ ਜਵਾਬ ਦਿਓ", + "status.report": "@{name} ਦੀ ਰਿਪੋਰਟ ਕਰੋ", + "status.sensitive_warning": "ਸੰਵੇਦਨਸ਼ੀਲ ਸਮੱਗਰੀ", "status.share": "ਸਾਂਝਾ ਕਰੋ", + "status.show_filter_reason": "ਕਿਵੇਂ ਵੀ ਵੇਖਾਓ", "status.show_less": "ਘੱਟ ਦਿਖਾਓ", - "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", - "subscribed_languages.save": "ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ", - "tabs_bar.home": "ਮੁੱਖ ਪੰਨਾ", + "status.show_more": "ਹੋਰ ਦਿਖਾਓ", + "status.title.with_attachments": "{user} ਨੇ {attachmentCount, plural,one {ਅਟੈਚਮੈਂਟ} other {{attachmentCount}ਅਟੈਚਮੈਂਟਾਂ}} ਪੋਸਟ ਕੀਤੀਆਂ", + "status.translate": "ਉਲੱਥਾ ਕਰੋ", + "subscribed_languages.save": "ਤਬਦੀਲੀਆਂ ਸੰਭਾਲੋ", + "tabs_bar.home": "ਘਰ", "tabs_bar.notifications": "ਸੂਚਨਾਵਾਂ", - "timeline_hint.resources.followers": "ਪ੍ਰਸ਼ੰਸਕ", - "timeline_hint.resources.follows": "ਪ੍ਰਸ਼ੰਸਕ ਬਣਨ 'ਤੇ", - "timeline_hint.resources.statuses": "Older toots", + "timeline_hint.resources.followers": "ਫ਼ਾਲੋਅਰ", + "timeline_hint.resources.follows": "ਫ਼ਾਲੋ", + "timeline_hint.resources.statuses": "ਪੂਰਾਣੀਆਂ ਪੋਸਟਾਂ", "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}", - "upload_form.audio_description": "Describe for people with hearing loss", - "upload_form.description": "Describe for the visually impaired", + "units.short.billion": "{count}ਿਬ", + "units.short.million": "{count}ਮਿ", + "units.short.thousand": "{count}ਹਜ਼ਾਰ", + "upload_form.audio_description": "ਬੋਲ਼ੇ ਜਾਂ ਸੁਣਨ ਵਿੱਚ ਮੁਸ਼ਕਿਲ ਵਾਲੇ ਲੋਕਾਂ ਲਈ ਵੇਰਵੇ", + "upload_form.description": "ਅੰਨ੍ਹੇ ਜਾਂ ਦੇਖਣ ਲਈ ਮੁਸ਼ਕਲ ਵਾਲੇ ਲੋਕਾਂ ਲਈ ਵੇਰਵੇ", "upload_form.edit": "ਸੋਧ", - "upload_form.undo": "ਮਿਟਾਓ", - "upload_form.video_description": "Describe for people with hearing loss or visual impairment", + "upload_form.undo": "ਹਟਾਓ", + "upload_form.video_description": "ਬੋਲ਼ੇ, ਸੁਣਨ ਵਿੱਚ ਮੁਸ਼ਕਿਲ, ਅੰਨ੍ਹੇ ਜਾਂ ਘੱਟ ਨਿਗ੍ਹਾ ਵਾਲੇ ਲੋਕਾਂ ਲਈ ਵੇਰਵਾ", "upload_modal.apply": "ਲਾਗੂ ਕਰੋ", + "upload_modal.applying": "ਲਾਗੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…", "upload_modal.choose_image": "ਤਸਵੀਰ ਚੁਣੋ", "upload_modal.edit_media": "ਮੀਡੀਆ ਸੋਧੋ", - "upload_progress.label": "Uploading…", - "upload_progress.processing": "ਕਾਰਜ ਅਧੀਨ ਹੈ…", + "upload_progress.label": "ਅੱਪਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...", + "upload_progress.processing": "ਕਾਰਵਾਈ ਚੱਲ ਰਹੀ ਹੈ…", "video.exit_fullscreen": "ਪੂਰੀ ਸਕਰੀਨ ਵਿੱਚੋਂ ਬਾਹਰ ਨਿਕਲੋ", "video.fullscreen": "ਪੂਰੀ ਸਕਰੀਨ", - "video.pause": "ਰਹਾਉ", + "video.pause": "ਠਹਿਰੋ", "video.play": "ਚਲਾਓ" } diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 46fcc01160b986..0eb4041988a217 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -488,6 +488,7 @@ "onboarding.profile.note": "O tebe", "onboarding.profile.note_hint": "Môžeš @spomenúť iných ľudí, alebo #haštagy…", "onboarding.profile.save_and_continue": "Ulož a pokračuj", + "onboarding.profile.title": "Nastavenie profilu", "onboarding.profile.upload_avatar": "Nahraj profilový obrázok", "onboarding.profile.upload_header": "Nahraj profilové záhlavie", "onboarding.share.lead": "Daj ľudom vedieť, ako ťa môžu na Mastodone nájsť!", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 0be9bf6d7a0d98..67b920393a31de 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -496,7 +496,7 @@ "onboarding.share.message": "ฉันคือ {username} ใน #Mastodon! มาติดตามฉันที่ {url}", "onboarding.share.next_steps": "ขั้นตอนถัดไปที่เป็นไปได้:", "onboarding.share.title": "แชร์โปรไฟล์ของคุณ", - "onboarding.start.lead": "ตอนนี้คุณเป็นส่วนหนึ่งของ Mastodon แพลตฟอร์มสื่อสังคมที่มีเอกลักษณ์เฉพาะตัว กระจายศูนย์ ที่ซึ่งคุณ—ไม่ใช่อัลกอริทึม—เรียบเรียงประสบการณ์ของคุณเอง มาช่วยให้คุณเริ่มต้นใช้งานพรมแดนทางสังคมใหม่นี้กันเลย:", + "onboarding.start.lead": "ตอนนี้คุณเป็นส่วนหนึ่งของ Mastodon แพลตฟอร์มสื่อสังคมแบบกระจายศูนย์ที่มีเอกลักษณ์เฉพาะตัว ที่ซึ่งคุณ ไม่ใช่อัลกอริทึม เรียบเรียงประสบการณ์ของคุณเอง มาช่วยให้คุณเริ่มต้นใช้งานพรมแดนทางสังคมใหม่นี้กันเลย:", "onboarding.start.skip": "ไม่ต้องการความช่วยเหลือในการเริ่มต้นใช้งาน?", "onboarding.start.title": "คุณทำสำเร็จแล้ว!", "onboarding.steps.follow_people.body": "การติดตามผู้คนที่น่าสนใจคือสิ่งที่ Mastodon ให้ความสำคัญ", diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json index 4d2452e12d8cad..6bb5ba0ebf95da 100644 --- a/app/javascript/mastodon/locales/ug.json +++ b/app/javascript/mastodon/locales/ug.json @@ -1,4 +1,6 @@ { + "about.blocks": "ئوتتۇراھال مۇلازىمېتىر", + "about.contact": "ئالاقىلاشقۇچى:", "account.badges.bot": "Bot", "account.cancel_follow_request": "Withdraw follow request", "account.posts": "Toots", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 4fb5a12de3d134..8484e00c830add 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -8,7 +8,7 @@ "about.domain_blocks.silenced.title": "已受限", "about.domain_blocks.suspended.explanation": "來自此伺服器的資料都不會被處理、儲存或交換,也無法與此伺服器上的使用者互動或交流。", "about.domain_blocks.suspended.title": "已停權", - "about.not_available": "無法於此伺服器上使用此資訊。", + "about.not_available": "無法於本伺服器上使用此資訊。", "about.powered_by": "由 {mastodon} 提供的去中心化社群媒體", "about.rules": "伺服器規則", "account.account_note_header": "備註", @@ -207,14 +207,14 @@ "dismissable_banner.explore_statuses": "這些於此伺服器以及去中心化網路中其他伺服器發出的嘟文正在被此伺服器上的人們熱烈討論著。越多不同人轉嘟及最愛排名更高。", "dismissable_banner.explore_tags": "這些主題標籤正在被此伺服器以及去中心化網路上的人們熱烈討論著。越多不同人所嘟出的主題標籤排名更高。", "dismissable_banner.public_timeline": "這些是來自 {domain} 使用者們跟隨中帳號所發表之最新公開嘟文。", - "embed.instructions": "如要將此嘟文嵌入您的網站,請複製以下程式碼。", + "embed.instructions": "若您欲於您的網站嵌入此嘟文,請複製以下程式碼。", "embed.preview": "它將顯示成這樣:", "emoji_button.activity": "活動", "emoji_button.clear": "清除", "emoji_button.custom": "自訂", "emoji_button.flags": "旗幟", "emoji_button.food": "食物 & 飲料", - "emoji_button.label": "插入表情圖案", + "emoji_button.label": "插入表情符號", "emoji_button.nature": "自然", "emoji_button.not_found": "啊就沒這表情符號吼!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "物件", @@ -353,11 +353,11 @@ "keyboard_shortcuts.legend": "顯示此說明選單", "keyboard_shortcuts.local": "開啟本站時間軸", "keyboard_shortcuts.mention": "提及作者", - "keyboard_shortcuts.muted": "開啟靜音使用者清單", + "keyboard_shortcuts.muted": "開啟靜音使用者列表", "keyboard_shortcuts.my_profile": "開啟個人檔案頁面", "keyboard_shortcuts.notifications": "開啟通知欄", "keyboard_shortcuts.open_media": "開啟媒體", - "keyboard_shortcuts.pinned": "開啟釘選的嘟文清單", + "keyboard_shortcuts.pinned": "開啟釘選的嘟文列表", "keyboard_shortcuts.profile": "開啟作者的個人檔案頁面", "keyboard_shortcuts.reply": "回應嘟文", "keyboard_shortcuts.requests": "開啟跟隨請求列表", @@ -386,7 +386,7 @@ "lists.new.create": "新增列表", "lists.new.title_placeholder": "新列表標題", "lists.replies_policy.followed": "任何跟隨的使用者", - "lists.replies_policy.list": "成員清單", + "lists.replies_policy.list": "列表成員", "lists.replies_policy.none": "沒有人", "lists.replies_policy.title": "顯示回覆:", "lists.search": "搜尋您跟隨的使用者", @@ -477,7 +477,7 @@ "onboarding.actions.back": "返回", "onboarding.actions.go_to_explore": "看看發生什麼新鮮事", "onboarding.actions.go_to_home": "前往您的首頁時間軸", - "onboarding.compose.template": "你好 #Mastodon!", + "onboarding.compose.template": "哈囉 #Mastodon!", "onboarding.follows.empty": "很遺憾,目前未能顯示任何結果。您可以嘗試使用搜尋、瀏覽探索頁面以找尋人們跟隨、或稍候再試。", "onboarding.follows.lead": "您的首頁時間軸是 Mastodon 的核心體驗。若您跟隨更多人的話,它將會變得更活躍有趣。這些個人檔案也許是個好起點,您可以隨時取消跟隨他們!", "onboarding.follows.title": "客製化您的首頁時間軸", @@ -687,7 +687,7 @@ "status.translated_from_with": "透過 {provider} 翻譯 {lang}", "status.uncached_media_warning": "無法預覽", "status.unmute_conversation": "解除此對話的靜音", - "status.unpin": "從個人檔案頁面取消釘選", + "status.unpin": "自個人檔案頁面取消釘選", "subscribed_languages.lead": "僅選定語言的嘟文才會出現於您的首頁上,並於變更後列出時間軸。選取「無」以接收所有語言的嘟文。", "subscribed_languages.save": "儲存變更", "subscribed_languages.target": "變更 {target} 的訂閱語言", diff --git a/app/javascript/mastodon/reducers/media_attachments.js b/app/javascript/mastodon/reducers/media_attachments.js index f145e1dcaac6aa..cbb4933bc7efa8 100644 --- a/app/javascript/mastodon/reducers/media_attachments.js +++ b/app/javascript/mastodon/reducers/media_attachments.js @@ -2,13 +2,6 @@ import { Map as ImmutableMap } from 'immutable'; import { STORE_HYDRATE } from '../actions/store'; -export let currentMedia = null; - -export function setCurrentMedia(value) { - currentMedia = value; -} - - const initialState = ImmutableMap({ accept_content_types: [], }); diff --git a/app/javascript/mastodon/store/middlewares/loading_bar.ts b/app/javascript/mastodon/store/middlewares/loading_bar.ts index 5fe8000731a879..83056ee49f44a9 100644 --- a/app/javascript/mastodon/store/middlewares/loading_bar.ts +++ b/app/javascript/mastodon/store/middlewares/loading_bar.ts @@ -1,3 +1,9 @@ +import { + isAsyncThunkAction, + isPending as isThunkActionPending, + isFulfilled as isThunkActionFulfilled, + isRejected as isThunkActionRejected, +} from '@reduxjs/toolkit'; import { showLoading, hideLoading } from 'react-redux-loading-bar'; import type { AnyAction, Middleware } from 'redux'; @@ -21,25 +27,43 @@ export const loadingBarMiddleware = ( return ({ dispatch }) => (next) => (action: AnyAction) => { - if (action.type && !action.skipLoading) { + let isPending = false; + let isFulfilled = false; + let isRejected = false; + + if ( + isAsyncThunkAction(action) + // TODO: once we get the first use-case for it, add a check for skipLoading + ) { + if (isThunkActionPending(action)) isPending = true; + else if (isThunkActionFulfilled(action)) isFulfilled = true; + else if (isThunkActionRejected(action)) isRejected = true; + } else if ( + action.type && + !action.skipLoading && + typeof action.type === 'string' + ) { const [PENDING, FULFILLED, REJECTED] = promiseTypeSuffixes; - const isPending = new RegExp(`${PENDING}$`, 'g'); - const isFulfilled = new RegExp(`${FULFILLED}$`, 'g'); - const isRejected = new RegExp(`${REJECTED}$`, 'g'); - - if (typeof action.type === 'string') { - if (action.type.match(isPending)) { - dispatch(showLoading()); - } else if ( - action.type.match(isFulfilled) ?? - action.type.match(isRejected) - ) { - dispatch(hideLoading()); - } + const isPendingRegexp = new RegExp(`${PENDING}$`, 'g'); + const isFulfilledRegexp = new RegExp(`${FULFILLED}$`, 'g'); + const isRejectedRegexp = new RegExp(`${REJECTED}$`, 'g'); + + if (action.type.match(isPendingRegexp)) { + isPending = true; + } else if (action.type.match(isFulfilledRegexp)) { + isFulfilled = true; + } else if (action.type.match(isRejectedRegexp)) { + isRejected = true; } } + if (isPending) { + dispatch(showLoading()); + } else if (isFulfilled || isRejected) { + dispatch(hideLoading()); + } + return next(action); }; }; diff --git a/app/lib/ostatus/tag_manager.rb b/app/lib/ostatus/tag_manager.rb index 7d813162272882..21b3d3aa58453f 100644 --- a/app/lib/ostatus/tag_manager.rb +++ b/app/lib/ostatus/tag_manager.rb @@ -52,7 +52,7 @@ def unique_tag_to_local_id(tag, expected_type) ActivityPub::TagManager.instance.uri_to_local_id(tag) else matches = Regexp.new("objectId=([\\d]+):objectType=#{expected_type}").match(tag) - return matches[1] unless matches.nil? + matches[1] unless matches.nil? end end diff --git a/app/lib/potential_friendship_tracker.rb b/app/lib/potential_friendship_tracker.rb deleted file mode 100644 index b32deb170833e9..00000000000000 --- a/app/lib/potential_friendship_tracker.rb +++ /dev/null @@ -1,32 +0,0 @@ -# frozen_string_literal: true - -class PotentialFriendshipTracker - EXPIRE_AFTER = 90.days.seconds - MAX_ITEMS = 80 - - WEIGHTS = { - reply: 1, - emoji_reaction: 3, - favourite: 10, - reblog: 20, - }.freeze - - class << self - include Redisable - - def record(account_id, target_account_id, action) - return if account_id == target_account_id - - key = "interactions:#{account_id}" - weight = WEIGHTS[action] - - redis.zincrby(key, weight, target_account_id) - redis.zremrangebyrank(key, 0, -MAX_ITEMS) - redis.expire(key, EXPIRE_AFTER) - end - - def remove(account_id, target_account_id) - redis.zrem("interactions:#{account_id}", target_account_id) - end - end -end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb index 35f0b5fee18a9a..3312183d47db66 100644 --- a/app/mailers/application_mailer.rb +++ b/app/mailers/application_mailer.rb @@ -12,7 +12,7 @@ class ApplicationMailer < ActionMailer::Base protected def locale_for_account(account, &block) - I18n.with_locale(account.user_locale || I18n.default_locale, &block) + I18n.with_locale(account.user_locale || I18n.locale || I18n.default_locale, &block) end def set_autoreply_headers! diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 2af2a3a41d2cb3..432b851b5e668e 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -202,6 +202,6 @@ def set_instance end def locale - @resource.locale.presence || I18n.default_locale + @resource.locale.presence || I18n.locale || I18n.default_locale end end diff --git a/app/models/account.rb b/app/models/account.rb index 0d4af2f909077a..6702ff897db46e 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -496,8 +496,8 @@ def from_text(text) end def inverse_alias(key, original_key) - define_method("#{key}=") do |value| - public_send("#{original_key}=", !ActiveModel::Type::Boolean.new.cast(value)) + define_method(:"#{key}=") do |value| + public_send(:"#{original_key}=", !ActiveModel::Type::Boolean.new.cast(value)) end define_method(key) do diff --git a/app/models/account_domain_block.rb b/app/models/account_domain_block.rb index af1e6a68dc45f4..753935d6af6a86 100644 --- a/app/models/account_domain_block.rb +++ b/app/models/account_domain_block.rb @@ -18,16 +18,17 @@ class AccountDomainBlock < ApplicationRecord belongs_to :account validates :domain, presence: true, uniqueness: { scope: :account_id }, domain: true - after_commit :remove_blocking_cache - after_commit :remove_relationship_cache + after_commit :invalidate_domain_blocking_cache + after_commit :invalidate_follow_recommendations_cache private - def remove_blocking_cache + def invalidate_domain_blocking_cache Rails.cache.delete("exclude_domains_for:#{account_id}") + Rails.cache.delete(['exclude_domains', account_id, domain]) end - def remove_relationship_cache - Rails.cache.delete_matched("relationship:#{account_id}:*") + def invalidate_follow_recommendations_cache + Rails.cache.delete("follow_recommendations/#{account_id}") end end diff --git a/app/models/account_suggestions.rb b/app/models/account_suggestions.rb index d1774e62fae3bd..d62176c7ca3568 100644 --- a/app/models/account_suggestions.rb +++ b/app/models/account_suggestions.rb @@ -1,28 +1,48 @@ # frozen_string_literal: true class AccountSuggestions + include DatabaseHelper + SOURCES = [ AccountSuggestions::SettingSource, - AccountSuggestions::PastInteractionsSource, + AccountSuggestions::FriendsOfFriendsSource, + AccountSuggestions::SimilarProfilesSource, AccountSuggestions::GlobalSource, ].freeze - def self.get(account, limit) - SOURCES.each_with_object([]) do |source_class, suggestions| - source_suggestions = source_class.new.get( - account, - skip_account_ids: suggestions.map(&:account_id), - limit: limit - suggestions.size - ) + BATCH_SIZE = 40 - suggestions.concat(source_suggestions) - end + def initialize(account) + @account = account end - def self.remove(account, target_account_id) - SOURCES.each do |source_class| - source = source_class.new - source.remove(account, target_account_id) + def get(limit, offset = 0) + with_read_replica do + account_ids_with_sources = Rails.cache.fetch("follow_recommendations/#{@account.id}", expires_in: 15.minutes) do + SOURCES.flat_map { |klass| klass.new.get(@account, limit: BATCH_SIZE) }.each_with_object({}) do |(account_id, source), h| + (h[account_id] ||= []).concat(Array(source).map(&:to_sym)) + end.to_a.shuffle + end + + # The sources deliver accounts that haven't yet been followed, are not blocked, + # and so on. Since we reset the cache on follows, blocks, and so on, we don't need + # a complicated query on this end. + + account_ids = account_ids_with_sources[offset, limit] + accounts_map = Account.where(id: account_ids.map(&:first)).includes(:account_stat).index_by(&:id) + + account_ids.filter_map do |(account_id, source)| + next unless accounts_map.key?(account_id) + + AccountSuggestions::Suggestion.new( + account: accounts_map[account_id], + source: source + ) + end end end + + def remove(target_account_id) + FollowRecommendationMute.create(account_id: @account.id, target_account_id: target_account_id) + end end diff --git a/app/models/account_suggestions/friends_of_friends_source.rb b/app/models/account_suggestions/friends_of_friends_source.rb new file mode 100644 index 00000000000000..28d0ab99b3b1f9 --- /dev/null +++ b/app/models/account_suggestions/friends_of_friends_source.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +class AccountSuggestions::FriendsOfFriendsSource < AccountSuggestions::Source + def get(account, limit: 10) + Account.find_by_sql([<<~SQL.squish, { id: account.id, limit: limit }]).map { |row| [row.id, key] } + WITH first_degree AS ( + SELECT target_account_id + FROM follows + JOIN accounts AS target_accounts ON follows.target_account_id = target_accounts.id + WHERE account_id = :id + AND NOT target_accounts.hide_collections + ) + SELECT accounts.id, COUNT(*) AS frequency + FROM accounts + JOIN follows ON follows.target_account_id = accounts.id + JOIN account_stats ON account_stats.account_id = accounts.id + LEFT OUTER JOIN follow_recommendation_mutes ON follow_recommendation_mutes.target_account_id = accounts.id AND follow_recommendation_mutes.account_id = :id + WHERE follows.account_id IN (SELECT * FROM first_degree) + AND NOT EXISTS (SELECT 1 FROM follows f WHERE f.target_account_id = follows.target_account_id AND f.account_id = :id) + AND follows.target_account_id <> :id + AND accounts.discoverable + AND accounts.suspended_at IS NULL + AND accounts.silenced_at IS NULL + AND accounts.moved_to_account_id IS NULL + AND follow_recommendation_mutes.target_account_id IS NULL + GROUP BY accounts.id, account_stats.id + ORDER BY frequency DESC, account_stats.followers_count ASC + LIMIT :limit + SQL + end + + private + + def key + :friends_of_friends + end +end diff --git a/app/models/account_suggestions/global_source.rb b/app/models/account_suggestions/global_source.rb index 651041d67510e8..d68f285e4f4e89 100644 --- a/app/models/account_suggestions/global_source.rb +++ b/app/models/account_suggestions/global_source.rb @@ -1,39 +1,13 @@ # frozen_string_literal: true class AccountSuggestions::GlobalSource < AccountSuggestions::Source - include Redisable - - def key - :global - end - - def get(account, skip_account_ids: [], limit: 40) - account_ids = account_ids_for_locale(I18n.locale.to_s.split(/[_-]/).first) - [account.id] - skip_account_ids - - as_ordered_suggestions( - scope(account).where(id: account_ids), - account_ids - ).take(limit) - end - - def remove(_account, _target_account_id) - nil + def get(account, limit: 10) + FollowRecommendation.localized(content_locale).joins(:account).merge(base_account_scope(account)).order(rank: :desc).limit(limit).pluck(:account_id, :reason) end private - def scope(account) - Account.searchable - .followable_by(account) - .not_excluded_by_account(account) - .not_domain_blocked_by_account(account) - end - - def account_ids_for_locale(locale) - redis.zrevrange("follow_recommendations:#{locale}", 0, -1).map(&:to_i) - end - - def to_ordered_list_key(account) - account.id + def content_locale + I18n.locale.to_s.split(/[_-]/).first end end diff --git a/app/models/account_suggestions/past_interactions_source.rb b/app/models/account_suggestions/past_interactions_source.rb deleted file mode 100644 index d169394f11a30f..00000000000000 --- a/app/models/account_suggestions/past_interactions_source.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -class AccountSuggestions::PastInteractionsSource < AccountSuggestions::Source - include Redisable - - def key - :past_interactions - end - - def get(account, skip_account_ids: [], limit: 40) - account_ids = account_ids_for_account(account.id, limit + skip_account_ids.size) - skip_account_ids - - as_ordered_suggestions( - scope.where(id: account_ids), - account_ids - ).take(limit) - end - - def remove(account, target_account_id) - redis.zrem("interactions:#{account.id}", target_account_id) - end - - private - - def scope - Account.searchable - end - - def account_ids_for_account(account_id, limit) - redis.zrevrange("interactions:#{account_id}", 0, limit).map(&:to_i) - end - - def to_ordered_list_key(account) - account.id - end -end diff --git a/app/models/account_suggestions/setting_source.rb b/app/models/account_suggestions/setting_source.rb index 6185732b4bcbb8..4b7275bf7ada96 100644 --- a/app/models/account_suggestions/setting_source.rb +++ b/app/models/account_suggestions/setting_source.rb @@ -1,32 +1,18 @@ # frozen_string_literal: true class AccountSuggestions::SettingSource < AccountSuggestions::Source - def key - :staff - end - - def get(account, skip_account_ids: [], limit: 40) - return [] unless setting_enabled? - - as_ordered_suggestions( - scope(account).where(setting_to_where_condition).where.not(id: skip_account_ids), - usernames_and_domains - ).take(limit) - end - - def remove(_account, _target_account_id) - nil + def get(account, limit: 10) + if setting_enabled? + base_account_scope(account).where(setting_to_where_condition).limit(limit).pluck(:id).zip([key].cycle) + else + [] + end end private - def scope(account) - Account.searchable - .followable_by(account) - .not_excluded_by_account(account) - .not_domain_blocked_by_account(account) - .where(locked: false) - .where.not(id: account.id) + def key + :featured end def usernames_and_domains @@ -61,8 +47,4 @@ def setting_to_usernames_and_domains def setting Setting.bootstrap_timeline_accounts end - - def to_ordered_list_key(account) - [account.username.downcase, account.domain&.downcase] - end end diff --git a/app/models/account_suggestions/similar_profiles_source.rb b/app/models/account_suggestions/similar_profiles_source.rb new file mode 100644 index 00000000000000..733c5f0bbcd649 --- /dev/null +++ b/app/models/account_suggestions/similar_profiles_source.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +class AccountSuggestions::SimilarProfilesSource < AccountSuggestions::Source + class QueryBuilder < AccountSearchService::QueryBuilder + def must_clauses + [ + { + more_like_this: { + fields: %w(text text.stemmed), + like: @query.map { |id| { _index: 'accounts', _id: id } }, + }, + }, + + { + term: { + properties: 'discoverable', + }, + }, + ] + end + + def must_not_clauses + [ + { + terms: { + id: following_ids, + }, + }, + + { + term: { + properties: 'bot', + }, + }, + ] + end + + def should_clauses + { + term: { + properties: { + value: 'verified', + boost: 2, + }, + }, + } + end + end + + def get(account, limit: 10) + recently_followed_account_ids = account.active_relationships.recent.limit(5).pluck(:target_account_id) + + if Chewy.enabled? && !recently_followed_account_ids.empty? + QueryBuilder.new(recently_followed_account_ids, account).build.limit(limit).hits.pluck('_id').map(&:to_i).zip([key].cycle) + else + [] + end + rescue Faraday::ConnectionFailed + [] + end + + private + + def key + :similar_to_recently_followed + end +end diff --git a/app/models/account_suggestions/source.rb b/app/models/account_suggestions/source.rb index 504d26a8bd6640..ee93a1342fc38e 100644 --- a/app/models/account_suggestions/source.rb +++ b/app/models/account_suggestions/source.rb @@ -1,34 +1,18 @@ # frozen_string_literal: true class AccountSuggestions::Source - def key - raise NotImplementedError - end - def get(_account, **kwargs) raise NotImplementedError end - def remove(_account, target_account_id) - raise NotImplementedError - end - protected - def as_ordered_suggestions(scope, ordered_list) - return [] if ordered_list.empty? - - map = scope.index_by { |account| to_ordered_list_key(account) } - - ordered_list.filter_map { |ordered_list_key| map[ordered_list_key] }.map do |account| - AccountSuggestions::Suggestion.new( - account: account, - source: key - ) - end - end - - def to_ordered_list_key(_account) - raise NotImplementedError + def base_account_scope(account) + Account.searchable + .followable_by(account) + .not_excluded_by_account(account) + .not_domain_blocked_by_account(account) + .where.not(id: account.id) + .joins("LEFT OUTER JOIN follow_recommendation_mutes ON follow_recommendation_mutes.target_account_id = accounts.id AND follow_recommendation_mutes.account_id = #{account.id}").where(follow_recommendation_mutes: { target_account_id: nil }) end end diff --git a/app/models/block.rb b/app/models/block.rb index 11156ebab3114f..5476542a5ab8eb 100644 --- a/app/models/block.rb +++ b/app/models/block.rb @@ -26,15 +26,20 @@ def local? end before_validation :set_uri, only: :create - after_commit :remove_blocking_cache + after_commit :invalidate_blocking_cache + after_commit :invalidate_follow_recommendations_cache private - def remove_blocking_cache + def invalidate_blocking_cache Rails.cache.delete("exclude_account_ids_for:#{account_id}") Rails.cache.delete("exclude_account_ids_for:#{target_account_id}") end + def invalidate_follow_recommendations_cache + Rails.cache.delete("follow_recommendations/#{account_id}") + end + def set_uri self.uri = ActivityPub::TagManager.instance.generate_uri_for(self) if uri.nil? end diff --git a/app/models/concerns/account/associations.rb b/app/models/concerns/account/associations.rb index d050d85f80d5da..2536578ace038e 100644 --- a/app/models/concerns/account/associations.rb +++ b/app/models/concerns/account/associations.rb @@ -78,6 +78,7 @@ module Account::Associations has_one :deletion_request, class_name: 'AccountDeletionRequest', inverse_of: :account, dependent: :destroy # Follow recommendations + has_one :follow_recommendation, inverse_of: :account, dependent: nil has_one :follow_recommendation_suppression, inverse_of: :account, dependent: :destroy # Account statuses cleanup policy diff --git a/app/models/concerns/account/interactions.rb b/app/models/concerns/account/interactions.rb index 79f96c87741af6..93d40a24c06674 100644 --- a/app/models/concerns/account/interactions.rb +++ b/app/models/concerns/account/interactions.rb @@ -60,12 +60,6 @@ def account_note_map(target_account_ids, account_id) end end - def domain_blocking_map(target_account_ids, account_id) - accounts_map = Account.where(id: target_account_ids).select('id, domain').each_with_object({}) { |a, h| h[a.id] = a.domain } - blocked_domains = domain_blocking_map_by_domain(accounts_map.values.compact, account_id) - accounts_map.reduce({}) { |h, (id, domain)| h.merge(id => blocked_domains[domain]) } - end - def domain_blocking_map_by_domain(target_domains, account_id) follow_mapping(AccountDomainBlock.where(account_id: account_id, domain: target_domains), :domain) end @@ -122,8 +116,6 @@ def follow!(other_account, reblogs: nil, notify: nil, languages: nil, uri: nil, rel.save! if rel.changed? - remove_potential_friendship(other_account) - rel end @@ -137,13 +129,10 @@ def request_follow!(other_account, reblogs: nil, notify: nil, languages: nil, ur rel.save! if rel.changed? - remove_potential_friendship(other_account) - rel end def block!(other_account, uri: nil) - remove_potential_friendship(other_account) block_relationships.create_with(uri: uri) .find_or_create_by!(target_account: other_account) end @@ -154,8 +143,6 @@ def mute!(other_account, notifications: nil, duration: 0) mute.expires_in = duration.zero? ? nil : duration mute.save! - remove_potential_friendship(other_account) - # When toggling a mute between hiding and allowing notifications, the mute will already exist, so the find_or_create_by! call will return the existing Mute without updating the hide_notifications attribute. Therefore, we check that hide_notifications? is what we want and set it if it isn't. mute.update!(hide_notifications: notifications) if mute.hide_notifications? != notifications @@ -333,10 +320,4 @@ def relations_map(account_ids, domains = nil, **options) domain_blocking_by_domain: Account.domain_blocking_map_by_domain(domains, id), }) end - - private - - def remove_potential_friendship(other_account) - PotentialFriendshipTracker.remove(id, other_account.id) - end end diff --git a/app/models/concerns/account/search.rb b/app/models/concerns/account/search.rb index df413f15a55044..45139b093f7b14 100644 --- a/app/models/concerns/account/search.rb +++ b/app/models/concerns/account/search.rb @@ -139,6 +139,7 @@ def searchable_properties [].tap do |properties| properties << 'bot' if bot? properties << 'verified' if fields.any?(&:verified?) + properties << 'discoverable' if discoverable? end end diff --git a/app/models/concerns/relationship_cacheable.rb b/app/models/concerns/relationship_cacheable.rb index 0d9359f7e7b71a..c32a8d62c6fef7 100644 --- a/app/models/concerns/relationship_cacheable.rb +++ b/app/models/concerns/relationship_cacheable.rb @@ -10,7 +10,7 @@ module RelationshipCacheable private def remove_relationship_cache - Rails.cache.delete("relationship:#{account_id}:#{target_account_id}") - Rails.cache.delete("relationship:#{target_account_id}:#{account_id}") + Rails.cache.delete(['relationship', account_id, target_account_id]) + Rails.cache.delete(['relationship', target_account_id, account_id]) end end diff --git a/app/models/concerns/remotable.rb b/app/models/concerns/remotable.rb index bd8b6f4eb9a538..6118e204a1e90a 100644 --- a/app/models/concerns/remotable.rb +++ b/app/models/concerns/remotable.rb @@ -7,7 +7,7 @@ module Remotable def remotable_attachment(attachment_name, limit, suppress_errors: true, download_on_assign: true, attribute_name: nil) attribute_name ||= :"#{attachment_name}_remote_url" - define_method("download_#{attachment_name}!") do |url = nil| + define_method(:"download_#{attachment_name}!") do |url = nil| url ||= self[attribute_name] return if url.blank? @@ -24,29 +24,29 @@ def remotable_attachment(attachment_name, limit, suppress_errors: true, download Request.new(:get, url).perform do |response| raise Mastodon::UnexpectedResponseError, response unless (200...300).cover?(response.code) - public_send("#{attachment_name}=", ResponseWithLimit.new(response, limit)) + public_send(:"#{attachment_name}=", ResponseWithLimit.new(response, limit)) end rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError => e Rails.logger.debug { "Error fetching remote #{attachment_name}: #{e}" } - public_send("#{attachment_name}=", nil) if public_send("#{attachment_name}_file_name").present? + public_send(:"#{attachment_name}=", nil) if public_send(:"#{attachment_name}_file_name").present? raise e unless suppress_errors rescue Paperclip::Errors::NotIdentifiedByImageMagickError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, Paperclip::Error, Mastodon::DimensionsValidationError, Mastodon::StreamValidationError => e Rails.logger.debug { "Error fetching remote #{attachment_name}: #{e}" } - public_send("#{attachment_name}=", nil) if public_send("#{attachment_name}_file_name").present? + public_send(:"#{attachment_name}=", nil) if public_send(:"#{attachment_name}_file_name").present? end nil end - define_method("#{attribute_name}=") do |url| - return if self[attribute_name] == url && public_send("#{attachment_name}_file_name").present? + define_method(:"#{attribute_name}=") do |url| + return if self[attribute_name] == url && public_send(:"#{attachment_name}_file_name").present? self[attribute_name] = url if has_attribute?(attribute_name) - public_send("download_#{attachment_name}!", url) if download_on_assign + public_send(:"download_#{attachment_name}!", url) if download_on_assign end - alias_method("reset_#{attachment_name}!", "download_#{attachment_name}!") + alias_method(:"reset_#{attachment_name}!", "download_#{attachment_name}!") end end end diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb index 2b568bad6a1a78..069cc983cbd7d3 100644 --- a/app/models/custom_filter.rb +++ b/app/models/custom_filter.rb @@ -94,7 +94,7 @@ def self.cached_filters_for(account_id) filters_hash.values.map { |cache| [cache.delete(:filter), cache] } end.to_a - active_filters.select { |custom_filter, _| !custom_filter.expired? } + active_filters.reject { |custom_filter, _| custom_filter.expired? } end def self.apply_cached_filters(cached_filters, status, following: false) diff --git a/app/models/follow.rb b/app/models/follow.rb index 108f5c5d515bf0..4d1598dcad66c7 100644 --- a/app/models/follow.rb +++ b/app/models/follow.rb @@ -44,10 +44,10 @@ def revoke_request! before_validation :set_uri, only: :create after_create :increment_cache_counters - after_create :invalidate_hash_cache after_destroy :remove_endorsements after_destroy :decrement_cache_counters - after_destroy :invalidate_hash_cache + after_commit :invalidate_follow_recommendations_cache + after_commit :invalidate_hash_cache private @@ -74,4 +74,8 @@ def invalidate_hash_cache Rails.cache.delete("followers_hash:#{target_account_id}:#{account.synchronization_uri_prefix}") end + + def invalidate_follow_recommendations_cache + Rails.cache.delete("follow_recommendations/#{account_id}") + end end diff --git a/app/models/follow_recommendation_filter.rb b/app/models/follow_recommendation_filter.rb index 2fab975698871c..62a02eba5ae5c5 100644 --- a/app/models/follow_recommendation_filter.rb +++ b/app/models/follow_recommendation_filter.rb @@ -17,12 +17,9 @@ def initialize(params) def results if params['status'] == 'suppressed' - Account.joins(:follow_recommendation_suppression).order(FollowRecommendationSuppression.arel_table[:id].desc).to_a + Account.includes(:account_stat).joins(:follow_recommendation_suppression).order(FollowRecommendationSuppression.arel_table[:id].desc) else - account_ids = redis.zrevrange("follow_recommendations:#{@language}", 0, -1).map(&:to_i) - accounts = Account.where(id: account_ids).index_by(&:id) - - account_ids.filter_map { |id| accounts[id] } + Account.includes(:account_stat).joins(:follow_recommendation).merge(FollowRecommendation.localized(@language).order(rank: :desc)) end end end diff --git a/app/models/follow_recommendation_mute.rb b/app/models/follow_recommendation_mute.rb new file mode 100644 index 00000000000000..d166d0a620622f --- /dev/null +++ b/app/models/follow_recommendation_mute.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: follow_recommendation_mutes +# +# id :bigint(8) not null, primary key +# account_id :bigint(8) not null +# target_account_id :bigint(8) not null +# created_at :datetime not null +# updated_at :datetime not null +# +class FollowRecommendationMute < ApplicationRecord + belongs_to :account + belongs_to :target_account, class_name: 'Account' + + validates :target_account, uniqueness: { scope: :account_id } + + after_commit :invalidate_follow_recommendations_cache + + private + + def invalidate_follow_recommendations_cache + Rails.cache.delete("follow_recommendations/#{account_id}") + end +end diff --git a/app/models/follow_recommendation_suppression.rb b/app/models/follow_recommendation_suppression.rb index e261a2fe359dba..59e94dc6b3a464 100644 --- a/app/models/follow_recommendation_suppression.rb +++ b/app/models/follow_recommendation_suppression.rb @@ -11,19 +11,5 @@ # class FollowRecommendationSuppression < ApplicationRecord - include Redisable - belongs_to :account - - after_commit :remove_follow_recommendations, on: :create - - private - - def remove_follow_recommendations - redis.pipelined do |pipeline| - I18n.available_locales.each do |locale| - pipeline.zrem("follow_recommendations:#{locale}", account_id) - end - end - end end diff --git a/app/models/follow_request.rb b/app/models/follow_request.rb index a5c23e09d4769f..3c5e8f96f0d5bc 100644 --- a/app/models/follow_request.rb +++ b/app/models/follow_request.rb @@ -45,10 +45,15 @@ def local? end before_validation :set_uri, only: :create + after_commit :invalidate_follow_recommendations_cache private def set_uri self.uri = ActivityPub::TagManager.instance.generate_uri_for(self) if uri.nil? end + + def invalidate_follow_recommendations_cache + Rails.cache.delete("follow_recommendations/#{account_id}") + end end diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb index d36586ccd0b57c..55730a9361ab4e 100644 --- a/app/models/form/admin_settings.rb +++ b/app/models/form/admin_settings.rb @@ -118,7 +118,7 @@ class Form::AdminSettings KEYS.each do |key| define_method(key) do - return instance_variable_get("@#{key}") if instance_variable_defined?("@#{key}") + return instance_variable_get(:"@#{key}") if instance_variable_defined?(:"@#{key}") stored_value = if UPLOAD_KEYS.include?(key) SiteUpload.where(var: key).first_or_initialize(var: key) @@ -130,12 +130,12 @@ class Form::AdminSettings Setting.public_send(key) end - instance_variable_set("@#{key}", stored_value) + instance_variable_set(:"@#{key}", stored_value) end end UPLOAD_KEYS.each do |key| - define_method("#{key}=") do |file| + define_method(:"#{key}=") do |file| value = public_send(key) value.file = file rescue Mastodon::DimensionsValidationError => e @@ -150,13 +150,13 @@ def save return false unless errors.empty? && valid? KEYS.each do |key| - next unless instance_variable_defined?("@#{key}") + next unless instance_variable_defined?(:"@#{key}") if UPLOAD_KEYS.include?(key) public_send(key).save else setting = Setting.where(var: key).first_or_initialize(var: key) - setting.update(value: typecast_value(key, instance_variable_get("@#{key}"))) + setting.update(value: typecast_value(key, instance_variable_get(:"@#{key}"))) end end end @@ -177,9 +177,9 @@ def typecast_value(key, value) def validate_site_uploads UPLOAD_KEYS.each do |key| - next unless instance_variable_defined?("@#{key}") + next unless instance_variable_defined?(:"@#{key}") - upload = instance_variable_get("@#{key}") + upload = instance_variable_get(:"@#{key}") next if upload.valid? upload.errors.each do |error| diff --git a/app/models/form/import.rb b/app/models/form/import.rb index 29a2975c7be187..712acf37065e17 100644 --- a/app/models/form/import.rb +++ b/app/models/form/import.rb @@ -43,14 +43,19 @@ class EmptyFileError < StandardError; end validate :validate_data def guessed_type - return :muting if csv_headers_match?('Hide notifications') - return :following if csv_headers_match?('Show boosts') || csv_headers_match?('Notify on new posts') || csv_headers_match?('Languages') - return :following if file_name_matches?('follows') || file_name_matches?('following_accounts') - return :blocking if file_name_matches?('blocks') || file_name_matches?('blocked_accounts') - return :muting if file_name_matches?('mutes') || file_name_matches?('muted_accounts') - return :domain_blocking if file_name_matches?('domain_blocks') || file_name_matches?('blocked_domains') - return :bookmarks if file_name_matches?('bookmarks') - return :lists if file_name_matches?('lists') + if csv_headers_match?('Hide notifications') || file_name_matches?('mutes') || file_name_matches?('muted_accounts') + :muting + elsif csv_headers_match?('Show boosts') || csv_headers_match?('Notify on new posts') || csv_headers_match?('Languages') || file_name_matches?('follows') || file_name_matches?('following_accounts') + :following + elsif file_name_matches?('blocks') || file_name_matches?('blocked_accounts') + :blocking + elsif file_name_matches?('domain_blocks') || file_name_matches?('blocked_domains') + :domain_blocking + elsif file_name_matches?('bookmarks') + :bookmarks + elsif file_name_matches?('lists') + :lists + end end # Whether the uploaded CSV file seems to correspond to a different import type than the one selected diff --git a/app/models/mute.rb b/app/models/mute.rb index 8fc5422624a3e5..1d18b30eea9385 100644 --- a/app/models/mute.rb +++ b/app/models/mute.rb @@ -23,11 +23,16 @@ class Mute < ApplicationRecord validates :account_id, uniqueness: { scope: :target_account_id } - after_commit :remove_blocking_cache + after_commit :invalidate_blocking_cache + after_commit :invalidate_follow_recommendations_cache private - def remove_blocking_cache + def invalidate_blocking_cache Rails.cache.delete("exclude_account_ids_for:#{account_id}") end + + def invalidate_follow_recommendations_cache + Rails.cache.delete("follow_recommendations/#{account_id}") + end end diff --git a/app/presenters/account_relationships_presenter.rb b/app/presenters/account_relationships_presenter.rb index 5d2b5435dd23c9..8482ef54da4368 100644 --- a/app/presenters/account_relationships_presenter.rb +++ b/app/presenters/account_relationships_presenter.rb @@ -5,8 +5,9 @@ class AccountRelationshipsPresenter :muting, :requested, :requested_by, :domain_blocking, :endorsed, :account_note - def initialize(account_ids, current_account_id, **options) - @account_ids = account_ids.map { |a| a.is_a?(Account) ? a.id : a.to_i } + def initialize(accounts, current_account_id, **options) + @accounts = accounts.to_a + @account_ids = @accounts.pluck(:id) @current_account_id = current_account_id @following = cached[:following].merge(Account.following_map(@uncached_account_ids, @current_account_id)) @@ -16,10 +17,11 @@ def initialize(account_ids, current_account_id, **options) @muting = cached[:muting].merge(Account.muting_map(@uncached_account_ids, @current_account_id)) @requested = cached[:requested].merge(Account.requested_map(@uncached_account_ids, @current_account_id)) @requested_by = cached[:requested_by].merge(Account.requested_by_map(@uncached_account_ids, @current_account_id)) - @domain_blocking = cached[:domain_blocking].merge(Account.domain_blocking_map(@uncached_account_ids, @current_account_id)) @endorsed = cached[:endorsed].merge(Account.endorsed_map(@uncached_account_ids, @current_account_id)) @account_note = cached[:account_note].merge(Account.account_note_map(@uncached_account_ids, @current_account_id)) + @domain_blocking = domain_blocking_map + cache_uncached! @following.merge!(options[:following_map] || {}) @@ -36,6 +38,31 @@ def initialize(account_ids, current_account_id, **options) private + def domain_blocking_map + target_domains = @accounts.pluck(:domain).compact.uniq + blocks_by_domain = {} + + # Fetch from cache + cache_keys = target_domains.map { |domain| domain_cache_key(domain) } + Rails.cache.read_multi(*cache_keys).each do |key, blocking| + blocks_by_domain[key.last] = blocking + end + + uncached_domains = target_domains - blocks_by_domain.keys + + # Read uncached values from database + AccountDomainBlock.where(account_id: @current_account_id, domain: uncached_domains).pluck(:domain).each do |domain| + blocks_by_domain[domain] = true + end + + # Write database reads to cache + to_cache = uncached_domains.to_h { |domain| [domain_cache_key(domain), blocks_by_domain[domain]] } + Rails.cache.write_multi(to_cache, expires_in: 1.day) + + # Return formatted value + @accounts.each_with_object({}) { |account, h| h[account.id] = blocks_by_domain[account.domain] } + end + def cached return @cached if defined?(@cached) @@ -47,28 +74,23 @@ def cached muting: {}, requested: {}, requested_by: {}, - domain_blocking: {}, endorsed: {}, account_note: {}, } - @uncached_account_ids = [] + @uncached_account_ids = @account_ids.uniq - @account_ids.each do |account_id| - maps_for_account = Rails.cache.read("relationship:#{@current_account_id}:#{account_id}") - - if maps_for_account.is_a?(Hash) - @cached.deep_merge!(maps_for_account) - else - @uncached_account_ids << account_id - end + cache_ids = @account_ids.map { |account_id| relationship_cache_key(account_id) } + Rails.cache.read_multi(*cache_ids).each do |key, maps_for_account| + @cached.deep_merge!(maps_for_account) + @uncached_account_ids.delete(key.last) end @cached end def cache_uncached! - @uncached_account_ids.each do |account_id| + to_cache = @uncached_account_ids.to_h do |account_id| maps_for_account = { following: { account_id => following[account_id] }, followed_by: { account_id => followed_by[account_id] }, @@ -77,12 +99,21 @@ def cache_uncached! muting: { account_id => muting[account_id] }, requested: { account_id => requested[account_id] }, requested_by: { account_id => requested_by[account_id] }, - domain_blocking: { account_id => domain_blocking[account_id] }, endorsed: { account_id => endorsed[account_id] }, account_note: { account_id => account_note[account_id] }, } - Rails.cache.write("relationship:#{@current_account_id}:#{account_id}", maps_for_account, expires_in: 1.day) + [relationship_cache_key(account_id), maps_for_account] end + + Rails.cache.write_multi(to_cache, expires_in: 1.day) + end + + def domain_cache_key(domain) + ['exclude_domains', @current_account_id, domain] + end + + def relationship_cache_key(account_id) + ['relationship', @current_account_id, account_id] end end diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index 8646cec6921af0..7812fff4128a90 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -14,32 +14,7 @@ class InitialStateSerializer < ActiveModel::Serializer has_one :role, serializer: REST::RoleSerializer def meta - store = { - streaming_api_base_url: Rails.configuration.x.streaming_api_base_url, - access_token: object.token, - locale: I18n.locale, - domain: Addressable::IDNA.to_unicode(instance_presenter.domain), - title: instance_presenter.title, - admin: object.admin&.id&.to_s, - search_enabled: Chewy.enabled?, - repository: Mastodon::Version.repository, - source_url: instance_presenter.source_url, - version: instance_presenter.version, - limited_federation_mode: Rails.configuration.x.limited_federation_mode, - mascot: instance_presenter.mascot&.file&.url, - profile_directory: Setting.profile_directory, - trends_enabled: Setting.trends, - registrations_open: Setting.registrations_mode != 'none' && !Rails.configuration.x.single_user_mode, - timeline_preview: Setting.timeline_preview, - activity_api_enabled: Setting.activity_api_enabled, - single_user_mode: Rails.configuration.x.single_user_mode, - trends_as_landing_page: Setting.trends_as_landing_page, - status_page_url: Setting.status_page_url, - sso_redirect: sso_redirect, - dtl_tag: dtl_enabled? ? dtl_tag_name : nil, - enable_local_privacy: Setting.enable_public_unlisted_visibility, - enable_local_timeline: Setting.enable_local_timeline, - } + store = default_meta_store if object.current_account store[:me] = object.current_account.id.to_s @@ -133,6 +108,35 @@ def languages private + def default_meta_store + { + access_token: object.token, + activity_api_enabled: Setting.activity_api_enabled, + admin: object.admin&.id&.to_s, + domain: Addressable::IDNA.to_unicode(instance_presenter.domain), + dtl_tag: dtl_enabled? ? dtl_tag_name : nil, + enable_local_privacy: Setting.enable_public_unlisted_visibility, + enable_local_timeline: Setting.enable_local_timeline, + limited_federation_mode: Rails.configuration.x.limited_federation_mode, + locale: I18n.locale, + mascot: instance_presenter.mascot&.file&.url, + profile_directory: Setting.profile_directory, + registrations_open: Setting.registrations_mode != 'none' && !Rails.configuration.x.single_user_mode, + repository: Mastodon::Version.repository, + search_enabled: Chewy.enabled?, + single_user_mode: Rails.configuration.x.single_user_mode, + source_url: instance_presenter.source_url, + sso_redirect: sso_redirect, + status_page_url: Setting.status_page_url, + streaming_api_base_url: Rails.configuration.x.streaming_api_base_url, + timeline_preview: Setting.timeline_preview, + title: instance_presenter.title, + trends_as_landing_page: Setting.trends_as_landing_page, + trends_enabled: Setting.trends, + version: instance_presenter.version, + } + end + def object_account_user object.current_account.user end diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb index 684e578b32d494..578e155d18b617 100644 --- a/app/services/account_search_service.rb +++ b/app/services/account_search_service.rb @@ -23,6 +23,7 @@ def build query: { bool: { must: must_clauses, + must_not: must_not_clauses, }, }, @@ -51,6 +52,10 @@ def must_clauses end end + def must_not_clauses + [] + end + def should_clauses if @account && !@options[:following] && !@options[:follower] [boost_following_query] diff --git a/app/services/delivery_antenna_service.rb b/app/services/delivery_antenna_service.rb index 52abf7977da22f..07888f50a65835 100644 --- a/app/services/delivery_antenna_service.rb +++ b/app/services/delivery_antenna_service.rb @@ -22,7 +22,7 @@ def call(status, update, **options) private - def delivery! + def delivery! # rubocop:disable Metrics/AbcSize subscription_policy = @account.subscription_policy dtl_post = @status.dtl? && dtl_enabled? diff --git a/app/services/emoji_react_service.rb b/app/services/emoji_react_service.rb index 54e7a54a9e6014..8fe412fba86d1e 100644 --- a/app/services/emoji_react_service.rb +++ b/app/services/emoji_react_service.rb @@ -36,7 +36,7 @@ def call(account, status, name) create_notification notify_to_followers - bump_potential_friendship! + increment_statistics write_stream! @emoji_reaction @@ -64,11 +64,8 @@ def write_stream! DeliveryEmojiReactionWorker.perform_async(render_emoji_reaction(emoji_group), @emoji_reaction.status_id, @emoji_reaction.account_id) end - def bump_potential_friendship! + def increment_statistics ActivityTracker.increment('activity:interactions') - return if @emoji_reaction.account.following?(@emoji_reaction.status.account_id) - - PotentialFriendshipTracker.record(@emoji_reaction.account.id, @emoji_reaction.status.account_id, :emoji_reaction) end def payload diff --git a/app/services/favourite_service.rb b/app/services/favourite_service.rb index 6fdc92a173173d..ded50187f77485 100644 --- a/app/services/favourite_service.rb +++ b/app/services/favourite_service.rb @@ -20,7 +20,7 @@ def call(account, status) Trends.statuses.register(status) create_notification(favourite) - bump_potential_friendship(account, status) + increment_statistics favourite end @@ -37,11 +37,8 @@ def create_notification(favourite) end end - def bump_potential_friendship(account, status) + def increment_statistics ActivityTracker.increment('activity:interactions') - return if account.following?(status.account_id) - - PotentialFriendshipTracker.record(account.id, status.account_id, :favourite) end def build_json(favourite) diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index b8c5d2778290f8..efc71241057c23 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -280,9 +280,6 @@ def bump_potential_friendship! return if !@status.reply? || @account.id == @status.in_reply_to_account_id ActivityTracker.increment('activity:interactions') - return if @account.following?(@status.in_reply_to_account_id) - - PotentialFriendshipTracker.record(@account.id, @status.in_reply_to_account_id, :reply) end def status_attributes diff --git a/app/services/reblog_service.rb b/app/services/reblog_service.rb index 42db4d199a83f6..a36eda467307c5 100644 --- a/app/services/reblog_service.rb +++ b/app/services/reblog_service.rb @@ -34,7 +34,7 @@ def call(account, reblogged_status, options = {}) ActivityPub::DistributionWorker.perform_async(reblog.id) create_notification(reblog) - bump_potential_friendship(account, reblog) + increment_statistics reblog end @@ -51,12 +51,8 @@ def create_notification(reblog) end end - def bump_potential_friendship(account, reblog) + def increment_statistics ActivityTracker.increment('activity:interactions') - - return if account.following?(reblog.reblog.account_id) - - PotentialFriendshipTracker.record(account.id, reblog.reblog.account_id, :reblog) end def build_json(reblog) diff --git a/app/services/update_account_service.rb b/app/services/update_account_service.rb index e3c3e239b38f91..79f01e8b40e715 100644 --- a/app/services/update_account_service.rb +++ b/app/services/update_account_service.rb @@ -27,7 +27,7 @@ def call(account, params, raise_error: false) def authorize_all_follow_requests(account) follow_requests = FollowRequest.where(target_account: account) - follow_requests = follow_requests.preload(:account).select { |req| !req.account.silenced? && reject_straight_follow_domains.exclude?(req.account.domain) } + follow_requests = follow_requests.preload(:account).reject { |req| req.account.silenced? || reject_straight_follow_domains.include?(req.account.domain) } AuthorizeFollowWorker.push_bulk(follow_requests, limit: 1_000) do |req| [req.account_id, req.target_account_id] end diff --git a/app/views/admin/accounts/_buttons.html.haml b/app/views/admin/accounts/_buttons.html.haml index 6eb141abc9ad7b..2aaca8962c10e0 100644 --- a/app/views/admin/accounts/_buttons.html.haml +++ b/app/views/admin/accounts/_buttons.html.haml @@ -6,8 +6,8 @@ %p.muted-hint= deletion_request.present? ? t('admin.accounts.suspension_reversible_hint_html', date: content_tag(:strong, l(deletion_request.due_at.to_date))) : t('admin.accounts.suspension_irreversible') = link_to t('admin.accounts.undo_suspension'), unsuspend_admin_account_path(account.id), method: :post, class: 'button' if can?(:unsuspend, account) = link_to t('admin.accounts.redownload'), redownload_admin_account_path(account.id), method: :post, class: 'button' if can?(:redownload, account) && account.suspension_origin_remote? - - if deletion_request.present? - = link_to t('admin.accounts.delete'), admin_account_path(account.id), method: :delete, class: 'button button--destructive', data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, account) + - if deletion_request.present? && can?(:destroy, account) + = link_to t('admin.accounts.delete'), admin_account_path(account.id), method: :delete, class: 'button button--destructive', data: { confirm: t('admin.accounts.are_you_sure') } - else .action-buttons %div @@ -15,8 +15,8 @@ = link_to t('admin.accounts.warn'), new_admin_account_action_path(account.id, type: 'none'), class: 'button' if can?(:warn, account) - if account.user_disabled? = link_to t('admin.accounts.enable'), enable_admin_account_path(account.id), method: :post, class: 'button' if can?(:enable, account.user) - - else - = link_to t('admin.accounts.disable'), new_admin_account_action_path(account.id, type: 'disable'), class: 'button' if can?(:disable, account.user) + - elsif can?(:disable, account.user) + = link_to t('admin.accounts.disable'), new_admin_account_action_path(account.id, type: 'disable'), class: 'button' - if account.sensitized? = link_to t('admin.accounts.undo_sensitized'), unsensitive_admin_account_path(account.id), method: :post, class: 'button' if can?(:unsensitive, account) - elsif !account.local? || account.user_approved? @@ -29,13 +29,13 @@ - if account.user_pending? = link_to t('admin.accounts.approve'), approve_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button' if can?(:approve, account.user) = link_to t('admin.accounts.reject'), reject_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive' if can?(:reject, account.user) - - unless account.user_confirmed? - = link_to t('admin.accounts.confirm'), admin_account_confirmation_path(account.id), method: :post, class: 'button' if can?(:confirm, account.user) - - if !account.local? || account.user_approved? - = link_to t('admin.accounts.perform_full_suspension'), new_admin_account_action_path(account.id, type: 'suspend'), class: 'button' if can?(:suspend, account) + - if !account.user_confirmed? && can?(:confirm, account.user) + = link_to t('admin.accounts.confirm'), admin_account_confirmation_path(account.id), method: :post, class: 'button' + - if (!account.local? || account.user_approved?) && can?(:suspend, account) + = link_to t('admin.accounts.perform_full_suspension'), new_admin_account_action_path(account.id, type: 'suspend'), class: 'button' %div - if account.local? - - if !account.memorial? && account.user_approved? - = link_to t('admin.accounts.memorialize'), memorialize_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive' if can?(:memorialize, account) - - else - = link_to t('admin.accounts.redownload'), redownload_admin_account_path(account.id), method: :post, class: 'button' if can?(:redownload, account) + - if !account.memorial? && account.user_approved? && can?(:memorialize, account) + = link_to t('admin.accounts.memorialize'), memorialize_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive' + - elsif can?(:redownload, account) + = link_to t('admin.accounts.redownload'), redownload_admin_account_path(account.id), method: :post, class: 'button' diff --git a/app/views/admin/accounts/_local_account.html.haml b/app/views/admin/accounts/_local_account.html.haml index 4b361fc8d10c96..82197cda43d9d5 100644 --- a/app/views/admin/accounts/_local_account.html.haml +++ b/app/views/admin/accounts/_local_account.html.haml @@ -47,8 +47,8 @@ - else = t 'admin.accounts.security_measures.only_password' %td - - if account.user&.two_factor_enabled? - = table_link_to 'unlock', t('admin.accounts.disable_two_factor_authentication'), admin_user_two_factor_authentication_path(account.user.id), method: :delete if can?(:disable_2fa, account.user) + - if account.user&.two_factor_enabled? && can?(:disable_2fa, account.user) + = table_link_to 'unlock', t('admin.accounts.disable_two_factor_authentication'), admin_user_two_factor_authentication_path(account.user.id), method: :delete - if can?(:reset_password, account.user) %tr %td diff --git a/app/views/admin/follow_recommendations/show.html.haml b/app/views/admin/follow_recommendations/show.html.haml index dc65a72135bf5b..9c2063d3c577ee 100644 --- a/app/views/admin/follow_recommendations/show.html.haml +++ b/app/views/admin/follow_recommendations/show.html.haml @@ -38,3 +38,5 @@ = nothing_here 'nothing-here--under-tabs' - else = render partial: 'account', collection: @accounts, locals: { f: f } + += paginate @accounts diff --git a/app/workers/scheduler/follow_recommendations_scheduler.rb b/app/workers/scheduler/follow_recommendations_scheduler.rb index ea59ad986b9a06..ea5aa8b5396e5c 100644 --- a/app/workers/scheduler/follow_recommendations_scheduler.rb +++ b/app/workers/scheduler/follow_recommendations_scheduler.rb @@ -2,61 +2,11 @@ class Scheduler::FollowRecommendationsScheduler include Sidekiq::Worker - include Redisable sidekiq_options retry: 0, lock: :until_executed, lock_ttl: 1.day.to_i - # The maximum number of accounts that can be requested in one page from the - # API is 80, and the suggestions API does not allow pagination. This number - # leaves some room for accounts being filtered during live access - SET_SIZE = 100 - def perform - # Maintaining a materialized view speeds-up subsequent queries significantly AccountSummary.refresh FollowRecommendation.refresh - - fallback_recommendations = FollowRecommendation.order(rank: :desc).limit(SET_SIZE) - - Trends.available_locales.each do |locale| - recommendations = if AccountSummary.safe.filtered.localized(locale).exists? # We can skip the work if no accounts with that language exist - FollowRecommendation.localized(locale).order(rank: :desc).limit(SET_SIZE).map { |recommendation| [recommendation.rank, recommendation.account_id] } - else - [] - end - - # Use language-agnostic results if there are not enough language-specific ones - missing = SET_SIZE - recommendations.size - - if missing.positive? && fallback_recommendations.size.positive? - max_fallback_rank = fallback_recommendations.first.rank || 0 - - # Language-specific results should be above language-agnostic ones, - # otherwise language-agnostic ones will always overshadow them - recommendations.map! { |(rank, account_id)| [rank + max_fallback_rank, account_id] } - - added = 0 - - fallback_recommendations.each do |recommendation| - next if recommendations.any? { |(_, account_id)| account_id == recommendation.account_id } - - recommendations << [recommendation.rank, recommendation.account_id] - added += 1 - - break if added >= missing - end - end - - redis.multi do |multi| - multi.del(key(locale)) - multi.zadd(key(locale), recommendations) - end - end - end - - private - - def key(locale) - "follow_recommendations:#{locale}" end end diff --git a/config/boot.rb b/config/boot.rb index 3e44cbe5811f47..717de85f20f5e7 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true unless ENV.key?('RAILS_ENV') - STDERR.puts 'ERROR: Missing RAILS_ENV environment variable, please set it to "production", "development", or "test".' + warn 'ERROR: Missing RAILS_ENV environment variable, please set it to "production", "development", or "test".' exit 1 end diff --git a/config/initializers/3_omniauth.rb b/config/initializers/3_omniauth.rb index d316c3b73a7411..aa8ba1a056ed10 100644 --- a/config/initializers/3_omniauth.rb +++ b/config/initializers/3_omniauth.rb @@ -79,7 +79,7 @@ oidc_options[:client_auth_method] = ENV['OIDC_CLIENT_AUTH_METHOD'] if ENV['OIDC_CLIENT_AUTH_METHOD'] # OPTIONAL (default: basic) scope_string = ENV['OIDC_SCOPE'] if ENV['OIDC_SCOPE'] # NEED scopes = scope_string.split(',') - oidc_options[:scope] = scopes.map { |x| x.to_sym } + oidc_options[:scope] = scopes.map(&:to_sym) oidc_options[:response_type] = ENV['OIDC_RESPONSE_TYPE'] if ENV['OIDC_RESPONSE_TYPE'] # OPTIONAL (default: code) oidc_options[:response_mode] = ENV['OIDC_RESPONSE_MODE'] if ENV['OIDC_RESPONSE_MODE'] # OPTIONAL (default: query) oidc_options[:display] = ENV['OIDC_DISPLAY'] if ENV['OIDC_DISPLAY'] # OPTIONAL (default: page) diff --git a/config/initializers/simple_form.rb b/config/initializers/simple_form.rb index 887b1335a4beef..f45d15ff464e57 100644 --- a/config/initializers/simple_form.rb +++ b/config/initializers/simple_form.rb @@ -188,7 +188,7 @@ def warning_hint(_wrapper_options = nil) # config.item_wrapper_class = nil # How the label text should be generated altogether with the required text. - config.label_text = lambda { |label, required, _explicit_label| "#{label} #{required}" } + config.label_text = ->(label, required, _explicit_label) { "#{label} #{required}" } # You can define the class to use on all labels. Default is nil. # config.label_class = nil diff --git a/config/initializers/trusted_proxies.rb b/config/initializers/trusted_proxies.rb index aa2f4510c20c7e..33bfddbdf16ef8 100644 --- a/config/initializers/trusted_proxies.rb +++ b/config/initializers/trusted_proxies.rb @@ -1,13 +1,8 @@ # frozen_string_literal: true -module Rack - class Request - def trusted_proxy?(ip) - if Rails.application.config.action_dispatch.trusted_proxies.nil? - super - else - Rails.application.config.action_dispatch.trusted_proxies.any? { |proxy| proxy === ip } - end - end - end +unless Rails.application.config.action_dispatch.trusted_proxies.nil? + # Rack is configured with a default collection of trusted proxies + # If Rails has been configured to use a specific list, configure + # Rack to use this Proc, which enforces the Rails-configured list. + Rack::Request.ip_filter = ->(ip) { Rails.application.config.action_dispatch.trusted_proxies.include?(ip) } end diff --git a/config/locales/activerecord.ia.yml b/config/locales/activerecord.ia.yml new file mode 100644 index 00000000000000..480fd56f63ff5f --- /dev/null +++ b/config/locales/activerecord.ia.yml @@ -0,0 +1,8 @@ +--- +ia: + activerecord: + attributes: + user: + password: Contrasigno + user/account: + username: Nomine de usator diff --git a/config/locales/activerecord.ie.yml b/config/locales/activerecord.ie.yml new file mode 100644 index 00000000000000..0c63299e04e97a --- /dev/null +++ b/config/locales/activerecord.ie.yml @@ -0,0 +1,9 @@ +--- +ie: + activerecord: + attributes: + poll: + expires_at: Cludent date + options: Optiones + user: + password: Passa-parol diff --git a/config/locales/activerecord.lad.yml b/config/locales/activerecord.lad.yml new file mode 100644 index 00000000000000..71a63d1cd198d4 --- /dev/null +++ b/config/locales/activerecord.lad.yml @@ -0,0 +1,59 @@ +--- +lad: + activerecord: + attributes: + poll: + expires_at: Limito temporal + options: Opsyones + user: + agreement: Akodro de servisyo + email: Adreso de posta elektronika + locale: Lingua + password: Kod + user/account: + username: Nombre de uzador + user/invite_request: + text: Razon + errors: + models: + account: + attributes: + username: + invalid: solo puede kontener letras, shifras i sulinyados + reserved: esta rezervado + admin/webhook: + attributes: + url: + invalid: no es adreso URL valido + doorkeeper/application: + attributes: + website: + invalid: no es adreso URL valido + import: + attributes: + data: + malformed: tiene formato yerrado + status: + attributes: + reblog: + taken: de publikasyon ya existe + user: + attributes: + email: + blocked: uza un prokurador de posta no autorizado + unreachable: no parese existir + role_id: + elevated: no puede ser mas alto ke tu rolo aktual + user_role: + attributes: + permissions_as_keys: + dangerous: inkluir permisos ke no son siguros para el rolo de baza + elevated: no se puede inkluir permisos kualos no tiene tu rolo aktual + own_role: no se puede trokar kon tu rolo aktual + position: + elevated: no puede ser mas alto ke tu rolo aktual + own_role: no se puede trokar kon tu rolo aktual + webhook: + attributes: + events: + invalid_permissions: no puedes inkluir evenimientos a los kualos no estas autorizado diff --git a/config/locales/activerecord.pa.yml b/config/locales/activerecord.pa.yml index bb8a6c834d9c41..ea95c894773363 100644 --- a/config/locales/activerecord.pa.yml +++ b/config/locales/activerecord.pa.yml @@ -1 +1,23 @@ +--- pa: + activerecord: + attributes: + poll: + expires_at: ਆਖਰੀ ਤਾਰੀਖ + options: ਚੋਣਾਂ + user: + agreement: ਸੇਵਾ ਸਮਝੌਤਾ + email: ਈਮੇਲ ਪਤਾ + locale: ਲੋਕੇਲ + password: ਪਾਸਵਰਡ + user/account: + username: ਵਰਤੋਂਕਾਰ-ਨਾਂ + user/invite_request: + text: ਕਾਰਨ + errors: + models: + account: + attributes: + username: + invalid: ਸਿਰਫ਼ ਅੱਖਰ, ਅੰਕ ਅਤੇ ਹੇਠਾਂ-ਰੇਖਾ ਹੀ ਹੋੋਣੀ ਚਾਹੀਦੀ ਹੈ + reserved: ਰਾਖਵਾਂ ਹੈ diff --git a/config/locales/devise.ia.yml b/config/locales/devise.ia.yml new file mode 100644 index 00000000000000..6ab26788bdf03a --- /dev/null +++ b/config/locales/devise.ia.yml @@ -0,0 +1 @@ +ia: diff --git a/config/locales/devise.ie.yml b/config/locales/devise.ie.yml new file mode 100644 index 00000000000000..cee5357c24164c --- /dev/null +++ b/config/locales/devise.ie.yml @@ -0,0 +1,30 @@ +--- +ie: + devise: + failure: + invalid: Ínvalid %{authentication_keys} o passa-parol. + not_found_in_database: Ínvalid %{authentication_keys} o passa-parol. + mailer: + email_changed: + extra: Si tu ne changeat tui email-adresse, it es probabil que alqui ha ganiat accesse a tui conto. Ples changear tui passa-parol strax o contacter li administrator del servitor si tu ne posse intrar tui conto. + password_change: + explanation: Li passa-parol de tui conto ha esset changeat. + extra: Si tu ne changeat tui passa-parol, it es probabil que alqui ha ganiat accesse a tui conto. Ples changear tui passa-parol strax o contacter li administrator del servitor si tu ne posse intrar tui conto. + subject: 'Mastodon: Passa-parol changeat' + title: Passa-parol changeat + reset_password_instructions: + action: Changear passa-parol + explanation: Tu demandat un nov passa-parol por tui conto. + extra: Si tu ne demandat to-ci, ples ignorar ti-ci email. Tui passa-parol ne va changear til que tu accessaye li ligament supra e crear un nov. + subject: 'Mastodon: Instructiones por reiniciar li passa-parol' + title: Reiniciar passa-parol + two_factor_disabled: + explanation: 2-factor autentication por tui conto ha esset desactivisat. Aperter session nu es possibil solmen per email-adresse e passa-parol. + passwords: + no_token: Tu ne posse accessar ti-ci págine sin venir de un email pri reiniciar li passa-parol. Si tu ha venit de un email pri reiniciar li passa-parol, ples far cert que tu usat li complet URL providet. + send_instructions: Si tui email-adresse existe in nor database, tu va reciver un ligament por recuperar li passa-parol a tui email-adresse in quelc minutes. Ples vider tui spam-emails si tu ne recivet ti email. + send_paranoid_instructions: Si tui email-adresse existe in nor database, tu va reciver un ligament por recuperar li passa-parol a tui email-adresse in quelc minutes. Ples vider tui spam-emails si tu ne recivet ti email. + updated: Tui passa-parol ha esset changeat successosimen. Tu nu ha apertet session. + updated_not_active: Tui passa-parol ha esset changeat successosimen. + registrations: + signed_up: Benevenit! Tu ha successat registrar te. diff --git a/config/locales/devise.io.yml b/config/locales/devise.io.yml index 7d5668c920987a..fb90c08c7ff659 100644 --- a/config/locales/devise.io.yml +++ b/config/locales/devise.io.yml @@ -13,7 +13,7 @@ io: locked: Tua konto esas extingita. not_found_in_database: Nejusta %{authentication_keys}. pending: Vua konti ankore kontrolesas. - timeout: Tua kunsido expiris. Voluntez rienirar por durar. + timeout: Vua kunsido expiris. Voluntez rienirar por avancar. unauthenticated: Tu devas enirar o membreskar por durar. unconfirmed: Tu devas konfirmar tua konto por durar. mailer: @@ -102,7 +102,7 @@ io: unlocks: send_instructions: Tu recevos retpost-mesajo kun instrucioni por riacendar tua konto pos kelka minuti. send_paranoid_instructions: Se tua retpost-adreso existas en nia datumbazo, tu recevos ligilo por riacendar tua konto per retpost-meajo. - unlocked: Tua konto riacendesis senprobleme, tu nun esas enirinta. + unlocked: Vua konto desklefagesis senprobleme. Voluntez enirar por avancar. errors: messages: already_confirmed: ja konfirmesis, voluntez probar enirar diff --git a/config/locales/devise.lad.yml b/config/locales/devise.lad.yml new file mode 100644 index 00000000000000..63933b80fc71d6 --- /dev/null +++ b/config/locales/devise.lad.yml @@ -0,0 +1,115 @@ +--- +lad: + devise: + confirmations: + confirmed: Tu adreso de posta elektronika tyene sido konfirmado korektamente. + send_instructions: Risiviras una posta elektronika kon instruksyones para konfirmar tu adreso de posta elektronika en unos minutos. Por favor, komprova tu kuti de spam si no risivites esta posta elektronika. + send_paranoid_instructions: Si tu adreso de posta elektronika existe en muestra baza de datos, risiviras una posta elektronika kon instruksyones sobre komo konfirmar tu adreso de posta elektronika en pokos minutos. + failure: + already_authenticated: Ya te konektates kon tu kuento. + inactive: Tu kuento ainda no tyene sido aktivado. + invalid: "%{authentication_keys} o kod invalido." + last_attempt: Aprova una vez mas antes de ke tu kuento sea blokado. + locked: Tu kuento esta blokado. + not_found_in_database: Inkorekto %{authentication_keys} o kod. + pending: Tu ainda esta basho revizyon. + timeout: Tu sesyon tiene kadukado. Por favor konektate kon tu kuento de muevo para kontinuar. + unauthenticated: Kale konektarte kon tu kuento o enregistrarte antes de kontinuar. + unconfirmed: Tyenes ke konfirmar tu adreso de posta elektronika antes de kontinuar. + mailer: + confirmation_instructions: + action: Verifika tu adreso de posta elektronika + action_with_app: Konfirma i volta a %{app} + explanation: Tyenes kriyado un kuento en %{host} kon este adreso de posta elektronika. Estas a un solo klik de aktivarlo. Si no fuites tu, por favor ignora esta posta elektronika. + explanation_when_pending: Tienes solisitado una envitasyon a %{host} kon este adreso de posta elektronika. Una vez ke konfirmes tu adreso de posta elektronika, revizaremos tu solisitud. Puedes konektarte kon tu kuento para trokar tus datos o supremir tu kuento, pero no puedes akseder a la majorita de las funciones hasta ke tu kuento sea achetado. Si tu solisitud es refuzada, tus datos seran supremidos, por lo ke no ay menester de dinguna aksyon adicional por tu parte. Si no fuites tu, por favor ignora esta posta elektronika. + extra_html: Por favor, reviza las reglas del sirvidor i muestros terminos de sirvisyo. + subject: 'Mastodon: Instruksyones de konfirmasyon para %{instance}''' + title: Verifika tu adreso de posta elektronika + email_changed: + explanation: 'La posta elektronika para tu kuento esta siendo trokado a:' + extra: Si no tienes trokado tu posta elektronika, es probavle ke algun aya konsigido akseso a tu kuento. Por favor troka tu kod inmediatamente o kontakta al administrador de la instansya si no puedes konektarte kon tu kuento. + subject: 'Mastodon: Posta elektronika trokada' + title: Muevo adreso de posta elektronika + password_change: + explanation: El kod de tu kuento tyene sido trokado. + extra: Si no tienes trokado tu kod. es probavle ke algun a konsigido akseso a tu kuento. Por favor troka tu kod inmediatamente o kontakta al administrador de la instansya si no puedes konektarte kon tu kuento. + subject: 'Mastodon: Kod trokado' + title: Kod trokado + reconfirmation_instructions: + explanation: Konfirma el muevo adreso para trokar tu posta elektronika. + extra: Si no inisyates este trokamiento, por favor ignora esta posta. Este adreso de posta elektronika para el kuento de Mastodon no trokara asta ke aksedas al atadijo arriva. + subject: 'Mastodon: Konfirma posta elektronika para %{instance}' + title: Verifika tu adreso de posta elektronika + reset_password_instructions: + action: Troka el kod + explanation: Solisitates un muevo kod para tu kuento. + extra: Si no solisitates esto, por favor ignora esta posta. Tu kod no trokara asta ke tu aksedas al atadijo arriva i kriyes un muevo. + subject: 'Mastodon: Instruksyones para reinisyar kod' + title: Reinisyar kod + two_factor_disabled: + explanation: La autentifikasyon de dos pasos para tu kuento a sido inkapasitada. Agora puedes konektarte solamente uzando el adreso de posta elektronika i el kod. + subject: 'Mastodon: La autentifikasyon de dos pasos esta inkapasitada' + title: Autentifikasyon 2FA inkapasitada + two_factor_enabled: + explanation: La autentifikasyon de dos pasos para tu kuento a sido kapasitada. Se rekiere un token djenerado por la aplikasyon TOTP konektada para entrar. + subject: 'Mastodon: La autentifikasyon de dos pasos esta kapasitada' + title: Autentifikasyon 2FA aktivada + two_factor_recovery_codes_changed: + explanation: Los kodiches de rekuperasyon previos tienen sido invalidados i se djeneraron kodiches muevos. + subject: 'Mastodon: Los kodiches de rekuperasyon de dos pasos fueron rejenerados' + title: Kodiches de rekuperasyon 2FA trokados + unlock_instructions: + subject: 'Mastodon: Instruksyones para dezblokar' + webauthn_credential: + added: + explanation: La sigiente yave de sigurita tiene sido adjustada a tu kuento + subject: 'Mastodon: Mueva yave de sigurita' + title: Se tiene adjustado una mueva yave de sigurita + deleted: + explanation: La sigiente yave de sigurita a sido supremida de tu kuento + subject: 'Mastodon: Yave de sigurita supremida' + title: Una de tus yaves de sigurita tiene sido supremida + webauthn_disabled: + explanation: La autentifikasyon kon yaves de sigurita a sido inkapasitada para tu kuento. Agora el inisyo de sesyon solo es posivle utilizando el token djeenerado por la aplikasyon TOTP konektada. + subject: 'Mastodon: autentifikasyon kon yaves de sigurita inkapasitada' + title: Yaves de sigurita inkapasitadas + webauthn_enabled: + explanation: La autentifikasyon kon yave de sigurita a sido kapasitada para tu kuento. Agora tu yave de sigurita puede ser utilizada para inisyar sesyon. + subject: 'Mastodon: Autentifikasyon de yave de sigurita aktivada' + title: Yaves de sigurita kapasitadas + omniauth_callbacks: + failure: No se te pudo autentifikar dizde %{kind} porke “%{reason}”. + success: Autentifikado djustamente dizde el kuento de %{kind}. + passwords: + no_token: No puedes akseder a esta pajina si no vienes dizde una posta elektronika de restablesimyento de kod. Si vienes dizde una posta elektronika de restablesimyento de kod, por favor asigurate de utilizar el URL kompleto embiado. + send_instructions: Si tu adreso de posta elektronika existe en muestra baza de datos, risiviras un atadijo de rekuperasyon de kod en tu adreso de posta elektronika en pokos minutos. Por favor, komprova tu kuti de posta spam si no risives akeya posta elektronika. + send_paranoid_instructions: Si tu adreso de posta elektronika existe en muestra baza de datos, risiviras un atadijo de rekuperasyon de kod en tu adreso de posta elektronika en pokos minutos. Por favor, komprova tu kuti de posta no deseado si no risives akeya posta elektronika. + updated: Tu kod a sido trokado kon reusho. Tinenes entrado en kuento. + updated_not_active: Tu kod se tiene trokado kon reusho. + registrations: + destroyed: Tu kuento a sido efasado kon reusho. Asperamos verte de muevo pronto. + signed_up: Bienvenido! Te tienes enrejistrado djustamente. + signed_up_but_inactive: Te tienes enrejistrado kon reusho. Entanto, no se pudio inisyar sesyon porke tu kuento ainda no esta aktivado. + signed_up_but_locked: Te tienes enrejistrado kon reusho. Entanto, no pudites konektarte kon tu kuento porke tu kuento esta blokado. + signed_up_but_pending: Un mesaj kon un atadijo de konfirmasyon a sido enviado a tu adreso de posta elektronika. Dempues de klikar en el atadijo, revizaremos tu solisitud. Seras avizado si se acheta. + signed_up_but_unconfirmed: Un mesaj kon un atadijo de konfirmasyon a sido enviado a tu adreso de posta elektronika. Por favor, sigue el atadijo para aktivar tu kuento. Por favor, komprova tu kuti de posta spam si no risives akeya posta elektronika. + update_needs_confirmation: Tienes aktualizado tu kuento kon reusho, pero kale verifikar tu muevo adreso de posta elektronika. Por favor, komprova tu posta elektronika i sige el atadijo de konfirmasyon para konfirmar tu muevo adreso de posta elektronika. Por favor, komprova tu kuti de posta spam si no risives akeya posta elektronika. + updated: Tu kuento se aktualizo kon reusho. + sessions: + already_signed_out: Salites del kuento kon reusho. + signed_in: Konektates kon tu kuento kon reusho. + signed_out: Salites del kuento kon reusho. + unlocks: + send_instructions: En unos minutos risiviras una posta elektronika kon instruksyones para dezblokar tu kuento. Por favor, komprova tu kuti de posta spam si no risives akeya posta elektronika. + send_paranoid_instructions: Si tu kuento existe, en unos minutos risiviras una posta elektronika kon instruksyones para dezblokarlo. Por favor, reviza tu kuti de posta spam si no risives akeya posta elektronika. + unlocked: Tu kuento fue dezblokado kon reusho. Por favor, konektate kon tu kuento para kontinuar. + errors: + messages: + already_confirmed: ya estaba konfirmado, por favor aprova konektarte kon tu kuento + confirmation_period_expired: nesesita konfirmarse dentro de %{period}, por favor, solisita una mueva + expired: tiene kadukado, por favor solisita una mueva + not_found: no topado + not_locked: no estava blokado + not_saved: + one: '1 yerro impidio ke este %{resource} se guadrase:' + other: "%{count} yerros impidieron ke este %{resource} se guadrase:" diff --git a/config/locales/devise.pa.yml b/config/locales/devise.pa.yml index bb8a6c834d9c41..7d56361f633803 100644 --- a/config/locales/devise.pa.yml +++ b/config/locales/devise.pa.yml @@ -1 +1,18 @@ +--- pa: + devise: + confirmations: + confirmed: ਤੁਹਾਡੇ ਈਮੇਲ ਸਿਰਨਾਵੇਂ ਨੂੰ ਕਾਮਯਾਬੀ ਨਾਲ ਤਸਦੀਕ ਕੀਤਾ ਗਿਆ ਹੈ। + failure: + inactive: ਤੁਹਾਡਾ ਖਾਤਾ ਹਾਲੇ ਸਰਗਰਮ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ। + invalid: ਗਲਤ %{authentication_keys} ਜਾਂ ਪਾਸਵਰਡ ਹੈ। + last_attempt: ਤੁਹਾਡੇ ਖਾਤੇ ਦੇ ਲਾਕ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ ਇੱਕ ਹੋਰ ਕੋਸ਼ਿਸ਼ ਬਾਕੀ ਹੈ। + locked: ਤੁਹਾਡਾ ਖਾਤਾ ਲਾਕ ਹੋ ਗਿਆ ਹੈ। + not_found_in_database: ਗਲਤ %{authentication_keys} ਜਾਂ ਪਾਸਵਰਡ ਹੈ। + pending: ਤੁਹਾਡਾ ਖਾਤਾ ਹਾਲੇ ਵੀ ਪੜਤਾਲ ਅਧੀਨ ਹੈ। + timeout: ਤੁਹਾਡੇ ਸ਼ੈਸ਼ਨ ਦੀ ਮਿਆਦ ਪੁੱਗੀ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਫੇਰ ਲਾਗਇਨ ਕਰੋ। + unauthenticated: ਜਾਰੀ ਰੱਖਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਜਾਂ ਸਾਈਨ ਅੱਪ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। + sessions: + already_signed_out: ਕਾਮਯਾਬੀ ਨਾਲ ਸਾਈਨ ਆਉਟ ਕੀਤਾ। + signed_in: ਕਾਮਯਾਬੀ ਨਾਲ ਸਾਈਨ ਇਨ ਕੀਤਾ। + signed_out: ਕਾਮਯਾਬੀ ਨਾਲ ਸਾਈਨ ਆਉਟ ਕੀਤਾ। diff --git a/config/locales/doorkeeper.ia.yml b/config/locales/doorkeeper.ia.yml new file mode 100644 index 00000000000000..6ab26788bdf03a --- /dev/null +++ b/config/locales/doorkeeper.ia.yml @@ -0,0 +1 @@ +ia: diff --git a/config/locales/doorkeeper.ie.yml b/config/locales/doorkeeper.ie.yml new file mode 100644 index 00000000000000..83c9cc564f8f39 --- /dev/null +++ b/config/locales/doorkeeper.ie.yml @@ -0,0 +1,11 @@ +--- +ie: + doorkeeper: + grouped_scopes: + title: + follow: Seques, silentias e bloccas + mutes: Silentias + scopes: + read:mutes: vider tui silentias + write:conversations: silentiar e deleter conversationes + write:mutes: silentiar persones e conversationes diff --git a/config/locales/doorkeeper.io.yml b/config/locales/doorkeeper.io.yml index e2418e4c777aeb..a71fa95841378e 100644 --- a/config/locales/doorkeeper.io.yml +++ b/config/locales/doorkeeper.io.yml @@ -122,12 +122,14 @@ io: admin/accounts: Administrar di konti admin/all: Omna administrofuncioni admin/reports: Administro di raporti + all: Kompleta aceso a vua Mastodon-konto blocks: Restriktita bookmarks: Libromarki conversations: Konversi crypto: Intersequanta chifro favourites: Favoriziti filters: Filtrili + follow: Sequati, silencigati e blokusati follows: Sequati lists: Listi media: Mediatachaji diff --git a/config/locales/doorkeeper.lad.yml b/config/locales/doorkeeper.lad.yml new file mode 100644 index 00000000000000..f52bac39c29876 --- /dev/null +++ b/config/locales/doorkeeper.lad.yml @@ -0,0 +1,195 @@ +--- +lad: + activerecord: + attributes: + doorkeeper/application: + name: Nombre de aplikasyon + redirect_uri: URI para readreso + scopes: Ambitos + website: Sitio internetiko + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: no puede kontener un fragmento. + invalid_uri: deve ser un URI valido. + relative_uri: deve ser un URI asoluto. + secured_uri: deve ser un URI de HTTPS/SSL. + doorkeeper: + applications: + buttons: + authorize: Autoriza + cancel: Anula + destroy: Destruye + edit: Edita + submit: Embia + confirmations: + destroy: Estas siguro? + edit: + title: Edita aplikasyon + form: + error: Atyo! Komprova tu formulario + help: + native_redirect_uri: Utiliza %{native_redirect_uri} para provas lokalas + redirect_uri: Uza una linya por URI + scopes: Separa los ambitos kon espasyos. Deshalo en blanko para kulanear los ambitos predeterminados. + index: + application: Aplikasyon + callback_url: URL de callback + delete: Efasa + empty: No tienes aplikasyones. + name: Nombre + new: Mueva aplikasyon + scopes: Ambitos + show: Amostra + title: Tus aplikasyones + new: + title: Mueva aplikasyon + show: + actions: Aksyones + application_id: Yave de mushteri + callback_urls: URLs de callback + scopes: Ambitos + secret: Mushteri sekreto + title: 'Aplikasyon: %{name}' + authorizations: + buttons: + authorize: Autoriza + deny: Dezautoriza + error: + title: Un yerro tiene afitado + new: + prompt_html: "%{client_name} kere permiso para akseder tu kuento. Es una aplikasyon de terseros. Si no konfias en eya, no deverias autorizarla." + review_permissions: Reviza permisos + title: Autorizasyon rekerida + show: + title: Kopia este kodiche de autorizasyon i apegalo en la aplikasyon. + authorized_applications: + buttons: + revoke: Revoka + confirmations: + revoke: Estas siguro? + index: + authorized_at: Autorizado el %{date} + description_html: Estas son las aplikasyones ke pueden akseder tu kuento uzando el API. Si ay aplikasyones aki las kualas no rekoneses, o unas ke no se komporten bien, puedes revokar sus akseso. + last_used_at: Ultimo uzo el %{date} + never_used: Nunkua uzado + scopes: Permisos + superapp: Interno + title: Tus aplikasyones autorizadas + errors: + messages: + access_denied: El patron del rekurso o el sirvidor de autorizasyon refuzo tu solisitud. + credential_flow_not_configured: Las kredensyalas de kod del patron del rekurso no funksyonan porke Doorkeeper.configure.resource_owner_from_credentials no esta konfigurado. + invalid_client: La autentifikasyon del mushteri no reushida porke el mushteri no es konesido, no ay autentifikasyon del mushteri inkluyida, o el metodo de autentifikasyon no es suportada. + invalid_grant: La konsesyon de autorizasyon ofresida es invalida, kadukada, revokada, no koensida kon el URI de readreso utilizado en la solisitud de autorizasyon, o fue emitida para otro mushteri. + invalid_redirect_uri: El URI de readreso inkluydo no es valido. + invalid_request: + missing_param: 'Parametro rekerido no topado: %{value}.' + request_not_authorized: Solisitud deve ser autorizada. Parametro rekerido para autorizar la solisitud no topado o no valido. + unknown: La solisitud no tiene un parametro rekerido, inkluye una valuta de parametro no suportada o es yerrado de otra forma. + invalid_resource_owner: Las kredensyalas de patron del rekurso no son validas o patron del rekurso no topado + invalid_scope: El ambito pedido es invalido, no konesido o yerrado. + invalid_token: + expired: El token de akseso tiene kadukado + revoked: El token de akseso fue revokado + unknown: El token de akseso no es valido + resource_owner_authenticator_not_configured: El patron del rekurso no topado porke Doorkeeper.configure.resource_owner_authenticator no esta konfigurado. + server_error: El sirvidor de autorizasyon topo una kondisyon no ekspektada ke no le permite kumplir kon la solisitud. + temporarily_unavailable: El sirvidor de autorizasyon agora no puede realizar la solisitud porke el sirvidor esta sobrekargado o basho mantenimiento. + unauthorized_client: El mushteri no esta autorizado para realizar esta solisitud uzando este metodo. + unsupported_grant_type: El tipo de konsesyon de autorizasyon no esta suportado por el sirvidor de autentifikasyon. + unsupported_response_type: El sirvidor de autorizasyon no suporta este tipo de repuesta. + flash: + applications: + create: + notice: Aplikasyon kriyada. + destroy: + notice: Aplikasyon efasada. + update: + notice: Aplikasyon aktualizada. + authorized_applications: + destroy: + notice: Aplikasyon revokada. + grouped_scopes: + access: + read: Akseso solo de meldar + read/write: Akseso de meldar i eskrivir + write: Akseso solo de eskrivir + title: + accounts: Kuentos + admin/accounts: Administrasyon de kuentos + admin/all: Todas las funksyones administrativas + admin/reports: Administrasyon de raportos + all: Akseso total a tu kuento de Mastodon + blocks: Blokos + bookmarks: Markadores + conversations: Konversasyones + crypto: Shifrasyon de lado a lado + favourites: Favoritos + filters: Filtros + follow: Segimientos, silensiasyones i blokos + follows: Segimientos + lists: Listas + media: Aneksos de multimedia + mutes: Silensiasyones + notifications: Avizos + push: Avizos arrepushados + reports: Raportos + search: Bushkeda + statuses: Publikasyones + layouts: + admin: + nav: + applications: Publikasyones + oauth2_provider: Prokurador de OAuth2 + application: + title: Autorizasyon OAuth rekerida + scopes: + admin:read: meldar todos los datos en el sirvidor + admin:read:accounts: meldar informasyon sensivle en todos los kuentos + admin:read:canonical_email_blocks: meldar informasyon sensivle de todos blokos kanonikos de posta + admin:read:domain_allows: meldar informasyon sensivle de todos los domenos permitidos + admin:read:domain_blocks: meldar informasyon sensivle de todos los blokos de domeno + admin:read:email_domain_blocks: meldar informasyon sensivle de todos los blokos de domenos de posta + admin:read:ip_blocks: meldar informasyon sensivle de todos los blokos de IP + admin:read:reports: meldar informasyon sensivle de todos los raportos i kuentos raportados + admin:write: modifikar todos los datos en el sirvidor + admin:write:accounts: fazer aksyones de moderasyon en kuentos + admin:write:canonical_email_blocks: fazer aksyones de moderasyon en blokos kanonikos de posta + admin:write:domain_allows: fazer aksyones de moderasyon en domenos permitidos + admin:write:domain_blocks: fazer aksyones de moderasyon en blokos de domeno + admin:write:email_domain_blocks: fazer aksyones de moderasyon en blokos de domenos de posta + admin:write:ip_blocks: fazer aksyones de moderasyon en blokos de IP + admin:write:reports: fazer aksyones de moderasyon en raportos + crypto: kulanear shifrasyon de lado a lado + follow: modifikar relasyones de kuentos + push: risivir tus avizos arrepushados + read: meldar todos tus datos de kuento + read:accounts: ver enformasyon de kuentos + read:blocks: ver tus blokos + read:bookmarks: ver tus markadores + read:favourites: ver ke te plaze + read:filters: ver tus filtros + read:follows: ver a ken siges + read:lists: ver tus listas + read:mutes: ver tus silensiasyones + read:notifications: ver tus avizos + read:reports: ver tus raportos + read:search: bushkar en tu nombre + read:statuses: ver todas las publikasyones + write: modifikar todos los datos de tu kuento + write:accounts: modifikar tu profil + write:blocks: blokar kuentos i domenos + write:bookmarks: markar publikasyones + write:conversations: silensyar i efasar konversasyones + write:favourites: indikar ke publikasyones te plazen + write:filters: kriyar filtros + write:follows: segir a djente + write:lists: kriyar listas + write:media: kargar dosyas multimedia + write:mutes: silensyar a djente i konversasyones + write:notifications: alimpiar tus avizos + write:reports: raportar a otras personas + write:statuses: publikar publikasyones diff --git a/config/locales/doorkeeper.pa.yml b/config/locales/doorkeeper.pa.yml index bb8a6c834d9c41..4ed0c7db658f32 100644 --- a/config/locales/doorkeeper.pa.yml +++ b/config/locales/doorkeeper.pa.yml @@ -1 +1,85 @@ +--- pa: + activerecord: + attributes: + doorkeeper/application: + name: ਐਪਲੀਕੇਸ਼ਨ ਦਾ ਨਾਂ + website: ਐਪਲੀਕੇਸ਼ਨ ਵੈੱਬਸਾਈਟ + doorkeeper: + applications: + buttons: + authorize: ਪਰਮਾਣਿਤ + cancel: ਰੱਦ ਕਰੋ + destroy: ਖਾਰਜ + edit: ਸੋਧੋ + submit: ਭੇਜੋ + confirmations: + destroy: ਪੱਕਾ? + edit: + title: ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਸੋਧੋ + form: + error: ਓਹ ਹੋ! ਸੰਭਾਵਿਤ ਗਲਤੀਆਂ ਲਈ ਆਪਣੇ ਫਾਰਮ ਦੀ ਜਾਂਚ ਕਰੋ + index: + application: ਐਪਲੀਕੇਸ਼ਨ + callback_url: ਕਾਲਬੈਕ URL + delete: ਹਟਾਓ + empty: ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਐਪਲੀਕੇਸ਼ਨ ਨਹੀਂ ਹੈ। + name: ਨਾਂ + new: ਨਵੀਂ ਐਪਲੀਕੇਸ਼ਨ + scopes: ਸਕੋਪ + show: ਵੇਖਾਓ + title: ਤੁਹਾਡੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ + new: + title: ਨਵੀਂ ਐਪਲੀਕੇਸ਼ਨ + show: + actions: ਕਾਰਵਾਈਆਂ + application_id: ਕਲਾਈਂਟ ਕੁੰਜੀ + callback_urls: ਕਾਲਬੈਕ URL + scopes: ਸਕੋਪ + secret: ਕਲਾਈਂਟ ਭੇਤ + title: 'ਐਪਲੀਕੇਸ਼ਨ: %{name}' + authorizations: + buttons: + authorize: ਪਰਮਾਣਿਤ + deny: ਇਨਕਾਰ ਕਰੋ + error: + title: ਗਲਤੀ ਆਈ ਹੈ + new: + review_permissions: ਇਜਾਜ਼ਤਾਂ ਦੀ ਪੜਤਾਲ ਕਰੋ + title: ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ + authorized_applications: + buttons: + revoke: ਮਨਸੂਖ ਕਰੋ + confirmations: + revoke: ਪੱਕਾ? + index: + authorized_at: "%{date} ਨੂੰ ਪਰਮਾਣਿਤ ਕੀਤਾ" + last_used_at: "%{date} ਨੂੰ ਆਖਰੀ ਵਾਰ ਵਰਤਿਆ" + never_used: ਕਦੀ ਨਹੀਂ ਵਰਤਿਆ + scopes: ਇਜਾਜ਼ਤਾਂ + superapp: ਅੰਦਰੂਨੀ + grouped_scopes: + title: + accounts: ਖਾਤੇ + blocks: ਪਾਬੰਦੀਸ਼ੁਦਾ + bookmarks: ਬੁੱਕਮਾਰਕ + crypto: ਸਿਰੇ-ਤੋਂ-ਸਿਰੇ ਤੱਕ ਇੰਕ੍ਰਿਪਸ਼ਨ + favourites: ਮਨਪਸੰਦ + filters: ਫਿਲਟਰ + follow: ਫ਼ਾਲੋ, ਮੌਨ ਅਤੇ ਪਾਬੰਦੀ ਲਾਏ + follows: ਫ਼ਾਲੋ + lists: ਸੂਚੀਆਂ + media: ਨੱਥੀ ਕੀਤਾ ਮੀਡੀਆ + mutes: ਮੌਨ + notifications: ਨੋਟੀਫਿਕੇਸ਼ਨ + reports: ਰਿਪੋਰਟਾਂ + search: ਖੋਜੋ + statuses: ਪੋਸਟਾਂ + layouts: + admin: + nav: + applications: ਐਪਲੀਕੇਸ਼ਨਾਂ + scopes: + write:follows: ਲੋਕਾਂ ਨੂੰ ਫ਼ਾਲੋ ਕਰੋ + write:lists: ਸੂਚੀਆਂ ਬਣਾਓ + write:media: ਮੀਡੀਆ ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ diff --git a/config/locales/eu.yml b/config/locales/eu.yml index e3062d9dff77b8..bcf8540e74295c 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -777,6 +777,8 @@ eu: open: Edonork eman dezake izena security: authorized_fetch: Eskatu autentifikazioa federatutako zerbitzarietatik + authorized_fetch_hint: Zerbitzari federatuen autentifikazioa eskatzeak erabiltzaile-mailako zein zerbitzari-mailako blokeak zorrotzago betearaztea ahalbidetzen du. Hala ere, horrek errendimendu galera dakar, zure erantzunen irismena murrizten du eta baliteke federatutako zerbitzu batzuekin bateragarritasun-arazoak sortu ahal izatea. Horrez gain, horrek ez du eragotziko aktore dedikatuek zure mezu eta kontu publikoak eskuratzea. + authorized_fetch_overridden_hint: Une honetan ezin duzu ezarpen hau aldatu ingurune-aldagai batek gainidazten duelako. federation_authentication: Federazio autentifikazioaren betearaztea title: Zerbitzariko ezarpenak site_uploads: @@ -784,6 +786,7 @@ eu: destroyed_msg: Guneko igoera ongi ezabatu da! software_updates: critical_update: Kritikoa — mesedez, eguneratu azkar + description: Zure Mastodon instalazioa eguneratuta mantentzea gomendatzen da azken konponketa eta hobekuntzak edukitzeko. Gainera, batzuetan funtsezkoa da Mastodon garaiz eguneratzea segurtasun-arazoak saihesteko. Arrazoi horiengatik, Mastodonek eguneratzeak egiaztatzen ditu 30 minuturo, eta zure posta elektronikoko jakinarazpen-hobespenen arabera jakinaraziko dizu. documentation_link: Informazio gehiago release_notes: Bertsio oharrak title: Eguneraketak eskuragarri @@ -791,6 +794,7 @@ eu: types: major: Argitalpen handia minor: Argitalpen txikia + patch: Partxe eguneraketa — akatsen konponketa eta aplikatzeko aldaketa errazak version: Bertsioa statuses: account: Egilea @@ -976,6 +980,7 @@ eu: next_steps: Apelazioa onartu dezakezu moderazio erabakia desegiteko, edo ez ikusia egin. subject: "%{username} erabiltzailea %{instance} instantziako moderazio erabaki bat apelatzen ari da" new_critical_software_updates: + body: Mastodon-en bertsio kritiko berriak kaleratu dira, agian lehenbailehen eguneratu nahi duzu! subject: "%{instance} ek eguneraketa kritikoak eskuragarri ditu!" new_pending_account: body: Kontu berriaren xehetasunak azpian daude. Eskaera hau onartu edo ukatu dezakezu. @@ -1037,10 +1042,12 @@ eu: hint_html: Azken kontu bat! Gizakia zarela berretsi behar dugu (zabor-kontuak kanpoan mantentzeko baino ez da!) Ebatzi azpiko CAPTCHA eta sakatu "Jarraitu". title: Segurtasun txekeoa confirmations: + awaiting_review: Zure helbide elektronikoa baieztatu da! %{domain} lan taldea zure erregistroa berrikusten ari da. Mezu elektroniko bat jasoko duzu zure kontua onartzen badute! awaiting_review_title: Zure izen-ematea berrikusten ari da clicking_this_link: lotura hau klikatzen login_link: hasi saioa proceed_to_login_html: Orain jarraitu dezakezu %{login_link} -era. + redirect_to_app_html: "%{app_name} aplikaziora berbideratua izan beharko zenuke. Hori gertatu ez bada, saiatu %{clicking_this_link} edo eskuz itzuli." registration_complete: Osatuta dago orain zure izen-ematea %{domain} -en! welcome_title: Ongi etorri, %{name}! wrong_email_hint: Helbide-elektroniko hori zuzena ez bada, kontuaren ezarpenetan alda dezakezu. diff --git a/config/locales/ia.yml b/config/locales/ia.yml new file mode 100644 index 00000000000000..64315d177fd089 --- /dev/null +++ b/config/locales/ia.yml @@ -0,0 +1,52 @@ +--- +ia: + admin: + accounts: + delete: Deler datos + deleted: Delite + display_name: Nomine visibile + enabled: Activate + location: + all: Toto + title: Location + moderation: + disabled: Disactivate + reset: Reinitialisar + reset_password: Reinitialisar contrasigno + search: Cercar + security: Securitate + username: Nomine de usator + custom_emojis: + copy: Copiar + create_new_category: Crear nove categoria + delete: Deler + domain_blocks: + confirm_suspension: + cancel: Cancellar + export: Exportar + import: Importar + email_domain_blocks: + add_new: Adder nove + delete: Deler + export_domain_allows: + no_file: Necun file seligite + follow_recommendations: + language: Per lingua + status: Stato + instances: + dashboard: + instance_languages_dimension: Linguas principal + delivery: + unavailable: Non disponibile + private_comment: Commento private + public_comment: Commento public + invites: + filter: + available: Disponibile + ip_blocks: + delete: Deler + expires_in: + '1209600': 2 septimanas + '15778476': 6 menses + '2629746': 1 mense + '86400': 1 die diff --git a/config/locales/ie.yml b/config/locales/ie.yml new file mode 100644 index 00000000000000..94df7d1454e90e --- /dev/null +++ b/config/locales/ie.yml @@ -0,0 +1,1414 @@ +--- +ie: + about: + about_mastodon_html: 'Li social rete del futur: sin reclams, sin supervision de corporationes, con un dessine etical e decentralisation! Repossede vor data med Mastodon!' + contact_missing: Ne assignat + contact_unavailable: Ne disponibil + hosted_on: Mastodon logiat che %{domain} + title: Pri + accounts: + follow: Sequer + followers: + one: Sequitor + other: Sequitores + following: Sequent + instance_actor_flash: Ti-ci conto es un virtual actor usat por representer li servitor self e null individual usator. It es usat por federational rasones e deve ne esser suspendet. + last_active: ultim activitá + link_verified_on: Proprietá de ti-ci ligament esset verificat ye %{date} + nothing_here: Hay nullcos ci! + pin_errors: + following: Tu deve ja sequer li person quem tu vole indossar + posts: + one: Posta + other: Postas + posts_tab_heading: Postas + admin: + account_actions: + action: Acter + title: Far un moderatori action a %{acct} + account_moderation_notes: + create: Scrir un note + created_msg: Moderatori nota creat successosimen! + destroyed_msg: Moderatori nota destructet successosimen! + accounts: + add_email_domain_block: Bloccar email-dominia {domain} + approve: Aprobar + approved_msg: Successosimen aprobat li aplication de registration de %{username} + are_you_sure: Es tu cert? + avatar: Avatar + by_domain: Dominia + change_email: + changed_msg: Email-adresse changeat successosimen! + current_email: Actual e-post + label: Cambiar li e-post + new_email: Nov e-post + submit: Cambiar li e-post + title: Changear li email-adresse de %{username} + change_role: + changed_msg: Rol changeat successosimen! + label: Cambiar li rol + no_role: Sin rol + title: Changear li rol de %{username} + confirm: Confirmar + confirmed: Confirmat + confirming: Atende confirmation + custom: Personalisat + delete: Deleter data + deleted: Deletet + demote: Demoer + destroyed_msg: Li data de %{username} es nu in li linea por esser deletet iminentmen + disable: Gelar + disable_sign_in_token_auth: Desactivisar autentication per email-claves + disable_two_factor_authentication: Desactivisar 2FA + disabled: Gelat + display_name: Visibil nómine + domain: Dominia + edit: Modificar + email: E-post + email_status: Statu del e-post + enable: Desgelar + enable_sign_in_token_auth: Activisar autentication per email-claves + enabled: Activ + enabled_msg: Successosimen desgelat li conto de %{username} + followers: Sequitores + follows: Seque + inbox_url: Inbuxe URL + invite_request_text: Rason por adhesion + invited_by: Invitat de + ip: IP + joined: Adheret + location: + all: Omni + local: Local + remote: Lontan + title: Localisation + login_status: Statu de intration + media_attachments: Medie-atachamentes + memorialize: Converter al memoriale + memorialized: Memorialisat + memorialized_msg: Successosimen convertet %{username} a un conto de memoriale + moderation: + active: Activ + all: Omni + disabled: Desactivat + pending: Atendent + silenced: Limitat + suspended: Suspendet + title: Moderation + moderation_notes: Notes de moderator + most_recent_activity: Ultim activitá + most_recent_ip: Ultim IP + no_account_selected: Null contos esset changeat pro que null contos esset selectet + no_limits_imposed: Null límites imposit + no_role_assigned: Null rol assignat + not_subscribed: Ne abonnat + pending: Atende li revision + perform_full_suspension: Suspender + previous_strikes: Precedent violationes + previous_strikes_description_html: + one: Ti conto have un violation. + other: Ti conto have %{count} violationes. + promote: Promoer + protocol: Protocol + public: Public + redownload: Recargar li profil + redownloaded_msg: Successosimen recargat li profil de %{username} del original fonte + reject: Rejecter + rejected_msg: Successosimen rejectet li aplication de registration de %{username} + remote_suspension_irreversible: Li data de ti-ci conto ha esset deletet ínreversibilmen. + remote_suspension_reversible_hint_html: Li conto ha esset suspendet che su servitor, e li data va esser completmen removet ye %{date}. Til tande, li lontan servitor posse restaurar ti conto sin quelcunc mal efectes. Si tu vole remover omni data del conto ínmediatmen, tu posse far it in infra. + remove_avatar: Remover li avatar + removed_avatar_msg: Successosimen removet li avatar-image de %{username} + removed_header_msg: Successosimen removet li cap-image de %{username} + resend_confirmation: + already_confirmed: Ti usator ja esset confirmat + send: Inviar li confirmation denov + success: Ligament de confirmation successosimen misset! + reset: Reiniciar + reset_password: Reiniciar passa-parol + resubscribe: Reabonnar + role: Rol + search: Serchar + search_same_email_domain: Altri usatores con li sam email-dominia + search_same_ip: Altri usatores con li sam IP + security: Securitá + security_measures: + only_password: Solmen un passa-parol + password_and_2fa: Passa-parol e 2FA + sensitive: Marcar sensitiv + sensitized: Marcat quam sensitiv + shared_inbox_url: Partit URL de inbuxe + show: + created_reports: Raportes fat + targeted_reports: Raportat de altres + silence: Limitar + silenced: Limitat + statuses: Postas + strikes: Precedent violationes + subscribe: Abonnar + suspend: Suspender + suspended: Suspendet + suspension_irreversible: Li data de ti-ci conto ha esset deletet ínreversibilmen. Tu posse dessuspender li conto por far it usabil ma it ne va reganiar quelcunc data quel it anteriorimen havet. + suspension_reversible_hint_html: Li conto ha esset suspendet, e li data va esser completmen removet ye %{date}. Til tande, li conto posse esser restaurat sin quelcunc mal efectes. Si tu vole remover omni data del conto ínmediatmen, tu posse far it in infra. + title: Contos + unblock_email: Desbloccar email-adresse + unblocked_email_msg: Successosimen desbloccat li email-adresse de %{username} + unconfirmed_email: Ínconfirmat email-adresse + undo_sensitized: Desmarcar quam sensitiv + undo_silenced: Deslimitar + undo_suspension: Desfar li suspension + unsilenced_msg: Successosimen deslimitat li conto de %{username} + unsubscribe: Desabonnar + unsuspended_msg: Successosimen dessuspendet li conto de %{username} + username: Nómine de usator + view_domain: Vider summarium pri li dominia + warn: Admonir + web: Web + whitelisted: Permisset por federation + action_logs: + action_types: + approve_appeal: Aprobar Apelle + approve_user: Aprobar usator + assigned_to_self_report: Assignar Raporte + change_email_user: Changear li email-adresse del usator + change_role_user: Changear li rol del usator + confirm_user: Confirmar usator + create_account_warning: Crear admonimentes + create_announcement: Crear un proclamation + create_canonical_email_block: Crear Email-Blocca + create_custom_emoji: Crear Customisat Emoji + create_domain_allow: Crear Dominia-Permisse + create_domain_block: Crear Dominia-Blocca + create_email_domain_block: Crear Email-Dominia-Blocca + create_ip_block: Crear regules por IP + create_unavailable_domain: Crear Dominia Índisponibil + create_user_role: Crear roles + demote_user: Demoer Usator + destroy_announcement: Deleter proclamation + destroy_canonical_email_block: Deleter Email-Blocca + destroy_custom_emoji: Deleter Customisat Emoji + destroy_domain_allow: Deleter Dominia-Permisse + destroy_domain_block: Deleter Dominia-Blocca + destroy_email_domain_block: Deleter Email-Dominia-Blocca + destroy_instance: Purgar Dominia + destroy_ip_block: Deleter regul por IP + destroy_status: Deleter Posta + destroy_unavailable_domain: Deleter Dominia Índisponibil + destroy_user_role: Destructer Rol + disable_2fa_user: Desactivisar 2FA + disable_custom_emoji: Desactivisar Customisat Emoji + disable_sign_in_token_auth_user: Desactivisar autentication per email-claves por usator + disable_user: Desactivisar Usator + enable_custom_emoji: Activisar Customisat Emoji + enable_sign_in_token_auth_user: Activisar autentication per email-claves por usator + enable_user: Activisar Usator + memorialize_account: Memorialisar Conto + promote_user: Promoer Usator + reject_appeal: Rejecter Apelle + reject_user: Rejecter Usator + remove_avatar_user: Remover Avatar + reopen_report: Reaperter Raporte + resend_user: Reinviar Confirmation + reset_password_user: Reiniciar Passa-parol + resolve_report: Resoluer Raporte + sensitive_account: Fortiar que medie de ti conto es marcat quam sensitiv + silence_account: Limitar Conto + suspend_account: Suspender Conto + unassigned_report: Deassignar Raporte + unblock_email_account: Desbloccar email-adresse + unsensitive_account: Desfar li fortiation que medie de ti conto es marcat quam sensitiv + unsilence_account: Deslimitar Conto + unsuspend_account: Dessuspender Conto + update_announcement: Actualisar un proclamation + update_custom_emoji: Actualisar Customisat Emoji + update_domain_block: Actualisar Dominia-Blocca + update_ip_block: Actualisar regul por IP + update_status: Actualisar Posta + update_user_role: Actualisar Rol + actions: + approve_appeal_html: "%{name} aprobat li apelle de %{target} contra un decision de moderation" + approve_user_html: "%{name} aprobat li registration de %{target}" + assigned_to_self_report_html: "%{name} assignat raporte %{target} a su self" + change_email_user_html: "%{name} changeat li email-adresse de usator %{target}" + change_role_user_html: "%{name} changeat li rol de %{target}" + confirm_user_html: "%{name} confirmat li email-adresse de usator %{target}" + create_account_warning_html: "%{name} dat un admoniment a %{target}" + create_announcement_html: "%{name} creat li nov proclamation %{target}" + create_canonical_email_block_html: "%{name} bloccat email con li hash %{target}" + create_custom_emoji_html: "%{name} cargat nov emoji %{target}" + create_domain_allow_html: "%{name} permisset federation con dominia %{target}" + create_domain_block_html: "%{name} bloccat dominia %{target}" + create_email_domain_block_html: "%{name} bloccat email-dominia %{target}" + create_ip_block_html: "%{name} creat regul por IP %{target}" + create_unavailable_domain_html: "%{name} haltat liveration a dominia %{target}" + create_user_role_html: "%{name} creat li rol %{target}" + demote_user_html: "%{name} demoet li usator %{target}" + destroy_announcement_html: "%{name} deletet li proclamation %{target}" + destroy_canonical_email_block_html: "%{name} desbloccat email con li hash %{target}" + destroy_custom_emoji_html: "%{name} deletet emoji %{target}" + destroy_domain_allow_html: "%{name} interdictet federation con dominia %{target}" + destroy_domain_block_html: "%{name} desbloccat dominia %{target}" + destroy_email_domain_block_html: "%{name} desbloccat email-dominia %{target}" + destroy_instance_html: "%{name} purgat dominia %{target}" + destroy_ip_block_html: "%{name} deletet regul por IP %{target}" + destroy_status_html: "%{name} removet posta de %{target}" + destroy_unavailable_domain_html: "%{name} recomensat liveration a dominia %{target}" + destroy_user_role_html: "%{name} deletet li rol %{target}" + disable_2fa_user_html: "%{name} desactivisat 2-factor postulation por li usator %{target}" + disable_custom_emoji_html: "%{name} desactivisat emoji %{target}" + disable_sign_in_token_auth_user_html: "%{name} desactivisat autentication per email-clave por %{target}" + disable_user_html: "%{name} desactivisat li abilitá de %{target} a intrar" + enable_custom_emoji_html: "%{name} activisat emoji %{target}" + enable_sign_in_token_auth_user_html: "%{name} activisat autentication per email-clave por %{target}" + enable_user_html: "%{name} activisat li abilitá de %{target} a intrar" + memorialize_account_html: "%{name} fat li conto de %{target} un págine de memorial" + promote_user_html: "%{name} promoet li usator %{target}" + reject_appeal_html: "%{name} rejectet li apelle de %{target} contra un decision de moderation" + reject_user_html: "%{name} rejectet li registration de %{target}" + remove_avatar_user_html: "%{name} removet li avatar de %{target}" + reopen_report_html: "%{name} reapertet raporte %{target}" + resend_user_html: "%{name} remisset un confirmation-email a %{target}" + reset_password_user_html: "%{name} reiniciat li passa-parol del usator %{target}" + resolve_report_html: "%{name} soluet raporte %{target}" + sensitive_account_html: "%{name} marcat li medie de %{target} quam sensitiv" + silence_account_html: "%{name} limitat li conto de %{target}" + suspend_account_html: "%{name} suspendet li conto de %{target}" + unassigned_report_html: "%{name} deassignat raporte %{target}" + unblock_email_account_html: "%{name} desbloccat li email-adresse de %{target}" + unsensitive_account_html: "%{name} desmarcat li medie de %{target} quam sensitiv" + unsilence_account_html: "%{name} deslimitat li conto de %{target}" + unsuspend_account_html: "%{name} dessuspendet li conto de %{target}" + update_announcement_html: "%{name} actualisat li proclamation %{target}" + update_custom_emoji_html: "%{name} actualisat emoji %{target}" + update_domain_block_html: "%{name} actualisat li dominia-blocca de %{target}" + update_ip_block_html: "%{name} changeat regul por IP %{target}" + update_status_html: "%{name} actualisat posta de %{target}" + update_user_role_html: "%{name} changeat li rol %{target}" + deleted_account: deletet conto + filter_by_action: Filtrar per action + filter_by_user: Filtrar per usator + announcements: + destroyed_msg: Proclamation deletet successosimen! + edit: + title: Redacter proclamation + empty: Null proclamationes trovat. + live: Activ + new: + create: Crear un proclamation + title: Nov proclamation + publish: Publicar + published_msg: Proclamation publicat successosimen! + scheduled_for: Planat por %{time} + scheduled_msg: Proclamation planat por publication! + title: Proclamationes + unpublish: Despublicar + unpublished_msg: Proclamation despublicat successosimen! + updated_msg: Proclamation actualisat successosimen! + critical_update_pending: Urgente actualisation atendent + custom_emojis: + assign_category: Assignar categorie + by_domain: Dominia + copied_msg: Successosimen creat un local copie del emoji + copy: Copiar + copy_failed_msg: Ne posset crear un local copie de ti-ta emoji + create_new_category: Crear nov categorie + created_msg: Emoji successosimen creat! + delete: Deleter + destroyed_msg: Emoji successosimen deletet! + disable: Desactivisar + disabled: Desactivisat + disabled_msg: Successosimen desactivisat ti emoji + emoji: Emoji + enable: Activar + enabled: Activ + enabled_msg: Successosimen activisat ti emoji + image_hint: PNG o GIF minu quam %{size} + list: Inlistar + listed: Inlistat + new: + title: Adjunter nov customisat emoji + no_emoji_selected: Null emoji esset changeat pro que null esset selectet + not_permitted: Tu ne es permisset far ti action + shortcode_hint: Adminim 2 carácteres, solmen lítteres, ciffres e sublineas + title: Customisat emoji + uncategorized: Íncategorisat + unlist: Delistar + unlisted: Delistat + update_failed_msg: Ne posset actualisar ti emoji + updated_msg: Emoji successosimen actualisat! + upload: Cargar + dashboard: + active_users: activ usatores + interactions: interactiones + media_storage: Inmagasination de medie + new_users: nov usatores + opened_reports: raportes apertet + pending_appeals_html: + one: "%{count} pendent apelle" + other: "%{count} pendent apelles" + pending_reports_html: + one: "%{count} pendent raporte" + other: "%{count} pendent raportes" + pending_tags_html: + one: "%{count} pendent hashtag" + other: "%{count} pendent hashtags" + pending_users_html: + one: "%{count} pendent usator" + other: "%{count} pendent usatores" + resolved_reports: raportes soluet + software: Programmas + sources: Fontes de adhesiones + space: Usation de spacie + title: Panel de control + top_languages: Max activ lingues + top_servers: Max activ servitores + website: Websitu + disputes: + appeals: + empty: Null apelles trovat. + title: Apelles + domain_allows: + add_new: Permisse federation con dominia + created_msg: Dominia ha esset successosimen permisset por federation + destroyed_msg: Dominia ha esset interdictet por federation + export: Exportar + import: Importar + undo: Interdicter federation con dominia + domain_blocks: + add_new: Adjunte nov dominia-blocca + confirm_suspension: + cancel: Anullar + confirm: Suspender + permanent_action: Desfar li suspension ne va restaurar quelcunc data o relation. + preamble_html: Tu va suspender %{domain} e su subdominias. + remove_all_data: Ti va remover omni contenete, medie e profil-data por li contos de ti-ci dominia de tui servitor. + stop_communication: Tui servitor va haltar comunication con ti servitores. + title: Confirmar dominia-blocca por %{domain} + undo_relationships: Ti va desfar quelcunc seque-relation inter contos de ti servitores e tis de tui. + created_msg: On tracta li dominia-blocca nu + destroyed_msg: Dominia-blocca ha esset desfat + domain: Dominia + edit: Modificar dominia-blocca + existing_domain_block: Tu ja ha imposit plu strict límites sur %{name}. + existing_domain_block_html: Tu ja ha imposit plu strict límites sur %{name}, tu besona desbloccar it erst. + export: Exportar + import: Importar + new: + create: Crear blocca + hint: Li dominia-blocca ne va prevenir li creation de intradas por contos in li database, ma it va retroactivmen e automaticmen aplica specific metodes de moderation a ti contos. + severity: + desc_html: "Limitar va far que postas de contos che ti dominia es ínvisibil a quicunc ne ja seque les. Suspender va remover omni contenete, medie e profil-data por li contos de ti dominia de tui servitor. Usa Null si tu vole simplicmen rejecter medie-files." + noop: 'Null' + silence: Limitar + suspend: Suspender + title: Nov dominia-blocca + no_domain_block_selected: Null dominia-bloccas esset changeat pro que null esset selectet + not_permitted: Tu ne es permisset far ti action + obfuscate: Obscurar dominia-nómine + obfuscate_hint: Partialmen obscurar li dominia-nómine in li liste si li publication de dominia-limitationes es activisat + private_comment: Privat comenta + private_comment_hint: Comenta pri ti dominia-limitation por usation internal del moderatores. + public_comment: Public comenta + public_comment_hint: Comenta pri ti dominia-limitation por li general public, si li publication del liste de dominia-limitationes es activisat. + reject_media: Rejecter medie-files + reject_media_hint: Remove medie-files inmagasinat localmen e refusa descargar quelcunc plu in li futur. Ínpertinent por suspensiones + reject_reports: Rejecter raportes + reject_reports_hint: Ignorar omni raportes venient de ti dominia. Ínpertinent por suspensiones + undo: Desfar dominia-blocca + view: Vider dominia-blocca + email_domain_blocks: + add_new: Adjunter un nov + attempts_over_week: + one: "%{count} registration-prova durant li ultim semane" + other: "%{count} registration-prova durant li ultim semane" + created_msg: Successosimen bloccat email-dominia + delete: Deleter + dns: + types: + mx: Registre MX + domain: Dominia + new: + create: Adjunter dominia + resolve: Resolver un dominia + title: Bloccar nov email-dominia + no_email_domain_block_selected: Null email-dominia-bloccas esset changeat pro que null esset selectet + not_permitted: Ne permisset + title: Bloccat email-dominias + export_domain_allows: + new: + title: Importar permisset dominias + no_file: Null file selectet + export_domain_blocks: + import: + description_html: Tu va importar un liste de dominia-bloccas. Ples controlar ti liste tre cuidosimen, precipue si tu ne creat li liste personalmen. + existing_relationships_warning: Existent seque-relationes + private_comment_description_html: 'Por auxiliar te saver de u veni importat bloccas, importat bloccas va esser creat con li sequent privat comenta: %{comment}' + private_comment_template: Importat de %{source} ye %{date} + title: Importar dominia-bloccas + invalid_domain_block: 'Un o plu dominia-bloccas esset omisset pro li sequent errore(s): %{error}' + new: + title: Importar dominia-bloccas + no_file: Null file selectet + follow_recommendations: + description_html: "Seque-recomandationes auxilia nov usatores trovar interessant contenete. Quande un usator ne ha interactet con altres suficentmen por generar personalisat seque-recomandationes, ti contos es recomandat vicemen. Ili es recalculat dialmen de un mixtura de contos con li max mult recent interactiones e li max alt númeres de local sequitores por un specificat lingue." + language: Por li lingue + status: Statu + suppress: Supresser seque-recomandation + suppressed: Supresset + title: Seque-recomandationes + unsuppress: Restaurar seque-recomandation + instances: + availability: + title: Disponibilitá + warning: Li ultim prova conexer a ti servitor ha esset ínsuccessosi + back_to_all: Omni + back_to_limited: Limitat + back_to_warning: Admonit + by_domain: Dominia + confirm_purge: Vole tu vermen permanentmen deleter data de ti dominia? + content_policies: + comment: Internal nota + policies: + reject_media: Rejecter medie + reject_reports: Rejecter raportes + silence: Limitar + suspend: Suspender + policy: Politica + reason: Visibil rason + title: Politicas pri contenete + dashboard: + instance_accounts_dimension: Max sequet contos + instance_accounts_measure: inmagasinat contos + instance_followers_measure: nor sequitores ta + instance_follows_measure: lor sequitores ci + instance_languages_dimension: Max grand lingues + delivery: + unavailable: Índisponibil + delivery_error_hint: Si liveration ne es possibil durant %{count} dies, it va esser marcat automaticmen quam ínliverabil. + destroyed_msg: Data de %{domain} es nu in li linea por iminent deletion. + empty: Null dominias trovat. + known_accounts: + one: "%{count} conosset conto" + other: "%{count} conosset contos" + moderation: + all: Omni + limited: Limitat + title: Moderation + private_comment: Privat comenta + public_comment: Public comenta + purge: Purgar + title: Federation + total_blocked_by_us: Bloccat de nos + total_followed_by_them: Sequet de les + total_followed_by_us: Sequet de nos + total_reported: Raportes pri les + total_storage: Medie-atachamentes + totals_time_period_hint_html: Li totales monstrat in infra include data por omni témpor. + unknown_instance: Actualmen hay null registre de ti dominia che ti-ci servitor. + invites: + deactivate_all: Desactivisar omni + filter: + all: Omni + available: Disponibil + expired: Expirat + title: Filtre + title: Invitationes + ip_blocks: + add_new: Crear regul + created_msg: Successosimen adjuntet nov IP-regul + delete: Deleter + expires_in: + '1209600': 2 semanes + '15778476': 6 mensus + '2629746': 1 mensu + '31556952': 1 annu + '86400': 1 die + '94670856': 3 annus + new: + title: Crear nov IP-regul + no_ip_block_selected: Null IP-regules esset changeat pro que null esset selectet + title: Regules por IPs + relationships: + title: Li relationes de %{acct} + relays: + add_new: Adjunter un nov relé + delete: Deleter + description_html: Un federational relé es un intermediari servitor quel exchangea grandissim quantitás de public postas inter li servitores queles abonna e publicar a it. It posse auxiliar micri e medial servitores decovrir contenete del fediverse, quel altrimen vell besonar que local usatores seque altri persones che lontan servitores manualmen. + disable: Desactivisar + disabled: Desactivisat + enable: Activisar + enable_hint: Pos activisation, tui servitor va abonnar al omni public postas de ti relé, e va comensar misser li public postas de ti-ci servitor a it. + enabled: Activisat + inbox_url: URL del relé + pending: Atendent li aprobation del relé + save_and_enable: Conservar e activisar + setup: Etablisser un conexion a un relé + signatures_not_enabled: Relés fórsan ne va functionar corectmen si secur mode o mode de limitat federation es activisat + status: Statu + title: Relés + report_notes: + created_msg: Raportal nota creat successosimen! + destroyed_msg: Raportal nota deletet successosimen! + reports: + account: + notes: + one: "%{count} nota" + other: "%{count} notas" + action_taken_by: Action fat de + actions: + delete_description_html: Li raportat postas va esser deletet e un admoniment va esser registrat por auxiliar te escalar si hay futuri infractiones del sam conto. + mark_as_sensitive_description_html: Li medie in li raportat postas va esser marcat quam sensitiv e un admoniment va esser registrat por auxiliar te escalar si hay futuri infractiones del sam conto. + other_description_html: Vider plu optiones por controlar li conduida del conto e customisar comunication al raportat conto. + resolve_description_html: Null action va esser fat contra li raportat conto, null admoniment registrat, e li raporte va esser cludet. + silence_description_html: Li conto va esser visibil nur a tis qui ja seque it o qui sercha it manualmen, limitante severimen su atingement. Ti sempre posse esser revertet. Ti clude omni raportes contra ti conto. + add_to_report: Adjunter plu al raporte + are_you_sure: Es tu cert? + assign_to_self: Assignar it a me + assigned: Assignat moderator + by_target_domain: Dominia del conto raportat + cancel: Anullar + category: Categorie + category_description_html: Li rason pro quel ti conto e/o contenete esset raportat va esser citat in comunication con li conto raportat + comment: + none: 'Null' + comment_description_html: 'Por provider plu mult information, %{name} scrit:' + confirm: Confirmar + confirm_action: Confirmar moderatori action contra @%{acct} + created_at: Raportat + delete_and_resolve: Deleter postas + mark_as_resolved: Marcar quam soluet + mark_as_sensitive: Marcar quam sensitiv + mark_as_unresolved: Marcar quam ínsoluet + no_one_assigned: Nequi + notes: + create: Adjunter nota + create_and_resolve: Soluer med nota + create_and_unresolve: Reaperter med nota + delete: Deleter + placeholder: Descrir li actiones queles ha esset fat, o quelcunc altri relatent actualisationes... + title: Notas + notes_description_html: Vider e lassar notas a altri moderatores e a tui futuri self + processed_msg: 'Raporte #%{id} successosimen tractat' + quick_actions_description_html: 'Fa un rapid action o ear ad-infra por vider li contenete raportat:' + remote_user_placeholder: li lontan usator de %{instance} + reopen: Reaperter raporte + report: 'Raporte #%{id}' + reported_account: Raportat conto + reported_by: Raportat de + resolved: Soluet + resolved_msg: Raporte successosimen soluet! + skip_to_actions: Ear rect al actiones + status: Statu + statuses: Contenete raportat + summary: + close_report: 'Marcar raporte #%{id} quam resoluet' + title: Raportes + roles: + categories: + devops: DevOps + invites: Invitationes + moderation: Moderation + special: Special + delete: Deleter + privileges: + administrator: Administrator + delete_user_data: Deleter Data de Usator + delete_user_data_description: Possibilisa que usatores mey deleter li data de altri usatores strax + invite_users: Invitar Usatores + manage_announcements: Tractar proclamationes + manage_announcements_description: Permisse usatores tractar proclamationes sur li servitor + manage_appeals: Gerer Apelles + manage_federation: Gerer Federation + manage_invites: Gerer Invitationes + manage_reports: Gerer Raportes + manage_roles: Gerer Roles + manage_taxonomies: Gerer Taxonomies + manage_user_access_description: Permisse usatores desactivisar li 2-factor autentication de altri usatores, changear lor email-adresses, e reiniciar lor passa-paroles + manage_users: Gerer usatores + title: Roles + rules: + add_new: Adjunter un regule + title: Regules del servitor + settings: + about: + title: Pri + appearance: + title: Aspecte + discovery: + profile_directory: Profilarium + public_timelines: Public témpor-lineas + domain_blocks: + users: A local usatores qui ha initiat session + registrations: + title: Registrationes + registrations_mode: + modes: + none: Nequi posse registrar se + open: Quicunc posse registrar se + site_uploads: + delete: Deleter cargat file + destroyed_msg: Cargat file successosimen deletet! + software_updates: + type: Specie + version: Version + statuses: + account: Autor + batch: + remove_from_report: Remover de raporte + report: Raportar + deleted: Deletet + favourites: Favorites + in_reply_to: Respondent a + language: Lingue + metadata: Metadata + open: Aperter posta + original_status: Original posta + visibility: Visibilitá + strikes: + actions: + sensitive: "%{name} marcat li conto de %{target} quam sensitiv" + silence: "%{name} limitat li conto de %{target}" + suspend: "%{name} suspendet li conto de %{target}" + appeal_approved: Apellat + appeal_pending: Apelle pendent + appeal_rejected: Apelle rejectet + system_checks: + database_schema_check: + message_html: Hay pendent migrationes de database. Ples far les por far cert que li aplication functiona quam expectat + elasticsearch_preset: + action: Vider li documentation + elasticsearch_preset_single_node: + action: Vider li documentation + title: Administration + trends: + approved: Aprobat + statuses: + shared_by: + one: Partit o favoritisat un vez + other: Partit e favoritisat %{friendly_count} vezes + tags: + listable: Suggestibil + not_listable: Ne suggestibil + not_usable: Prohibit + usable: Permisset + usage_comparison: 'Usat hodie: %{today} vez(es), yer: %{yesterday}' + webhooks: + events: Evenimentes + status: Statu + admin_mailer: + new_trends: + new_trending_links: + title: Populari ligamentes + new_trending_statuses: + title: Populari postas + new_trending_tags: + title: Populari hashtags + aliases: + add_new: Crear alias + created_msg: Successosimen creat un nov alias. Tu nu posse initiar li movement del antiqui conto. + deleted_msg: Successosimen removet li alias. Mover de ti-ta conto a ti-ci ne plu va esser possibil. + empty: Tu have null aliases. + hint_html: Si tu vole mover de un altri conto a ti-ci, ci tu posse crear un alias, quel es besonat ante que tu posse proceder a mover sequitores del antiqui conto a ti-ci. Ti-ci action, sol, es ínnociv e reversibil. Li conto-migration es initiat del antiqui conto. + remove: Desconexer alias + appearance: + advanced_web_interface: Avansat web-interfacie + advanced_web_interface_hint: 'Si tu vole usar li tot largore de tui ecran, li avansat web-interfacie permisse que tu mey configurar mult columnes diferent por vider tam mult information simultanmen quam tu vole: Hem, federat témpor-linea, quelcunc númere de listes e hashtags.' + animations_and_accessibility: Animationes e accessibilitá + confirmation_dialogs: Dialogs de confirmation + discovery: Decovriment + localization: + body: Mastodon es traductet de voluntarios. + guide_link: https://crowdin.com/project/mastodon + guide_link_text: Omnes posse contribuer. + sensitive_content: Sensitiv contenete + application_mailer: + notification_preferences: Changear parametres pri email + salutation: "%{name}," + settings: 'Changear parametres pri email: %{link}' + unsubscribe: Desabonnar + view: 'Vider:' + view_profile: Vider profil + view_status: Vider posta + applications: + created: Aplication successosimen creat + destroyed: Aplication successosimen deletet + logout: Exear + regenerate_token: Regenerar accesse-clave + token_regenerated: Accesse-clave successosimen regenerat + warning: Esse tre cuidosi pri ti-ci data. Nequande parti it a quicunc! + your_token: Tui accesse-clave + auth: + apply_for_account: Solicitar un conto + captcha_confirmation: + help_html: Si tu have desfacilitá solver li CAPTCHA, tu posse contacter nos a %{email} e noi posse auxiliar te. + hint_html: Just un cose plu! Noi deve confirmar que tu es homan (por que noi posse impedir li spam!). Solue li CAPTCHA in-infra e clicca "Avansar". + title: Control de securitá + confirmations: + awaiting_review: Tui email-adresse es confirmat! Li personale de %{domain} nu va tractar tui registration. Tu va reciver un email si ili aproba tui conto! + awaiting_review_title: On tracta tui registration + clicking_this_link: cliccar ti-ci ligament + login_link: intrar + proceed_to_login_html: Tu nu posse proceder a %{login_link}. + redirect_to_app_html: Tu deve har esset redirectet al aplication %{app_name}. Si to ne evenit, prova %{clicking_this_link} o retornar manualmen al aplication. + registration_complete: Tu ha completat tui registration che %{domain}! + welcome_title: Benevenit, %{name}! + wrong_email_hint: Si ti email-adresse ne es corect, tu posse changear it in li parametres de conto. + delete_account: Deleter li conto + delete_account_html: Si tu vole deleter tui conto, tu posse proceder ci. On va petir confirmation de te. + description: + prefix_invited_by_user: "@%{name} invita te adherer ti-ci servitor de Mastodon!" + prefix_sign_up: Adherer Mastodon hodie! + suffix: Med un conto, tu va posser sequer persones, postar actualisationes e exchangear missages con usatores de quelcunc Mastodon-servitor e plu! + didnt_get_confirmation: Ne recivet un confirmation-ligament? + dont_have_your_security_key: Ne have tui clave de securitá? + forgot_password: Obliviat tu tui passa-parol? + invalid_reset_password_token: Li clave por reiniciar li passa-parol es ínvalid o expirat. Ples demandar un nov. + link_to_otp: Introducte un 2-factor code de tui telefon o un code de recuperation + link_to_webauth: Usa tui aparate de clave de securitá + log_in_with: Intrar med + login: Intrar + logout: Exear + migrate_account: Mover te a un conto diferent + migrate_account_html: Si tu vole redirecter ti-ci conto a un altri, tu posse configurar it ci. + or_log_in_with: O intrar med + privacy_policy_agreement_html: Yo leet e consenti li politica pri privatie + progress: + confirm: Confirmar email + details: Tui detallies + review: Nor revise + rules: Acceptar regules + providers: + cas: CAS + saml: SAML + register: Adherer + registration_closed: "%{instance} ne accepta nov membres" + resend_confirmation: Reinviar ligament de confirmation + reset_password: Reiniciar passa-parol + rules: + accept: Acceptar + back: Retro + invited_by: 'Tu posse adherer %{domain} mersí al invitation quel tu recivet de:' + preamble: Tis es etablisset e infortiat del moderatores de %{domain}. + preamble_invited: Ante que tu procede, ples considerar li regules establisset del moderatores de %{domain}. + title: Quelc regules basic. + title_invited: Tu ha esset invitat. + security: Securitá + set_new_password: Establisser nov passa-parol + setup: + email_below_hint_html: Vider tui spam-emails, o petir un altre. Tu posse corectar tui email-adresse si it es íncorect. + email_settings_hint_html: Clicca li ligament quel noi inviat a te por verificar %{email}. Noi va atender ci. + link_not_received: Recivet null ligament? + new_confirmation_instructions_sent: Tu va reciver un nov email con li ligament de confirmation in quelc minutes! + title: Vider tui inbuxe + sign_in: + preamble_html: Aperter session med tui %{domain} detallies. Si tui conto logia che un diferent servitor, tu ne va posser intrar ci. + title: Aperter session che %{domain} + sign_up: + manual_review: Adhesiones a %{domain} es tractat manualmen de nor moderatores. Por auxiliar nos tractar tui aplication, scri un poc pri te e pro quo tu vole un conto che %{domain}. + preamble: Med un conto che ti-ci Mastodon-servitor, tu va posser sequer quelcunc altri person in li retage, sin egarda a u logia su conto. + title: Crear un conto che %{domain}. + status: + account_status: Statu del conto + confirming: Atendent li confirmation del email-adresse. + functional: Tui conto es completmen functional. + pending: Tu conto atende tractation de nor personale. Ti fórsan va durar quelc témpor. Tu va reciver un email si tui aplication es aprobat. + redirecting_to: Tui conto es ínactiv pro que it actualmen redirecte a %{acct}. + self_destruct: Pro que %{domain} va cluder bentost, tu have solmen limitat accesse a tui conto. + view_strikes: Vide anteyan admonimentes contra tui conto + too_fast: Formul inviat tro rapid, prova denov. + use_security_key: Usar clave de securitá + challenge: + confirm: Avansar + hint_html: "Nota: On ne va petir tui passa-parol denov por li venient hor." + invalid_password: Ínvalid passa-parol + prompt: Confirmar passa-parol por avansar + crypto: + errors: + invalid_key: ne es un valid clave Ed25519 o Curve25519 + invalid_signature: ne es un valid signatura Ed25519 + date: + formats: + default: "%d.%m.%Y" + with_month_name: "%d. %B %Y" + datetime: + 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: Just nu + less_than_x_minutes: "%{count}m" + less_than_x_seconds: Just nu + over_x_years: "%{count}a" + x_days: "%{count}d" + x_minutes: "%{count}m" + x_months: "%{count}me" + x_seconds: "%{count}s" + deletes: + challenge_not_passed: Li information quel tu dat ne esset corect + confirm_password: Introducte tui actual passa-parol por verificar tui identitá + confirm_username: Scri tu usator-nómine por confirmar li procedura + proceed: Deleter li conto + success_msg: Tui conto esset successosimen deletet + warning: + before: 'Ante proceder, ples leer ti notas cuidosimen:' + caches: Contenete quel ha esset inmagasinat de altri servitores fórsan va persister + data_removal: Tui postas e altri data va esser permanentmen removet + email_change_html: Tui posse changear tui email-adresse sin deleter tui conto + email_contact_html: Si ancor it ne ariva, tu posse inviar un email a %{email} por auxilie + email_reconfirmation_html: Si tu ne recive li confirmation-email, tu posse solicita it denov + irreversible: Tu ne va posser restaurar o reactivisar tui conto + more_details_html: Por plu mult detallies, vide li politica pri privatie. + username_available: Tui usator-nómine va retornar a esser disponibil + username_unavailable: Tui usator-nómine va restar índisponibil + disputes: + strikes: + action_taken: Action fat + appeal: Apellar + appeal_approved: Ti admoniment ha esset apellat successosimen e nu es ínvalid + appeal_rejected: Li apelle ha esset rejectet + appeal_submitted_at: Apelle inviat + appealed_msg: Tui apelle ha esset inviat. Si it es aprobat, tu va esser notificat. + appeals: + submit: Inviar apelle + approve_appeal: Aprobar apelle + associated_report: Associat raporte + created_at: Date + description_html: Tis es li actiones fat contra tui conto e admonimentes misset a te del personale de %{instance}. + recipient: Adressat a + reject_appeal: Rejecter apelle + status: 'Posta #%{id}' + status_removed: Posta ja removet del sistema + title: "%{action} de %{date}" + title_actions: + delete_statuses: Removement de posta + disable: Gelation de conto + mark_statuses_as_sensitive: Marcation de postas quam sensitiv + none: Admoniment + sensitive: Marcation de conto quam sensitiv + silence: Limitation de conto + suspend: Suspension de conto + your_appeal_approved: Tui apelle ha esset aprobat + your_appeal_pending: Tu ha fat un apelle + your_appeal_rejected: Tui apelle ha esset rejectet + domain_validator: + invalid_domain: ne es un valid dominia-nómine + edit_profile: + basic_information: Basic information + hint_html: "Customisa ti quel gente vide sur tui public profil e apu tui postas. Altri persones es plu probabil sequer te e interacter con te si tu have un detalliat profil e un profil-image." + other: Altri + errors: + '400': Li demande quel tu inviat esset ínvalid o misformat. + '403': Tu ne have permission vider ti-ci págine. + '404': Li págine quel tu sercha ne es ci. + '406': Ti-ci págine ne es disponibil in li formate petit. + '410': Li págine quel tu serchat ne plu existe ci. + '422': + content: Verification de securitá fallit. Esque tu blocca cookies? + title: Verification de securitá fallit + '429': Tro mult demandes + '500': + content: Pardona nos, alquo errat in nor servitor. + title: Ti-ci págine ne es corect + '503': On ne posset servir li págine pro un falliment temporari del servitor. + noscript_html: Por usar li web-aplication de Mastodon, ples activisar JavaScript. Alternativmen, prova un del nativ aplicationes por Mastodon por tui platform. + existing_username_validator: + not_found: ne posset trovar un local usator con ti usator-nómine + not_found_multiple: ne posset trovar %{usernames} + exports: + archive_takeout: + date: Date + download: Descargar tui archive + hint_html: Tu posse petir un archive de tui postas e cargat medie. Li exportat data va esser in li formate ActivityPub, leibil de quelcunc programmatura concordant. Tu posse petir un archive chascun 7 dies. + in_progress: Compilant tui archive... + request: Petir tui archive + size: Grandore + blocks: Tu ha bloccat + bookmarks: Marcatores + csv: CSV + domain_blocks: Dominia-bloccas + lists: Listes + mutes: Tu silentia + storage: Inmagasination de medie + featured_tags: + add_new: Adjunter un nov + errors: + limit: Tu ja ha pinglat li maxim númere de hashtags + hint_html: "Pinglar tui max important hashtags sur tui profil. Un bonissim maniere de mantener un registre de tui ovres e projectes, pinglat hashtags es monstrat prominentmen sur tui profil e permisse rapid accesse a tui propri postas." + filters: + contexts: + account: Profiles + home: Hem e listes + notifications: Notificationes + public: Public témpor-lineas + thread: Conversationes + edit: + add_keyword: Adjunter término + keywords: Términos + statuses: Individual postas + statuses_hint_html: Ti filtre aplica a selectet postas individual sin egarda a ca ili contene li términos in-infra. Reviser o remover postas del filtre. + title: Modificar filtre + errors: + deprecated_api_multiple_keywords: On ne posse changear ti parametres per ti-ci aplication pro que ili aplica a plu quam un filtrat término. Usa un aplication plu recent o li web-interfacie. + invalid_context: Null o ínvalid contextu dat + index: + contexts: Filtres in %{contexts} + delete: Deleter + empty: Tu have null filtres. + expires_in: Expira in %{distance} + expires_on: Expira ye %{date} + keywords: + one: "%{count} término" + other: "%{count} términos" + statuses: + one: "%{count} posta" + other: "%{count} postas" + statuses_long: + one: "%{count} individual posta celat" + other: "%{count} individual postas celat" + title: Filtres + new: + save: Conservar nov filtre + title: Adjunter nov filtre + statuses: + back_to_filter: Retornar al filtre + batch: + remove: Remover de filtre + index: + hint: Ti filtre aplica a selectet postas individual sin egarda a altri criteries. Tu posse adjunter plu postas a ti-ci filtre del web-interfacie. + title: Filtrat postas + generic: + all: Omni + all_items_on_page_selected_html: + one: "%{count} element in ti-ci págine es selectet." + other: Omni %{count} elementes in ti-ci págine es selectet. + all_matching_items_selected_html: + one: "%{count} element concordant tui sercha es selectet." + other: Omni %{count} elementes concordant tui sercha es selectet. + cancel: Anullar + changes_saved_msg: Modificationes conservat successosimen! + confirm: Confirmar + copy: Copiar + delete: Deleter + deselect: Desselecter omnis + none: 'Null' + order_by: Ordinar per + save_changes: Conservar changes + select_all_matching_items: + one: Selecter %{count} element concordant tui sercha. + other: Selecter omni %{count} elementes concordant tui sercha. + today: hodie + validation_errors: + one: Alquo ancor ne es bon! Ples controlar li errore in-infra + other: Alquo ancor ne es bon! Ples controlar li %{count} errores in-infra + imports: + errors: + empty: li file es vacui + incompatible_type: Íncompatibil con li selectet specie de importation + invalid_csv_file: 'Ínvalid file CSV. Errore: %{error}' + over_rows_processing_limit: contene plu quam %{count} lineas + too_large: li file es tro grand + failures: Fallites + imported: Importat + mismatched_types_warning: It apari que tu fórsan selectet li íncorect specie por ti importation, ples controlar denov. + modes: + merge: Coalescer + merge_long: Conservar existent registres e adjunter li novis + overwrite: Remplazzar + overwrite_long: Remplazzar existent registres per li novis + overwrite_preambles: + blocking_html: Tu va remplazzar tui liste de bloccat contos per til %{total_items} contos de %{filename}. + bookmarks_html: Tu va remplazzar tui marcatores per til %{total_items} postas de %{filename}. + domain_blocking_html: Tu va remplazzar tui liste de bloccat dominias per til %{total_items} dominias de %{filename}. + following_html: Tu va sequer til %{total_items} contos de %{filename} e dessequer omni altri contos. + lists_html: Tu va remplazzar tui listes per li contenete de %{filename}. Til %{total_items} contos va esser adjuntet a nov listes. + muting_html: Tu va remplazzar tui liste de silentiat contos per til %{total_items} contos de %{filename}. + preambles: + blocking_html: Tu va bloccar til %{total_items} contos de %{filename}. + bookmarks_html: Tu va adjunter til %{total_items} postas de %{filename} a tui marcatores. + domain_blocking_html: Tu va bloccar til %{total_items} dominias de %{filename}. + following_html: Tu va sequer til %{total_items} contos de %{filename}. + lists_html: Tu va adjunter til %{total_items} contos de %{filename} a tui listes. Nov listes va esser creat si ne hay un liste a quel adjunter. + muting_html: Tu va silentiar til %{total_items} contos de %{filename}. + preface: Tu posse importar data quel tu ha exportat de un altri servitor, quam un liste del gente quem tu seque o blocca. + recent_imports: Recent importationes + states: + finished: Finit + in_progress: Progressent + scheduled: Planat + unconfirmed: Ínconfirmat + status: Statu + success: Tui data esset cargat successosimen e va esser tractat tam tost quam es possibil + time_started: Comensat ye + titles: + blocking: Important bloccat contos + bookmarks: Important marcatores + domain_blocking: Important bloccat dominias + following: Important sequet contos + lists: Important listes + muting: Important silentiat contos + type: Specie de importation + type_groups: + constructive: Seques e marcatores + destructive: Bloccas & silentias + types: + blocking: Liste de bloccas + bookmarks: Marcatores + domain_blocking: Liste de dominia-bloccas + following: Liste de sequetes + lists: Listes + muting: Liste de silentiationes + upload: Cargar + invites: + delete: Desactivisar + expired: Expirat + expires_in: + '1800': 30 minutes + '21600': 6 hores + '3600': 1 hor + '43200': 12 hores + '604800': 1 semane + '86400': 1 die + expires_in_prompt: Nequande + generate: Generar ligament de invitation + invalid: Ti-ci invitation ne es valid + invited_by: 'Tu esset invitat de:' + max_uses: + one: 1 use + other: "%{count} uses" + max_uses_prompt: Null límite + prompt: Generar e distribuer ligamentes a altres por dar accesse a ti-ci servitor + table: + expires_at: Expira + uses: Uses + title: Invitar gente + lists: + errors: + limit: Tu ha atinget li maxim númere de listes + login_activities: + authentication_methods: + otp: aplication de 2-factor autentication + password: passa-parol + sign_in_token: code de securitá per email + webauthn: claves de securitá + description_html: Si tu vide activitá quel tu ne conosse, considera changear tui passa-parol e activisar 2-factor autentication. + empty: Null historie de autentication disponibil + failed_sign_in_html: Fallit prova de apertion de session per %{method} de %{ip} (%{browser}) + successful_sign_in_html: Successosi apertion de session per %{method} de %{ip} (%{browser}) + title: Historie de autentication + mail_subscriptions: + unsubscribe: + action: Yes, desabonnar + complete: Desabonnat + confirmation_html: Esque tu vermen vole desabonnar de reciver %{type} por Mastodon che %{domain} a tui email-adresse %{email}? Tu sempre posse reabonnar per tui parametres pri email-notificationes. + emails: + notification_emails: + favourite: email-notificationes pri favoritisationes + follow: email-notificationes pri seques + follow_request: email-notificationes pri seque-petitiones + mention: email-notificationes pri mentiones + reblog: email-notificationes pri boosts + resubscribe_html: Si tu ha desabonnat errarimen, tu posse reabonnar per tui parametres pri email-notificationes. + success_html: Tu ne plu va reciver %{type} por Mastodon che %{domain} a tui email-adresse %{email}. + title: Desabonnar + media_attachments: + validations: + images_and_video: On ne posse atachar un video a un posta quel ja contene images + migrations: + set_redirect: Configurar un redirection + move_handler: + carry_mutes_over_text: Ti-ci usator movet se de %{acct}, quel tu hat silentiat. + notification_mailer: + follow_request: + action: Tractar petitiones de sequer + body: "%{name} ha petit sequer te" + subject: 'Pendent sequitor: %{name}' + title: Nov petition de sequer + mention: + action: Responder + title: Nov mention + poll: + subject: Un balotation de %{name} ha finit + reblog: + body: 'Tui posta esset boostat de %{name}:' + subject: "%{name} boostat tui posta" + title: Nov boost + status: + subject: "%{name} just postat" + update: + subject: "%{name} modificat un posta" + notifications: + administration_emails: Email-notificationes pri administration + email_events: Evenimentes por email-notificationes + email_events_hint: 'Selecte li evenimentes pri queles tu vole reciver notificationes:' + other_settings: Parametres pri altri notificationes + otp_authentication: + code_hint: Inmetter li code generat de tui aplication de autentication por confirmar + description_html: Si tu activisa 2-factor autentication per un aplication de autentication, aperter un session va postular que tu have possession de tui telefon, quel va generar codes por que tu mey inmetter les. + enable: Activar + instructions_html: "Scande ti-ci code QR ad-in Google Authenticator o un simil aplication TOTP in tu telefon. Pos nu, ti aplication va generar codes queles tu va dever inmetter quande tu aperte un session." + manual_instructions: 'Si tu ne posse scander li code QR e besona inmetter it manualmen, vi li crud-text secrete:' + setup: Configurar + wrong_code: Li inmettet code esset ínvalid! Esque li témpor del servitor e del aparate corect? + pagination: + newer: Plu nov + next: Seq + older: Plu old + prev: Prec + truncate: "…" + polls: + errors: + already_voted: Tu ja votat in ti-ci balotation + duplicate_options: contene duplicat elementes + duration_too_long: es tro distant in li futur + duration_too_short: es tro tost + expired: Li balotation ja finit + invalid_choice: Li option por quel tu votat ne existe + over_character_limit: ne posse esser plu long quam %{max} carácteres chascun + self_vote: On ne posse votar en su propri balotationes + too_few_options: deve haver plu quam un option + too_many_options: ne posse contener plu quam %{max} optiones + preferences: + other: Altri + public_timelines: Public témpor-lineas + privacy: + hint_html: "Customisa qualmen tu vole que tui profil e tui postas posse esser trovat. Mastodon have un varietá de manieres por auxiliar te atinger un auditorie plu grand quande activisat. Prende un moment por reviser ti parametres por far cert que ili concorda tui casu de usation." + privacy: Privatie + privacy_hint_html: Decide quant mult tu vole revelar por li beneficie de altres. Gente decovri interessant profiles e frisc aplicationes per vider li seques de altres e vider de quel aplicationes ili posta, ma tu fórsan prefere celar ti. + reach: Atingement + reach_hint_html: Decide ca tu vole esser decovrit e sequet de nov persones. Vole tu que tui postas mey aparir sur li págine "Explorar"? Vole tu que altri gente posse vider te in lor seque-recomandationes? Vole tu acceptar omni nov sequitores automaticmen, o manualmen tractar chascun? + search: Sercha + search_hint_html: Decide qualmen tu vole esser trovat. Vole tu que gente trova te per ti pri quel tu ha postat publicmen? Vole tu que gente éxter Mastodon trova tui profil quande ili sercha li web? Ples memorar que complet exclusion de omni serchatores ne posse esser garantit por public information. + title: Privatie e atingement + privacy_policy: + title: Politica pri Privatie + reactions: + errors: + limit_reached: Límite de diferent reactiones atinget + unrecognized_emoji: ne es un reconosset emoji + relationships: + activity: Activitá de conto + confirm_follow_selected_followers: Esque tu vermen vole sequer selectet sequitores? + confirm_remove_selected_followers: Esque tu vermen vole remover selectet sequitores? + confirm_remove_selected_follows: Esque tu vermen vole remover selectet sequetes? + dormant: Dormient + follow_failure: Ne posset sequer quelc del contos selectet. + follow_selected_followers: Sequer selectet sequitores + followers: Sequitores + following: Sequetes + invited: Invitat + last_active: Ultimmen activ + most_recent: Max recent + moved: Movet + mutual: Reciproc + primary: Primari + relationship: Relation + remove_selected_domains: Remover omni sequitores del selectet dominias + remove_selected_followers: Remover selectet sequitores + remove_selected_follows: Dessequer selectet usatores + status: Statu del conto + rss: + content_warning: 'Avise pri li contenete:' + descriptions: + account: Public postas de @%{acct} + tag: 'Public postas con li hashtag #%{hashtag}' + scheduled_statuses: + over_daily_limit: Tu ha atinget li límite de %{limit} planat postas por hodie + over_total_limit: Tu ha atinget li límite de %{limit} planat postas + too_soon: Li planat date deve esser in li future + self_destruct: + lead_html: Ínfortunatmen, %{domain} va bentost permanentmen cluder. Si tu havet un conto ta, tu ne va posser continuar usar it, ma tu ancor posse demandar un archive de tui data. + title: Ti-ci servitor va cluder bentost + sessions: + activity: Ultim activitá + browser: Navigator + browsers: + alipay: Alipay + blackberry: BlackBerry + chrome: Chrome + edge: Microsoft Edge + electron: Electron + firefox: Firefox + generic: Ínconosset navigator + huawei_browser: Huawei Browser + ie: Internet Explorer + micro_messenger: MicroMessenger + nokia: Nokia S40 Ovi Browser + opera: Opera + otter: Otter + phantom_js: PhantomJS + qq: QQ Browser + safari: Safari + uc_browser: UC Browser + unknown_browser: Ínconosset navigator + weibo: Weibo + current_session: Actual session + description: "%{browser} in %{platform}" + explanation: Tis-ci es li navigatores queles actualmen ha initiat sessiones a tui Mastodon-conto. + ip: IP + platforms: + adobe_air: Adobe Air + android: Android + blackberry: BlackBerry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + kai_os: KaiOS + linux: Linux + mac: macOS + unknown_platform: Ínconosset platform + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone + revoke: Revocar + revoke_success: Session successosimen revocat + title: Sessiones + view_authentication_history: Vider li historie de autentication por tui conto + settings: + account: Conto + account_settings: Parametres del conto + aliases: Aliases del conto + appearance: Aspecte + authorized_apps: Autorisat aplicationes + back: Retornar a Mastodon + delete: Deletion de conto + development: Developation + edit_profile: Modificar profil + export: Exportation de data + featured_tags: Recomandat hashtags + import: Importar + import_and_export: Importation e exportation + migrate: Migration de conto + notifications: Notificationes + preferences: Preferenties + profile: Public profil + relationships: Sequetes e sequitores + statuses_cleanup: Automatisat deletion de postas + strikes: Admonimentes moderatori + two_factor_authentication: 2-factor autentication + webauthn_authentication: Claves de securitá + statuses: + attached: + audio: + one: "%{count} audio-file" + other: "%{count} audio-files" + description: 'Atachat: %{attached}' + image: + one: "%{count} image" + other: "%{count} images" + video: + one: "%{count} video" + other: "%{count} videos" + boosted_from_html: Boostat de %{acct_link} + default_language: Sam quam li lingue del interfacie + edited_at_html: Modificat ye %{date} + pin_errors: + direct: On ne posse pinglar postas queles es visibil solmen a mentionat usatores + limit: Tu ja ha pinglat li maxim númere de postas + ownership: On ne posse pinglar li posta de un altri person + reblog: On ne posse pinglar un boost + poll: + total_people: + one: "%{count} person" + other: "%{count} persones" + total_votes: + one: "%{count} vote" + other: "%{count} votes" + vote: Votar + title: "%{name}: «%{quote}»" + visibilities: + public: Public + unlisted: Delistat + statuses_cleanup: + exceptions: Exceptiones + keep_pinned: Conservar pinglat postas + keep_pinned_hint: Delete null de tui pinglat postas + keep_polls: Conservar balotationes + keep_polls_hint: Delete null de tui balotationes + min_age: + '1209600': 2 semanes + '31556952': 1 annu + strikes: + errors: + too_late: It es tro tard por apellar ti admoniment + tags: + does_not_match_previous_name: ne concorda li anteyan nómine + themes: + contrast: Mastodon (Alt contraste) + default: Mastodon (Obscur) + mastodon-light: Mastodon (Luminosi) + time: + formats: + default: "%d.%m.%Y ye %H:%M" + month: "%b %Y" + time: "%H:%M" + with_time_zone: "%d.%m.%Y ye %H:%M %Z" + translation: + errors: + quota_exceeded: Li servitor ha exhaustet nor quote por li servicie de traduction. + too_many_requests: Hay tro mult recent demandes al servicie de traduction. + two_factor_authentication: + add: Adjunter + disable: Desactivisar 2FA + disabled_success: 2-factor autentication successosimen desactivisat + edit: Modificar + enabled: 2-factor autentication es activisat + enabled_success: 2-factor autentication successosimen activisat + generate_recovery_codes: Generar codes de recuperation + lost_recovery_codes: Codes de recuperation lassa te recuperar accesse a tui conto si tu perdi tui telefon. Si tu ha perdit tui codes de recuperation, tu posse regenerar les ci. Tui antiqui codes de recuperation va esser ínvalidat. + methods: Metodes de 2-factor autentication + otp: Aplication de autentication + recovery_codes: Copiar tui codes de recuperation + recovery_codes_regenerated: Codes de recuperation successosimen regenerat + recovery_instructions_html: Si tu perdi accesse a tui telefon, tu posse usar un del codes de recuperation in-infra por reganiar accesse a tui conto. Mantener li securitá del codes de recuperation. Per exemple, tu fórsan va printar les e inmagasinar les con altri important documentes. + webauthn: Claves de securitá + user_mailer: + appeal_approved: + action: Ear a tui conto + explanation: Li apelle del admoniment contra tui conto ye %{strike_date} quel tu fat ye %{appeal_date} ha esset aprobat. Tui conto retorna a esser in bon statu. + subject: Tui apelle de %{date} ha esset aprobat + title: Apelle aprobat + appeal_rejected: + explanation: Li apelle del admoniment contra tui conto ye %{strike_date} quel tu fat ye %{appeal_date} ha esset rejectet. + subject: Tui apelle de %{date} ha esset rejectet + title: Apelle rejectet + backup_ready: + explanation: Tu solicitat un complet archive de tui Mastodon-conto. Nu it es pret por descargar! + subject: Tui archive es pret por descargar + title: Descargar archive + suspicious_sign_in: + change_password: changear tui passa-parol + details: 'Vi li detallies del apertion de session:' + explanation: On detectet un intration a tui conto de un nov IP-adresse. + further_actions_html: Si to ne esset tu, on recomanda que tu %{action} strax e activisar 2-factor autentication por mantener tui conto secur. + subject: Tui conto ha esset accesset de un nov IP-adresse + title: Un nov intration + warning: + appeal: Inviar un apelle + appeal_description: Si tu crede que ti es un error, tu posse inviar un apelle al personale de %{instance}. + categories: + spam: Spam + violation: Contenete viola li sequent regules del comunité + explanation: + delete_statuses: On judicat que quelc de tui postas viola un o plu del regules del comunité e pro to ha esset removet del moderatores del %{instance}. + disable: Tu ne plu posse usar tui conto, ma tui profil e altri data resta integri. Tu posse solicitar un archive de tui data, changear parametres del conto, o deleter tui conto. + mark_statuses_as_sensitive: Quelc de tui postas ha esset marcat quam sensitiv del moderatores de %{instance}. Ti significa que gente va dever cliccar li medie in li postas ante que un previse es monstrat. Tu self posse marcar medie quam sensitiv quande tu posta futurimen. + sensitive: Pos nu, omni tui cargat medie-files va esser marcat quam sensitiv e celat detra un avise que on deve cliccar por transpassar. + silence: Tu ancor posse usar tui conto, ma solmen gente qui ja seque te va posser vider tui postas in ti-ci servitor, e tu va esser excludet de utensiles de decovrition. Támen, altres ancor posse sequer te manualmen. + suspend: Tu ne plu posse usar tui conto, e tui profil e altri data nu es ínaccessibil. Tu ancor posse intrar por solicitar un archive de tui data til que li data es removet in circa 30 dies, ma noi va retener quelc basic data pri te por preventer te evitar li suspension. + reason: 'Rason:' + statuses: 'Postas citat:' + subject: + delete_statuses: Tui postas che %{acct} ha esset removet + disable: Tui conto %{acct} ha esset gelat + mark_statuses_as_sensitive: Tui postas che %{acct} ha esset marcat quam sensitiv + none: Admoniment por %{acct} + sensitive: Tui postas che %{acct} ve esser marcat quam sensitiv pos nu + welcome: + explanation: Vi quelc suggestiones por que tu mey comensar + subject: Benevenit a Mastodon + users: + seamless_external_login: Tu ha intrat per un servicie external, dunc parametres pri tui passa-parol e email-adresse ne es disponibil. + verification: + extra_instructions_html: 'Nota: Li ligament in tui websitu posse esser ínvisibil. Li important parte es rel="me" quel prevente fals self-identification in websitus con contenete generat de usatores. Tu posse mem usar un link element in li cap-section del págine vice a, ma li HTML code deve esser accessibil sin executer JavaScript.' + verification: Verification diff --git a/config/locales/io.yml b/config/locales/io.yml index c9a0dcd7365eb3..eb5fcc709d188d 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -91,6 +91,7 @@ io: moderation: active: Aktiva all: Omna + disabled: Desaktivigita pending: Vartanta silenced: Limitizita suspended: Restriktita @@ -116,12 +117,16 @@ io: redownloaded_msg: Sucesoze rifreshis profilo di %{username} de origino reject: Refuzez rejected_msg: Sucesoze refuzis registroapliko di %{username} + remote_suspension_irreversible: La datumi di ca konto esas nerenversebla efacita. + remote_suspension_reversible_hint_html: Ca konto restriktesis che lua servilo, e la datumi tota efacesos ye %{date}. Ante ta tempo, la fora servilo povos restaurar ca konto sen irga mala efecti. Se vu volas efacar omna datumi dil konto quik, vu povas facar lo sube. remove_avatar: Efacez profilimajo remove_header: Efacez kapimajo removed_avatar_msg: Sucesoze efacis profilimajo di %{username} removed_header_msg: Sucesoze efacis kapimajo di %{username} resend_confirmation: already_confirmed: Ca uzanto ja konfirmesis + send: Risendez konfirmligilo + success: Konfirmligilo sucesoze sendesas! reset: Richanjez reset_password: Richanjez pasvorto resubscribe: Riabonez @@ -129,6 +134,7 @@ io: search: Trovez search_same_email_domain: Altra uzanti kun sama retpostodomeno search_same_ip: Altra uzanti kun sama IP + security: Sekureso security_measures: only_password: Nur pasvorto password_and_2fa: Pasvorto e 2FA @@ -205,6 +211,7 @@ io: reject_user: Refuzez uzanto remove_avatar_user: Efacez profilimajo reopen_report: Riapertez raporto + resend_user: Risendez konfirmretposto reset_password_user: Richanjez pasvorto resolve_report: Rezolvez raporto sensitive_account: Forcsentoza konto @@ -263,6 +270,7 @@ io: reject_user_html: "%{name} refuzis registro de %{target}" remove_avatar_user_html: "%{name} efacis profilimajo de %{target}" reopen_report_html: "%{name} riapertis raporto %{target}" + resend_user_html: "%{name} risendis konfirmretposto por %{target}" reset_password_user_html: "%{name} richanjis pasvorto de uzanto %{target}" resolve_report_html: "%{name} rezolvis raporto %{target}" sensitive_account_html: "%{name} markizis medii di %{target} quale sentoza" @@ -279,6 +287,7 @@ io: update_ip_block_html: "%{name} kreis regulo por IP %{target}" update_status_html: "%{name} novigis posto da %{target}" update_user_role_html: "%{name} chanjis rolo di %{target}" + deleted_account: konto efacita empty: Nula logi. filter_by_action: Filtrez segun ago filter_by_user: Filtrez segun uzanto @@ -300,6 +309,7 @@ io: unpublish: Depublikigez unpublished_msg: Anunco sucesoze depublikigesas! updated_msg: Anunco sucesoza novigesas! + critical_update_pending: Urjanta aktualigo vartesas custom_emojis: assign_category: Insertez kategorio by_domain: Domeno @@ -373,6 +383,15 @@ io: undo: Despermisez federato kun domeno domain_blocks: add_new: Add new + confirm_suspension: + cancel: Anulez + confirm: Restriktez + permanent_action: Desrestriktar la servilo ne restaurar irga datumi o relati. + preamble_html: Vu restriktos %{domain} e lua subdomeni. + remove_all_data: Co efacos omna kontenaji, imaji, videi e profildatumi por la konti di ca domeno de vua servilo. + stop_communication: Vua servilo haltos komunikar kun ca servili. + title: Konfirmez domenoblokuso por %{domain} + undo_relationships: Co desfacos irga sequorelato inter konti di ca servili e vua. created_msg: Domenobstrukto nun procedesas destroyed_msg: Domenobstrukto desagesis domain: Domeno @@ -385,6 +404,7 @@ io: create: Kreez obstrukto hint: Domenobstrukto ne preventos kreo di kontrekordaji en datumaturo, ma retroaktive e automate aplikos partikulara jermetodi a ta konti. severity: + desc_html: "Limitizez facos la posti dil konti di ca domeno nevidebla da irgu qua ne sequas li. Restriktez efacos omna kontenaji, imaji, videi e profildatumi dil konti di ca domeno de vua servilo. Uzez Nulo se vu volas nur refuzar imaji e videi." noop: Nulo silence: Limito suspend: Restriktez @@ -419,9 +439,23 @@ io: resolve: Rezolvez domeno title: Obstruktez nova retpostodomeno no_email_domain_block_selected: Retpostodomenobstrukti ne chanjesis por ke nulo selektesis + not_permitted: Ne permisata resolved_dns_records_hint_html: Ca domennomo rezolvesas a ca MX-domeni, quale esas ultime responsanta por ganar retposto. Obstruktar MX-domeno obstruktos registri de irga retpostoadreso quo uzas sama MX-domeni, mem se la videbla domennomo esas diferanta. Sorgemez e ne obstruktez majora retpostositi. resolved_through_html: Rezolvesis tra %{domain} title: Obstruktita retpostodomeni + export_domain_allows: + no_file: Nula dosiero selektesas + export_domain_blocks: + import: + description_html: Vu importacos listo de domenoblokusi. Voluntez kontrolar la listo sorgoze, partikulare se vu ne kreis la listo personale. + existing_relationships_warning: Existanta sequo-relati + private_comment_description_html: 'Por helpar vu savar de ube importacita blokusi venis, importacita blokusi kreesos kun la sequanta komento privata: %{comment}' + private_comment_template: Importacita de %{source} ye %{date} + title: Importacar domenoblokusi + invalid_domain_block: 'Un o plu kam un domenoblokuso omisesis pro la sequanta eroro(-i): %{error}' + new: + title: Importacar domenoblokusi + no_file: Nula dosiero selektesas follow_recommendations: description_html: "Sequorekomendi helpas nova uzanti rapide trovar interesanta kontenajo. Se uzanto ne interagas kun altra personi sate por igar personaligita sequorekomendi, ca konti rekomendas. Oli rikalkulesas die de mixo di konti kun maxim alta recenta interagi e maxim altra lokala sequantoquanto segun selektita linguo." language: Por linguo @@ -450,6 +484,7 @@ io: content_policies: comment: Interna noto description_html: Vu povas fixar kontenajguidili quo aplikesos a omna konti de ca domeno e irga oli subdomeni. + limited_federation_mode_description_html: Vu povas selektar ka vu permisos federar kun ca domeno. policies: reject_media: Refusez medii reject_reports: Refusez raporti @@ -497,6 +532,7 @@ io: total_reported: Raporti pri oli total_storage: Mediiatachaji totals_time_period_hint_html: Sumi quo montresas sube inkluzas informi de pos la komenco. + unknown_instance: Prezente ne esas registrago pri ta domeno che ca servilo. invites: deactivate_all: Deaktivigez omno filter: @@ -553,20 +589,27 @@ io: mark_as_sensitive_description_html: Medii en raportizita posti markizesos quale sentoza e streko rekordigesos por helpar vu intensigar en nexta malagi da la sama konto. other_description_html: Videz plu multa opcioni por dominacar konduto di konto e kustumizar komuniko a raportizita konto. resolve_description_html: Nulo agesos kontre raportizita konto, streko ne rekordizesos e raporto klozesos. + silence_description_html: Konto esos videbla nur por personi qui ja sequas lo o manuale serchas lo, severe limitizante lua atingo. On sempre povas desfacar co. Klozas omna raporti kontra ca konto. + suspend_description_html: Ca konto e omna kontenaji esos neacesebla e efacota, e interagar kun ol esos neposibla. Desfacebla dum 30 dii. Klozas omna raporti kontra ca konto. actions_description_html: Decidez ago por rezolvar ca raporto. Se vu decidar puniso kontre raportizesis konto, retpostoavizo sendesos a ol, ecepte kande Spam kategorio selektesis. + actions_description_remote_html: Selektez quo vu agos por solvar ca raporto. Co nur efektigos quale vua servilo komunikas kun ca fora konto e traktas lua kontenaji. add_to_report: Insertez pluse a raporto are_you_sure: Ka vu esas certa? assign_to_self: Taskigez me assigned: Taskigita jerero by_target_domain: Domeno di raportizita konto + cancel: Anulez category: Kategorio category_description_html: La motivo ke ca konto e kontenajo raportizesis citesos por komuniko kun raportizita konto comment: none: Nulo comment_description_html: 'Por donar plu multa informo, %{name} skribis:' + confirm: Konfirmez + confirm_action: Konfirmez jero-ago kontra @%{acct} created_at: Raportizesis delete_and_resolve: Efacez posti forwarded: Sendesis + forwarded_replies_explanation: Ca raporto esas de fora uzanto e pri fora kontenajo. Esis dissemata a vu pro ke la raportita kontenajo es respondo a un ek vua uzanti. forwarded_to: Sendesis a %{domain} mark_as_resolved: Markizez quale rezolvita mark_as_sensitive: Markizez quale sentoza @@ -580,6 +623,7 @@ io: placeholder: Deskriptez quo agesis o irga relatita novaji... title: Noti notes_description_html: Videz e pozez noti a altra jereri e vua su en futuro + processed_msg: 'Raporto #%{id} sucesoze traktita' quick_actions_description_html: 'Agetez o volvez base por vidar raportizita kontenajo:' remote_user_placeholder: nelokala uzanti de %{instance} reopen: Riapertez raporto @@ -592,9 +636,28 @@ io: status: Stando statuses: Raportizita kontenajo statuses_description_html: Ofensanta kontenajo citesos en komuniko kun raportizita konto + summary: + action_preambles: + delete_html: 'Vu efacos kelka posti di @%{acct}. Co facos lo sequanta:' + mark_as_sensitive_html: 'Vu markizos kelka posti di @%{acct} quale provokema. Co facos lo sequanta:' + silence_html: 'Vu limitizos la konto di @%{acct}. Co facos lo sequanta:' + suspend_html: 'Vu restriktos la konto di @%{acct}. Co facos lo sequanta:' + actions: + delete_html: Efacar la ofensiva posti + mark_as_sensitive_html: Markizar la atachuri dil posti quale provokema + silence_html: Severe limitizar la atingo dil konto di @%{acct} per facar ke lua profilo e posti es videbla nur a personi qui ja sequas lu o qui manuale serchas lua profilo + suspend_html: Restriktar @%{acct}, facante ke lua profilo e kontenaji neacesibla e neposibla por interagado + close_report: 'Markizar raporto #%{id} quale solvita' + close_reports_html: Markizar omna raporti contra @%{acct} quale solvita + delete_data_html: Efacor la profilo e kontenaji di @%{acct} ye 30 dii de nun ecepte ke lu esus desrestrikita ante ta tempe + preview_preamble_html: "@%{acct} recevos averto kun la sequanta kontenajo:" + record_strike_html: Registrar punto kontra @%{acct} por helpar vu traktar futura reguloviolaci di ca konto + send_email_html: Sendez a @%{acct} avertala retposto + warning_placeholder: Neobligata plusa expliko por la jero-ago. target_origin: Fonto di raportizita konto title: Raporti unassign: Detaskigez + unknown_action_msg: 'Nekonocata ago: %{action}' unresolved: Nerezolvita updated_at: Novigesis view_profile: Videz profilo @@ -676,14 +739,21 @@ io: branding: preamble: Fabrikmarko di ca servilo diferentigas lu de altra servili en la reto. Ca informi forsan montresas che diversa loki. Do, ca informi debas esar klara. title: Fabrikmarkeso + captcha_enabled: + title: Postular ke nova uzanti solvos CAPTCHA por konfirmar lia konti content_retention: preamble: Dominacez quale uzantigita kontenajo retenesar en Mastodon. title: Kontenajreteneso + default_noindex: + desc_html: Efektigas omna uzanti qui ne personale chanjis ca opciono + title: Despartoprenigez uzanti de serchilo-indexi quale originala stando discovery: follow_recommendations: Sequez rekomendaji preamble: Montrar interesanta kontenajo esas importanta ye voligar nova uzanti quo forsan ne savas irgu. Dominacez quale ca deskovrotraiti funcionar en ca servilo. profile_directory: Profilcheflisto public_timelines: Publika tempolinei + publish_discovered_servers: Publikar deskovrita servili + publish_statistics: Publikar statistiki title: Deskovro trends: Tendenci domain_blocks: @@ -698,20 +768,51 @@ io: approved: Aprobo bezonesas por registro none: Nulu povas registrar open: Irgu povas registrar + security: + authorized_fetch: Postular autentikigo de federata servili + authorized_fetch_hint: Postular autentikigo de federata servili kapabligar plu strikta enforcigo dil blokusi di uzanti e dil servilo. Tamen, co enduktos exekutado-lentigo, diminutos la atingebleso di via respondi, e forsan enduktos koncilieblesoproblemi kun kelka softwari federata. Pluse, co ne preventos aganti dedikita de acesar vua publika posti e konti. + authorized_fetch_overridden_hint: Vu prezente ne povas chanjar ca opciono pro ke ol es remplasata da environmentala varieblo. + federation_authentication: Enforcigo di federado-autentikigo + title: Servilopcioni site_uploads: delete: Efacez adchargita failo destroyed_msg: Sitadchargito sucesoze efacesis! + software_updates: + critical_update: Urjanta — voluntez aktualigar rapide + description: On rekomendas ke vu sempre aktualigas vua Mastodon-instaluro por profitar la maxim nova solvuri e novaji. Pluse, kelkafoye es importantega aktualigar Mastodon rapide por evitar sekuresoproblemi. Pro ca motivi, Mastodon serchas aktualigi mihorale, e notifikos vu segun vua opcioni pri retposto-notifiki. + documentation_link: Lernez pluse + release_notes: Emiso-noti + title: Aktualigi disponebla + type: Tipo + types: + major: Majora emiso + minor: Minora emiso + patch: Mikra emiso — problemosolvuri e chanji facila a facar + version: Versiono statuses: + account: Skribinto + application: Apliko back_to_account: Retrovenez a kontopagino back_to_report: Retrovenez a raportpagino batch: remove_from_report: Efacez de raporto report: Raportizez deleted: Efacesis + favourites: Favoriziti + history: Historio di versioni + in_reply_to: Respondante a + language: Linguo media: title: Medii + metadata: Metadatumi no_status_selected: Nula posti chanjesis pro ke nulo selektesis + open: Apertez posto + original_status: Originala posto + reblogs: Dissemi + status_changed: Posto chanjita title: Kontoposti + trending: Populara + visibility: Videbleso with_media: Kun medii strikes: actions: @@ -724,9 +825,14 @@ io: suspend: "%{name} restriktis konto di %{target}" appeal_approved: Apelis appeal_pending: Vartata apelo + appeal_rejected: Apelo refuzita system_checks: database_schema_check: message_html: Existas vartanta datamaturmigri. Startez por certigar ke la softwaro kondutar quale expektita + elasticsearch_preset: + action: Videz la dokumentajo + elasticsearch_preset_single_node: + action: Videz la dokumentajo elasticsearch_running_check: message_html: Ne povas konektas a Elasticsearch. Kontrolez ke ol functionas o desaktivigez textokompleta trovo elasticsearch_version_check: @@ -737,6 +843,18 @@ io: message_html: Vu ne fixis irga servilreguli. sidekiq_process_check: message_html: Sidekiq procedo ne funcionas ye %{value} fask(o). Kontrolez vua opciono di Sidekiq + software_version_critical_check: + action: Videz la aktualigi disponebla + message_html: Urjanta Mastodon-aktualigo es disponebla, voluntez aktualigar la servilo tam rapide kam es posibla. + software_version_patch_check: + action: Videz la aktualigi disponebla + message_html: Problemosolvanta Mastodon-aktualigo es disponebla. + upload_check_privacy_error: + action: Konsultez hike por plu multa informo + message_html: "Vua retservilo es misfigurizita. La privateso di vua uzanti es domajebla." + upload_check_privacy_error_object_storage: + action: Konsultez hike por plu multa informo + message_html: "Vua dosierokonservo es misfigurizita. La privateso di vua uzanti es domajebla." tags: review: Kontrolez stando updated_msg: Hashtagopcioni novigesis sucesoze @@ -759,6 +877,7 @@ io: other: Partigesis da %{count} personi de pos antea semano title: Tendencoza ligili usage_comparison: Partigesis %{today} foyi hodie, la nombro esas %{yesterday} hiere + not_allowed_to_trend: Ne permisita quale popularo only_allowed: Nur permisato pending_review: Vartas kontrolo preview_card_providers: @@ -843,6 +962,9 @@ io: body: "%{target} apelas jerdecido da %{action_taken_by} de %{date}, quale esis %{type}. Oli skribis:" next_steps: Vu povas aprobar apelo por deagar jerdecido o ignorar. subject: "%{username} apela jerdecido che %{instance}" + new_critical_software_updates: + body: Nova urjanta versioni di Mastodon emisesis, vu forsan volas aktualigar tam balde kam es posibla! + subject: Urjanta Mastodon-aktualigi es disponebla por %{instance}! new_pending_account: body: Detali de nova konto esas la subo. Vu povas aprobar o refuzar ca apliko. subject: Nova konto bezonas kontrolesar che %{instance} (%{username}) @@ -850,6 +972,9 @@ io: body: "%{reporter} raportizis %{target}" body_remote: Ulu de %{domain} raportizis %{target} subject: Nova raporto por %{instance} (#%{id}) + new_software_updates: + body: Nova Mastodon-versioni emisesis, vu forsan volas aktualigar! + subject: Nova Mastodon-versioni es disponebla por %{instance}! new_trends: body: 'Ca kozi bezonas kontrol ante ol povas montresar publike:' new_trending_links: @@ -881,23 +1006,41 @@ io: notification_preferences: Chanjez retpostopreferaji salutation: "%{name}," settings: 'Chanjar la retpost-mesajala preferi: %{link}' + unsubscribe: Desabonez view: 'Vidar:' view_profile: Videz profilo view_status: Videz posto applications: created: Apliko sucesoze kreesas destroyed: Apliko sucesoze efacesas + logout: Ekirez regenerate_token: Rifacez acesficho token_regenerated: Acesficho sucesoze riganesas warning: Sorgemez per ca informi. Ne partigez kun irgu! your_token: Vua acesficho auth: + apply_for_account: Demandar konto + captcha_confirmation: + help_html: Se vu ne povas solvar la CAPTCHA, vu povas kontaktar ni per %{email} e ni povas helpar vu. + hint_html: Nur un plusa kozo! Ni postulas ke vu konfirmez ke vu esas homo (co es por ke ni povas preventar mesajachi!). Solvez la suba CAPTCHA e pulsez "Avancez". + title: Sekuresokontrolo + confirmations: + awaiting_review: Vua retpostadreso es konfirmita! La jeraro che %{domain} revuos vua apliko. Vu recevos retposto se li aprobas vua konto! + awaiting_review_title: Vua apliko vartas revuo + clicking_this_link: pulsante ca ligilo + login_link: enirar + proceed_to_login_html: Nun vu povas avancar a %{login_link}. + redirect_to_app_html: Vu devas sendesir al apliko %{app_name}. Se to ne evenis, probez %{clicking_this_link} o retroirez manuale al apliko. + registration_complete: Vua registrago che %{domain} nun es kompleta! + welcome_title: Bonvenez, %{name}! + wrong_email_hint: Se ta retpostadreso ne es korekta, vu povas chanjar lo en la konto-opcioni. delete_account: Efacez konto delete_account_html: Se vu volas efacar vua konto, vu povas irar hike. Vu demandesos konfirmar. description: prefix_invited_by_user: "@%{name} invitas vu juntar ca servilo di Mastodon!" prefix_sign_up: Registrez che Mastodon hodie! suffix: Per konto, vu povos sequar personi, postigar novaji e interchanjar mesaji kun uzanti de irga servilo di Mastodon e pluse! + didnt_get_confirmation: Ka vu ne recevis konfirmoligilo? dont_have_your_security_key: Ka vu ne havas sekuresklefo? forgot_password: Pasvorto obliviita? invalid_reset_password_token: Pasvorto richanjoficho esas nevalida o expirita. Demandez novo. @@ -910,18 +1053,39 @@ io: migrate_account_html: Se vu volas ridirektar ca konto a diferanto, vu povas ajustar hike. or_log_in_with: O eniras per privacy_policy_agreement_html: Me lektis e konsentis privatesguidilo + progress: + confirm: Konfirmar retpostoadreso + details: Vua detali + review: Nia revuo + rules: Aceptar reguli providers: cas: CAS saml: SAML register: Membreskar registration_closed: "%{instance} ne aceptas nova membri" + resend_confirmation: Risendez konfirmligilo reset_password: Chanjar la pasvorto rules: + accept: Aceptar + back: Retro + invited_by: 'Vu darfas krear konto che %{domain} pro ke vu recevis invito de:' preamble: Co igesas e exekutesas da jereri di %{domain}. + preamble_invited: Ante ke vu avancos, voluntez konsiderar la reguli kreita dal jeraro di %{domain}. title: Kelka bazala reguli. + title_invited: Vu esas invitita. security: Chanjar pasvorto set_new_password: Selektar nova pasvorto + setup: + email_below_hint_html: Kontrolez vua spam-dosieruro, o demandez altra ligilo. Vu povas korektigar vua retpostadreso se esas nekorekta. + email_settings_hint_html: Uzez la ligilo quan ni sendis a vu por verifikar %{email}. Ni vartos hike. + link_not_received: Ka vu ne recevis ligilo? + new_confirmation_instructions_sent: Vu recevos nova retposto kun la konfirmligilo pos kelka minuti! + title: Kontrolez vua retposti + sign_in: + preamble_html: Enirez per vua %{domain} detali. Se vua konto esas che altra servilo, vu ne povos enirar hike. + title: Enirez a %{domain} sign_up: + manual_review: Registragi che %{domain} es revuata da nia personaro. Por helpar ni traktar vua aplikajo, skribez kelko pri vu e pro quo vu volas konto che %{domain}. preamble: Per konto en ca servilo di Mastodon, on povas sequar irga persono en ca reto, ne ye ube ona konto hostagisas. title: Ni komencigez vu en %{domain}. status: @@ -930,14 +1094,15 @@ io: functional: Vua konto esas tote funcionoza. pending: Vua apliko bezonas kontrolo da nia laborero. Co forsan esas nekurta. Vu ganos retposto se vua apliko aprobesas. redirecting_to: Vua konto esas neaktiva pro ke ol nun ridirektesos a %{acct}. + self_destruct: Pro ke %{domain} balde klozos, vu havas nur aceso limitizata a vua konto. view_strikes: Videz antea streki kontre vua konto too_fast: Formulario sendesis tro rapide, probez itere. use_security_key: Uzes sekuresklefo challenge: - confirm: Durez + confirm: Avancez hint_html: "Guidilo: Ni ne demandos vua pasvorto itere til 1 horo." invalid_password: Nevalida pasvorto - prompt: Konfirmez pasvorto por durar + prompt: Konfirmez pasvorto por avancar crypto: errors: invalid_key: ne esas valida klefo Ed25519 o Curve25519 @@ -1009,6 +1174,9 @@ io: your_appeal_rejected: Vua apelo refuzesis domain_validator: invalid_domain: ne esas valida domennomo + edit_profile: + basic_information: Fundamentala informo + other: Altra errors: '400': Demando quon vu sendis esas nevalida o malstrukturala. '403': Vu ne havas permiso por vidar ca pagino. @@ -1044,6 +1212,8 @@ io: storage: Konservado di kontenajo featured_tags: add_new: Insertez novo + errors: + limit: Vu ja pinglizis la maxima nombro de hastagi hint_html: "Quo esas estelita hashtagi? Ol montresas eminente che vua publika profilo e povigas personi vidar vua publika posti partikulare kun ta hashtagi. Oli esas bona utensilo por jeretar kreiva agaji e longa projetaji." filters: contexts: @@ -1095,7 +1265,9 @@ io: all_matching_items_selected_html: one: "%{count} kozo quo parigesas kun vua trovato selektesas." other: Omna %{count} kozi quo parigesas kun vua trovato selektesas. + cancel: Anulez changes_saved_msg: Chanji senprobleme konservita! + confirm: Konfirmez copy: Kopiez delete: Efacez deselect: Deselektez omno @@ -1111,19 +1283,59 @@ io: other: Ulo ne eventis senprobleme! Voluntez konsultar la suba %{count} eror-raporti imports: errors: + empty: CSV-dosiero vakua + invalid_csv_file: 'Nevalida CSV-dosiero. Eroro: %{error}' over_rows_processing_limit: kontenas plu kam %{count} horizontala lineo + too_large: Dosiero es tro granda + failures: Falii + imported: Importacita + mismatched_types_warning: Semblas ke vu forsan selektis la nekorekta tipo por ca importaco, voluntez kontrolar itere. modes: merge: Kombinez merge_long: Retenez displonebla rekordi e insertez novi overwrite: Remplasez overwrite_long: Remplasez nuna rekordi per novi + overwrite_preambles: + blocking_html: Vu substitucos vua blokusolisto per til %{total_items} konti de %{filename}. + bookmarks_html: Vu substitucos vua libromarki per til %{total_items} posti de %{filename}. + domain_blocking_html: Vu substitucos vua domenoblokusolisto per til %{total_items} domeni de %{filename}. + following_html: Vu sequos til %{total_items} konti de %{filename} e haltar sequar irga altra konto. + lists_html: Vu substitucos vua listi kun la kontenaji di %{filename}. Til %{total_items} konti adjuntesos a nova listi. + muting_html: Vu substitucos vua listo di konti silencigita per til %{total_items} konti de %{filename}. + preambles: + blocking_html: Vu blokusos til %{total_items} konti de %{filename}. + bookmarks_html: Vu adjuntos %{total_items} posti de %{filename} a vua libromarki. + domain_blocking_html: Vu blokusos til %{total_items} domeni de %{filename}. + following_html: Vu sequos til %{total_items} konti de %{filename}. + lists_html: Vu adjuntos til %{total_items} konti de %{filename} a vua listi. Nova listi kreesos se ne existas listo a quo adjuntar. + muting_html: Vu silencigos til %{total_items} konti en %{filename}. preface: Tu povas importacar kelka datumi, tal quala listi de omna homi quin tu sequas o blokusas, a tua konto di ca instaluro, per dosiero exportacita de altra instaluro. + recent_imports: Importacaji recenta + states: + finished: Finita + in_progress: Progresanta + scheduled: Projetita + unconfirmed: Nekonfirmata + status: Stando success: Tua datumi esis senprobleme importacita ed esos traktita quale projetita + time_started: Komencita ye + titles: + blocking: Importacante konti blokusata + bookmarks: Importacante libromarki + domain_blocking: Importacante domeni blokusata + following: Importacante konti sequata + lists: Importacante listi + muting: Importacante konti silencigata + type: Tipo di importaco + type_groups: + constructive: Sequati & libromarki + destructive: Blokusati e silencigati types: blocking: Listo de blokusiti bookmarks: Libromarki domain_blocking: Domenobstruktolisto following: Listo de sequati + lists: Listi muting: Silenciglisto upload: Kargar invites: @@ -1138,6 +1350,7 @@ io: '86400': 1 dio expires_in_prompt: Nulatempe generate: Facez invitligilo + invalid: Ca invito ne es valida invited_by: 'Vu invitesis da:' max_uses: one: 1 uzo @@ -1148,6 +1361,9 @@ io: expires_at: Expiros uses: Uzi title: Invitez personi + lists: + errors: + limit: Vu atingis la maxima nombro de listi login_activities: authentication_methods: otp: 2-faktoryurizessoftwaro @@ -1159,6 +1375,21 @@ io: failed_sign_in_html: Falita enirprob per %{method} de %{ip} (%{browser}) successful_sign_in_html: Sucesoza eniro per %{method} de %{ip} (%{browser}) title: Yurizeshistorio + mail_subscriptions: + unsubscribe: + action: Yes, desabonez + complete: Desabonita + confirmation_html: Ka vu esas certa ke vu volas desabonar de recevar %{type} por Mastodon che %{domain} a vua retpostoadreso %{email}? Vu sempre povas riabonar che vua opcioni pri restposto-notifiki. + emails: + notification_emails: + favourite: notifiko-retposti pri favoriziti + follow: retposti pri sequo-notifiki + follow_request: retposti pri sequo-demandi + mention: retposti pri menciono-notifiki + reblog: retposti pri repeto-notifiki + resubscribe_html: Se vu desabonis eroroze, vu povas riabonar en vua opcioni pri retposto-notifiki. + success_html: Vu ne plus recevos %{type} por Mastodon che %{domain} a vua retpostadreso %{email}. + title: Desabonez media_attachments: validations: images_and_video: Ne povas atachar video a posto quo ja kontenar imaji @@ -1230,14 +1461,15 @@ io: poll: subject: Votposto di %{name} finis reblog: - body: "%{name} diskonocigis tua mesajo:" - subject: "%{name} diskonocigis tua mesajo" - title: Nova busto + body: "%{name} repetis vua posto:" + subject: "%{name} repetis vua posto" + title: Nova repeto status: subject: "%{name} nove postigis" update: subject: "%{name} modifikis posto" notifications: + administration_emails: Jerala retpostonotifiki email_events: Eventi por retpostoavizi email_events_hint: 'Selektez eventi quon vu volas ganar avizi:' other_settings: Altra avizopcioni @@ -1274,12 +1506,18 @@ io: expired: Votposto ja finis invalid_choice: Selektita votselektajo ne existas over_character_limit: ne povas esar plu longa kam %{max} literi por sing + self_vote: On ne povas votar en sua propra inquesti too_few_options: mustas havar kozi too_many_options: ne povas havar plu kam %{max} kozi preferences: other: Altra posting_defaults: Originala postoopcioni public_timelines: Publika tempolinei + privacy: + privacy: Privateso + reach: Atingo + search: Sercho + title: Privateso e atingo privacy_policy: title: Privatesguidilo reactions: @@ -1288,7 +1526,11 @@ io: unrecognized_emoji: ne esas rikonocita emocimajo relationships: activity: Kontoaktiveso + confirm_follow_selected_followers: Ka vu es certa ke vu volas sequar la selektata sequati? + confirm_remove_selected_followers: Ka vu es certa ke vu volas revokar la selektata sequati? + confirm_remove_selected_follows: Ka vu es certa ke vu volas revokar la selektata sequanti? dormant: Neaktiva + follow_failure: Ne esis posibla sequar kelka ek la selektita konti. follow_selected_followers: Sequez kelka sequanti followers: Sequanti following: Sequati @@ -1317,6 +1559,9 @@ io: over_daily_limit: Vu ecesas limito quale esas %{limit} projetita posti por hodio over_total_limit: Vu ecesas limito quale esas %{limit} projetita posti too_soon: Projetita dato mustas esar en futuro + self_destruct: + lead_html: Desfortunoze, %{domain} balde klozos. Se vu havis konto ibe, vu ne plus povas uzar it, ma vu ankore povas demandar exportacajo de vua datumi. + title: Ca servilo balde klozos sessions: activity: Antea aktiveso browser: Vidilo @@ -1328,6 +1573,7 @@ io: electron: Electron firefox: Firefox generic: Nesavita vidilo + huawei_browser: Navigilo Huawei ie: Internet Explorer micro_messenger: MicroMessenger nokia: Vidilo Nokia S40 Ovi @@ -1337,6 +1583,7 @@ io: qq: Vidilo QQ safari: Safari uc_browser: UC Browser + unknown_browser: Nekonocata Navigilo weibo: Weibo current_session: Nuna sesiono description: "%{browser} che %{platform}" @@ -1349,8 +1596,10 @@ io: chrome_os: ChromeOS firefox_os: Firefox OS ios: iOS + kai_os: KaiOS linux: Linux mac: macOS + unknown_platform: Nekonocata Platformo windows: Windows windows_mobile: Windows Mobile windows_phone: Windows Phone @@ -1393,7 +1642,7 @@ io: video: one: "%{count} video" other: "%{count} videi" - boosted_from_html: Bustesis de %{acct_link} + boosted_from_html: Repetis de %{acct_link} content_warning: 'Kontenajaverto: %{warning}' default_language: Sama quale intervizajlinguo disallowed_hashtags: @@ -1408,7 +1657,7 @@ io: direct: Posti quo povas videsar nur mencionita uzanti ne povas pinglagesar limit: Vu ja pinglagis maxima posti ownership: Posto di altra persono ne povas pinglagesar - reblog: Busto ne povas pinglagesar + reblog: Repeto ne povas pinglizesar poll: total_people: one: "%{count} persono" @@ -1436,9 +1685,9 @@ io: exceptions: Ecepti explanation: Pro ke efacar posti esas nechipa procedo, co agas lente progresive kande servilo ne esas okupata. Do, vua posti forsan efacesos kurte pos oli atingas oldeslimito. ignore_favs: Ignorez favorati - ignore_reblogs: Ignorez busti + ignore_reblogs: Ignorez repeti interaction_exceptions: Ecepti segun interagi - interaction_exceptions_explanation: Notale, ne existas garantio ke posti efacesos se oli iras sub favorato o bustlimito pos iras super ol. + interaction_exceptions_explanation: Notale, ne existas garantio ke posti efacesos se oli iras sub la favoratala o repetala solii pos iras super oli. keep_direct: Retenez direta mesaji keep_direct_hint: Ne efacas irga vua direta mesaji keep_media: Retenez posti kun mediiatachaji @@ -1462,8 +1711,9 @@ io: '7889238': 3 monati min_age_label: Oldeslimito min_favs: Retenez favorizita posti mine - min_reblogs: Retenez bustita posti mine - min_reblogs_hint: Ne efacas irga vua posti quo bustigesos mine ca foyoquanto. Restez quale vakua por efacar posti sen suciar olia foyoquanto + min_favs_hint: Ne efacas irgo ek vua posti qua havas adminime ca quanto de favoriziti. Restez vakua por efacar posti senegarde la nombro de favoriziti + min_reblogs: Retenez posti repetita adminime + min_reblogs_hint: Ne efacas irgo ek vua posti qua havas adminime ca quanto de repeti. Restez vakua por efacar posti senegarde la nombro de repeti stream_entries: sensitive_content: Titiliva kontenajo strikes: @@ -1564,7 +1814,10 @@ io: seamless_external_login: Vu enirar tra externa serveso, do pasvorto e retpostoopcioni ne esas disponebla. signed_in_as: 'Eniris quale:' verification: + here_is_how: Yen quale + instructions_html: Kopiez e glutinez la kodexo suba en la HTML di vua retsituo. Pose adjuntez la adreso di vua retsituo en un ek la textobuxi di vua profilo per la "Modifikar profilo" pagino e konservez chanji. verification: Verifikeso + verified_links: Vua ligili verifikata webauthn_credentials: add: Insertez nova sekuresklefo create: diff --git a/config/locales/lad.yml b/config/locales/lad.yml new file mode 100644 index 00000000000000..afa6d2930c729b --- /dev/null +++ b/config/locales/lad.yml @@ -0,0 +1,1470 @@ +--- +lad: + about: + about_mastodon_html: 'La red sosyala del avenir: Sin reklamas, sin vijilansia korporativa, kon desen etiko, i desentralizasyon! Seas patron de tu enformasyon kon Mastodon!' + contact_missing: No espesifikado + contact_unavailable: No desponivle + hosted_on: Mastodon balabayado en %{domain} + title: Sovre mozotros + accounts: + follow: Sige + followers: + one: Suivante + other: Suivantes + following: Sigiendo + instance_actor_flash: Este kuento es un aktor virtual utilizado para reprezentar al sirvidor en si mezmo i no a dingun utilizador individual. Se utiliza para butos de la federasyon i no se deve suspender. + last_active: ultima koneksyon + link_verified_on: La propiedad de este atadijo fue verifikada el %{date} + nothing_here: No ay niente aki! + pin_errors: + following: Deves estar sigiendo a la persona a la ke keres achetar + posts_tab_heading: Publikasyones + admin: + account_actions: + action: Realiza aksion + title: Modera %{acct} + account_moderation_notes: + create: Kriya nota + created_msg: Nota de moderasyon kriyada kon sukseso! + destroyed_msg: Nota de moderasyon destruida kon sukseso! + accounts: + add_email_domain_block: Bloka domeno de posta + approve: Achetar + approved_msg: La solisitasyon de enrejistrasyon de %{username} achetada djustamente + are_you_sure: Estas siguro? + avatar: Imaje de profil + by_domain: Domeno + change_email: + changed_msg: Adreso de posta trokado kon sukseso! + current_email: Posta elektronika aktuala + label: Troka la posta elektronika + new_email: Mueva posta elektronika + submit: Troka la posta elektronika + title: Troka la posta elektronika de %{username} + change_role: + changed_msg: Rolo trokado kon sukseso! + label: Troka rolo + no_role: Sin rolo + title: Troka rolo para %{username} + confirm: Konfirma + confirmed: Konfirmado + confirming: Konfirmando + custom: Personalizado + delete: Efasa datos + deleted: Kitado + demote: Degrada + destroyed_msg: Los datos de %{username} estan agora en kola para ser supremir pishin + disable: Inkapasita + disable_sign_in_token_auth: Inkapasita la autentifikasyon por token de posta elektronika + disable_two_factor_authentication: Inkapasita autentifikasyon en dos pasos + disabled: Inkapasitada + display_name: Nombre amostrado + domain: Domeno + edit: Edita + email: Posta elektronika + email_status: Estatus de posta + enable: Kapasita + enable_sign_in_token_auth: Kapasita la autentifikasyon por token de posta elektronika + enabled: Kapasitada + enabled_msg: El kuento de %{username} fue kapasitado djustamente + followers: Suivantes + follows: Segimientos + header: Kavesera + inbox_url: URL del kuti de arivo + invite_request_text: Razones para unirse + invited_by: Envitado por + ip: IP + joined: Unido + location: + all: Todos + local: Lokal + remote: Remoto + title: Lokalizasyon + login_status: Estado de koneksyon kon kuento + media_attachments: Aneksos de multimedia + memorialize: Konvirtir en memorial + memorialized: Kuento komemorativo + memorialized_msg: "%{username} se konvirtido kon sukseso en un kuento komemorativo" + moderation: + active: Aktivo + all: Todos + disabled: Inkapasitado + pending: Asperando + silenced: Limitado + suspended: Suspendido + title: Moderasyon + moderation_notes: Notas de moderasyon + most_recent_activity: Aktivita mas reziente + most_recent_ip: IP mas muevo + no_account_selected: Dinguno kuento fue trokado komo dinguno fue eskojido + no_limits_imposed: Sin limites forsados + no_role_assigned: Dingun rolo apropyado + not_subscribed: No se esta abonado + pending: Revizion esta asperando + perform_full_suspension: Suspende + previous_strikes: Amonestamientos previos + previous_strikes_description_html: + one: Este kuento tiene un amonestamiento. + other: Este kuento tiene %{count} amonestamientos. + promote: Promosyonar + protocol: Protokol + public: Publiko + push_subscription_expires: Ekspirasyon del abonamiento PuSH + redownload: Arefreskar profil + redownloaded_msg: Se aktualizo djustamente el profil de %{username} dizde el orijin + reject: Refuza + rejected_msg: La solisitasyon de enrejistrasyon de %{username} a sido refuzada kon sukseso + remote_suspension_irreversible: Los datos de este kuento fueron irreversivlemente supremidos. + remote_suspension_reversible_hint_html: El kuento fue suspendido en este sirvidor i los datos seran totalmente supremidos el %{date}. Asta estonses el sirvidor remoto puede restaurar este kuento sin dingun efekto negativo. Si keres supremir todos los datos del kuento pishin, puedes fazerlo a kontinuasyon. + remove_avatar: Efasa imaje de profil + remove_header: Efasa kavesera + removed_avatar_msg: Se tiene supremido kon sukseso la imaje de profil de %{username} + removed_header_msg: Se tiene supremido kon sukseso la imaje de kavesera de %{username} + resend_confirmation: + already_confirmed: Este utilizador ya esta konfirmado + send: Reembia la posta elektronika de konfirmasyon + success: Posta elektronika de konfirmasyon embiada kon sukseso! + reset: Reinisya + reset_password: Reinisya kod + resubscribe: Reabona + role: Rolo + search: Bushka + search_same_email_domain: Otros utilizadores kon el mezmo domeno de posta + search_same_ip: Otros utilizadores kon el mezmo adreso IP + security: Sigurita + security_measures: + only_password: Solo kod + password_and_2fa: Kod i A2P + sensitive: Sensivle + sensitized: Markado komo sensivle + shared_inbox_url: URL de kuti partajado + show: + created_reports: Raportos embiados por este kuento + targeted_reports: Raportos embiados sovre este kuento + silence: Limita + silenced: Limitado + statuses: Publikasyones + strikes: Amonestamientos previos + subscribe: Abona + suspend: Suspende + suspended: Suspendido + suspension_irreversible: Los datos de este kuento fueron irreversivlemente supremidos. Puedes dezazer la suspensyon del kuento para fazerlo utilizavle, ama no rekuperaras los datos los kualos tenias mas antes. + suspension_reversible_hint_html: El kuento fue suspendido i los datos se supremiran kompletamente el %{date}. Asta estonses, el kuento puede ser restaurado sin dingun efekto negativo. Si keres supremir todos los datos del kuento pishin, puedes fazerlo a kontinuasyon. + title: Kuentos + unblock_email: Dezbloka adreso de posta + unblocked_email_msg: Tienes dezblokado el adreso de posta de %{username} + unconfirmed_email: Posta elektronika sin konfirmasyon + undo_sensitized: Dezmarka komo sensivle + undo_silenced: No limita + undo_suspension: Desuspende + unsilenced_msg: Se kito kon sukseso el limito del kuento %{username} + unsubscribe: Deabona + unsuspended_msg: Se kito kon sukseso la suspensyon del kuento de %{username} + username: Nombre de utilizador + view_domain: Ve rezumen del domeno + warn: Averte + web: Web + whitelisted: Permitido para la federasyon + action_logs: + action_types: + approve_appeal: Acheta apelasyon + approve_user: Acheta utilizador + assigned_to_self_report: Asinya raporto + change_email_user: Troka posta elektronika del utilizador + change_role_user: Troka rolo de utilizador + confirm_user: Konfirma utilizador + create_account_warning: Kriya avertensya + create_announcement: Kriya pregon + create_canonical_email_block: Kriya bloko de posta elektronika + create_custom_emoji: Kriya emoji personalizado + create_domain_allow: Kriya permiso de domeno + create_domain_block: Kriya bloko de domeno + create_email_domain_block: Kriya bloko de domeno de posta + create_ip_block: Kriya regla de IP + create_unavailable_domain: Kriya domeno no desponivle + create_user_role: Kriya rolo + demote_user: Degrada utilizador + destroy_announcement: Efasa pregon + destroy_canonical_email_block: Efasa bloko de posta elektronika + destroy_custom_emoji: Efasa emoji personalizado + destroy_domain_allow: Efasa permiso de domeno + destroy_domain_block: Efasa bloko de domeno + destroy_email_domain_block: Efasa bloko de domeno de posta + destroy_instance: Efasa domeno + destroy_ip_block: Efasa regla de IP + destroy_status: Efasa publikasyon + destroy_unavailable_domain: Efasa domeno no desponivle + destroy_user_role: Efasa rolo + disable_2fa_user: Inkapasita autentifikasyon en dos pasos + disable_custom_emoji: Inkapasita emoji personalizados + disable_sign_in_token_auth_user: Inkapasita la autentifikasyon por token de posta elektronika para el utilizador + disable_user: Inkapasita utilizador + enable_custom_emoji: Kapasita emoji personalizados + enable_sign_in_token_auth_user: Kapasita la autentifikasyon por token de posta para el utilizador + enable_user: Kapasita utilizador + memorialize_account: Transforma en kuento komemorativo + promote_user: Promove utilizador + reject_appeal: Refuza apelasyon + reject_user: Refuza utilizador + remove_avatar_user: Efasa imaje de profil + reopen_report: Reavre raporto + resend_user: Reembia posta de konfirmasyon + reset_password_user: Reinisya kod + resolve_report: Rezolve raporto + sensitive_account: Marka multimedia en tu kuento komo sensivle + silence_account: Limita kuento + suspend_account: Suspende kuento + unassigned_report: Dezasinya raporto + unblock_email_account: Dezbloka adreso de posta + unsensitive_account: Dezmarka multimedia en tu kuento komo sensivle + unsilence_account: No limita kuento + unsuspend_account: Desuspende kuento + update_announcement: Aktualiza pregon + update_custom_emoji: Aktualiza emoji personalizado + update_domain_block: Aktualiza bloko de domeno + update_ip_block: Aktualiza regla de IP + update_status: Aktualiza publikasyon + update_user_role: Aktualiza rolo + actions: + approve_appeal_html: "%{name} acheto la solisitasyon de moderasyon de %{target}" + approve_user_html: "%{name} acheto el enrejistramiento de %{target}" + assigned_to_self_report_html: "%{name} asinyo el raporto %{target} a si mezmo" + change_email_user_html: "%{name} troko el adreso de posta elektronika del utilizador %{target}" + change_role_user_html: "%{name} troko el rolo de %{target}" + confirm_user_html: "%{name} konfirmo el adreso de posta elektronika del utilizador %{target}" + create_account_warning_html: "%{name} embio una avertensya a %{target}" + create_announcement_html: "%{name} kriyo un muevo pregon %{target}" + create_canonical_email_block_html: "%{name} bloko la posta elektronika kon el hash %{target}" + create_custom_emoji_html: "%{name} kargo el muevo emoji %{target}" + create_domain_allow_html: "%{name} perimitio la federasyon kon el domeno %{target}" + create_domain_block_html: "%{name} bloko el domeno %{target}" + create_email_domain_block_html: "%{name} bloko el domeno de posta elektronika %{target}" + create_ip_block_html: "%{name} kriyo una regla para IP %{target}" + create_unavailable_domain_html: "%{name} detuvo las entregas al domeno %{target}" + create_user_role_html: "%{name} kriyo el rolo %{target}" + demote_user_html: "%{name} degrado a %{target}" + destroy_announcement_html: "%{name} supremio el pregon %{target}" + destroy_canonical_email_block_html: "%{name} dezbloko la posta elektronika kon el hash %{target}" + destroy_custom_emoji_html: "%{name} supremio el emoji %{target}" + destroy_domain_allow_html: "%{name} bloko la federasyon kon el domeno %{target}" + destroy_domain_block_html: "%{name} dezbloko el domeno %{target}" + destroy_email_domain_block_html: "%{name} dezbloko el domeno de posta elektronika %{target}" + destroy_instance_html: "\"%{name} purgo el domeno %{target}" + destroy_ip_block_html: "%{name} supremio una regla para la IP %{target}" + destroy_status_html: "%{name} supremio una publikasyon de %{target}" + destroy_unavailable_domain_html: "%{name} reinisyo las entregas al domeno %{target}" + destroy_user_role_html: "%{name} supremio el rolo %{target}" + disable_2fa_user_html: "%{name} dezaktivo el rekerimiento en dos pasos para el utilizador %{target}" + disable_custom_emoji_html: "%{name} dezaktivo el emoji %{target}" + disable_sign_in_token_auth_user_html: "%{name} inkapasito la autentifikasyon por token de posta elektronika para %{target}" + disable_user_html: "%{name} inkapasito la koneksion kon el kuento para el utilizador %{target}" + enable_custom_emoji_html: "%{name} aktivo el emoji %{target}" + enable_sign_in_token_auth_user_html: "%{name} tiene kapasitado la autentifikasyon por token de posta elektronika para %{target}" + enable_user_html: "%{name} kapasito koneksion kon kuento para el utilizador %{target}" + memorialize_account_html: "%{name} konvirtio el kuento de %{target} en una pajina de bendicha memoria" + promote_user_html: "%{name} promosyon al utilizador %{target}" + reject_appeal_html: "%{name} refuzo la solisitasyon de moderasyon de %{target}" + reject_user_html: "%{name} refuzo el enrejistramiento de %{target}" + remove_avatar_user_html: "%{name} supremio la imaje de profil de %{target}" + reopen_report_html: "%{name} reavrio el raporto %{target}" + resend_user_html: "%{name} tiene reembiado la posta de konfirmasyon para %{target}" + reset_password_user_html: "%{name} reinisyo el kod del utilizador %{target}" + resolve_report_html: "%{name} rezolvio el raporto %{target}" + sensitive_account_html: "%{name} marko la multimedia de %{target} komo sensivle" + silence_account_html: "%{name} silensyo el kuento de %{target}" + suspend_account_html: "%{name} suspendio el kuento de %{target}" + unassigned_report_html: "%{name} dezasinyo el raporto %{target}" + unblock_email_account_html: "%{name} tiene dezblokado el adreso de posta de %{target}" + unsensitive_account_html: "%{name} dezmarko la multimedia de %{target} komo sensivle" + unsilence_account_html: "%{name} kito el limite del kuento de %{target}" + unsuspend_account_html: "%{name} reaktivo el kuento de %{target}" + update_announcement_html: "%{name} aktualizo el pregon %{target}" + update_custom_emoji_html: "%{name} aktualizo el emoji %{target}" + update_domain_block_html: "%{name} aktualizo el bloko de domeno para %{target}" + update_ip_block_html: "\"%{name} troko la regla de IP %{target}" + update_status_html: "%{name} aktualizo la publikasyon de %{target}" + update_user_role_html: "%{name} troko el rolo %{target}" + deleted_account: kuento supremido + empty: No se toparon rejistros. + filter_by_action: Filtra por aksion + filter_by_user: Filtra por utilizador + title: Log de revizyon + announcements: + destroyed_msg: Pregon supremido kon sukseso! + edit: + title: Edita pregon + empty: No se toparon pregones. + live: En bivo + new: + create: Kriya pregon + title: Muevo pregon + publish: Publika + published_msg: Pregon publikado kon sukseso! + scheduled_for: Programado para %{time} + scheduled_msg: Pregon programado para su publikasyon! + title: Pregones + unpublish: Retirar publikasyon + unpublished_msg: Pregon retirado kon sukseso! + updated_msg: Pregon aktualizado kon sukseso! + custom_emojis: + assign_category: Asinyar kategoria + by_domain: Domeno + copied_msg: Kopia lokala del emoji kriyada kon sukseso + copy: Kopia + copy_failed_msg: No se pudo realizar una kopia lokala de akel emoji + create_new_category: Kriya una mueva kategoria + created_msg: Emoji kriyado kon sukseso! + delete: Efasa + destroyed_msg: Emoji destruyido kon sukseso! + disable: Inkapasita + disabled: Inkapasitado + disabled_msg: Se inkapasito akel emoji kon sukseso + emoji: Emoji + enable: Kapasita + enabled: Kapasitado + enabled_msg: Se kapasito akel emoji kon sukseso + image_hint: PNG o GIF asta %{size} + list: Lista + listed: Listados + new: + title: Adjustar muevo emoji personalizado + no_emoji_selected: No se troko dingun emoji porke no eskojites dinguno + not_permitted: No tienes permiso para realizar esta aksyon + overwrite: Sobreskrive + title: Emojis personalizados + uncategorized: No kategorizado + unlist: No lista + unlisted: No listado + update_failed_msg: No se pudo aktualizar akel emoji + updated_msg: Emoji aktualizado kon sukseso! + upload: Karga + dashboard: + active_users: utilizadores aktivos + interactions: enteraksyones + media_storage: Magazinaje de multimedia + new_users: muevos utilizadores + opened_reports: raportos aviertos + pending_appeals_html: + one: "%{count} apelasyon esta asperando" + other: "%{count} apelasiones estan asperando" + pending_reports_html: + one: "%{count} raporto esta asperando" + other: "%{count} raportos estan asperando" + pending_tags_html: + one: "%{count} etiketa esta asperando" + other: "%{count} etiketas estan asperando" + pending_users_html: + one: "%{count} utilizador esta asperando" + other: "%{count} utilizadores estan asperando" + resolved_reports: raportos rezolvidos + software: Programario + sources: Manaderos de rejistro + space: Uzo de magazinaje + title: Pano + top_languages: Linguas mas aktivas + top_servers: Sirvidores mas aktivos + website: Sitio internetiko + disputes: + appeals: + empty: No se toparon apelasiones. + title: Apelasiones + domain_allows: + add_new: Perimite federasyon kon el domeno + created_msg: Federasyon kon el domeno permitida kon sukseso + destroyed_msg: Federasyon kon el domeno proibida kon sukseso + export: Eksporto + import: Importo + undo: Proibe federasyon kon el domeno + domain_blocks: + add_new: Adjusta muevo bloko de domeno + confirm_suspension: + cancel: Anula + confirm: Suspende + created_msg: El bloko de domeno esta siendo prosesado + destroyed_msg: El bloko de domeno se dezizo + domain: Domeno + edit: Edita muevo bloko de domeno + existing_domain_block: Ya impusites limitos mas estriktos a %{name}. + existing_domain_block_html: Ya tienes forsado limitos mas estriktos a %{name}, kale dezblokarlo primero. + export: Eksporto + import: Importo + new: + create: Kriya bloko + hint: El bloko de domeno no prevendra la kriyasyon de entradas de kuento en la baza de datos, ama aplikara retroaktiva i otomatikamente metodos de moderasyon espesifika en dichos kuentos. + severity: + desc_html: "Limitar ara las publikasyones del kuento invizivles a kualkiera ke no lo este sigiendo. Suspender supremira todo el kontenido, media, i datos del profil. Uza Dinguno si solo keres refuzar dosyas multimedia." + noop: Dinguno + silence: Limita + suspend: Suspende + title: Muevo bloko de domeno + no_domain_block_selected: Dingun bloko de domeno tiene sido trokado deke dingun tiene sido eskojido + not_permitted: No tienes permiso para egzekutar esta aksyon + obfuscate: Eskonde nombre de domeno + obfuscate_hint: Eskonde una parte del nombre de domeno en la lista si amostrar la lista de limitasyones de domeno esta kapasitado + private_comment: Komento privado + private_comment_hint: Komento sovre esta limitasyon de domeno para el uzo interno por parte de los moderadores. + public_comment: Komento publiko + public_comment_hint: Komento sovre esta limitasyon de domeno para el publiko en djeneral, si la publisita de la lista de limitasyones de domeno esta kapasitada. + reject_media: Refuza dosyas de multimedia + reject_media_hint: Efasa dosyas multimedia magazinadas lokalmente para abashar kualkiera en el avenir. No relevante para suspensiones + reject_reports: Refuza raportos + reject_reports_hint: Ignora todos los raportos de este domeno. No relevante para suspensiones + undo: Dezaz bloko de domeno + view: Ve domeno blokado + email_domain_blocks: + add_new: Adjustar muevo + attempts_over_week: + one: "\"%{count} prova durante la ultima semana" + other: "%{count} provas de enrejistrarse durante la ultima semana" + created_msg: Domeno de posta blokado kon sukseso + delete: Efasa + dns: + types: + mx: Defter MX + domain: Domeno + new: + create: Adjusta domeno + resolve: Rezolve domeno + title: Bloka muevo domeno de posta + no_email_domain_block_selected: No se tienen trokado blokos de domeno porke dinguno a sido eskojido + not_permitted: Sin permiso + resolved_dns_records_hint_html: El nombre de domeno rezolve los sigientes domenos MX, los kualos son responsavles en ultima instansya de achetar la posta elektronika. Blokar un domeno MX blokara los rejistros de kualkier adreso de posta elektronika ke utilize el mezmo domeno MX, inkluzo si el nombre de domeno vizivle es desferente. Tenga kudiado de no blokar los prinsipales domenos de posta elektronika. + resolved_through_html: Rezolvido por %{domain} + title: Domenos de posta blokados + export_domain_allows: + new: + title: Importa permisos de domeno + no_file: Dinguna dosya tiene sido eskojida + export_domain_blocks: + import: + description_html: Vas importar una lista de blokos de domenos. Por favor reviza esta lista kon atansion, espesialmente si no eres el kriyador de la lista. + existing_relationships_warning: Relasiones de segimiento existientes + private_comment_description_html: 'Para ayudarte a averiguar de ande vienen los blokos importados, blokos importados seran kriyados kon este komento privado: %{comment}' + private_comment_template: Importado de %{source} el %{date} + title: Importa blokos de domeno + invalid_domain_block: 'Uno o mas blokos de domeno fueron omitidos por razon de yerro(s): %{error}' + new: + title: Importa blokos de domeno + no_file: Dinguna dosya tiene sido eskojida + follow_recommendations: + description_html: "Las rekomendasyones de kuentos ayudan a los muevos utilizadores a topar presto kontenido enteresante. Kuando un utilizador no tiene enteraktuado kon otros lo sufisiente komo para djenerar rekomendasyones personalizadas de kuentos a las ke segir, en sus lugar se le rekomiendan estes kuentos. Se rekalkulan diariamente a partir de una mikstura de kuentos kon el mayor numero de enteraksyones rezientes i kon el mayor numero de suivantes lokales kon una lingua determinada." + language: Para la lingua + status: Estado + suppress: Inkapasita rekomendasyon de kuentos + suppressed: Inkapasitada + title: Rekomendasyones de kuentos + unsuppress: Restora rekomendasyones de kuentos + instances: + availability: + description_html: + one: Si el embio al domeno no reushe %{count} diya, no se aran mas provas de entrega a manko ke se risiva un embio dizde el domeno. + other: Si el embio al domeno no reushe %{count} diyas desferentes, no se aprovaran a entregar a manko ke se risiva un embio dizde el domeno. + failure_threshold_reached: Limito de provas no reushidas alkansado el %{date}. + failures_recorded: + one: Prova no reushida en %{count} diya. + other: Provas no reushidas en %{count} diyas desferentes. + no_failures_recorded: No ay provas no reushidas en el defter. + title: Disponivilita + warning: La ultima prova de koneksyon a este sirvidor no tuvo sukseso + back_to_all: Todos + back_to_limited: Limitados + back_to_warning: Avertensya + by_domain: Domeno + confirm_purge: Siguro ke keres supremir permanentemente los datos de este domeno? + content_policies: + comment: Nota interna + description_html: Puedes definir politikas de kontenido ke se aplikaran a todos los kuentos de este domeno i a kualkiera de sus subdomenos. + limited_federation_mode_description_html: Puedes eskojer si keres permitir federasyon kon este domeno. + policies: + reject_media: Refuza multimedia + reject_reports: Refuza raportos + silence: Limita + suspend: Suspende + policy: Politika + reason: Razon publika + title: Politikas de kontenido + dashboard: + instance_accounts_dimension: Kuentos mas segidos + instance_accounts_measure: kuentos magazinados + instance_followers_measure: muestros suivantes ayi + instance_follows_measure: sus suivantes aki + instance_languages_dimension: Linguas popularas + instance_media_attachments_measure: dosyas adjuntas guadradas + instance_reports_measure: raportos sovre eyos + instance_statuses_measure: mesajes magazinados + delivery: + all: Todos + clear: Alimpiar yerros de entrega + failing: Fayando + restart: Reinisyar entrega + stop: Detener entrega + unavailable: No desponivle + delivery_available: Entrega desponivle + delivery_error_days: Diyas de yerro de entrega + delivery_error_hint: Si la entrega no es posivle a lo longo de %{count} diyas, se markara otomatikamente komo no entregable. + destroyed_msg: Los datos de %{domain} estan agora en kola para sus iminente efasasyon. + empty: No se toparon domenos. + known_accounts: + one: "%{count} kuento konesido" + other: "%{count} kuentos konesidos" + moderation: + all: Todos + limited: Limitado + title: Moderasyon + private_comment: Komento privado + public_comment: Komento publiko + purge: Purga + purge_description_html: Si kreyes ke este domeno esta deskonektado, puedes efasar todos los rejistros de kuentos i los datos asosyados de este domeno de tu magazinaje. Esto puede levar un tiempo. + title: Federasyon + total_blocked_by_us: Blokado por mozotros + total_followed_by_them: Segidos por eyos + total_followed_by_us: Segidos por mozotros + total_reported: Raportos sovre eyos + total_storage: Aneksos de multimedia + totals_time_period_hint_html: Los totales amostrados a kontinuasyon inkluyen datos para todo el tiempo. + invites: + deactivate_all: Dezaktiva todos + filter: + all: Todos + available: Desponivles + expired: Kadukados + title: Filtra + title: Envitasyones + ip_blocks: + add_new: Kriya regla + created_msg: Mueva regla de IP adjustada kon sukseso + delete: Efasa + expires_in: + '1209600': 2 semanas + '15778476': 6 mezes + '2629746': 1 mez + '31556952': 1 anyo + '86400': 1 diya + '94670856': 3 anyos + new: + title: Kriya mueva regla de IP + no_ip_block_selected: No se tienen trokado reglas IP deke niguna fue eskojida + title: Reglas de IP + relationships: + title: Relasyones de %{acct} + relays: + add_new: Adjusta un muevo relevo + delete: Efasa + description_html: Un relevo de federasyon es un sirvidor intermedio ke enterkambia mabules de publikasyones publikas entre sirvidores ke se abonan i publikan en el. Puede ayudar a sirvidores chikos i medianos a diskuvrir kontenido del fediverso, ke de otra manera rekeriria ke los utilizadores lokales sigiesen manualmente a personas de sirvidores remotos. + disable: Inkapasita + disabled: Inkapasitado + enable: Kapasita + enable_hint: Una vez konektado, tu sirvidor se abonara a todas las publikasyones publikas de este relevo, i ampesara a embiar las publikasyones publikas de este sirvidor verso el. + enabled: Kapasitado + inbox_url: URL del relevo + pending: Asperando la achetasion del relevo + save_and_enable: Guadra i konekta + setup: Apareja una koneksyon de relevos + signatures_not_enabled: Los relevos no fonksionaran djustamente mientres el modo siguro o el modo de federasyon limitada esten kapasitados + status: Estado + title: Relevos + report_notes: + created_msg: Tienes kriyado djustamente la nota de denunsia! + destroyed_msg: Tienes efasado djustamente la nota de denunsia! + reports: + account: + notes: + one: "%{count} nota" + other: "%{count} notas" + action_log: Defter de revizyon + action_taken_by: Aksyon tomada por + actions: + delete_description_html: Los mesajes denunsiados seran supremidos i se enrejistrara un amonestamiento para ayudarte kon las futuras infraksyones por el mezmo kuento. + mark_as_sensitive_description_html: Las dosyas de multimedia en los mesajes enformados se markaran komo sensivles i se aplikara un amonestamiento para ayudarte kon las futuras infraksyones del mezmo kuento. + other_description_html: Ve mas opsiones para kontrolar el komporto del kuento i personalizar la komunikasyon del kuento raportado. + resolve_description_html: No se tomaran aksyones kontra el kuento denunsiado, no se enrejistrara el amonestamiento, i se serrara el raporto. + silence_description_html: El profil sera vizivle solo para akeyos ke ya lo sigan o lo bushken manualmente, limitando seriamente su alkanse. Siempre puede ser revertido. + suspend_description_html: El profil i todos sus kontenidos seran inaksesivles asta ke sean enfin supremidos. La enteraksion kon el kuento sera emposivle. Reversivle durante un tiempo de 30 diyas. + actions_description_html: Dechide kualas mizuras tomar para rezolver esta denunsia. Si tomas una aksion punitiva kontra el kuento denunsiada, se le embiara a dicho kuento un avizo por posta elektronika, ekseptado kuando se eskoja la kategoria Spam. + actions_description_remote_html: Dechide ke fazer para rezolver este raporto. Esto solo va afektar komo tu sirvidor komunike kon este kuento remoto i ke faze kon su kontenido. + add_to_report: Adjusta mas al raporto + are_you_sure: Estas siguro? + assign_to_self: Asinyamela a mi + assigned: Moderador asinyado + by_target_domain: Domeno del kuento raportado + cancel: Anula + category: Kategoria + category_description_html: La razon por la ke se raporto este kuento o kontenido sera mensyonada en las komuniksayones kon el kuento raportado + comment: + none: Dinguno + comment_description_html: 'Para dar mas enformasyon, %{name} eskrivio:' + confirm: Konfirma + confirm_action: Konfirma la aksyon de moderasyon kontra @%{acct} + created_at: Raportado + delete_and_resolve: Efasa publikasyones + forwarded: Reembiado + forwarded_to: Reembiado a %{domain} + mark_as_resolved: Marka komo rezolvido + mark_as_sensitive: Marka komo sensivle + mark_as_unresolved: Marka komo no rezolvido + no_one_assigned: Dinguno + notes: + create: Adjusta una nota + create_and_resolve: Rezolve kon una nota + create_and_unresolve: Reavre kon una nota + delete: Efasa + placeholder: Espesifika ke aksyones se tienen tomado o kualkier otro haber... + title: Notas + notes_description_html: Ve i desha notas a otros moderadores i a tu yo futuro + processed_msg: 'Raporto #%{id} prosesado kon sukseso' + quick_actions_description_html: 'Toma una aksion rapida o metete abasho para ver el kontenido denunsiado:' + remote_user_placeholder: el utilizador remoto de %{instance} + reopen: Reavre denunsia + report: 'Raporta #%{id}' + reported_account: Kuento raportado + reported_by: Raportado por + resolved: Rezolvido + resolved_msg: Tienes rezolvido la denunsia djustamente! + skip_to_actions: Ir direktamente a las aksyones + status: Estado + statuses: Kontenido raportado + statuses_description_html: El kontenido ofensivo se sitara en la komunikasyon kon el kuento raportado + summary: + action_preambles: + delete_html: 'Vas kitar algunas de las publikasyones de @%{acct}''''. Esto va:' + mark_as_sensitive_html: 'Vas markar algunas de las publikasyones de @%{acct} komo sensivles. Esto va:' + silence_html: 'Vas limitar el kuento de @%{acct}''''. Esto va:' + suspend_html: 'Vas suspender el kuento de @%{acct}''''. Esto va:' + actions: + delete_html: Kitar las publikasyones ofensivas + mark_as_sensitive_html: Markar los multimedios de la publikasyon komo sensivles + silence_html: Severamente limitar la vizivilita de @%{acct}, fazendo su profil i kontenido vizivles solo para las personas ke ya lo sigen o manualmente bushkan su profil + suspend_html: Suspender @%{acct}, faziendo su profil i kontenido inaksesivle i no disponivle para interaksiones + close_report: 'Markar raporto #%{id} komo rezolvido' + close_reports_html: Markar todos los raportos kontra @%{acct} komo rezolvidos + delete_data_html: Efasa el profil i kontenido de @%{acct} en 30 dias si no sea desuspendido en akel tiempo + preview_preamble_html: "@%{acct} resivira una avertensya komo esta:" + record_strike_html: Enrejistra un amonestamiento kontra @%{acct} para ke te ayude eskalar las violasyones de reglas de este kuento en el avenir + send_email_html: Embia un mesaj de avertensia a la posta elektronika de @%{acct} + warning_placeholder: Adisionalas, opsionalas razones la aksyon de moderasyon. + target_origin: Orijin del kuento raportado + title: Raportos + unassign: Dezasinyar + unknown_action_msg: 'Aksyon no konesida: %{action}' + unresolved: No rezolvido + updated_at: Aktualizado + view_profile: Ve profil + roles: + add_new: Adjusta rolo + assigned_users: + one: "%{count} utilizador" + other: "%{count} utilizadores" + categories: + administration: Administrasyon + devops: DevOps + invites: Envytasyones + moderation: Moderasyon + special: Espesial + delete: Efasa + description_html: Kon rolos de utilizador, puede personalizar las fonksiones i areas de Mastodon a las ke pueden akseder sus utilizadores. + edit: Edita rolo '%{name}' + everyone: Permisos predeterminados + everyone_full_description_html: Este es el rolo base ke afecta a todos los utilizadores, inkluzo akeyos sin un rolo asinyado. Todos los otros rolos eredan permisos de el. + permissions_count: + one: "%{count} permiso" + other: "%{count} permisos" + privileges: + administrator: Administrador + administrator_description: Los utilizadores kon este permiso saltaran todos los permisos + delete_user_data: Efasar datos de utilizador + delete_user_data_description: Permete a los utilizadores supremir los datos de otros utilizadores sin demora + invite_users: Envita a djente + invite_users_description: Permete a los utilizadores envitar a muevas personas al sirvidor + manage_announcements: Administra pregones + manage_announcements_description: Permete a los utilizadores gestionar pregones en el sirvidor + manage_appeals: Administra apelasiones + manage_appeals_description: Permete a los utilizadores revizar apelasiones kontra aksyones de moderasyon + manage_blocks: Administra blokos + manage_blocks_description: Permete a los utilizadores blokar los prokuradores de posta elektronika i los adresos IP + manage_custom_emojis: Administra emojis personalizados + manage_custom_emojis_description: Permete a los utilizadores editar emojis personalizados en el sirvidor + manage_federation: Administra federasyon + manage_federation_description: Permete a los utilizadores blokar o permeter la federasyon kon otros domenos, i kontrolar la entregabilita + manage_invites: Administra envitasyones + manage_invites_description: Permete a los utilizadores navegar i dezaktivar los atadijos de envitasyon + manage_reports: Administra raportos + manage_reports_description: Permete a los utilizadores revizar raportos i realizar aksyones de moderasyon bazadas en eyos + manage_roles: Administra rolos + manage_roles_description: Permete a los utilizadores administrar i asinyar rolos por debasho de los suyos + manage_rules: Administra reglas + manage_rules_description: Permete a los utilizadores trokar las reglas del sirvidor + manage_settings: Administra konfigurasyon + manage_settings_description: Permete a los utilizadores trokar la konfigurasyon del sitio + manage_taxonomies: Administra etiketas + manage_taxonomies_description: Permete a los utilizadores revizar el kontenido en trend i aktualizar la konfigurasyon de las etiketas + manage_user_access: Administra akseso de utilizadores + manage_user_access_description: Permete a los utilizadores dezaktivar la autentifikasyon en dos pasos de otros utilizadores, trokar sus adreso de posta elektronika i restableser sus kod + manage_users: Administra utilizadores + manage_users_description: Permete a los utilizadores ver los peratim de otros utilizadores i realizar aksyones de moderasyon kontra eyos + manage_webhooks: Administrar webhooks + view_devops: DevOps + title: Rolos + rules: + add_new: Adjusta regla + delete: Efasa + edit: Edita regla + title: Reglas del sirvidor + settings: + about: + manage_rules: Administra reglas del sirvidor + title: Sovre esto + appearance: + title: Aparensya + discovery: + follow_recommendations: Rekomendasyones de kuentos + profile_directory: Katalogo de profiles + public_timelines: Linyas de tiempo publikas + trends: Trendes + domain_blocks: + all: A todos + disabled: A dinguno + users: Para los utilizadores lokales ke entrado en su kuento + registrations: + preamble: Kontrola ken puede kriyar un kuento en tu sirvidor. + title: Enrejistramientos + registrations_mode: + modes: + approved: Se rekiere achetasion para enrejistrarse + none: Permete a los utilizadores trokar la konfigurasyon del sitio + open: Kualkiera puede enrejistrarse + title: Konfigurasyon del sirvidor + site_uploads: + delete: Efasa dosya kargada + destroyed_msg: Dosya supremida kon sukseso! + software_updates: + documentation_link: Ambezate mas + title: Aktualizasyones desponivles + type: Tipo + version: Versyon + statuses: + account: Autor + application: Aplikasyon + back_to_account: Retorna al kuento + back_to_report: Retorna a la pajina del raporto + batch: + remove_from_report: Kita del raporto + report: Raporto + deleted: Efasado + favourites: Favoritos + history: Estoria de versiones + in_reply_to: En repuesta a + language: Lingua + media: + title: Multimedia + metadata: Metadatos + no_status_selected: No se troko dinguna publikasyon al no eskojer dinguna + open: Avre publikasyon + original_status: Publikasyon orijinala + reblogs: Repartajasyones + status_changed: Publikasyon trokada + title: Publikasyones del kuento + trending: Trendes + visibility: Vizivilita + with_media: Kon multimedia + strikes: + actions: + delete_statuses: "%{name} supremio las publikasyones de %{target}" + disable: "%{name} konjelo el kuento de %{target}" + mark_statuses_as_sensitive: "%{name} tiene markado las publikasyones de %{target} komo sensivles" + none: "%{name} embio una avertensya a %{target}" + sensitive: "%{name} marko el kuento de %{target} komo sensivle" + silence: "%{name} limito el kuento de %{target}" + suspend: "%{name} suspendio el kuento de %{target}" + appeal_approved: Apelado + appeal_pending: Apelasyon asperando + appeal_rejected: Apelasyon refuzada + system_checks: + database_schema_check: + message_html: Ay migrasyones asperando de la baza de datos. Por favor, egzekutalas para asigurarte de ke la aplikasyon fonksiona komo deveria + elasticsearch_preset: + action: Ve dokumentasyon + elasticsearch_preset_single_node: + action: Ve dokumentasyon + elasticsearch_running_check: + message_html: No se pudo konektar a Elasticsearch. Por favor, averigua ke esta egzekutandose, o dezaktiva la bushkeda de teksto kompleto + elasticsearch_version_check: + message_html: 'Versyon inkompativle de Elasticsearch: %{value}' + version_comparison: Elasticsearch %{running_version} se esta egzekutando ama ay menester de Elasticsearch %{required_version} + rules_check: + action: Administra reglas del sirvidor + message_html: No tienes definido dinguna regla del sirvidor. + sidekiq_process_check: + message_html: No ay dingun prosedura Sidekiq en egzekusion para la(s) kola(s) %{value}. Por favor, reviza tu konfigurasyon de Sidekiq + upload_check_privacy_error: + message_html: "Tu sirvidor de web es mal konfigurado. La privasita de tus utilizadores esta en riziko." + upload_check_privacy_error_object_storage: + action: Ve aki para mas enformasyon + message_html: "Tu magazinaje de objektos es mal konfigurado. La privasita de tus utilizadores esta en riziko." + tags: + review: Estado de revizion + updated_msg: Konfigurasyon de etiketas aktualizada kon sukseso + title: Administrasyon + trends: + allow: Permete + approved: Achetadas + disallow: No permete + links: + allow: Permete atadijo + allow_provider: Permete publikador + description_html: Estos son atadijos ke aktualmente estan siendo partajados muncho por los kuentos dizde las ke tu sirvidor ve los mesajes. Pueden ayudar a tus utilizadores a averiguar ke esta pasando en el mundo. Ningun atadijo se amostren publikamente asta ke autorice al domeno. Tamyen puede permeter o refuzar atadijos individuales. + disallow: Refuza atadijo + disallow_provider: Refuza publikador + no_link_selected: No se troko dingun atadijo porke no eskojites dinguno + publishers: + no_publisher_selected: No se troko dingun publikador porke no eskojites dinguno + title: Atadijos en trend + usage_comparison: Partajado %{today} vezes oy, komparado kon %{yesterday} ayer + not_allowed_to_trend: Sin permiso para estar en trendes + only_allowed: Solo las permetidas + pending_review: Revizion esta asperando + preview_card_providers: + allowed: Los atadijos de este medio pueden ser trend + description_html: Estos son domenos dizde los ke los atadijos akoruto se partajan en sus sirvidor. Los atadijos no seran trend publikamente a menos ke se achete el domeno del atadijo. Sus achetasion (o refuzo) se ekstende a los subdomenos. + rejected: Los atadijos de este medio no pueden ser trend + title: Medios + rejected: Refuzadas + statuses: + allow: Permete publikasyon + allow_account: Permete al autor + description_html: Estas son publikasyones ke tu sirvidor konese ke estan siendo partajadas muncho i plazen a munchas personas en este momento. Puedes ayudar a tus utilizadores muevos i retornantes a topar mas djente a la ke segir. No ay mesajes ke se amostren publikamente asta ke aproves el autor i el autor permeta ke su kuento sea sugjerado a otros. Tamyen puedes permeter o refuzar mesajes individuales. + disallow: No permete publikasyon + disallow_account: No permete al autor + no_status_selected: No se troko dinguna publikasyon en trend porke no seleksionates dingunas + not_discoverable: El autor no tiene optado por ser detektable + shared_by: + one: Repartajado por o plaze a alguno una vez + other: Repartajado por o plaze a alguno %{friendly_count} vezes + title: Publikasyones en trend + tags: + current_score: Puntuasion aktuala %{score} + dashboard: + tag_accounts_measure: uzos unikos + tag_languages_dimension: Linguas popularas + tag_servers_dimension: Sirvidores prinsipales + tag_servers_measure: desferentes sirvidores + tag_uses_measure: uzos totales + description_html: Estas son etiketas ke estan aparesiendo en munchas publikasyones ke tu sirvidor ve. Pueden ayudar a tus utilizadores a averiguar de ke avla mas djente en estos momentos. No ay etiketas ke se amostren publikamente asta ke las achetes. + listable: Pueden ser rekomendadas + no_tag_selected: No se troko dinguna etiketa al no eskojer dinguna + not_listable: No seran rekomendadas + not_usable: No se pueden uzar + trendable: Pueden apareser en trendes + trending_rank: Trend n.º %{rank} + usable: Pueden uzarse + usage_comparison: Uzada %{today} vezes oy, komparado kon %{yesterday} ayer + used_by_over_week: + one: Uzada por una persona durante la ultima semana + other: Uzada por %{count} personas durante la ultima semana + title: Trendes + trending: En trend + warning_presets: + add_new: Adjusta muevo + delete: Efasa + edit_preset: Edita avizo predeterminado + empty: Ainda no tienes definido ningun avizo predeterminado. + title: Edita konfigurasyon predeterminada de avizos + webhooks: + add_new: Adjusta endpoint + delete: Efasa + description_html: Un webhook permete a Mastodon embiar avizos en tiempo real sovre los evenimientos eskojidos a tu propia aplikasyon, para ke tu aplikasyon pueda lanzar reaksyones otomatikamente. + disable: Inkapasita + disabled: Inkapasitado + edit: Edita endpoint + empty: Ainda no tienes ningun endpoint de webhook konfigurado. + enable: Kapasita + enabled: Aktivo + enabled_events: + one: 1 evenimiento kapasitado + other: "%{count} evenimientos kapasitados" + events: Evenimientos + new: Muevo webhook + rotate_secret: Rotar sekreto + secret: Firmando sekreto + status: Estado + title: Webhooks + webhook: Webhook + admin_mailer: + new_appeal: + actions: + delete_statuses: para supremir sus mesajes + disable: para konjelar su kuento + mark_statuses_as_sensitive: para markar sus mesajes komo sensivles + none: una avertensya + sensitive: para markar su kuento komo sensivle + silence: para limitar su kuento + suspend: para suspender su kuento + body: "%{target} esta apelando a una solisitasyon de moderasyon de %{action_taken_by} el %{date}, del tipo %{type}. Eyos eskrivieron:" + next_steps: Puedes achetar la apelasyon para dezazer la dechizyon de moderasyon, o ignorarla. + subject: "%{username} esta apelando a una dechizyon de moderasyon en %{instance}" + new_pending_account: + body: Los peratim del muevo kuento estan abashos. Puedes achetar o refuzar esta aplikasyon. + subject: Muevo kuento para revizion en %{instance} (%{username}) + new_report: + body: "%{reporter} tiene raportado a %{target}" + body_remote: Alguno de %{domain} a raportado a %{target} + subject: Muevo raporto para la %{instance} (#%{id}) + new_trends: + body: 'Los sigientes elementos nesesitan una revizion antes de ke se puedan amostrar publikamente:' + new_trending_links: + title: Atadijos en trend + new_trending_statuses: + title: Publikasyones en trend + new_trending_tags: + title: Etiketas en trend + appearance: + advanced_web_interface: Enterfaz web avanzada + sensitive_content: Kontenido sensivle + application_mailer: + salutation: "%{name}," + settings: 'Troka preferensyas de posta: %{link}' + unsubscribe: Dezabona + view: 'Mira:' + view_profile: Ve profil + view_status: Ve publikasyon + applications: + created: Aplikasyon kriyada kon sukseso + destroyed: Aplikasyon supremida kon sukseso + logout: Sal + regenerate_token: Redjenera token de akseso + token_regenerated: Token de akseso redjenerado kon sukseso + warning: Ten muncho kudiado kon estos datos. No los partajes kon dinguno! + your_token: Tu token de akseso + auth: + apply_for_account: Solisita un kuento + confirmations: + login_link: konektate kon kuento + welcome_title: Bienvenido, %{name}! + wrong_email_hint: Si este adreso de posta es inkorekto, puedes trokarlo en las preferensyas del kuento. + delete_account: Efasa kuento + delete_account_html: Si keres supremir tu kuento, puedes ir aki. Seras pedido de una konfirmasyon. + description: + prefix_invited_by_user: "@%{name} te envita a unirte a este sirvidor de Mastodon!" + prefix_sign_up: Adjuntate a Mastodon oy! + suffix: Kon un kuento podras segir a djente, publikar haberes e enterkambiar mesajes kon utilizadores de kualkier sirvidor de Mastodon i mas! + didnt_get_confirmation: No risivites el atadijo de konfirmasyon? + dont_have_your_security_key: No tienes tu yave de sigurita? + forgot_password: Neglijates tu kod? + invalid_reset_password_token: El token de reinisyo de kod es malato o ekspiro. Por favor pide uno muevo. + link_to_otp: Introduse un kodiche de autorizasyon en dos pasos dizde tu telefon o un kodiche de rekuperasyon + link_to_webauth: Utiliza tu aparato de yave de sigurita + log_in_with: Konektate kon kuento kon + login: Konektate kon kuento + logout: Sal + migrate_account: Transferate a otro kuento + migrate_account_html: Si keres readresar este kuento a otra distinta, puedes konfigurarlo aki. + or_log_in_with: O konektate kon tu kuento kon + privacy_policy_agreement_html: Tengo meldado i acheto la politika de privasita + progress: + confirm: Konfirma posta + details: Tus detalyos + rules: Acheta reglas + providers: + cas: CAS + saml: SAML + register: Enrejistrate + registration_closed: "%{instance} no esta achetando a muevos miembros" + resend_confirmation: Reembia posta de konfirmasyon + reset_password: Reinisya kod + rules: + accept: Acheta + back: Atras + preamble: Estas son establesidas i aplikadas por los moderadores de %{domain}. + title: Algunas reglas bazikas. + security: Sigurita + set_new_password: Establese muevo kod + setup: + email_below_hint_html: Mira en tu kuti de spam o solisita de muevo. Si el adreso de posta elektronika ke aparese aki es yerrado, puedes trokarlo aki. + sign_in: + preamble_html: Konektate kon tus kredensiales de %{domain}. Si tu kuento esta balabayado en otruno servidor, no puedras konektarte aki. + title: Konektate kon %{domain} + sign_up: + preamble: Kon un kuento en este sirvidor de Mastodon, podras segir a kualkier otra persona en la red, endependientemente del sirvidor en el ke se tope. + title: Kriya kuento de Mastodon en %{domain}. + status: + account_status: Estado del kuento + confirming: Bekleando konfirmasyon de posta elektronika. + functional: Tu kuento esta kompletamente funksyonal. + pending: Tu solisitasyon esta asperando la revizion por muestros administradores. Esto puede tadrar algun tiempo. Arisiviras una posta elektronika si la solisitasyon sea achetada. + redirecting_to: Tu kuento se topa inaktivo porke esta siendo readresado a %{acct}. + view_strikes: Ve amonestamientos pasados kontra tu kuento + too_fast: Formulario enviado demaziado rapido, aprovalo de muevo. + use_security_key: Uza la yave de sigurita + challenge: + confirm: Kontinua + hint_html: "Tip: No retornaremos a demandarte por el kod durante la sigiente ora." + invalid_password: Kod inkorekto + prompt: Konfirma kod para segir + crypto: + errors: + invalid_key: no es una yave Ed25519 o Curve25519 valida + invalid_signature: no es una firma Ed25519 valida + date: + formats: + default: "%d %b %Y" + with_month_name: "%d %B %Y" + datetime: + distance_in_words: + about_x_hours: "%{count} o" + about_x_months: "%{count} me" + about_x_years: "%{count} a" + almost_x_years: "%{count} a" + half_a_minute: Agora + less_than_x_minutes: "%{count} m" + less_than_x_seconds: Agora + over_x_years: "%{count} a" + x_days: "%{count} d" + x_minutes: "%{count} m" + x_months: "%{count} me" + x_seconds: "%{count} s" + deletes: + proceed: Efasa kuento + disputes: + strikes: + action_taken: Aksyon tomada + appeal: Apela + appeal_submitted_at: Apelasyon embiada + appealed_msg: Tu apelasyon fue embiada. Si la achetamos, se te avizara. + appeals: + submit: Embia apelasyon + approve_appeal: Acheta apelasyon + associated_report: Raporto asosiado + created_at: Kon data + description_html: Estas son las aksyones emprendidas kontra tu kuento i las avertensyas ke te an sido enviadas por la taifa de %{instance}. + recipient: Dirijda a + reject_appeal: Refuza apelasyon + status: 'Publikasyon #%{id}' + status_removed: Publikasyon ya supremida del sistem + title: "%{action} del %{date}" + title_actions: + delete_statuses: Efasasyon de publikasyon + disable: Konjelasyon del kuento + mark_statuses_as_sensitive: Markamiento de los mesajes komo sensivles + none: Avertensya + sensitive: Markamiento del kuento komo sensivle + silence: Limitasyon de kuento + suspend: Suspensyon de kuento + your_appeal_approved: Tu apelasyon fue achetada + your_appeal_pending: Tienes enviado una apelasyon + your_appeal_rejected: Tu apelasyon fue refuzada + domain_validator: + invalid_domain: no es un nombre de domeno valido + edit_profile: + other: Otros + errors: + '400': La solisitasyon ke enviates no fue valida o fue malformada. + '403': No tienes permiso para ver esta pajina. + '404': La pajina ke bushkas no egziste. + '406': Esta pajina no esta desponivle en el formato solisitado. + '410': La pajina ke estavas bushkando no egziste mas. + '422': + content: Verifikasyon de sigurita no reushida. Estas blokando algunas cookies? + title: Verifikasyon de sigurita no reushida + '429': Demaziadas solisitasyones + '500': + content: Pardon, algo tiene fonksionado mal por muestra parte. + title: Esta pajina no es djusta + '503': La pajina no se tiene podido desbarkar por un yerro temporal del sirvidor. + noscript_html: Para uzar la aplikasyon web de Mastodon, por favor aktiva Javascript. Alternativamente, aprova alguna de las aplikasyones nativas para Mastodon para tu platforma. + existing_username_validator: + not_found: no se pudo topar un utilizador lokal kon akel nombre de utilizador + not_found_multiple: no se pudo topar %{usernames} + exports: + archive_takeout: + date: Data + download: Abasha tu dosya + hint_html: Puedes solisitar una dosya de tus publikasyones i dosyas multimedia kargadas. Los datos eksportados estaran en formato ActivityPub, meldavles por kualkier programario kompativle. Puedes solisitar una dosya kada 7 diyas. + in_progress: Rekopilando tu dosya... + request: Solisita tu dosya + size: Boy + blocks: Personas a las kualas tienes blokado + bookmarks: Markadores + csv: CSV + domain_blocks: Blokos de domenos + lists: Listas + mutes: Silensias + storage: Magazinaje de multimedia + featured_tags: + add_new: Adjusta muevo + filters: + contexts: + account: Profiles + notifications: Avizos + public: Linyas de tiempo publikas + edit: + add_keyword: Adjusta biervo yave + keywords: Biervos yaves + statuses: Publikasyones individualas + index: + delete: Efasa + title: Filtros + new: + save: Guadra muevo filtro + title: Adjusta muevo filtro + statuses: + back_to_filter: Retorna al filtro + batch: + remove: Kita del filtro + generic: + all: Todos + cancel: Anula + confirm: Konfirma + copy: Kopia + delete: Efasa + none: Dinguno + save_changes: Guadra trokamientos + today: oy + imports: + errors: + invalid_csv_file: 'Dosya CSV no valida. Yerro: %{error}' + over_rows_processing_limit: kontiene mas de %{count} filas + too_large: Dosya es mas grande + imported: Importado + modes: + merge: Une + merge_long: Manten rejistros egzistentes i adjusta muevos + overwrite: Sobreskrive + overwrite_long: Mete muevos rejistros en vez de los aktuales + preface: Puedes importar siertos datos, komo todas las personas a las kualas estas sigiendo o blokando en tu kuento en esta instansya, dizde dosyas eksportadas de otra instansya. + states: + finished: Finalizado + scheduled: Programado + unconfirmed: Sin konfirmasyon + status: Estado + success: Tus datos se tienen kargado djustamente i seran prosesados pishin + types: + blocking: Lista de blokos + bookmarks: Markadores + lists: Listas + upload: Karga + invites: + delete: Dezaktiva + expires_in: + '1800': 30 minutos + '21600': 6 oras + '3600': 1 ora + '43200': 12 oras + '604800': 1 semana + '86400': 1 diya + expires_in_prompt: Nunkua + max_uses: + one: 1 uzo + other: "%{count} uzos" + max_uses_prompt: Sin limito + table: + expires_at: Kaduka + uses: Uzos + title: Envita a djente + lists: + errors: + limit: Tienes alkansado el karar maksimo de listas + login_activities: + authentication_methods: + otp: aplikasyon de autentifikasyon en dos pasos + password: kod + sign_in_token: kodiche de sigurita por posta elektronika + webauthn: yaves de sigurita + description_html: Si ves una aktivita ke no rekoneses, konsidera trokar tu kod i kapasitar la autentifikasyon en dos pasos. + empty: No ay estoria de autentifikasyon desponivle + failed_sign_in_html: Prova de inisiasyon de sesion no reushida kon %{method} de %{ip} (%{browser}) + successful_sign_in_html: Prova de sesion reushida kon %{method} dizde %{ip} (%{browser}) + title: Estoria de autentifikasyon + mail_subscriptions: + unsubscribe: + complete: Dezabonado + title: Dezabona + media_attachments: + validations: + images_and_video: No se puede adjuntar un video a un estado ke ya kontenga imajes + not_ready: No se pueden adjuntar dosyas ke no se tienen eskapado de prosesar. Aprovalo de muevo en un momento! + too_many: No se pueden adjuntar mas de 4 dosyas + migrations: + acct: Migrado a + cancel: Anula readreso + cancel_explanation: Al anular el readreso se reaktivara tu kuento aktual, ama no rekuperaras los suivantes ke ayan sido trasladados al otro kuento. + cancelled_msg: Tienes anulado el readreso djustamente. + errors: + already_moved: es el mezmo kuento al ke ya tienes migrado + missing_also_known_as: no es un alias de este kuento + move_to_self: no puede ser el kuento aktual + not_found: no se pudo topar + on_cooldown: Estas en tiempo de reutilizasyon + followers_count: Suivantes al momento de migrar + incoming_migrations: Migra de un kuento desferente + incoming_migrations_html: Para migrar de otro kuento a este, primero kale kriyar un alias del kuento. + moved_msg: Tu kuento agora se esta redirigiendo a %{acct} i tus suivantes se estan migrando. + not_redirecting: Tu kuento no se esta readresando a dinguna otro kuento aktualmente. + on_cooldown: Tienes migrado tu kuento rezientemente. Esta fonksyon estara desponivle de muevo en %{count} diyas. + past_migrations: Migrasyones pasadas + proceed_with_move: Migra suivantes + redirected_msg: Tu kuento agora readresa a %{acct}. + redirecting_to: Tu kuento se esta readresando a %{acct}. + set_redirect: Establese readreso + warning: + backreference_required: El muevo kuento deve ser konfigurado primero para fazer referensya a este + before: 'Antes de kontinuar, por favor melda kon atensyon las sigientes notas:' + cooldown: Dempues de migrar ay un periodo de aspera durante el kual no podras retornar a migrar + disabled_account: Tu kuento aktual no sera kompletamente utilizable dempues. Portanto, tendras akseso a la eksportasyon de datos ansi komo a la reaktivasyon. + followers: Esta aksion migrara a todos los suivantes del kuento aktual al muevo kuento + only_redirect_html: Alternativamente, solo puedes poner un readreso en tu profil. + moderation: + title: Moderasyon + notification_mailer: + follow: + title: Muevo suivante + follow_request: + title: Mueva solisitud de segimiento + mention: + action: Arisponde + number: + human: + decimal_units: + format: "%n%u" + units: + billion: MM + million: M + thousand: K + otp_authentication: + enable: Kapasita + instructions_html: "Eskanea este kodiche QR dizde Google Authenticator o una aplikasyon similar en tu telefon. A partir de agora, esta aplikasyon djenerara kodiches ke tendras ke ingresar kuando keras konektarte kon tu kuento." + manual_instructions: 'Si no puedes eskanear el kodiche QR i nesesitas introdusirlo manualmente, este es el sekreto en teksto plano:' + setup: Konfigura + wrong_code: El kodiche ingresado es malato! Es djusta la ora del aparato i el sirvidor? + pagination: + newer: Mas muevo + next: Sigiente + older: Mas viejo + prev: Anterior + truncate: "…" + polls: + errors: + already_voted: Ya tienes votado en esta anketa + duplicate_options: kontiene elementos duplikados + duration_too_long: esta demaziado leshos en el avenir + duration_too_short: es demaziado pronto + expired: La anketa ya tiene eskapado + invalid_choice: La opsyon de voto eskojida no egziste + over_character_limit: no puede trespasar %{max} karakteres kada uno + too_few_options: deve tener mas de un elemento + too_many_options: no puede kontener mas de %{max} elementos + preferences: + other: Otros + posting_defaults: Konfigurasyon predeterminada de publikasyones + public_timelines: Linyas de tiempo publikas + privacy: + privacy: Privasita + search: Bushkeda + privacy_policy: + title: Politika de privasita + reactions: + errors: + limit_reached: Limito de reaksyones desferentes alkansado + unrecognized_emoji: no es un emoji konesido + relationships: + activity: Aktivita del kuento + confirm_follow_selected_followers: Estas siguro ke keres segir a los suivantes eskojidos? + confirm_remove_selected_followers: Estas siguro ke keres kitar a los suivantes eskojidos? + confirm_remove_selected_follows: Estas siguro ke keres kitar los kuentos segidos a los kualos tienes eskojido? + dormant: Inaktivo + follow_failure: No se pudo segir algunos de los kuentos eskojidos. + follow_selected_followers: Sige a los suivantes eskojidos + followers: Suivantes + following: Segidos + invited: Envitados + last_active: Ultima aktivita + most_recent: Mas reziente + moved: Migrados + mutual: Mutual + primary: Prinsipal + relationship: Relasyon + status: Estado del kuento + rss: + content_warning: 'Avertensya de kontenido:' + sessions: + activity: Ultima aktivita + browsers: + alipay: Alipay + blackberry: BlackBerry + chrome: Chrome + edge: Microsoft Edge + electron: Electron + firefox: Firefox + huawei_browser: Huawei Browser + ie: Internet Explorer + micro_messenger: MicroMessenger + nokia: Nokia S40 Ovi Browser + opera: Opera + otter: Otter + phantom_js: PhantomJS + qq: QQ Browser + safari: Safari + uc_browser: UC Browser + weibo: Weibo + current_session: Sesyon aktuala + ip: IP + platforms: + adobe_air: Adobe Air + android: Android + blackberry: BlackBerry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + kai_os: KaiOS + linux: Linux + mac: macOS + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone + revoke: Revoka + revoke_success: Sesion revokada kon sukseso + title: Sesiones + view_authentication_history: Ve estoria de autentifikasyon de tu kuento + settings: + account: Kuento + account_settings: Preferensyas de kuento + aliases: Aliases del kuento + appearance: Aparensya + authorized_apps: Aplikasyones autorizadas + back: Retorna a Mastodon + delete: Efasa kuento + development: Dezvelopamiento + edit_profile: Edita profil + export: Eksporta enformasyon + featured_tags: Etiketas avaliadas + import: Importo + import_and_export: Importo i eksporto + migrate: Migrasyon de kuento + notifications: Avizos + preferences: Preferensyas + profile: Profil publiko + relationships: Segidos i suivantes + statuses_cleanup: Efasasyon otomatika de publikasyones + strikes: Amonestamientos de moderasyon + two_factor_authentication: Autentifikasyon en dos pasos + webauthn_authentication: Yaves de sigurita + statuses: + attached: + audio: + one: "%{count} audio" + other: "%{count} audios" + description: 'Atamiento: %{attached}' + image: + one: "%{count} imaje" + other: "%{count} imajes" + video: + one: "%{count} video" + other: "%{count} videos" + boosted_from_html: Repartajado dizde %{acct_link} + content_warning: 'Avertensya de kontenido: %{warning}' + default_language: La mezma ke la lingua de la enterfaz + disallowed_hashtags: + one: 'kontenia una etiketa no permetida: %{tags}' + other: 'kontenia las etiketas no permetidas: %{tags}' + edited_at_html: Editado %{date} + errors: + in_reply_not_found: La publikasion a la ke aprovas arispondir no egziste. + open_in_web: Avre en web + over_character_limit: limito de karakteres de %{max} superado + pin_errors: + direct: Las publikasyones ke son vizivles solo para los utilizadores enmentados no pueden fiksarse + limit: Ya tienes fiksado el numero maksimo de publikasyones + ownership: La publikasyon de otra persona no puede fiksarse + poll: + vote: Vota + show_more: Amostra mas + statuses_cleanup: + min_age: + '1209600': 2 semanas + '15778476': 6 mezes + '2629746': 1 mez + '31556952': 1 anyo + '5259492': 2 mezes + '604800': 1 semana + '63113904': 2 anyos + '7889238': 3 mezes + stream_entries: + sensitive_content: Kontenido sensivle + strikes: + errors: + too_late: Es demaziado tadre para apelar este amonestamiento + tags: + does_not_match_previous_name: no koensida kon el nombre anterior + themes: + contrast: Mastodon (alto kontraste) + default: Mastodon (eskuro) + mastodon-light: Mastodon (klaro) + time: + formats: + default: "%d de %b del %Y, %H:%M" + month: "%b %Y" + time: "%H:%M" + with_time_zone: "%d de %b del %Y, %H:%M %Z" + two_factor_authentication: + add: Adjusta + disable: Inkapasita autentifikasyon en dos pasos + disabled_success: Autentifikasyon de dos pasos inkapasitada djustamente + edit: Edita + enabled: Autentifikasyon de dos pasos esta kapasitada + enabled_success: Autentifikasyon de dos pasos kapasitada djustamente + generate_recovery_codes: Jenera kodiches de rekuperasyon + lost_recovery_codes: Los kodiches de rekuperasyon te permeten obtener akseso a tu kuento si piedres tu telefon. Si tienes pedrido tus kodiches de rekuperasyon, puedes redjenerarlos aki. Tus viejos kodiches de rekuperasyon se aran malatos. + methods: Metodos de autentifikasyon de dos pasos + otp: Aplikasyon de autentifikasyon + recovery_codes: Fazer kopias de sigurita de tus kodiches de rekuperasyon + recovery_codes_regenerated: Kodiches de rekupersayon redjenerados kon sukseso + recovery_instructions_html: Si piedres akseso a tu telefon, puedes uzar uno de los sigientes kodiches de rekuperasyon para obtener akseso a tu kuento. Mantenlos a salvo. Por enshemplo, puedes imprimirlos i guadrarlos kon otros dokumentos emportantes. + webauthn: Yaves de sigurita + user_mailer: + appeal_approved: + action: Va a tu kuento + explanation: La apelasyon del amonestamiento kontra tu kuento del %{strike_date} ke mandates el %{appeal_date} fue achetada. Tu kuento se topa de muevo en dobro estado. + subject: Tu apelasyon del %{date} fue achetada + title: Apelasyon achetada + appeal_rejected: + explanation: La apelasyon del amonestamiento kontra tu kuento del %{strike_date} ke mandates el %{appeal_date} fue refuzada. + subject: Tu apelasyon del %{date} fue refuzada + title: Apelasyon refuzada + backup_ready: + explanation: Tienes solisitado una kopia kompleta de tu kuento de Mastodon. Ya esta pronta para abashar! + subject: Tu dosya esta pronta para abashar + title: Abasha dosya + suspicious_sign_in: + change_password: troka tu kod + details: 'Aki estan los peratim de la koneksyon kon tu kuento:' + explanation: Topimos una koneksyon kon tu kuento dizde un muevo adreso IP. + further_actions_html: Si no fuites tu, te rekomendamos ke %{action} pishin i kapasites la autentifikasyon en dos pasos para mantener tu kuento siguro. + subject: Tu kuento fue aksedido dizde un muevo adreso IP + title: Una mueva koneksyon kon tu kuento + warning: + appeal: Embia una apelasyon + appeal_description: Si kreyes ke esto es un yerro, puedes embiar una apelasyon a la taifa de %{instance}. + categories: + spam: Spam + violation: El kontenido viola las sigientes reglas de la komunita + explanation: + delete_statuses: Se tiene determinado ke algunos de tus mesajes violan una o mas reglas de la komunita i por tanto fueron supremidos por los moderadores de %{instance}. + disable: Ya no puedes uzar tu kuento, ama tu profil i el resto de datos permanesen intactos. Puedes solisitar una kopia de sigurita de tus datos, trokar la konfigurasyon de tu kuento o supremirlo. + mark_statuses_as_sensitive: Algunas de tus publikasyones an sido markados komo sensivles por los moderadores de %{instance}. Esto sinyifika ke la djente tendra ke pulsar los dosyas multimedia en las publikasyones antes de ke se amostre una vista previa. Puedes markar los dosyas multimedia komo sensivles tu mezmo kuando publikes en el avenir. + sensitive: A partir de agora todas los dosyas multimedia ke subas seran markados komo sensivles i eskondidos tras una avertensya. + reason: 'Razon:' + title: + none: Avertensya + silence: Kuento limitado + suspend: Kuento suspendido + users: + signed_in_as: 'Konektado komo:' + verification: + verification: Verifikasyon + webauthn_credentials: + add: Adjusta mueva yave de sigurita + delete: Efasa + invalid_credential: Yave de sigurita no valida + nickname_hint: Introduska el sovrenombre de tu mueva yave de sigurita + not_enabled: Ainda no tienes aktivado WebAuthn + not_supported: Este navigador no soporta yaves de sigurita + otp_required: Para uzar yaves de sigurita, por favor kapasite primero la autentifikasyon de dos pasos. + registered_on: Enrejistrado el %{date} diff --git a/config/locales/pa.yml b/config/locales/pa.yml index bb8a6c834d9c41..7a34358ddb8ff6 100644 --- a/config/locales/pa.yml +++ b/config/locales/pa.yml @@ -1 +1,161 @@ +--- pa: + about: + about_mastodon_html: ਭਵਿੱਖ ਦਾ ਸ਼ੋਸ਼ਲ ਨੈੱਟਵਰਕ ਹੈ। ਕੋਈ ਇਸ਼ਤਿਹਾਰ ਨਹੀਂ, ਕੋਈ ਵਪਾਰਕ ਨਿਗਰਾਨੀ ਨਹੀਂ, ਨੈਤਿਕ ਡਿਜ਼ਾਇਨ ਅਤੇ ਖਿੰਡਿਆ ਹੋਇਆ ਨੈੱਟਵਰਕ! ਮਸਟੋਡੋਨ ਨਾਲ ਆਪਣੇ ਡਾਟੇ ਨੂੰ ਆਪਣਾ ਹੀ ਰੱਖੋ! + contact_missing: ਸੈੱਟ ਨਹੀਂ ਹੈ + contact_unavailable: ਲਾਗ ਨਹੀਂ + hosted_on: "%{domain} ਉੱਤੇ ਹੋਸਟ ਕੀਤਾ ਮਸਟਾਡੋਨ" + title: ਇਸ ਬਾਰੇ + accounts: + follow: ਫ਼ਾਲੋ + following: ਫ਼ਾਲੋ ਕੀਤੇ ਜਾ ਰਹੇ + posts_tab_heading: ਪੋਸਟਾਂ + admin: + account_moderation_notes: + create: ਨੋਟ ਭੇਜੋ + accounts: + approve: ਮਨਜ਼ੂਰ + are_you_sure: ਪੱਕਾ? + avatar: ਅਵਤਾਰ + by_domain: ਡੋਮੇਨ + change_email: + changed_msg: ਈਮੇਲ ਨੂੰ ਕਾਮਯਾਬੀ ਨਾਲ ਬਦਲਿਆ ਗਿਆ! + current_email: ਮੌਜੂਦਾ ਈਮੇਲ + label: ਈਮੇਲ ਬਦਲੋ + new_email: ਨਵੀਂ ਈਮੇਲ + submit: ਈਮੇਲ ਨੂੰ ਬਦਲੋ + title: "%{username} ਲਈ ਈਮੇਲ ਨੂੰ ਬਦਲੋ" + confirm: ਤਸਦੀਕ + confirmed: ਤਸਦੀਕ ਕੀਤਾ + confirming: ਤਸਦੀਕ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ + custom: ਕਸਟਮ + delete: ਡਾਟੇ ਨੂੰ ਹਟਾਓ + deleted: ਹਟਾਇਆ + display_name: ਦਿਖਾਇਆ ਜਾਣ ਵਾਲਾ ਨਾਂ + domain: ਡੋਮੇਨ + moderation: + all: ਸਭ + suspended: ਸਸਪੈਂਡ ਕੀਤਾ + title: ਖਾਤੇ + username: ਵਰਤੋਂਕਾਰ-ਨਾਂ + ip_blocks: + delete: ਹਟਾਓ + expires_in: + '1209600': 2 ਹਫ਼ਤੇ + '15778476': 6 ਮਹੀਨੇ + '2629746': 1 ਮਹੀਨਾ + '31556952': 1 ਸਾਲ + '86400': 1 ਦਿਨ + '94670856': 3 ਸਾਲ + relays: + enable: ਸਮਰੱਥ + enabled: ਸਮਰੱਥ ਹੈ + save_and_enable: ਸੰਭਾਲੋ ਅਤੇ ਸਮਰੱਥ ਕਰੋ + reports: + are_you_sure: ਪੱਕਾ? + cancel: ਰੱਦ ਕਰੋ + comment: + none: ਕੋਈ ਨਹੀਂ + notes: + delete: ਹਟਾਓ + settings: + about: + title: ਇਸ ਬਾਰੇ + statuses: + deleted: ਹਟਾਏ + favourites: ਮਨਪਸੰਦ + history: ਵਰਜ਼ਨ ਅਤੀਤ + in_reply_to: ਇਸ ਨੂੰ ਜਵਾਬ ਦਿੱਤਾ ਜਾ ਰਿਹਾ ਹੈ + language: ਭਾਸ਼ਾ + media: + title: ਮੀਡੀਆ + metadata: ਮੇਟਾਡਾਟਾ + webhooks: + delete: ਹਟਾਓ + disable: ਅਸਮਰੱਥ + disabled: ਅਸਮਰੱਥ ਹੈ + enable: ਸਮਰੱਥ + application_mailer: + salutation: "%{name}," + applications: + logout: ਲਾਗ ਆਉਟ + your_token: ਤੁਹਾਡਾ ਪਹੁੰਚ ਟੋਕਨ + auth: + apply_for_account: ਖਾਤੇ ਲਈ ਬੇਨਤੀ + confirmations: + login_link: ਲਾਗ ਇਨ + welcome_title: "%{name}, ਜੀ ਆਇਆਂ ਨੂੰ!" + delete_account: ਖਾਤੇ ਨੂੰ ਹਟਾਓ + forgot_password: ਆਪਣਾ ਪਾਸਵਰਡ ਭੁੱਲ ਗਏ ਹੋ? + log_in_with: ਇਸ ਨਾਲ ਲਾਗਇਨ ਕਰੋ + login: ਲਾਗ ਇਨ + logout: ਲਾਗ ਆਉਟ + rules: + accept: ਮਨਜ਼ੂਰ + back: ਪਿੱਛੇ + challenge: + confirm: ਜਾਰੀ ਰੱਖੋ + date: + formats: + default: "%d %b %Y" + with_month_name: "%d %B %Y" + datetime: + distance_in_words: + about_x_hours: "%{count}ਘੰ" + about_x_months: "%{count}ਮਹੀ" + about_x_years: "%{count}ਸਾ" + almost_x_years: "%{count}ਸ" + half_a_minute: ਹੁਣੇ ਹੀ + less_than_x_minutes: "%{count}ਮਿੰ" + less_than_x_seconds: ਹੁਣੇ ਹੀ + over_x_years: "%{count}ਸਾ" + x_days: "%{count}ਦਿ" + x_minutes: "%{count}ਮਿੰ" + deletes: + proceed: ਖਾਤੇ ਨੂੰ ਹਟਾਓ + disputes: + strikes: + title: "%{date} ਨੂੰ %{action}" + exports: + archive_takeout: + date: ਤਾਰੀਖ + filters: + contexts: + account: ਪਰੋਫਾਈਲ + home: ਹੋਮ ਅਤੇ ਸੂਚੀਆਂ + notifications: ਨੋਟੀਫਿਕੇਸ਼ਨ + thread: ਗੱਲਾਂਬਾਤਾਂ + index: + delete: ਹਟਾਓ + generic: + all: ਸਭ + copy: ਕਾਪੀ ਕਰੋ + delete: ਹਟਾਓ + today: ਅੱਜ + invites: + expires_in: + '43200': 12 ਘੰਟੇ + '604800': 1 ਹਫਤਾ + '86400': 1 ਦਿਨ + expires_in_prompt: ਕਦੇ ਨਹੀਂ + login_activities: + authentication_methods: + password: ਪਾਸਵਰਡ + notification_mailer: + follow: + subject: "%{name} ਹੁਣ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕਰਦੇ ਹਨ" + title: ਨਵੇਂ ਫ਼ਾਲੋਅਰ + follow_request: + body: "%{name} ਨੇ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ" + mention: + action: ਜਵਾਬ ਦਿਓ + number: + human: + decimal_units: + format: "%n%u" + units: + billion: ਬਿ + million: ਮਿ + otp_authentication: + enable: ਸਮਰੱਥ + setup: ਸੈਟ ਅੱਪ diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml new file mode 100644 index 00000000000000..6ab26788bdf03a --- /dev/null +++ b/config/locales/simple_form.ia.yml @@ -0,0 +1 @@ +ia: diff --git a/config/locales/simple_form.ie.yml b/config/locales/simple_form.ie.yml new file mode 100644 index 00000000000000..a94903b6620c55 --- /dev/null +++ b/config/locales/simple_form.ie.yml @@ -0,0 +1,81 @@ +--- +ie: + simple_form: + hints: + account: + unlocked: Persones va posser sequer te sin petir aprobation. Desselecte si tu vole manualmen tractar petitiones de sequer e decider ca acceptar o rejecter nov sequitores. + admin_account_action: + send_email_notification: Li usator va reciver un explication de ti quel evenit con su conto + text_html: Ínobligatori. Tu posse usar posta-sintaxe. Tu posse adjunter preconfigurationes de avises por sparar témpor + type_html: Selecte quo far con %{acct} + types: + disable: Prevente li usator de usar su conto, ma ne delete o cela su contenete. + none: Usa ti por inviar un admoniment al usator, sin initiante quelcunc altri action. + sensitive: Fortiar que omni medie-atachamentes de ti usator essaye marcat quam sensitiv. + silence: Preventer li usator de posser postar con public visibilitá, e celar tui postas e notificationes de gente qui ne seque ti. Ti clude omni raportes contra ti conto. + suspend: Preventer omni interaction de o a ti-ci conto e deleter su contenete. Reversibil ante 30 dies ha passat. Ti clude omni raportes contra ti conto. + warning_preset_id: Ínobligatori. Tu ancor posse adjunter customisat textu al fine del preconfiguration + announcement: + all_day: Si ti-ci es marcat, solmen li dates del periode de témpor va esser monstrat + ends_at: Ínobligatori. Li proclamation va esser despublicat automaticmen ye ti-ci témpor + scheduled_at: Lassar vacui por publicar li proclamation strax + starts_at: Ínobligatori. In li casu que tui proclamation es ligat a un specific periode de témpor + text: Tu posse usar posta-sintaxe. Ples considerar li spacie quel li proclamation va plenar sur li ecran del usator + appeal: + text: Tu posse apellar un admoniment solmen un vez + defaults: + autofollow: Persones qui adherer per li invitation va sequer te automaticmen + avatar: PNG, GIF o JPEG. Admaxim %{size}. Li grandore va esser contraet a %{dimensions}px + bot: Dir a altres que li conto primarimen far automatic actiones e que fórsan null homan vigila it + context: Un o multiplic contextus u li filtre deve aplicar + current_password: Por securital rasones, ples introducter li passa-parol del actual conto + current_username: Por confirmar, ples inmetter li usator-nómine del actual conto + digest: Misset solmen pos un long periode de ínactivitá e solmen si tu ha recivet quelcunc missages personal in tui inbuxe + email: On va misser te un email de confirmation + header: PNG, GIF o JPEG. Admaxim %{size}. Li grandore va esser contraet a %{dimensions}px + inbox_url: Copiar li URL del initial págine del relé quel tu vole usar + irreversible: Filtrat postas va desaparir ínreversibilmen, mem si li filtre es removet plu tard + locale: Li lingue del usator-interfacie, emails e notificationes push + password: Usa adminim 8 carácteres + phrase: Va aplicar sin egarda a ca li lítteres in li posta o su contenete-avise es majuscules o minuscules + scopes: Queles API li aplication va esser permisset accesser. Si tu selecte un capabilitá del max alt nivelle, tu ne deve selecter li individualis. + setting_aggregate_reblogs: Ne monstrar nov boosts por postas queles ha esset recentmen boostat (afecta solmen boostas recivet futurimen) + setting_always_send_emails: Generalmen notificationes per email ne va esser misset quande tu activmen usa Mastodon + setting_default_sensitive: Sensitiv medie es customarimen celat e posse esser revelat con un clicca + setting_display_media_default: Celar medie marcat quam sensitiv + setting_display_media_hide_all: Sempre celar medie + setting_display_media_show_all: Sempre monstrar medie + form_admin_settings: + bootstrap_timeline_accounts: Ti-ci contos va esser pinglat al parte superiori del recomandationes por nov usatores. + theme: Li dessine quel ínregistrat visitantes e nov usatores vide. + timeline_preview: Ínregistrat visitantes va posser vider li max recent public postas disponibil che li servitor. + trends_as_landing_page: Monstrar populari contenete a ínregistrat visitantes vice un description del servitor. Besona que tendenties es activisat. + form_challenge: + current_password: Tu nu intra un area secur + labels: + account: + fields: + value: Contenete + account_warning_preset: + title: Titul + admin_account_action: + type: Action + announcement: + all_day: Eveniment del tot die + ends_at: Fine del eveniment + scheduled_at: Planar publication + starts_at: Comense del eveniment + text: Proclamation + defaults: + confirm_new_password: Confirmar nov passa-parol + confirm_password: Confirmar passa-parol + current_password: Actual passa-parol + honeypot: "%{label} (ne plenar)" + locale: Lingue del interfacie + new_password: Nov passa-parol + note: Biografie + password: Passa-parol + form_admin_settings: + registrations_mode: Qui posse registrar se + notification_emails: + follow_request: Alqui petit sequer te diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml index b21b86723c8f1c..eef2014d19cff5 100644 --- a/config/locales/simple_form.io.yml +++ b/config/locales/simple_form.io.yml @@ -2,6 +2,14 @@ io: simple_form: hints: + account: + discoverable: Vua publika posti e profilo povas remarkesar o rekomendesar en diferanta parti di Mastodon e vua profilo povas sugestesar ad altra uzanti. + display_name: Vua tota nomo o vua gaya nomo. + fields: Vua retsituo, pronomi, evo, irgo quan vu volas. + indexable: Vua posta publika povos aparar en rezultaji di serchi che Mastodon. Personi qui interagis kun vua posti povos serchar oli irgakaze. + note: 'Vu povas @mencionar altra personi o #hashtagi.' + show_collections: Personi povos navigar tra vua sequati e sequanti. Personi quin vu sequas, vidos ke vu sequas li irgakaze. + unlocked: Personi povos sequar vu sen demandar aprobo. Deselektez se vu volas revuar sequadodemandi e selektez aceptar o refuzar nova sequati. account_alias: acct: Partikulare pozez uzantonomo@domeno di konto quon vua volas ektransferesar account_migration: @@ -18,6 +26,8 @@ io: disable: Preventez uzanto de uzar olia konto ma ne efacez o celez olia kontenaji. none: Uzez co por sendar averto a la uzanto sen eventigar irga altra ago. sensitive: Koaktez omna mediiatachaji da ca uzanto markizesar quale sentoza. + silence: Preventez la uzanto de povar postar per publika videbleso, celez lua posti e avizi de personi qui ne sequas lu. Co klozas omna raporto kontra ca konto. + suspend: Preventez irga interago de o a ca konto e efacez lua kontenaji. Inversebla til 30 dii. Co klozas omna raporti kontra ca konto. warning_preset_id: Neobligata. Vu povas ankore insertar kustume texto a extremajo di fixito announcement: all_day: Kande kontrolesas, nur tempoporteodato montresos @@ -43,7 +53,7 @@ io: password: Uzes minime 8 litri phrase: Parigesos ne ye textosituaciono o konteneyoaverto di posto scopes: Quala API quon softwaro permisesas acesar. Se vu selektas alta skopo, vu ne mustas selektar individui. - setting_aggregate_reblogs: Ne montrez nova busti di posti quo recente bustesas (nova busti) + setting_aggregate_reblogs: Ne montrez nova repeti di posti qui ja repetesis recente (nur efektigas repeti recevata nove) setting_always_send_emails: Normale retpostoavizi ne sendesas kande vu aktiva uzas Mastodon setting_default_sensitive: Sentoza medii originala celesas e povas revelesar per klikto setting_display_media_default: Celez medii quo markizesis quale sentoza @@ -51,25 +61,30 @@ io: setting_display_media_show_all: Sempre montrez medii setting_use_blurhash: Inklini esas segun kolori di celesis vidaji ma kovras irga detali setting_use_pending_items: Celez tempolineonovi dop kliktar e ne automatike movigar niuzeto + username: Vu darfas uzar literi, nombri, e sublinei whole_word: Kande klefvorto o fraz esas nur litera e nombra, ol nur aplikesos se ol parigesas la tota vorto domain_allow: domain: Ca domeno povas ganar informi de ca servilo e venanta informo de ol procedagesos e sparesos email_domain_block: domain: Co povas esas domennomo quo montresas che retposto o registrajo MX quon ol uzas. Oli kontrolesos kande registro. with_dns_records: Probo di rezolvar registri DNS di la domeno agesos e rezulti anke preventesos + featured_tag: + name: 'Yen kelka hashtagi quin vu uzis maxim recente:' filters: action: Selektez ago kande posto parigas filtrilo actions: hide: Komplete celez filtrita kontenajo quale ol ne existas warn: Celez filtrita kontenajo dop avert quo montras titulo di filtrilo form_admin_settings: + activity_api_enabled: Quanto de lokale publikigita posti, aktiva uzanti e nova registri, donita semanope backups_retention_period: Retenez igita uzantoarkivi por la diiquanto. bootstrap_timeline_accounts: Ca konti pinglagesos a super sequorekomendi di nova uzanti. closed_registrations_message: Montresas kande registradi klozesas - content_cache_retention_period: Posti de altra servili efacesos pos la diiquanto kande fixesas a positiva nombro. Co darfas desagesar. + content_cache_retention_period: Omna posti e repeti de altra servili efacesos pos la specigita nombro de dii. Kelka posti forsan ne esos restaurebla. Omna relata libromarki, favoriziti e repeti anke esos perdita e neposible restaurota. custom_css: Vu povas pozar kustumizita staili en retverso di Mastodon. mascot: Remplas montreso en avanca retintervizajo. media_cache_retention_period: Deschargita mediifaili efacesos pos la diiquanto kande fixesas a positiva nombro, e rideschargesas irgatempe. + peers_api_enabled: Listo di domeni quin ca servilo trovis en la fediverso. Nula informo inkluzesas hike pri ka vu federas kun partikulara servilo, nur ke vua servilo savas pri lo. Co es uzata da enti qui kolektas statistiki pri federeso generale. profile_directory: La profilcheflisto montras omna uzanti quo voluntale volas esar deskovrebla. require_invite_text: Kande registradi bezonas manuala aprobo, ol kauzigas "Por quo vu volas juntas?" textoenpozo esar obliganta site_contact_email: Quale personi povas kontaktar vu por legala o suportquestioni. @@ -78,11 +93,13 @@ io: site_short_description: Kurta deskripto por helpar unala identifikar ca servilo. Qua funcionigar lu e por qua? site_terms: Uzez vua sua privatesguidilo o ignorez por uzar la originalo. Povas strukturigesar per sintaxo di Markdown. site_title: Quale personi vokas ca servilo se ne uzas domennomo. + status_page_url: URL di pagino ube personi povas vidar la stando di ca servilo kande la servilo ne funcionas theme: Temo quo videsas da ekirita vizitanti e nova uzanti. thumbnail: Cirkum 2:1 imajo montresar kun informo di ca servilo. timeline_preview: Ekirita vizitanti videsos maxim recenta publika posti quo esas displonebla en la servilo. trendable_by_default: Ignorez manuala kontrolar di tendencoza kontenajo. Singla kozi povas ankore efacesar de tendenci pose. trends: Tendenci montras quala posti, hashtagi e niuzrakonti famozeskas en ca servilo. + trends_as_landing_page: Montrez populara posti a uzanti neeniriti e vizitanti vice deskriptajo pri ca servilo. Bezonas ke populari es aktivita. form_challenge: current_password: Vu eniras sekura areo imports: @@ -103,6 +120,9 @@ io: sessions: otp: Enter the Two-factor code from your phone or use one of your recovery codes. webauthn: Se ol esas klefo di USB, certigar ke vu insertas e se bezonesas, tushetez. + settings: + indexable: Vua profilpagino povas aparar en serchorezultaji che Google, Bing, e altri. + show_application: Vu sempre povos vidar qua apliko publikigis vua posto irgakaze. tag: name: Vu povas nur chanjar literkaso, por exemplo, por kauzigar lu divenar plu lektebla user: @@ -119,9 +139,13 @@ io: url: Ibe eventi sendesos labels: account: + discoverable: Inkluzar profilo e posti en trovado-algoritmi fields: name: Etiketo value: Kontenajo + indexable: Inkluzar publika posti en serchorezultaji + show_collections: Montrar sequati e sequanti en la profilo + unlocked: Automate aceptar nova sequanti account_alias: acct: Nomo di olda konto account_migration: @@ -175,10 +199,10 @@ io: password: Pasvorto phrase: Klefvorto o frazo setting_advanced_layout: Aktivigez avancata retintervizajo - setting_aggregate_reblogs: Grupbusti en tempolinei + setting_aggregate_reblogs: Grupigar repeti en tempolinei setting_always_send_emails: Sempre sendez retpostoavizi setting_auto_play_gif: Automate pleez animigita GIFi - setting_boost_modal: Montrez konfirmdialogo ante bustar + setting_boost_modal: Montrez konfirmdialogo ante repetar setting_default_language: Postolinguo setting_default_privacy: Videbleso di la mesaji setting_default_sensitive: Sempre markizez medii quale sentoza @@ -213,6 +237,7 @@ io: hide: Tote celez warn: Celez kun averto form_admin_settings: + activity_api_enabled: Publikigez rezumstatistiko pri uzantoaktiveso en API backups_retention_period: Uzantoarkivretendurtempo bootstrap_timeline_accounts: Sempre rekomendez ca konti a nova uzanti closed_registrations_message: Kustumizita mesajo kande registradi ne esas disponebla @@ -220,6 +245,7 @@ io: custom_css: Kustumizita CSS mascot: Kustumizita reprezentimajo (oldo) media_cache_retention_period: Mediimemorajretendurtempo + peers_api_enabled: Publikigez listo di deskovrita servili en API profile_directory: Aktivigez profilcheflisto registrations_mode: Qua povas registragar require_invite_text: Mustez pozar motivo por juntar @@ -231,11 +257,13 @@ io: site_short_description: Servildeskripto site_terms: Privatesguidilo site_title: Servilnomo + status_page_url: URL dil stando-pagino theme: Originala temo thumbnail: Servilimajeto timeline_preview: Permisez neyurizita aceso a publika tempolineo trendable_by_default: Permisez tendenci sen bezonar kontrolo trends: Aktivigez tendenci + trends_as_landing_page: Uzar populari quale la iniciala pagino interactions: must_be_follower: Celar la savigi da homi, qui ne sequas tu must_be_following: Celar la savigi da homi, quin tu ne sequas @@ -260,11 +288,20 @@ io: follow_request: Sendar retpost-mesajo, kande ulu diskonocigas mesajo da tu mention: Sendar retpost-mesajo, kande ulu mencionas tu pending_account: Nova konto bezonas kontrolo - reblog: Sendar retpost-mesajo, kande ulu diskonocigas mesajo da tu + reblog: Ulu repetis vua posto report: Nova raport sendesas + software_updates: + all: Notifikar pri omna aktualigi + critical: Notifikar pri nur urjanta aktualigi + label: Nova Mastodon-versiono es disponebla + none: Nultempe notifikar pri aktualigi (ne rekomendata) + patch: Notifikar pri problemosolvanta aktualigi trending_tag: Nova tendenco bezonas kontrolo rule: text: Regulo + settings: + indexable: Inkluzar profilopagino en serchili + show_application: Montrar la apliko de qua vu sendis posto tag: listable: Permisez ca hashtago aparar en trovaji e sugestaji name: Hashtago @@ -272,6 +309,7 @@ io: usable: Permisez posti uzar ca hashtago user: role: Rolo + time_zone: Klokozono user_role: color: Insignokoloro highlighted: Montrez rolo quale insigno en uzantoprofili diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml new file mode 100644 index 00000000000000..33fe877db13ad3 --- /dev/null +++ b/config/locales/simple_form.lad.yml @@ -0,0 +1,266 @@ +--- +lad: + simple_form: + hints: + account: + display_name: Tu nombre para amostrar. + account_alias: + acct: Espesifika tu nombre de utilizador@domeno del kuento de ande keres migrar + account_migration: + acct: Espesifika el nombre de utilizador@domeno del kuento de kualo keres migrar + account_warning_preset: + text: Puedes kulanear sintaksa de publikasyones, komo adresos URL, etiketas i enmentaduras + title: Opsyonal. No es vizivle para el destinatario + admin_account_action: + include_statuses: El utilizador vera kualas publikasyones tienen kauzado la aksyon de moderasyon o avertensya + send_email_notification: El utilizador risivira una esplikasyon de lo kualo afito kon su kuento + text_html: Puedes kulanear sintaksa de publikasyones. Puede adjustar konfigurasyones predefinidas de avertensya para no pedrer tiempo + type_html: Eskoje lo ke vas fazer kon %{acct} + types: + disable: Evita ke el utilizador utilize su kuento, pero no supreme ni eskonde sus kontenidos. + none: Utiliza esto para embiar una avertensya al utilizador, sin ampesar ninguna otra aksyon. + sensitive: Forza ke todas las dosyas multimedia de este utilizador sean markados komo sensivles. + silence: Evita ke el utilizador pueda publikar kon vizivilita publika, i eskonde sus mesajes i avizos a personas ke no lo sigen. Serra todos los raportos kontra este kuento. + suspend: Evita kualseker interaksyon dizde o verso este kuento i supreme su kontenido. Reversivle en 30 diyas. Sierra todos los raportos kontra este kuento. + warning_preset_id: Opsyonal. Ainda puedes adjustar teksto personalizado al final de la konfigurasyon predefinida + announcement: + all_day: Kuando esta eskojido solo se amostraran las datas del rango de tiempo + ends_at: Opsyonal. El pregon dezaparesera otomatikamente en este momento + scheduled_at: Deshar en blanko para publikar el pregon pishin + starts_at: Opsyonal. En caso de ke tu pregon este atado a un intervalo de tiempo espesifiko + text: Puedes kulanear la sintaksa de publikasyones. Por favor nota el espasyo ke okupara el pregon en el ekran del utilizador + appeal: + text: Solo puedes apelar un amonestamiento una vez + defaults: + autofollow: Los utilizadores ke se enrejistren por la envitasyon te segiran otomatikamente + avatar: PNG, GIF o JPG. Maksimo %{size}. Sera eskalado a %{dimensions}px + bot: Indika ke este kuento egzekuta prinsipalmente aksyones otomatizadas i podria no ser monitorizada + context: Uno o multiples kontekstos en los ke deve aplikarse el filtro + current_password: Por razones de sigurita por favor ingresa el kod del kuento aktual + current_username: Para konfirmar, por favor ingresa el nombre de utilizador del kuento aktual + digest: Solo embiado dempues de un eluengo periodo de inaktivita i solo si tienes recibido mesajes personales durante tu ausensya + email: Se te embiara konfirmasyon por posta elektronika + header: PNG, GIF o JPG. Maksimo %{size}. Sera eskalado a %{dimensions}px + inbox_url: Kopia el URL de la pajina prinsipala del relevo ke keres utilizar + irreversible: Las publikasyones filtradas dezapareseran irreversivlemente, inkluzo si este filtro es supremido mas adelante + locale: La lingua de la enterfaz de utilizador, posta i avizos arrepushados + password: Utiliza al manko 8 karakteres + phrase: Se aplikara sin importar las mayuskulas o los avizos de kontenido de una publikasyon + scopes: A los kualos APIs la aplikasyon tendra akseso. Si eskojes el alkanse de nivel mas alto, no kale eskojer las individualas. + setting_aggregate_reblogs: No amostra muevas repartajasyones para las publikasyones ke an sido resientemente repartajadas (solo afekta a las repartajasyones risividas resientemente) + setting_always_send_emails: Normalmente los avizos por posta elektronika no se embiaran kuando estes uzando Mastodon aktivamente + setting_default_sensitive: Tu muevo kontenido multimedia esta eskondido i puede ser amostrado kon un klik + setting_display_media_default: Eskonde kontenido multimedia markado komo sensivle + setting_display_media_hide_all: Siempre eskonde todo el kontenido multimedia + setting_display_media_show_all: Amostra siempre el kontenido de multimedia + setting_use_blurhash: Los gradientes se bazan en los kolores de las imajes eskondidas pero faziendo velados los peratim + setting_use_pending_items: Eskonde muevas publikasyones detras de un klik en lugar de desplazar otomatikamente la linya + whole_word: Kuando el biervo yave o fraza es solo alfanumerika, solo sera aplikado si konkorda kon todo el biervo + domain_allow: + domain: Este domeno podra obtener datos de este sirvidor i los datos entrantes seran prosesados i archivados + email_domain_block: + domain: Este puede ser el nombre de domeno ke aparese en el adreso de posta elektronika o el rejistro MX ke utiliza. Se komprovaran al registrarse. + with_dns_records: Se ara un intento de rezolver los rejistros DNS del domeno dado i los rizultados seran tamyen puestos en lista preta + featured_tag: + name: 'Aki estan algunas de las etiketas ke mas tienes utilizado resientemente:' + filters: + action: Eskoje kuala aksyon realizar kuando una publikasyon koensida kon el filtro + actions: + hide: Eskonde kompletamente el kontenido filtrado komo si no existiera + warn: Eskonde el kontenido filtrado detras de una avertensya enmentando el titolo del filtro + form_admin_settings: + activity_api_enabled: Numero de publikasyones publikadas lokalmente, utilizadores activos i enrejistrasyones muevas kada semana + backups_retention_period: Manten las dosyas de utilizador djeneradas durante el numero de diyas espesifikado. + bootstrap_timeline_accounts: Estos kuentos apareseran en la parte superior de las rekomendasiones de los muevos utilizadores. + closed_registrations_message: Amostrado kuando las enrejistrasyones estan serrados + content_cache_retention_period: Las publikasyones de otros sirvidores se supremiran dempues del numero espesifikado de diyas kuando se establezka una valuta pozitiva. Esto puede ser irreversivle. + custom_css: Puedes aplikar estilos personalizados a la version web de Mastodon. + mascot: Reemplaza la ilustrasyon en la enterfaz web avanzada. + media_cache_retention_period: Las dosyas de multimedia abashadas se supremiran dempues del numero espesifikado de diyas kuando se establezka una valuta pozitiva, i se reabasharan basho demanda. + peers_api_enabled: Una lista de nombres de domeno ke este sirvidor tiene topado en el Fediverso. Aki no se inkluye dingun dato sovre si federas kon un sirvidor determinado, solo ke tu sirvidor lo konese. Esto es utilizado por los servisyos ke rekopilan estatistikas sovre la federasyon en un senso djeneral. + profile_directory: El katalogo de profiles lista a todos los utilizadores ke tienen optado por ke sus kuento pueda ser deskuvierto. + require_invite_text: Kuando las enrejistrasyones rekieren achetasyon manuala, faze obligatoria la entrada de teksto "Por ke keres unirte?" en lugar de ser opsyonal + site_contact_email: Komo la djente puede ponerse en kontakto kontigo para konsultas legales o de ayuda. + site_contact_username: Komo puede kontaktarte la djente en Mastodon. + site_extended_description: Kualseker enformasyon adisyonala ke pueda ser util para los vizitantes i tus utilizadores. Se puede estrukturar kon formato Markdown. + site_short_description: Una breve deskripsyon para ayudar a identifikar tu sirvidor de forma unika. Ken lo administra? + site_terms: Utiliza tu propia politika de privasita o deshala en blanko para kulanear la predeterminada Puede estrukturarse kon formato Markdown. + site_title: Komo puede referirse la djente a tu sirvidor ademas de por el nombre de domeno. + status_page_url: Adreso URL de la pajina ande la djente puede ver el estado de este sirvidor durante una insidensya + theme: El tema ke los vizitantes no enrejistrados i los muevos utilizadores ven. + thumbnail: Una imaje de aproksimadamente 2:1 se amostra djunto a la enformasyon de tu sirvidor. + timeline_preview: Los vizitantes no konektados podran navigar por los mesajes publikos mas resientes desponivles en el sirvidor. + trendable_by_default: Omite la revizyon manuala del kontenido en trend. Los elementos individuales ainda podran supremirse de los trendes. + trends: Los trendes amostran ke mesajes, etiketas i haberes estan ganando traksyon en tu sirvidor. + trends_as_landing_page: Amostra kontenido en trend para utilizadores i vizitantes en lugar de una deskripsyon de este sirvidor. Rekiere ke los trendes esten kapasitados. + form_challenge: + current_password: Estas entrando en un area siguro + imports: + data: Archivo CSV eksportado dizde otra instansya de Mastodon + invite_request: + text: Esto nos ayudara a revizar tu aplikasyon + ip_block: + comment: Opsyonal. Akodrate por ke tienes adjustado esta regla. + expires_in: Los adresos IP son un rekurso finito, a vezes se partajan i trokan. Por esta razon, no se rekomiendan blokos de IP indefinidos. + ip: Introduze un adreso IPv4 o IPv6. Puede blokar rangos kompletos uzando la sintaksa CIDR. Ten kuidado de no kedarte afuera! + severities: + no_access: Bloka akseso a todos los rekursos + sign_up_block: Las muevas enrejistrasyones se inkapasitaran + sign_up_requires_approval: Muevas enrejistrasyones rekeriran tu achetasyon + severity: Eskoje lo ke pasara kon las petisyones dizde este IP + rule: + text: Deskrive una norma o rekerensya para los utilizadores de este sirvidor. Aprova fazerla kurta i kolay + sessions: + otp: 'Introduse el kodiche de autentifikasyon de dos pasos djenerado por tu aplikasyon de telefon o uza uno de tus kodiches de recuperasyon:' + webauthn: Si es una yave USB, asigurete de insertarla y, si es necesario, pulsala. + tag: + name: Solo se puede trokar la kapitalizasyon de las letras, por enshemplo, para ke sea mas meldable + user: + chosen_languages: Kuando se marka, solo se amostraran las publikasyones en las linguas eskojidas en las linyas de tiempo publikas + role: El rolo kontrola kualos permisos tiene el utilizador + user_role: + color: Color ke se utilizara para el rolo a lo largo de la enterfaz de utilizador, komo RGB en formato heksadesimal + highlighted: Esto faze ke el rolo sea publikamente visible + name: Nombre publiko del rolo, si el rolo se establese para ke se amostre komo una insinya + permissions_as_keys: Los utilizadores kon este rolo tendran akseso a... + position: Un rolo mas alto deside la rezolusyon de konfliktos en algunas situasyones. Algunas aksyones solo pueden levarse por rolos kon menor priorita + webhook: + events: Eskoje evenimientos para embiar + url: Ande los evenimientos seran embiados + labels: + account: + fields: + name: Etiketa + value: Kontenido + account_alias: + acct: Alias del kuento viejo + account_migration: + acct: Alias del muevo kuento + account_warning_preset: + text: Teksto predefinido + title: Titolo + admin_account_action: + include_statuses: Inkluye en la posta elektronika las publikasyones raportadas + send_email_notification: Aviza al utilizador por posta elektronika + text: Avizo personalizado + type: Aksyon + types: + disable: Inkapasitar + none: Embia uma avertensya + sensitive: Sensivle + silence: Limita + suspend: Suspende + warning_preset_id: Kulanea un avizo predeterminado + announcement: + all_day: Evenimiento de todo el diya + ends_at: Fin del evenimiento + scheduled_at: Programar publikasyon + starts_at: Ampesijo del evenimiento + text: Pregon + appeal: + text: Esplika porke esta dechizyon deve ser revertida + defaults: + autofollow: Envita a segir tu kuento + avatar: Imaje de profil + bot: Este es un kuento otomatizado + chosen_languages: Filtra linguas + confirm_new_password: Konfirma muevo kod + confirm_password: Konfirma kod + context: Filtra kontekstos + current_password: Kod aktual + display_name: Nombre amostrado + email: Adreso de posta elektronika + expires_in: Kaduka dempues de + header: Imaje de kavesera + new_password: Muevo kod + note: Deskripsyon + otp_attempt: Kodiche de dos pasos + password: Kod + setting_default_language: Lingua de publikasyones + setting_default_privacy: Privasita de publikasyones + setting_display_media_default: Predeterminado + setting_display_media_hide_all: Eskonde todo + setting_display_media_show_all: Amostra todo + setting_use_blurhash: Amostra gradientes koloridos para kontenido multimedia eskondido + setting_use_pending_items: Modo lento + severity: Severita + sign_in_token_attempt: Kodiche de sigurita + title: Titolo + type: Tipo de importasyon + username: Nombre de uzador + username_or_email: Utilizador o posta + whole_word: Todo el biervo + email_domain_block: + with_dns_records: Inkluye los rejistros MX i los adresos IP del domeno + featured_tag: + name: Etiketa + filters: + actions: + hide: Eskonde kompletamente + warn: Eskonde kon una avertensya + form_admin_settings: + activity_api_enabled: Publika estatistikas adjustadas sovre la aktivita del utilizador kon la API + backups_retention_period: Periodo de retensyon de la dosya de utilizador + bootstrap_timeline_accounts: Rekomenda siempre estos kuentos a muevos utilizadores + closed_registrations_message: Mesaj personalizado kuando las enrejistrasyones no estan desponivles + content_cache_retention_period: Periodo de retensyon de kashe de kontenido + custom_css: CSS personalizado + mascot: Maskota personalizada (legado) + media_cache_retention_period: Periodo de retensyon de kashe multimedia + peers_api_enabled: Publika lista de sirvidores diskuviertos en la API + profile_directory: Kapasita katalogo de profiles + registrations_mode: Ken puede enrejistrarse + require_invite_text: Rekere una razon para unirse + show_domain_blocks: Amostra domenos blokados + show_domain_blocks_rationale: Amostra deke se blokaron los domenos + site_contact_email: Posta elektronika de kontakto + site_contact_username: Nombre de utilizador de kontakto + site_extended_description: Deskripsyon ekstendida + site_short_description: Deskripsyon del sirvidor + site_terms: Politika de privasita + site_title: Nombre del sirvidor + status_page_url: URL de pajina de estado + theme: Tema predeterminado + thumbnail: Minyatura del sirvidor + timeline_preview: Permite el akseso no autentifikado a las linyas de tiempo publikas + trendable_by_default: Permite trendes sin revizyon previa + trends: Kapasita trendes + trends_as_landing_page: Kulanea trendes komo la pajina prinsipala + interactions: + must_be_follower: Bloka avizos de personas ke no te sigen + must_be_following: Bloka avizos de personas a las kualas no siges + must_be_following_dm: Bloka mesajes direktos de personas a las kualas no siges + invite: + comment: Komento + invite_request: + text: Deke keres adjuntarte? + ip_block: + comment: Komento + ip: IP + severities: + no_access: Bloka akseso + sign_up_block: Bloka enrejistrasyones + sign_up_requires_approval: Limita enrejistrasyones + severity: Regla + notification_emails: + follow: Alguno te ampeso a segir + follow_request: Alguno tiene solisitado segirte + mention: Alguno te enmento + reblog: Alguno repartajo tu publikasyon + rule: + text: Regla + tag: + name: Etiketa + user: + role: Rolo + user_role: + name: Nombre + permissions_as_keys: Permisos + position: Priorita + webhook: + events: Evenimientos kapasitados + 'no': 'No' + recommended: Rekomendado + required: + mark: "*" + 'yes': Si diff --git a/config/locales/sk.yml b/config/locales/sk.yml index caf253c69c03b3..ab2bc5155323b6 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -119,6 +119,7 @@ sk: reject: Zamietni rejected_msg: Úspešne zamietnutá prihláška %{username} remote_suspension_irreversible: Údaje tohto účtu boli nenávratne zmazané. + remote_suspension_reversible_hint_html: Účet bol pozastavený na ich serveri a údaje budú úplne odstránené dňa %{date}. Dovtedy môže vzdialený server účet obnoviť bez akýchkoľvek nepriaznivých účinkov. Ak chceš odstrániť všetky údaje účtu ihneď, môžeš tak urobiť nižšie. remove_avatar: Vymaž avatar remove_header: Vymaž záhlavie removed_avatar_msg: Úspešne odstránený obrázok avatara %{username} diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index e17228da32f077..61650f894313a4 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1273,7 +1273,7 @@ zh-TW: other: 選取 %{count} 個符合您搜尋的項目。 today: 今天 validation_errors: - other: 恩...似乎發生了點錯誤?請檢查以下 %{count} 項錯誤 + other: 恩...似乎不太對勁耶?請檢查以下 %{count} 項錯誤 imports: errors: empty: 空的 CSV 檔案 @@ -1805,7 +1805,7 @@ zh-TW: title: "%{name} 誠摯歡迎您的加入!" users: follow_limit_reached: 您無法跟隨多於 %{limit} 個人 - go_to_sso_account_settings: 前往您的身分識別提供者(IdP)之帳號設定 + go_to_sso_account_settings: 前往您的身分提供商 (identity provider) 之帳號設定 invalid_otp_token: 兩階段認證碼不正確 otp_lost_help_html: 如果您無法存取這兩者,您可以透過 %{email} 與我們聯繫 seamless_external_login: 由於您是由外部系統登入,所以不能設定密碼與電子郵件。 diff --git a/config/routes.rb b/config/routes.rb index 374a4a83d38342..bc4bac0bf209a3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -58,7 +58,7 @@ def redirect_with_vary(path) get 'health', to: 'health#show' - authenticate :user, lambda { |u| u.role&.can?(:view_devops) } do + authenticate :user, ->(user) { user.role&.can?(:view_devops) } do mount Sidekiq::Web, at: 'sidekiq', as: :sidekiq mount PgHero::Engine, at: 'pghero', as: :pghero end @@ -112,10 +112,10 @@ def redirect_with_vary(path) } # rubocop:disable Style/FormatStringToken - those do not go through the usual formatting functions and are not safe to correct - get '/users/:username', to: redirect_with_vary('/@%{username}'), constraints: lambda { |req| req.format.nil? || req.format.html? } - get '/users/:username/following', to: redirect_with_vary('/@%{username}/following'), constraints: lambda { |req| req.format.nil? || req.format.html? } - get '/users/:username/followers', to: redirect_with_vary('/@%{username}/followers'), constraints: lambda { |req| req.format.nil? || req.format.html? } - get '/users/:username/statuses/:id', to: redirect_with_vary('/@%{username}/%{id}'), constraints: lambda { |req| req.format.nil? || req.format.html? } + get '/users/:username', to: redirect_with_vary('/@%{username}'), constraints: ->(req) { req.format.nil? || req.format.html? } + get '/users/:username/following', to: redirect_with_vary('/@%{username}/following'), constraints: ->(req) { req.format.nil? || req.format.html? } + get '/users/:username/followers', to: redirect_with_vary('/@%{username}/followers'), constraints: ->(req) { req.format.nil? || req.format.html? } + get '/users/:username/statuses/:id', to: redirect_with_vary('/@%{username}/%{id}'), constraints: ->(req) { req.format.nil? || req.format.html? } # rubocop:enable Style/FormatStringToken get '/authorize_follow', to: redirect { |_, request| "/authorize_interaction?#{request.params.to_query}" } diff --git a/config/routes/api.rb b/config/routes/api.rb index 583ed8dd0002ec..005d8f68390c4e 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -336,10 +336,6 @@ resources :statuses, only: [:show, :destroy] end - namespace :accounts do - resources :relationships, only: :index - end - namespace :admin do resources :accounts, only: [:index] end diff --git a/db/migrate/20230215074423_move_user_settings.rb b/db/migrate/20230215074423_move_user_settings.rb index b745436e52e3c8..20fd168434d041 100644 --- a/db/migrate/20230215074423_move_user_settings.rb +++ b/db/migrate/20230215074423_move_user_settings.rb @@ -86,7 +86,7 @@ def up end end - user.update_column('settings', Oj.dump(user_settings)) # rubocop:disable Rails/SkipsModelValidations + user.update_column('settings', Oj.dump(user_settings)) end end end diff --git a/db/migrate/20230819084858_add_no_insert_feeds_to_antennas.rb b/db/migrate/20230819084858_add_no_insert_feeds_to_antennas.rb index a040370507bdbf..fce41a7b835513 100644 --- a/db/migrate/20230819084858_add_no_insert_feeds_to_antennas.rb +++ b/db/migrate/20230819084858_add_no_insert_feeds_to_antennas.rb @@ -13,7 +13,7 @@ class Antenna < ApplicationRecord def up safety_assured do add_column_with_default :antennas, :insert_feeds, :boolean, default: false, allow_null: false - Antenna.where(insert_feeds: false).update_all(insert_feeds: true) # rubocop:disable Rails/SkipsModelValidations + Antenna.where(insert_feeds: false).update_all(insert_feeds: true) end end diff --git a/db/migrate/20230930233930_add_quote_to_status_references.rb b/db/migrate/20230930233930_add_quote_to_status_references.rb index f2bd6cd48d8402..003b70f6ade323 100644 --- a/db/migrate/20230930233930_add_quote_to_status_references.rb +++ b/db/migrate/20230930233930_add_quote_to_status_references.rb @@ -12,7 +12,7 @@ class StatusReference < ApplicationRecord; end def up safety_assured do add_column_with_default :status_references, :quote, :boolean, default: false, allow_null: false - StatusReference.where(attribute_type: 'QT').update_all(quote: true) # rubocop:disable Rails/SkipsModelValidations + StatusReference.where(attribute_type: 'QT').update_all(quote: true) end end diff --git a/db/migrate/20231211234923_create_follow_recommendation_mutes.rb b/db/migrate/20231211234923_create_follow_recommendation_mutes.rb new file mode 100644 index 00000000000000..92cb16e17b5356 --- /dev/null +++ b/db/migrate/20231211234923_create_follow_recommendation_mutes.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +class CreateFollowRecommendationMutes < ActiveRecord::Migration[7.1] + def change + create_table :follow_recommendation_mutes do |t| + t.references :account, null: false, foreign_key: { on_delete: :cascade }, index: false + t.references :target_account, null: false, foreign_key: { to_table: 'accounts', on_delete: :cascade } + + t.timestamps + end + + add_index :follow_recommendation_mutes, [:account_id, :target_account_id], unique: true + end +end diff --git a/db/migrate/20231212073317_add_languages_index_to_account_summaries.rb b/db/migrate/20231212073317_add_languages_index_to_account_summaries.rb new file mode 100644 index 00000000000000..8adaf792c317e7 --- /dev/null +++ b/db/migrate/20231212073317_add_languages_index_to_account_summaries.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddLanguagesIndexToAccountSummaries < ActiveRecord::Migration[7.1] + disable_ddl_transaction! + + def change + add_index :account_summaries, [:account_id, :language, :sensitive], algorithm: :concurrently + end +end diff --git a/db/post_migrate/20231021005339_remove_remote_uri_from_local_custom_emojis.rb b/db/post_migrate/20231021005339_remove_remote_uri_from_local_custom_emojis.rb index d541de7429d261..4e87008e46b94b 100644 --- a/db/post_migrate/20231021005339_remove_remote_uri_from_local_custom_emojis.rb +++ b/db/post_migrate/20231021005339_remove_remote_uri_from_local_custom_emojis.rb @@ -12,7 +12,7 @@ class CustomEmoji < ApplicationRecord; end def up safety_assured do CustomEmoji.transaction do - CustomEmoji.where(domain: nil).update_all(image_remote_url: nil, uri: nil) # rubocop:disable Rails/SkipsModelValidations + CustomEmoji.where(domain: nil).update_all(image_remote_url: nil, uri: nil) end end end diff --git a/db/schema.rb b/db/schema.rb index 2f7544372f786f..9e31dcb530bc08 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -648,6 +648,15 @@ t.index ["tag_id"], name: "index_featured_tags_on_tag_id" end + create_table "follow_recommendation_mutes", force: :cascade do |t| + t.bigint "account_id", null: false + t.bigint "target_account_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["account_id", "target_account_id"], name: "idx_on_account_id_target_account_id_a8c8ddf44e", unique: true + t.index ["target_account_id"], name: "index_follow_recommendation_mutes_on_target_account_id" + end + create_table "follow_recommendation_suppressions", force: :cascade do |t| t.bigint "account_id", null: false t.datetime "created_at", null: false @@ -1485,6 +1494,8 @@ add_foreign_key "favourites", "statuses", name: "fk_b0e856845e", on_delete: :cascade add_foreign_key "featured_tags", "accounts", on_delete: :cascade add_foreign_key "featured_tags", "tags", on_delete: :cascade + add_foreign_key "follow_recommendation_mutes", "accounts", column: "target_account_id", on_delete: :cascade + add_foreign_key "follow_recommendation_mutes", "accounts", on_delete: :cascade add_foreign_key "follow_recommendation_suppressions", "accounts", on_delete: :cascade add_foreign_key "follow_requests", "accounts", column: "target_account_id", name: "fk_9291ec025d", on_delete: :cascade add_foreign_key "follow_requests", "accounts", name: "fk_76d644b0e7", on_delete: :cascade @@ -1624,6 +1635,7 @@ WHERE ((accounts.suspended_at IS NULL) AND (accounts.silenced_at IS NULL) AND (accounts.moved_to_account_id IS NULL) AND (accounts.discoverable = true) AND (accounts.locked = false)) GROUP BY accounts.id; SQL + add_index "account_summaries", ["account_id", "language", "sensitive"], name: "idx_on_account_id_language_sensitive_250461e1eb" add_index "account_summaries", ["account_id"], name: "index_account_summaries_on_account_id", unique: true create_view "global_follow_recommendations", materialized: true, sql_definition: <<-SQL diff --git a/lib/mastodon/cli/maintenance.rb b/lib/mastodon/cli/maintenance.rb index 43fd7fab33e9b1..98067c6e34da72 100644 --- a/lib/mastodon/cli/maintenance.rb +++ b/lib/mastodon/cli/maintenance.rb @@ -254,7 +254,7 @@ def deduplicate_users! users = User.where(id: row['ids'].split(',')).sort_by(&:updated_at).reverse ref_user = users.shift say "Multiple users registered with e-mail address #{ref_user.email}.", :yellow - say "e-mail will be disabled for the following accounts: #{user.map { |user| user.account.acct }.join(', ')}", :yellow + say "e-mail will be disabled for the following accounts: #{users.map { |user| user.account.acct }.join(', ')}", :yellow say 'Please reach out to them and set another address with `tootctl account modify` or delete them.', :yellow users.each_with_index do |user, index| @@ -546,7 +546,7 @@ def deduplicate_tags! if migrator_version < 2021_04_21_121431 ActiveRecord::Base.connection.add_index :tags, 'lower((name)::text)', name: 'index_tags_on_name_lower', unique: true else - ActiveRecord::Base.connection.execute 'CREATE UNIQUE INDEX CONCURRENTLY index_tags_on_name_lower_btree ON tags (lower(name) text_pattern_ops)' + ActiveRecord::Base.connection.execute 'CREATE UNIQUE INDEX index_tags_on_name_lower_btree ON tags (lower(name) text_pattern_ops)' end end diff --git a/package.json b/package.json index ea33e67120b5ff..c2e5f64dca82a8 100644 --- a/package.json +++ b/package.json @@ -206,7 +206,7 @@ "lint-staged": "^15.0.0", "prettier": "^3.0.0", "react-test-renderer": "^18.2.0", - "stylelint": "^15.10.1", + "stylelint": "^16.0.2", "stylelint-config-standard-scss": "^12.0.0", "typescript": "^5.0.4", "webpack-dev-server": "^3.11.3", diff --git a/spec/controllers/activitypub/replies_controller_spec.rb b/spec/controllers/activitypub/replies_controller_spec.rb index 7e6e0ffb0d04a7..5fc9698a325e49 100644 --- a/spec/controllers/activitypub/replies_controller_spec.rb +++ b/spec/controllers/activitypub/replies_controller_spec.rb @@ -123,7 +123,7 @@ end it 'uses ids for remote toots' do - remote_replies = page_json[:items].select { |x| !x.is_a?(Hash) } + remote_replies = page_json[:items].reject { |x| x.is_a?(Hash) } expect(remote_replies.all? { |item| item.is_a?(String) && !ActivityPub::TagManager.instance.local_uri?(item) }).to be true end diff --git a/spec/controllers/admin/settings/branding_controller_spec.rb b/spec/controllers/admin/settings/branding_controller_spec.rb index 435616022aa2ba..e30300b4e4fcb6 100644 --- a/spec/controllers/admin/settings/branding_controller_spec.rb +++ b/spec/controllers/admin/settings/branding_controller_spec.rb @@ -19,14 +19,6 @@ end describe 'PUT #update' do - around do |example| - before = Setting.site_short_description - Setting.site_short_description = nil - example.run - Setting.site_short_description = before - Setting.new_setting_key = nil - end - it 'cannot create a setting value for a non-admin key' do expect(Setting.new_setting_key).to be_blank diff --git a/spec/controllers/api/v1/trends/links_controller_spec.rb b/spec/controllers/api/v1/trends/links_controller_spec.rb index 12d4198aaf8d34..bcaf066f1602a0 100644 --- a/spec/controllers/api/v1/trends/links_controller_spec.rb +++ b/spec/controllers/api/v1/trends/links_controller_spec.rb @@ -6,12 +6,6 @@ render_views describe 'GET #index' do - around do |example| - previous = Setting.trends - example.run - Setting.trends = previous - end - context 'when trends are disabled' do before { Setting.trends = false } diff --git a/spec/controllers/api/v1/trends/statuses_controller_spec.rb b/spec/controllers/api/v1/trends/statuses_controller_spec.rb index 69fdb270d57532..25ab5f228a094e 100644 --- a/spec/controllers/api/v1/trends/statuses_controller_spec.rb +++ b/spec/controllers/api/v1/trends/statuses_controller_spec.rb @@ -6,12 +6,6 @@ render_views describe 'GET #index' do - around do |example| - previous = Setting.trends - example.run - Setting.trends = previous - end - context 'when trends are disabled' do before { Setting.trends = false } diff --git a/spec/controllers/api/v1/trends/tags_controller_spec.rb b/spec/controllers/api/v1/trends/tags_controller_spec.rb index 9311392cd9dfcb..c889f1c5b9ef45 100644 --- a/spec/controllers/api/v1/trends/tags_controller_spec.rb +++ b/spec/controllers/api/v1/trends/tags_controller_spec.rb @@ -6,12 +6,6 @@ render_views describe 'GET #index' do - around do |example| - previous = Setting.trends - example.run - Setting.trends = previous - end - context 'when trends are disabled' do before { Setting.trends = false } diff --git a/spec/controllers/auth/registrations_controller_spec.rb b/spec/controllers/auth/registrations_controller_spec.rb index a9b24a1004068c..37172f8d24477f 100644 --- a/spec/controllers/auth/registrations_controller_spec.rb +++ b/spec/controllers/auth/registrations_controller_spec.rb @@ -6,12 +6,6 @@ render_views shared_examples 'checks for enabled registrations' do |path| - around do |example| - registrations_mode = Setting.registrations_mode - example.run - Setting.registrations_mode = registrations_mode - end - it 'redirects if it is in single user mode while it is open for registration' do Fabricate(:account) Setting.registrations_mode = 'open' @@ -82,12 +76,6 @@ end context 'with open registrations' do - around do |example| - registrations_mode = Setting.registrations_mode - example.run - Setting.registrations_mode = registrations_mode - end - it 'returns http success' do Setting.registrations_mode = 'open' get :new @@ -120,12 +108,6 @@ post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', agreement: 'true' } } end - around do |example| - registrations_mode = Setting.registrations_mode - example.run - Setting.registrations_mode = registrations_mode - end - it 'redirects to setup' do subject expect(response).to redirect_to auth_setup_path @@ -146,12 +128,6 @@ post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', agreement: 'false' } } end - around do |example| - registrations_mode = Setting.registrations_mode - example.run - Setting.registrations_mode = registrations_mode - end - it 'does not create user' do subject user = User.find_by(email: 'test@example.com') @@ -166,12 +142,6 @@ post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', agreement: 'true' } } end - around do |example| - registrations_mode = Setting.registrations_mode - example.run - Setting.registrations_mode = registrations_mode - end - it 'redirects to setup' do subject expect(response).to redirect_to auth_setup_path @@ -194,12 +164,6 @@ post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', invite_code: invite.code, agreement: 'true' } } end - around do |example| - registrations_mode = Setting.registrations_mode - example.run - Setting.registrations_mode = registrations_mode - end - it 'redirects to setup' do subject expect(response).to redirect_to auth_setup_path @@ -224,14 +188,6 @@ post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', invite_code: invite.code, agreement: 'true' } } end - around do |example| - registrations_mode = Setting.registrations_mode - require_invite_text = Setting.require_invite_text - example.run - Setting.require_invite_text = require_invite_text - Setting.registrations_mode = registrations_mode - end - it 'redirects to setup' do subject expect(response).to redirect_to auth_setup_path diff --git a/spec/controllers/concerns/account_controller_concern_spec.rb b/spec/controllers/concerns/account_controller_concern_spec.rb index 56ffcfb047c844..e3295204aaf393 100644 --- a/spec/controllers/concerns/account_controller_concern_spec.rb +++ b/spec/controllers/concerns/account_controller_concern_spec.rb @@ -11,12 +11,6 @@ def success end end - around do |example| - registrations_mode = Setting.registrations_mode - example.run - Setting.registrations_mode = registrations_mode - end - before do routes.draw { get 'success' => 'anonymous#success' } end diff --git a/spec/controllers/emojis_controller_spec.rb b/spec/controllers/emojis_controller_spec.rb index 3fe19ee5ce36c5..dd139de931afcc 100644 --- a/spec/controllers/emojis_controller_spec.rb +++ b/spec/controllers/emojis_controller_spec.rb @@ -5,7 +5,7 @@ describe EmojisController do render_views - let(:emoji) { Fabricate(:custom_emoji) } + let(:emoji) { Fabricate(:custom_emoji, shortcode: 'coolcat') } describe 'GET #show' do let(:response) { get :show, params: { id: emoji.id, format: :json } } diff --git a/spec/controllers/settings/two_factor_authentication/webauthn_credentials_controller_spec.rb b/spec/controllers/settings/two_factor_authentication/webauthn_credentials_controller_spec.rb index 719ed2f886e20f..41a3ba5eb5bbf5 100644 --- a/spec/controllers/settings/two_factor_authentication/webauthn_credentials_controller_spec.rb +++ b/spec/controllers/settings/two_factor_authentication/webauthn_credentials_controller_spec.rb @@ -194,60 +194,49 @@ def add_webauthn_credential(user) add_webauthn_credential(user) end - context 'when creation succeeds' do - it 'adds a new credential to user credentials and does not change webauthn_id', :aggregate_failures do - controller.session[:webauthn_challenge] = challenge + it 'adds a new credential to user credentials and does not change webauthn_id when creation succeeds', :aggregate_failures do + controller.session[:webauthn_challenge] = challenge - expect do - post :create, params: { credential: new_webauthn_credential, nickname: nickname } - end.to change { user.webauthn_credentials.count }.by(1) - .and not_change(user, :webauthn_id) + expect do + post :create, params: { credential: new_webauthn_credential, nickname: nickname } + end.to change { user.webauthn_credentials.count }.by(1) + .and not_change(user, :webauthn_id) - expect(response).to have_http_status(200) - end + expect(response).to have_http_status(200) end - context 'when the nickname is already used' do - it 'fails' do - controller.session[:webauthn_challenge] = challenge + it 'fails when the nickname is already used' do + controller.session[:webauthn_challenge] = challenge - post :create, params: { credential: new_webauthn_credential, nickname: 'USB Key' } + post :create, params: { credential: new_webauthn_credential, nickname: 'USB Key' } - expect(response).to have_http_status(422) - expect(flash[:error]).to be_present - end + expect(response).to have_http_status(422) + expect(flash[:error]).to be_present end - context 'when the credential already exists' do - before do - user2 = Fabricate(:user) - public_key_credential = WebAuthn::Credential.from_create(new_webauthn_credential) - Fabricate(:webauthn_credential, - user_id: user2.id, - external_id: public_key_credential.id, - public_key: public_key_credential.public_key) - end + it 'fails when the credential already exists' do + public_key_credential = WebAuthn::Credential.from_create(new_webauthn_credential) + Fabricate(:webauthn_credential, + user_id: Fabricate(:user).id, + external_id: public_key_credential.id, + public_key: public_key_credential.public_key) - it 'fails' do - controller.session[:webauthn_challenge] = challenge + controller.session[:webauthn_challenge] = challenge - post :create, params: { credential: new_webauthn_credential, nickname: nickname } + post :create, params: { credential: new_webauthn_credential, nickname: nickname } - expect(response).to have_http_status(422) - expect(flash[:error]).to be_present - end + expect(response).to have_http_status(422) + expect(flash[:error]).to be_present end end - context 'when user have not enabled webauthn' do - context 'when creation succeeds' do - it 'creates a webauthn credential' do - controller.session[:webauthn_challenge] = challenge + context 'when user have not enabled webauthn and creation succeeds' do + it 'creates a webauthn credential' do + controller.session[:webauthn_challenge] = challenge - expect do - post :create, params: { credential: new_webauthn_credential, nickname: nickname } - end.to change { user.webauthn_credentials.count }.by(1) - end + expect do + post :create, params: { credential: new_webauthn_credential, nickname: nickname } + end.to change { user.webauthn_credentials.count }.by(1) end end end @@ -292,15 +281,13 @@ def add_webauthn_credential(user) add_webauthn_credential(user) end - context 'when deletion succeeds' do - it 'redirects to 2FA methods list and shows flash success and deletes the credential', :aggregate_failures do - expect do - delete :destroy, params: { id: user.webauthn_credentials.take.id } - end.to change { user.webauthn_credentials.count }.by(-1) + it 'redirects to 2FA methods list and shows flash success and deletes the credential when deletion succeeds', :aggregate_failures do + expect do + delete :destroy, params: { id: user.webauthn_credentials.take.id } + end.to change { user.webauthn_credentials.count }.by(-1) - expect(response).to redirect_to settings_two_factor_authentication_methods_path - expect(flash[:success]).to be_present - end + expect(response).to redirect_to settings_two_factor_authentication_methods_path + expect(flash[:success]).to be_present end end diff --git a/spec/fabricators/announcement_mute_fabricator.rb b/spec/fabricators/announcement_mute_fabricator.rb new file mode 100644 index 00000000000000..0adc1d60bbdfd9 --- /dev/null +++ b/spec/fabricators/announcement_mute_fabricator.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +Fabricator(:announcement_mute) do + announcement { Fabricate.build(:announcement) } + account { Fabricate.build(:account) } +end diff --git a/spec/fabricators/announcement_reaction_fabricator.rb b/spec/fabricators/announcement_reaction_fabricator.rb new file mode 100644 index 00000000000000..e84579729166ca --- /dev/null +++ b/spec/fabricators/announcement_reaction_fabricator.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +Fabricator(:announcement_reaction) do + account { Fabricate.build(:account) } + announcement { Fabricate.build(:announcement) } + name { Fabricate(:custom_emoji).shortcode } +end diff --git a/spec/fabricators/custom_emoji_category_fabricator.rb b/spec/fabricators/custom_emoji_category_fabricator.rb new file mode 100644 index 00000000000000..af41c9722743ea --- /dev/null +++ b/spec/fabricators/custom_emoji_category_fabricator.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +Fabricator(:custom_emoji_category) do + name { sequence(:name) { |i| "name_#{i}" } } +end diff --git a/spec/fabricators/custom_emoji_fabricator.rb b/spec/fabricators/custom_emoji_fabricator.rb index fa570eec607ae5..7ef875286f32f6 100644 --- a/spec/fabricators/custom_emoji_fabricator.rb +++ b/spec/fabricators/custom_emoji_fabricator.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true Fabricator(:custom_emoji) do - shortcode 'coolcat' + shortcode { sequence(:shortcode) { |i| "code_#{i}" } } domain nil image { Rails.root.join('spec', 'fixtures', 'files', 'emojo.png').open } end diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 0a55770bad7f4f..ef1463e64c8660 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -292,12 +292,6 @@ def current_theme = 'default' end describe 'title' do - around do |example| - site_title = Setting.site_title - example.run - Setting.site_title = site_title - end - it 'returns site title on production environment' do Setting.site_title = 'site title' allow(Rails.env).to receive(:production?).and_return(true) @@ -318,12 +312,6 @@ def current_theme = 'default' allow(Rails.env).to receive(:production?).and_return(true) end - around do |example| - site_title = Setting.site_title - example.run - Setting.site_title = site_title - end - context 'with a page_title content_for value' do it 'uses the value in the html title' do Setting.site_title = 'Site Title' diff --git a/spec/helpers/instance_helper_spec.rb b/spec/helpers/instance_helper_spec.rb index cdbce565984576..7e39b7cb3d1eaf 100644 --- a/spec/helpers/instance_helper_spec.rb +++ b/spec/helpers/instance_helper_spec.rb @@ -4,12 +4,6 @@ describe InstanceHelper do describe 'site_title' do - around do |example| - site_title = Setting.site_title - example.run - Setting.site_title = site_title - end - it 'Uses the Setting.site_title value when it exists' do Setting.site_title = 'New site title' diff --git a/spec/helpers/json_ld_helper_spec.rb b/spec/helpers/json_ld_helper_spec.rb index e4c1e0cec47c65..228c4ff4079f3b 100644 --- a/spec/helpers/json_ld_helper_spec.rb +++ b/spec/helpers/json_ld_helper_spec.rb @@ -147,7 +147,7 @@ expect(compact(json).dig('object', 'tag', 'href')).to eq 'foo' end - it 'compacts the activistreams Public collection' do + it 'compacts the activitystreams Public collection' do expect(compact(json)['to']).to eq 'as:Public' end diff --git a/spec/lib/mastodon/cli/maintenance_spec.rb b/spec/lib/mastodon/cli/maintenance_spec.rb index 02169b7a42a998..353bf08b68f461 100644 --- a/spec/lib/mastodon/cli/maintenance_spec.rb +++ b/spec/lib/mastodon/cli/maintenance_spec.rb @@ -52,5 +52,136 @@ .and raise_error(SystemExit) end end + + context 'when requirements are met' do + before do + allow(ActiveRecord::Migrator).to receive(:current_version).and_return(2023_08_22_081029) # The latest migration before the cutoff + agree_to_backup_warning + end + + context 'with duplicate accounts' do + before do + prepare_duplicate_data + end + + let(:duplicate_account_username) { 'username' } + let(:duplicate_account_domain) { 'host.example' } + + it 'runs the deduplication process' do + expect { subject } + .to output_results( + 'Deduplicating accounts', + 'Restoring index_accounts_on_username_and_domain_lower', + 'Reindexing textual indexes on accounts…', + 'Finished!' + ) + .and change(duplicate_accounts, :count).from(2).to(1) + end + + def duplicate_accounts + Account.where(username: duplicate_account_username, domain: duplicate_account_domain) + end + + def prepare_duplicate_data + ActiveRecord::Base.connection.remove_index :accounts, name: :index_accounts_on_username_and_domain_lower + Fabricate(:account, username: duplicate_account_username, domain: duplicate_account_domain) + Fabricate.build(:account, username: duplicate_account_username, domain: duplicate_account_domain).save(validate: false) + end + end + + context 'with duplicate users on email' do + before do + prepare_duplicate_data + end + + let(:duplicate_email) { 'duplicate@example.host' } + + it 'runs the deduplication process' do + expect { subject } + .to output_results( + 'Deduplicating user records', + 'Restoring users indexes', + 'Finished!' + ) + .and change(duplicate_users, :count).from(2).to(1) + end + + def duplicate_users + User.where(email: duplicate_email) + end + + def prepare_duplicate_data + ActiveRecord::Base.connection.remove_index :users, :email + Fabricate(:user, email: duplicate_email) + Fabricate.build(:user, email: duplicate_email).save(validate: false) + end + end + + context 'with duplicate users on confirmation_token' do + before do + prepare_duplicate_data + end + + let(:duplicate_confirmation_token) { '123ABC' } + + it 'runs the deduplication process' do + expect { subject } + .to output_results( + 'Deduplicating user records', + 'Unsetting confirmation token', + 'Restoring users indexes', + 'Finished!' + ) + .and change(duplicate_users, :count).from(2).to(1) + end + + def duplicate_users + User.where(confirmation_token: duplicate_confirmation_token) + end + + def prepare_duplicate_data + ActiveRecord::Base.connection.remove_index :users, :confirmation_token + Fabricate(:user, confirmation_token: duplicate_confirmation_token) + Fabricate.build(:user, confirmation_token: duplicate_confirmation_token).save(validate: false) + end + end + + context 'with duplicate users on reset_password_token' do + before do + prepare_duplicate_data + end + + let(:duplicate_reset_password_token) { '123ABC' } + + it 'runs the deduplication process' do + expect { subject } + .to output_results( + 'Deduplicating user records', + 'Unsetting password reset token', + 'Restoring users indexes', + 'Finished!' + ) + .and change(duplicate_users, :count).from(2).to(1) + end + + def duplicate_users + User.where(reset_password_token: duplicate_reset_password_token) + end + + def prepare_duplicate_data + ActiveRecord::Base.connection.remove_index :users, :reset_password_token + Fabricate(:user, reset_password_token: duplicate_reset_password_token) + Fabricate.build(:user, reset_password_token: duplicate_reset_password_token).save(validate: false) + end + end + + def agree_to_backup_warning + allow(cli.shell) + .to receive(:yes?) + .with('Continue? (Yes/No)') + .and_return(true) + .once + end + end end end diff --git a/spec/models/announcement_spec.rb b/spec/models/announcement_spec.rb new file mode 100644 index 00000000000000..e37b81a52edf87 --- /dev/null +++ b/spec/models/announcement_spec.rb @@ -0,0 +1,210 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Announcement do + describe 'Scopes' do + context 'with published and unpublished records' do + let!(:published) { Fabricate(:announcement, published: true) } + let!(:unpublished) { Fabricate(:announcement, published: false, scheduled_at: 10.days.from_now) } + + describe '#unpublished' do + it 'returns records with published false' do + results = described_class.unpublished + + expect(results).to eq([unpublished]) + end + end + + describe '#published' do + it 'returns records with published true' do + results = described_class.published + + expect(results).to eq([published]) + end + end + end + + describe '#without_muted' do + let!(:announcement) { Fabricate(:announcement) } + let(:account) { Fabricate(:account) } + let(:muted_announcement) { Fabricate(:announcement) } + + before do + Fabricate(:announcement_mute, account: account, announcement: muted_announcement) + end + + it 'returns the announcements not muted by the account' do + results = described_class.without_muted(account) + expect(results).to include(announcement) + expect(results).to_not include(muted_announcement) + end + end + + context 'with timestamped announcements' do + let!(:adam_announcement) { Fabricate(:announcement, starts_at: 100.days.ago, scheduled_at: 10.days.ago, published_at: 10.days.ago, ends_at: 5.days.from_now) } + let!(:brenda_announcement) { Fabricate(:announcement, starts_at: 10.days.ago, scheduled_at: 100.days.ago, published_at: 10.days.ago, ends_at: 5.days.from_now) } + let!(:clara_announcement) { Fabricate(:announcement, starts_at: 10.days.ago, scheduled_at: 10.days.ago, published_at: 100.days.ago, ends_at: 5.days.from_now) } + let!(:darnelle_announcement) { Fabricate(:announcement, starts_at: 10.days.ago, scheduled_at: 10.days.ago, published_at: 10.days.ago, ends_at: 5.days.from_now, created_at: 100.days.ago) } + + describe '#chronological' do + it 'orders the records correctly' do + results = described_class.chronological + + expect(results).to eq( + [ + adam_announcement, + brenda_announcement, + clara_announcement, + darnelle_announcement, + ] + ) + end + end + + describe '#reverse_chronological' do + it 'orders the records correctly' do + results = described_class.reverse_chronological + + expect(results).to eq( + [ + darnelle_announcement, + clara_announcement, + brenda_announcement, + adam_announcement, + ] + ) + end + end + end + end + + describe 'Validations' do + describe 'text' do + it 'validates presence of attribute' do + record = Fabricate.build(:announcement, text: nil) + + expect(record).to_not be_valid + expect(record.errors[:text]).to be_present + end + end + + describe 'ends_at' do + it 'validates presence when starts_at is present' do + record = Fabricate.build(:announcement, starts_at: 1.day.ago) + + expect(record).to_not be_valid + expect(record.errors[:ends_at]).to be_present + end + + it 'does not validate presence when starts_at is missing' do + record = Fabricate.build(:announcement, starts_at: nil) + + expect(record).to be_valid + expect(record.errors[:ends_at]).to_not be_present + end + end + end + + describe '#publish!' do + it 'publishes an unpublished record' do + announcement = Fabricate(:announcement, published: false, scheduled_at: 10.days.from_now) + + announcement.publish! + + expect(announcement).to be_published + expect(announcement.published_at).to_not be_nil + expect(announcement.scheduled_at).to be_nil + end + end + + describe '#unpublish!' do + it 'unpublishes a published record' do + announcement = Fabricate(:announcement, published: true) + + announcement.unpublish! + + expect(announcement).to_not be_published + expect(announcement.scheduled_at).to be_nil + end + end + + describe '#time_range?' do + it 'returns false when starts_at and ends_at are missing' do + record = Fabricate.build(:announcement, starts_at: nil, ends_at: nil) + + expect(record.time_range?).to be(false) + end + + it 'returns false when starts_at is present and ends_at is missing' do + record = Fabricate.build(:announcement, starts_at: 5.days.from_now, ends_at: nil) + + expect(record.time_range?).to be(false) + end + + it 'returns false when starts_at is missing and ends_at is present' do + record = Fabricate.build(:announcement, starts_at: nil, ends_at: 5.days.from_now) + + expect(record.time_range?).to be(false) + end + + it 'returns true when starts_at and ends_at are present' do + record = Fabricate.build(:announcement, starts_at: 5.days.from_now, ends_at: 10.days.from_now) + + expect(record.time_range?).to be(true) + end + end + + describe '#reactions' do + context 'with announcement_reactions present' do + let!(:account) { Fabricate(:account) } + let!(:announcement) { Fabricate(:announcement) } + let!(:announcement_reaction) { Fabricate(:announcement_reaction, announcement: announcement, created_at: 10.days.ago) } + let!(:announcement_reaction_account) { Fabricate(:announcement_reaction, announcement: announcement, created_at: 5.days.ago, account: account) } + + before do + Fabricate(:announcement_reaction) + end + + it 'returns the announcement reactions for the announcement' do + results = announcement.reactions + + expect(results.first.name).to eq(announcement_reaction.name) + expect(results.last.name).to eq(announcement_reaction_account.name) + end + + it 'returns the announcement reactions for the announcement limited to account' do + results = announcement.reactions(account) + + expect(results.first.name).to eq(announcement_reaction.name) + end + end + end + + describe '#statuses' do + let(:announcement) { Fabricate(:announcement, status_ids: status_ids) } + + context 'with empty status_ids' do + let(:status_ids) { nil } + + it 'returns empty array' do + results = announcement.statuses + + expect(results).to eq([]) + end + end + + context 'with relevant status_ids' do + let(:status) { Fabricate(:status, visibility: :public) } + let(:direct_status) { Fabricate(:status, visibility: :direct) } + let(:status_ids) { [status.id, direct_status.id] } + + it 'returns public and unlisted statuses' do + results = announcement.statuses + + expect(results).to include(status) + expect(results).to_not include(direct_status) + end + end + end +end diff --git a/spec/models/concerns/remotable_spec.rb b/spec/models/concerns/remotable_spec.rb index 9f6aeb7fb4ead2..097e6bf006f814 100644 --- a/spec/models/concerns/remotable_spec.rb +++ b/spec/models/concerns/remotable_spec.rb @@ -178,11 +178,11 @@ def self.attachment_definitions allow(foo).to receive(:public_send) foo.hoge_remote_url = url - expect(foo).to have_received(:public_send).with("download_#{hoge}!", url) + expect(foo).to have_received(:public_send).with(:"download_#{hoge}!", url) allow(foo).to receive(:public_send) foo.download_hoge!(url) - expect(foo).to have_received(:public_send).with("#{hoge}=", response_with_limit) + expect(foo).to have_received(:public_send).with(:"#{hoge}=", response_with_limit) end end end diff --git a/spec/models/custom_emoji_spec.rb b/spec/models/custom_emoji_spec.rb index 8a6487c3211618..06affd634ab4e2 100644 --- a/spec/models/custom_emoji_spec.rb +++ b/spec/models/custom_emoji_spec.rb @@ -59,7 +59,7 @@ describe '.from_text' do subject { described_class.from_text(text, nil) } - let!(:emojo) { Fabricate(:custom_emoji) } + let!(:emojo) { Fabricate(:custom_emoji, shortcode: 'coolcat') } context 'with plain text' do let(:text) { 'Hello :coolcat:' } diff --git a/spec/models/form/custom_emoji_batch_spec.rb b/spec/models/form/custom_emoji_batch_spec.rb new file mode 100644 index 00000000000000..abeada5d507984 --- /dev/null +++ b/spec/models/form/custom_emoji_batch_spec.rb @@ -0,0 +1,118 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Form::CustomEmojiBatch do + describe '#save' do + subject { described_class.new({ current_account: account }.merge(options)) } + + let(:options) { {} } + let(:account) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } + + context 'with empty custom_emoji_ids' do + let(:options) { { custom_emoji_ids: [] } } + + it 'does nothing if custom_emoji_ids is empty' do + expect(subject.save).to be_nil + end + end + + describe 'the update action' do + let(:custom_emoji) { Fabricate(:custom_emoji, category: Fabricate(:custom_emoji_category)) } + let(:custom_emoji_category) { Fabricate(:custom_emoji_category) } + + context 'without anything to change' do + let(:options) { { action: 'update' } } + + it 'silently exits without updating any custom emojis' do + expect { subject.save }.to_not change(Admin::ActionLog, :count) + end + end + + context 'with a category_id' do + let(:options) { { action: 'update', custom_emoji_ids: [custom_emoji.id], category_id: custom_emoji_category.id } } + + it 'updates the category of the emoji' do + subject.save + + expect(custom_emoji.reload.category).to eq(custom_emoji_category) + end + end + + context 'with a category_name' do + let(:options) { { action: 'update', custom_emoji_ids: [custom_emoji.id], category_name: custom_emoji_category.name } } + + it 'updates the category of the emoji' do + subject.save + + expect(custom_emoji.reload.category).to eq(custom_emoji_category) + end + end + end + + describe 'the list action' do + let(:custom_emoji) { Fabricate(:custom_emoji, visible_in_picker: false) } + let(:options) { { action: 'list', custom_emoji_ids: [custom_emoji.id] } } + + it 'updates the picker visibility of the emoji' do + subject.save + + expect(custom_emoji.reload.visible_in_picker).to be(true) + end + end + + describe 'the unlist action' do + let(:custom_emoji) { Fabricate(:custom_emoji, visible_in_picker: true) } + let(:options) { { action: 'unlist', custom_emoji_ids: [custom_emoji.id] } } + + it 'updates the picker visibility of the emoji' do + subject.save + + expect(custom_emoji.reload.visible_in_picker).to be(false) + end + end + + describe 'the enable action' do + let(:custom_emoji) { Fabricate(:custom_emoji, disabled: true) } + let(:options) { { action: 'enable', custom_emoji_ids: [custom_emoji.id] } } + + it 'updates the disabled value of the emoji' do + subject.save + + expect(custom_emoji.reload).to_not be_disabled + end + end + + describe 'the disable action' do + let(:custom_emoji) { Fabricate(:custom_emoji, visible_in_picker: false) } + let(:options) { { action: 'disable', custom_emoji_ids: [custom_emoji.id] } } + + it 'updates the disabled value of the emoji' do + subject.save + + expect(custom_emoji.reload).to be_disabled + end + end + + describe 'the copy action' do + let(:custom_emoji) { Fabricate(:custom_emoji) } + let(:options) { { action: 'copy', custom_emoji_ids: [custom_emoji.id] } } + + it 'makes a copy of the emoji' do + expect { subject.save } + .to change(CustomEmoji, :count).by(1) + end + end + + describe 'the delete action' do + let(:custom_emoji) { Fabricate(:custom_emoji) } + let(:options) { { action: 'delete', custom_emoji_ids: [custom_emoji.id] } } + + it 'destroys the emoji' do + subject.save + + expect { custom_emoji.reload }.to raise_error(ActiveRecord::RecordNotFound) + end + end + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index a2f8d2ca44b510..9111fd7c73c68d 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -175,16 +175,8 @@ let(:user) { Fabricate(:user, confirmed_at: nil, unconfirmed_email: new_email) } context 'when the user is already approved' do - around do |example| - registrations_mode = Setting.registrations_mode - Setting.registrations_mode = 'approved' - - example.run - - Setting.registrations_mode = registrations_mode - end - before do + Setting.registrations_mode = 'approved' user.approve! end @@ -199,13 +191,8 @@ end context 'when the user does not require explicit approval' do - around do |example| - registrations_mode = Setting.registrations_mode + before do Setting.registrations_mode = 'open' - - example.run - - Setting.registrations_mode = registrations_mode end it 'sets email to unconfirmed_email' do @@ -219,13 +206,8 @@ end context 'when the user requires explicit approval but is not approved' do - around do |example| - registrations_mode = Setting.registrations_mode + before do Setting.registrations_mode = 'approved' - - example.run - - Setting.registrations_mode = registrations_mode end it 'sets email to unconfirmed_email' do @@ -243,16 +225,8 @@ describe '#approve!' do subject { user.approve! } - around do |example| - registrations_mode = Setting.registrations_mode - Setting.registrations_mode = 'approved' - - example.run - - Setting.registrations_mode = registrations_mode - end - before do + Setting.registrations_mode = 'approved' allow(TriggerWebhookWorker).to receive(:perform_async) end diff --git a/spec/presenters/account_relationships_presenter_spec.rb b/spec/presenters/account_relationships_presenter_spec.rb index 5b05ac8001d144..282cae4f068c24 100644 --- a/spec/presenters/account_relationships_presenter_spec.rb +++ b/spec/presenters/account_relationships_presenter_spec.rb @@ -5,19 +5,18 @@ RSpec.describe AccountRelationshipsPresenter do describe '.initialize' do before do - allow(Account).to receive(:following_map).with(account_ids, current_account_id).and_return(default_map) - allow(Account).to receive(:followed_by_map).with(account_ids, current_account_id).and_return(default_map) - allow(Account).to receive(:blocking_map).with(account_ids, current_account_id).and_return(default_map) - allow(Account).to receive(:muting_map).with(account_ids, current_account_id).and_return(default_map) - allow(Account).to receive(:requested_map).with(account_ids, current_account_id).and_return(default_map) - allow(Account).to receive(:requested_by_map).with(account_ids, current_account_id).and_return(default_map) - allow(Account).to receive(:domain_blocking_map).with(account_ids, current_account_id).and_return(default_map) + allow(Account).to receive(:following_map).with(accounts.pluck(:id), current_account_id).and_return(default_map) + allow(Account).to receive(:followed_by_map).with(accounts.pluck(:id), current_account_id).and_return(default_map) + allow(Account).to receive(:blocking_map).with(accounts.pluck(:id), current_account_id).and_return(default_map) + allow(Account).to receive(:muting_map).with(accounts.pluck(:id), current_account_id).and_return(default_map) + allow(Account).to receive(:requested_map).with(accounts.pluck(:id), current_account_id).and_return(default_map) + allow(Account).to receive(:requested_by_map).with(accounts.pluck(:id), current_account_id).and_return(default_map) end - let(:presenter) { described_class.new(account_ids, current_account_id, **options) } + let(:presenter) { described_class.new(accounts, current_account_id, **options) } let(:current_account_id) { Fabricate(:account).id } - let(:account_ids) { [Fabricate(:account).id] } - let(:default_map) { { 1 => true } } + let(:accounts) { [Fabricate(:account)] } + let(:default_map) { { accounts[0].id => true } } context 'when options are not set' do let(:options) { {} } @@ -29,7 +28,33 @@ blocking: default_map, muting: default_map, requested: default_map, - domain_blocking: default_map + domain_blocking: { accounts[0].id => nil } + ) + end + end + + context 'with a warm cache' do + let(:options) { {} } + + before do + described_class.new(accounts, current_account_id, **options) + + allow(Account).to receive(:following_map).with([], current_account_id).and_return({}) + allow(Account).to receive(:followed_by_map).with([], current_account_id).and_return({}) + allow(Account).to receive(:blocking_map).with([], current_account_id).and_return({}) + allow(Account).to receive(:muting_map).with([], current_account_id).and_return({}) + allow(Account).to receive(:requested_map).with([], current_account_id).and_return({}) + allow(Account).to receive(:requested_by_map).with([], current_account_id).and_return({}) + end + + it 'sets returns expected values' do + expect(presenter).to have_attributes( + following: default_map, + followed_by: default_map, + blocking: default_map, + muting: default_map, + requested: default_map, + domain_blocking: { accounts[0].id => nil } ) end end @@ -86,7 +111,7 @@ let(:options) { { domain_blocking_map: { 7 => true } } } it 'sets @domain_blocking merged with default_map and options[:domain_blocking_map]' do - expect(presenter.domain_blocking).to eq default_map.merge(options[:domain_blocking_map]) + expect(presenter.domain_blocking).to eq({ accounts[0].id => nil }.merge(options[:domain_blocking_map])) end end end diff --git a/spec/presenters/instance_presenter_spec.rb b/spec/presenters/instance_presenter_spec.rb index 1aed588ef49bb7..a5a5d3e188bbe8 100644 --- a/spec/presenters/instance_presenter_spec.rb +++ b/spec/presenters/instance_presenter_spec.rb @@ -6,12 +6,6 @@ let(:instance_presenter) { described_class.new } describe '#description' do - around do |example| - site_description = Setting.site_short_description - example.run - Setting.site_short_description = site_description - end - it 'delegates site_description to Setting' do Setting.site_short_description = 'Site desc' expect(instance_presenter.description).to eq 'Site desc' @@ -19,12 +13,6 @@ end describe '#extended_description' do - around do |example| - site_extended_description = Setting.site_extended_description - example.run - Setting.site_extended_description = site_extended_description - end - it 'delegates site_extended_description to Setting' do Setting.site_extended_description = 'Extended desc' expect(instance_presenter.extended_description).to eq 'Extended desc' @@ -32,12 +20,6 @@ end describe '#email' do - around do |example| - site_contact_email = Setting.site_contact_email - example.run - Setting.site_contact_email = site_contact_email - end - it 'delegates contact_email to Setting' do Setting.site_contact_email = 'admin@example.com' expect(instance_presenter.contact.email).to eq 'admin@example.com' @@ -45,12 +27,6 @@ end describe '#account' do - around do |example| - site_contact_username = Setting.site_contact_username - example.run - Setting.site_contact_username = site_contact_username - end - it 'returns the account for the site contact username' do Setting.site_contact_username = 'aaa' account = Fabricate(:account, username: 'aaa') diff --git a/spec/requests/api/v1/custom_emojis_spec.rb b/spec/requests/api/v1/custom_emojis_spec.rb index 5de0dda0be4525..2f0dc729449c51 100644 --- a/spec/requests/api/v1/custom_emojis_spec.rb +++ b/spec/requests/api/v1/custom_emojis_spec.rb @@ -9,7 +9,7 @@ describe 'GET /api/v1/custom_emojis' do before do - Fabricate(:custom_emoji, domain: nil, disabled: false, visible_in_picker: true) + Fabricate(:custom_emoji, domain: nil, disabled: false, visible_in_picker: true, shortcode: 'coolcat') end context 'when logged out' do diff --git a/spec/controllers/api/v1/directories_controller_spec.rb b/spec/requests/api/v1/directories_spec.rb similarity index 82% rename from spec/controllers/api/v1/directories_controller_spec.rb rename to spec/requests/api/v1/directories_spec.rb index 308a8874c86942..0a1864d136cc5e 100644 --- a/spec/controllers/api/v1/directories_controller_spec.rb +++ b/spec/requests/api/v1/directories_spec.rb @@ -2,17 +2,13 @@ require 'rails_helper' -describe Api::V1::DirectoriesController do - render_views - +describe 'Directories API' do let(:user) { Fabricate(:user, confirmed_at: nil) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:follows') } - - before do - allow(controller).to receive(:doorkeeper_token) { token } - end + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'read:follows' } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - describe 'GET #show' do + describe 'GET /api/v1/directories' do context 'with no params' do before do local_unconfirmed_account = Fabricate( @@ -58,27 +54,32 @@ ) domain_blocked_account.create_account_stat! Fabricate(:account_domain_block, account: user.account, domain: 'test.example') + + local_discoverable_account.create_account_stat! + eligible_remote_account.create_account_stat! end - it 'returns the local discoverable account and the remote discoverable account' do - local_discoverable_account = Fabricate( + let(:local_discoverable_account) do + Fabricate( :account, domain: nil, user: Fabricate(:user, confirmed_at: 10.days.ago, approved: true), discoverable: true, username: 'local_discoverable' ) - local_discoverable_account.create_account_stat! + end - eligible_remote_account = Fabricate( + let(:eligible_remote_account) do + Fabricate( :account, domain: 'host.example', discoverable: true, username: 'eligible_remote' ) - eligible_remote_account.create_account_stat! + end - get :show + it 'returns the local discoverable account and the remote discoverable account' do + get '/api/v1/directory', headers: headers expect(response).to have_http_status(200) expect(body_as_json.size).to eq(2) @@ -87,14 +88,17 @@ end context 'when asking for local accounts only' do - it 'returns only the local accounts' do - user = Fabricate(:user, confirmed_at: 10.days.ago, approved: true) - local_account = Fabricate(:account, domain: nil, user: user) - remote_account = Fabricate(:account, domain: 'host.example') + let(:user) { Fabricate(:user, confirmed_at: 10.days.ago, approved: true) } + let(:local_account) { Fabricate(:account, domain: nil, user: user) } + let(:remote_account) { Fabricate(:account, domain: 'host.example') } + + before do local_account.create_account_stat! remote_account.create_account_stat! + end - get :show, params: { local: '1' } + it 'returns only the local accounts' do + get '/api/v1/directory', headers: headers, params: { local: '1' } expect(response).to have_http_status(200) expect(body_as_json.size).to eq(1) @@ -108,7 +112,7 @@ old_stat = Fabricate(:account_stat, last_status_at: 1.day.ago) new_stat = Fabricate(:account_stat, last_status_at: 1.minute.ago) - get :show, params: { order: 'active' } + get '/api/v1/directory', headers: headers, params: { order: 'active' } expect(response).to have_http_status(200) expect(body_as_json.size).to eq(2) @@ -123,7 +127,7 @@ travel_to 10.seconds.from_now account_new = Fabricate(:account_stat).account - get :show, params: { order: 'new' } + get '/api/v1/directory', headers: headers, params: { order: 'new' } expect(response).to have_http_status(200) expect(body_as_json.size).to eq(2) diff --git a/spec/requests/api/v1/instances/activity_spec.rb b/spec/requests/api/v1/instances/activity_spec.rb index d1f92ef36e5a0f..4f2bc91ad68235 100644 --- a/spec/requests/api/v1/instances/activity_spec.rb +++ b/spec/requests/api/v1/instances/activity_spec.rb @@ -4,12 +4,6 @@ RSpec.describe 'Activity' do describe 'GET /api/v1/instance/activity' do - around do |example| - original = Setting.activity_api_enabled - example.run - Setting.activity_api_enabled = original - end - context 'with activity api enabled' do before { Setting.activity_api_enabled = true } diff --git a/spec/requests/api/v1/instances/domain_blocks_spec.rb b/spec/requests/api/v1/instances/domain_blocks_spec.rb index 99b5e2b6aa4684..397ecff084a6fd 100644 --- a/spec/requests/api/v1/instances/domain_blocks_spec.rb +++ b/spec/requests/api/v1/instances/domain_blocks_spec.rb @@ -4,12 +4,6 @@ RSpec.describe 'Domain Blocks' do describe 'GET /api/v1/instance/domain_blocks' do - around do |example| - original = Setting.show_domain_blocks - example.run - Setting.show_domain_blocks = original - end - before do Fabricate(:domain_block) end diff --git a/spec/requests/api/v1/instances/peers_spec.rb b/spec/requests/api/v1/instances/peers_spec.rb index d3400ae8fdd90a..1a7975f8b79309 100644 --- a/spec/requests/api/v1/instances/peers_spec.rb +++ b/spec/requests/api/v1/instances/peers_spec.rb @@ -4,12 +4,6 @@ RSpec.describe 'Peers' do describe 'GET /api/v1/instance/peers' do - around do |example| - original = Setting.peers_api_enabled - example.run - Setting.peers_api_enabled = original - end - context 'with peers api enabled' do before { Setting.peers_api_enabled = true } diff --git a/spec/requests/api/v1/suggestions_spec.rb b/spec/requests/api/v1/suggestions_spec.rb index 42b7f86629bb0e..dc89613fc52b22 100644 --- a/spec/requests/api/v1/suggestions_spec.rb +++ b/spec/requests/api/v1/suggestions_spec.rb @@ -13,13 +13,12 @@ get '/api/v1/suggestions', headers: headers, params: params end - let(:bob) { Fabricate(:account) } - let(:jeff) { Fabricate(:account) } + let(:bob) { Fabricate(:account) } + let(:jeff) { Fabricate(:account) } let(:params) { {} } before do - PotentialFriendshipTracker.record(user.account_id, bob.id, :reblog) - PotentialFriendshipTracker.record(user.account_id, jeff.id, :favourite) + Setting.bootstrap_timeline_accounts = [bob, jeff].map(&:acct).join(',') end it_behaves_like 'forbidden for wrong scope', 'write' @@ -65,17 +64,15 @@ delete "/api/v1/suggestions/#{jeff.id}", headers: headers end - let(:suggestions_source) { instance_double(AccountSuggestions::PastInteractionsSource, remove: nil) } - let(:bob) { Fabricate(:account) } - let(:jeff) { Fabricate(:account) } + let(:bob) { Fabricate(:account) } + let(:jeff) { Fabricate(:account) } + let(:scopes) { 'write' } before do - PotentialFriendshipTracker.record(user.account_id, bob.id, :reblog) - PotentialFriendshipTracker.record(user.account_id, jeff.id, :favourite) - allow(AccountSuggestions::PastInteractionsSource).to receive(:new).and_return(suggestions_source) + Setting.bootstrap_timeline_accounts = [bob, jeff].map(&:acct).join(',') end - it_behaves_like 'forbidden for wrong scope', 'write' + it_behaves_like 'forbidden for wrong scope', 'read' it 'returns http success' do subject @@ -86,8 +83,7 @@ it 'removes the specified suggestion' do subject - expect(suggestions_source).to have_received(:remove).with(user.account, jeff.id.to_s).once - expect(suggestions_source).to_not have_received(:remove).with(user.account, bob.id.to_s) + expect(FollowRecommendationMute.exists?(account: user.account, target_account: jeff)).to be true end context 'without an authorization header' do diff --git a/spec/requests/api/v2/search_spec.rb b/spec/requests/api/v2/search_spec.rb index d0778cba4dd486..13bcf17984b11b 100644 --- a/spec/requests/api/v2/search_spec.rb +++ b/spec/requests/api/v2/search_spec.rb @@ -40,7 +40,7 @@ end end - context 'with `offset`' do + context 'with valid `offset` value' do let(:params) { { q: 'test1', offset: 1 } } it 'returns http unauthorized' do @@ -50,6 +50,26 @@ end end + context 'with negative `offset` value' do + let(:params) { { q: 'test1', offset: '-100', type: 'accounts' } } + + it 'returns http bad_request' do + get '/api/v2/search', headers: headers, params: params + + expect(response).to have_http_status(400) + end + end + + context 'with negative `limit` value' do + let(:params) { { q: 'test1', limit: '-100', type: 'accounts' } } + + it 'returns http bad_request' do + get '/api/v2/search', headers: headers, params: params + + expect(response).to have_http_status(400) + end + end + context 'with following=true' do let(:params) { { q: 'test', type: 'accounts', following: 'true' } } diff --git a/spec/requests/cache_spec.rb b/spec/requests/cache_spec.rb index ce73d3af75d543..dbba228740ab61 100644 --- a/spec/requests/cache_spec.rb +++ b/spec/requests/cache_spec.rb @@ -242,17 +242,11 @@ module DisabledAnonymousAPI end describe '/api/v1/instance/domain_blocks' do - around do |example| - old_setting = Setting.show_domain_blocks + before do Setting.show_domain_blocks = show_domain_blocks - - example.run - - Setting.show_domain_blocks = old_setting + get '/api/v1/instance/domain_blocks' end - before { get '/api/v1/instance/domain_blocks' } - context 'when set to be publicly-available' do let(:show_domain_blocks) { 'all' } @@ -365,16 +359,8 @@ module DisabledAnonymousAPI end describe '/api/v1/instance/domain_blocks' do - around do |example| - old_setting = Setting.show_domain_blocks - Setting.show_domain_blocks = show_domain_blocks - - example.run - - Setting.show_domain_blocks = old_setting - end - before do + Setting.show_domain_blocks = show_domain_blocks get '/api/v1/instance/domain_blocks', headers: { 'Authorization' => "Bearer #{token.token}" } end diff --git a/spec/requests/omniauth_callbacks_spec.rb b/spec/requests/omniauth_callbacks_spec.rb index 27aa5ec506db43..0d37c411403bdc 100644 --- a/spec/requests/omniauth_callbacks_spec.rb +++ b/spec/requests/omniauth_callbacks_spec.rb @@ -4,7 +4,7 @@ describe 'OmniAuth callbacks' do shared_examples 'omniauth provider callbacks' do |provider| - subject { post send "user_#{provider}_omniauth_callback_path" } + subject { post send :"user_#{provider}_omniauth_callback_path" } context 'with full information in response' do before do diff --git a/spec/services/app_sign_up_service_spec.rb b/spec/services/app_sign_up_service_spec.rb index d5946cf9b02365..0adb473f17770b 100644 --- a/spec/services/app_sign_up_service_spec.rb +++ b/spec/services/app_sign_up_service_spec.rb @@ -28,13 +28,8 @@ end context 'when registrations are closed' do - around do |example| - tmp = Setting.registrations_mode + before do Setting.registrations_mode = 'none' - - example.run - - Setting.registrations_mode = tmp end it 'raises an error', :aggregate_failures do diff --git a/spec/services/delete_account_service_spec.rb b/spec/services/delete_account_service_spec.rb index 5defd5bbabea7f..9e126714da4ee1 100644 --- a/spec/services/delete_account_service_spec.rb +++ b/spec/services/delete_account_service_spec.rb @@ -90,11 +90,11 @@ def delete_associated_owned_records end def delete_associated_target_records - change do - [ - AccountPin.where(target_account: account), - ].map(&:count) - end.from([1]).to([0]) + change(account_pins_for_account, :count).from(1).to(0) + end + + def account_pins_for_account + AccountPin.where(target_account: account) end def delete_associated_target_notifications @@ -140,28 +140,34 @@ def delete_associated_target_notifications it 'sends expected activities to followed and follower inboxes' do subject - expect(a_request(:post, account.inbox_url).with( - body: - hash_including({ - 'type' => 'Reject', - 'object' => hash_including({ - 'type' => 'Follow', - 'actor' => account.uri, - 'object' => ActivityPub::TagManager.instance.uri_for(local_follower), - }), - }) - )).to have_been_made.once - - expect(a_request(:post, account.inbox_url).with( - body: hash_including({ - 'type' => 'Undo', - 'object' => hash_including({ - 'type' => 'Follow', - 'actor' => ActivityPub::TagManager.instance.uri_for(local_follower), - 'object' => account.uri, - }), - }) - )).to have_been_made.once + expect(post_to_inbox_with_reject).to have_been_made.once + expect(post_to_inbox_with_undo).to have_been_made.once + end + + def post_to_inbox_with_undo + a_request(:post, account.inbox_url).with( + body: hash_including({ + 'type' => 'Undo', + 'object' => hash_including({ + 'type' => 'Follow', + 'actor' => ActivityPub::TagManager.instance.uri_for(local_follower), + 'object' => account.uri, + }), + }) + ) + end + + def post_to_inbox_with_reject + a_request(:post, account.inbox_url).with( + body: hash_including({ + 'type' => 'Reject', + 'object' => hash_including({ + 'type' => 'Follow', + 'actor' => account.uri, + 'object' => ActivityPub::TagManager.instance.uri_for(local_follower), + }), + }) + ) end end end diff --git a/spec/services/update_account_service_spec.rb b/spec/services/update_account_service_spec.rb index 6318cc95fbb5aa..e1cc5a794025d4 100644 --- a/spec/services/update_account_service_spec.rb +++ b/spec/services/update_account_service_spec.rb @@ -10,14 +10,17 @@ let(:alice) { Fabricate(:account) } let(:bob) { Fabricate(:account) } let(:eve) { Fabricate(:account) } + let(:ohagi) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/actor') } before do bob.touch(:silenced_at) account.mute!(eve) + Fabricate(:domain_block, domain: 'example.com', reject_straight_follow: true) FollowService.new.call(alice, account) FollowService.new.call(bob, account) FollowService.new.call(eve, account) + FollowService.new.call(ohagi, account) subject.call(account, { locked: false }) end @@ -36,5 +39,10 @@ expect(eve.following?(account)).to be true expect(eve.requested?(account)).to be false end + + it 'does not auto-accept pending follow requests from blocking straight follow domains' do + expect(ohagi.following?(account)).to be false + expect(ohagi.requested?(account)).to be true + end end end diff --git a/spec/workers/scheduler/follow_recommendations_scheduler_spec.rb b/spec/workers/scheduler/follow_recommendations_scheduler_spec.rb index 18d5260e426f8c..246012e128c9ce 100644 --- a/spec/workers/scheduler/follow_recommendations_scheduler_spec.rb +++ b/spec/workers/scheduler/follow_recommendations_scheduler_spec.rb @@ -29,14 +29,12 @@ it 'creates recommendations' do expect { scheduled_run }.to change(FollowRecommendation, :count).from(0).to(target_accounts.size) - expect(redis.zrange('follow_recommendations:en', 0, -1)).to match_array(target_accounts.pluck(:id).map(&:to_s)) end end context 'when there are no accounts to recommend' do it 'does not create follow recommendations' do expect { scheduled_run }.to_not change(FollowRecommendation, :count) - expect(redis.zrange('follow_recommendations:en', 0, -1)).to be_empty end end end diff --git a/yarn.lock b/yarn.lock index 60eeee951b763a..70e249a7d9cf31 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1539,7 +1539,7 @@ __metadata: languageName: node linkType: hard -"@csstools/css-parser-algorithms@npm:^2.3.1": +"@csstools/css-parser-algorithms@npm:^2.3.2": version: 2.3.2 resolution: "@csstools/css-parser-algorithms@npm:2.3.2" peerDependencies: @@ -1548,14 +1548,14 @@ __metadata: languageName: node linkType: hard -"@csstools/css-tokenizer@npm:^2.2.0": +"@csstools/css-tokenizer@npm:^2.2.1": version: 2.2.1 resolution: "@csstools/css-tokenizer@npm:2.2.1" checksum: 0c6901d291e99c567893846a47068057c2a28b3edc4219b6da589a530f55f51ddd4675f906f707b393bfe7a508ab2604bf3f75708f064db857bb277636bd5a44 languageName: node linkType: hard -"@csstools/media-query-list-parser@npm:^2.1.4": +"@csstools/media-query-list-parser@npm:^2.1.5": version: 2.1.5 resolution: "@csstools/media-query-list-parser@npm:2.1.5" peerDependencies: @@ -1744,10 +1744,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.55.0": - version: 8.55.0 - resolution: "@eslint/js@npm:8.55.0" - checksum: 88ab9fc57a651becd2b32ec40a3958db27fae133b1ae77bebd733aa5bbd00a92f325bb02f20ad680d31c731fa49b22f060a4777dd52eb3e27da013d940bd978d +"@eslint/js@npm:8.56.0": + version: 8.56.0 + resolution: "@eslint/js@npm:8.56.0" + checksum: 60b3a1cf240e2479cec9742424224465dc50e46d781da1b7f5ef240501b2d1202c225bd456207faac4b34a64f4765833345bc4ddffd00395e1db40fa8c426f5a languageName: node linkType: hard @@ -2451,7 +2451,7 @@ __metadata: sass-loader: "npm:^10.2.0" stacktrace-js: "npm:^2.0.2" stringz: "npm:^2.1.0" - stylelint: "npm:^15.10.1" + stylelint: "npm:^16.0.2" stylelint-config-standard-scss: "npm:^12.0.0" substring-trie: "npm:^1.0.2" terser-webpack-plugin: "npm:^4.2.3" @@ -2515,9 +2515,9 @@ __metadata: linkType: soft "@material-symbols/svg-600@npm:^0.14.0": - version: 0.14.1 - resolution: "@material-symbols/svg-600@npm:0.14.1" - checksum: fb5252285bbeccc45a4b131e8b165470b5b57e146bc7ea586eb82e580037d1218f6dad5fee4e6822c357041ff547f34c9c7432cce0a811b14f7e41d8ae23009b + version: 0.14.3 + resolution: "@material-symbols/svg-600@npm:0.14.3" + checksum: b9d1942790ee420d3464786fc7e748b3925d20c50aa34f2b289807badb85e49d52b4dcb36bed14c45e544a7d25fda81b33dd40d52aa134a6dea74b76805ea863 languageName: node linkType: hard @@ -3271,13 +3271,6 @@ __metadata: languageName: node linkType: hard -"@types/minimist@npm:^1.2.2": - version: 1.2.4 - resolution: "@types/minimist@npm:1.2.4" - checksum: 01403652c09de17b8c6d7d9959cb7a244deccf31e9e7a1a7011fba73fa2724c14fe935718e0fdc48dcd30403fd76a916cb991d4c0ddf229748ccc6c4920c3371 - languageName: node - linkType: hard - "@types/node@npm:*": version: 20.8.10 resolution: "@types/node@npm:20.8.10" @@ -3294,13 +3287,6 @@ __metadata: languageName: node linkType: hard -"@types/normalize-package-data@npm:^2.4.0": - version: 2.4.3 - resolution: "@types/normalize-package-data@npm:2.4.3" - checksum: 9ad94568b53f65d0c7fffed61c74e4a7b8625b1ebbc549f1de25287c2d20e6bca9d9cdc5826e508c9d95e02a48ac69d0282121c300667071661f37090224416b - languageName: node - linkType: hard - "@types/npmlog@npm:^7.0.0": version: 7.0.0 resolution: "@types/npmlog@npm:7.0.0" @@ -3385,11 +3371,11 @@ __metadata: linkType: hard "@types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.2.4": - version: 18.2.17 - resolution: "@types/react-dom@npm:18.2.17" + version: 18.2.18 + resolution: "@types/react-dom@npm:18.2.18" dependencies: "@types/react": "npm:*" - checksum: 33b53078ed7e9e0cfc4dc691e938f7db1cc06353bc345947b41b581c3efe2b980c9e4eb6460dbf5ddc521dd91959194c970221a2bd4bfad9d23ebce338e12938 + checksum: 74dba11a1b8156f3a763f3fca1fb4ec1dcd349153279b8bf79210024a69f994bf2cf0728198c047f8130c5318420ea56281b0a4ef84c8ae943cd9a0cac705220 languageName: node linkType: hard @@ -3515,13 +3501,13 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7": - version: 18.2.43 - resolution: "@types/react@npm:18.2.43" + version: 18.2.45 + resolution: "@types/react@npm:18.2.45" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 10477a50fbd3c0cc5b8a2ade679f442717f68fb27c8460b2aa1d3256cd18c48f742bbe5b9ee37a8c4c5f832ffa37b3a23c09fd96dd880a8e3182d8929c05e803 + checksum: 4cc650c47ffb88baac29fb7a74e842e4af4a55f437086ef70250fdc75f0a5f2fcf8adc272d05ab2e00b1de6e14613296881271caee037dadf9130fdeb498c59e languageName: node linkType: hard @@ -3702,14 +3688,14 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^6.0.0": - version: 6.13.2 - resolution: "@typescript-eslint/eslint-plugin@npm:6.13.2" + version: 6.14.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.14.0" dependencies: "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:6.13.2" - "@typescript-eslint/type-utils": "npm:6.13.2" - "@typescript-eslint/utils": "npm:6.13.2" - "@typescript-eslint/visitor-keys": "npm:6.13.2" + "@typescript-eslint/scope-manager": "npm:6.14.0" + "@typescript-eslint/type-utils": "npm:6.14.0" + "@typescript-eslint/utils": "npm:6.14.0" + "@typescript-eslint/visitor-keys": "npm:6.14.0" debug: "npm:^4.3.4" graphemer: "npm:^1.4.0" ignore: "npm:^5.2.4" @@ -3722,44 +3708,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 531a4406d872738d165c6a66cb26e976523c94053b022a8210dc9fd10e91b79b705bc0fcc77145e9744e4108b53bdba55e02a10dc17757b22be92aff57849384 + checksum: 6360efb0e142ed91de5e9bddcd041f769feeedd256332733be08f7a74c8ae637cbfb78c6b85d747c73231bbb95cef95ed2d2854ab7d43aebfbedb3a191f447f1 languageName: node linkType: hard "@typescript-eslint/parser@npm:^6.0.0": - version: 6.13.2 - resolution: "@typescript-eslint/parser@npm:6.13.2" + version: 6.14.0 + resolution: "@typescript-eslint/parser@npm:6.14.0" dependencies: - "@typescript-eslint/scope-manager": "npm:6.13.2" - "@typescript-eslint/types": "npm:6.13.2" - "@typescript-eslint/typescript-estree": "npm:6.13.2" - "@typescript-eslint/visitor-keys": "npm:6.13.2" + "@typescript-eslint/scope-manager": "npm:6.14.0" + "@typescript-eslint/types": "npm:6.14.0" + "@typescript-eslint/typescript-estree": "npm:6.14.0" + "@typescript-eslint/visitor-keys": "npm:6.14.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 2c62b8cd8a37eb2ea59cd00e559f51a9f57af746e2040e872af3c58ddd3f4071ad7b7009789bdeb0e0d4ee0343bfe96ee77288020f3ae22d08e1674203f5e156 + checksum: 0344f7f640374e7e5a5b50e9c90fbd161611b3f455132e541ef9116eef7bd3acf364db64bd38d4b6b4fe148414494620c9df660f8ddce036019c38ae8e146585 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/scope-manager@npm:6.13.2" +"@typescript-eslint/scope-manager@npm:6.14.0": + version: 6.14.0 + resolution: "@typescript-eslint/scope-manager@npm:6.14.0" dependencies: - "@typescript-eslint/types": "npm:6.13.2" - "@typescript-eslint/visitor-keys": "npm:6.13.2" - checksum: 9b159e5bb10dfb5953e71488200b4126378fc7e987ce7d90946aea9ec40cd66c7ada92399657c5d9794189b764ca6f4eb38a8dcb9e4c5aa50ab6000a39636b9c + "@typescript-eslint/types": "npm:6.14.0" + "@typescript-eslint/visitor-keys": "npm:6.14.0" + checksum: 8c59a215af3d7d24d8d0b21c28a858263de471650829f288a941e0eb8af8a054798da5c7594b7f39370219718270c18464b5edb96f451457e5f080a33ba57c2c languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/type-utils@npm:6.13.2" +"@typescript-eslint/type-utils@npm:6.14.0": + version: 6.14.0 + resolution: "@typescript-eslint/type-utils@npm:6.14.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:6.13.2" - "@typescript-eslint/utils": "npm:6.13.2" + "@typescript-eslint/typescript-estree": "npm:6.14.0" + "@typescript-eslint/utils": "npm:6.14.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.0.1" peerDependencies: @@ -3767,23 +3753,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 1ca97c78abdf479aea0c54e869fda2ae2f69de1974cc063062ce7b5b16c7fdf497ea15c50a29dd5941ea1b6b77e8f1213a5c272a747e334ac69ede083f327468 + checksum: 836a6e84be5a245b07c76968c98e2f3bae064767dde720080fe8f33e226188510778dbca4199b7e42ef675ec3fd6d0ab522ec1c77d6e2a9b50e8e275fe7c72c9 languageName: node linkType: hard -"@typescript-eslint/types@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/types@npm:6.13.2" - checksum: 029918ca5b1442bb4bc435773504ce32191e2c3e2fde8d4176bb6513f03e3dfa2aa9724b2d22b1640656d666b97f7a7ebfeaf67b881d5e07250828fa83e3ebe8 +"@typescript-eslint/types@npm:6.14.0": + version: 6.14.0 + resolution: "@typescript-eslint/types@npm:6.14.0" + checksum: d59306a7a441982a4dcee7d775928fd5086aba9331f7a238f915723a0dc785df0e43af562a30a7c2f1b056a1e49fd64863a8d2450d31706193add0ade87334a4 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/typescript-estree@npm:6.13.2" +"@typescript-eslint/typescript-estree@npm:6.14.0": + version: 6.14.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.14.0" dependencies: - "@typescript-eslint/types": "npm:6.13.2" - "@typescript-eslint/visitor-keys": "npm:6.13.2" + "@typescript-eslint/types": "npm:6.14.0" + "@typescript-eslint/visitor-keys": "npm:6.14.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -3792,34 +3778,34 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 1c4c59dce0c51fdfee34d9f418e64fe28e3ec1a97661efc8a3d2780bdff36aff38de9090d356a968f394fa6d4e9c058936ce9cd260d4c44a52761ecd74915bce + checksum: 767c3309987b8ad053a2403605a9bd7c4eb3283dece864a741a7531a1c28eea4d85acaa4613141b64e194f9f6c4cbc5bc762c9b9f3a67c6202aa8cbb18b180d2 languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.13.2, @typescript-eslint/utils@npm:^6.5.0": - version: 6.13.2 - resolution: "@typescript-eslint/utils@npm:6.13.2" +"@typescript-eslint/utils@npm:6.14.0, @typescript-eslint/utils@npm:^6.5.0": + version: 6.14.0 + resolution: "@typescript-eslint/utils@npm:6.14.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" "@types/json-schema": "npm:^7.0.12" "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:6.13.2" - "@typescript-eslint/types": "npm:6.13.2" - "@typescript-eslint/typescript-estree": "npm:6.13.2" + "@typescript-eslint/scope-manager": "npm:6.14.0" + "@typescript-eslint/types": "npm:6.14.0" + "@typescript-eslint/typescript-estree": "npm:6.14.0" semver: "npm:^7.5.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 84969be91e7949868eaaa289288c9d71927f0e427b572501b0991d8d62b40a4234f7287c35b35d276ccbb53e9ea5457b8250fcf4941e60e6b9ba4065fbfba416 + checksum: 72689b2897b89e1bd1c71c1c2ae436d0ccfbcfffabf3be4378de74ad8138b2ecdbeeda7c1720e2f1754569e773f2fc7216f704335e1e56c38c7601ee1d190aeb languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/visitor-keys@npm:6.13.2" +"@typescript-eslint/visitor-keys@npm:6.14.0": + version: 6.14.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.14.0" dependencies: - "@typescript-eslint/types": "npm:6.13.2" + "@typescript-eslint/types": "npm:6.14.0" eslint-visitor-keys: "npm:^3.4.1" - checksum: c173bc1fcc42c3075a5ee094e7f3bf0279d98315c25ff49e20d02d79022b1d0402accfa113b070afb4d52a6f6d180594b67baa8b6a784eabdf82b54dd1ff454c + checksum: 0e2363f9f1986ebdb41507c54a666fa1c336eb6beb383dc342a10844d3c42c89067b21c3f158851fa6f0825e1e451a5470b5454fde70a6fc33b4b0259462d954 languageName: node linkType: hard @@ -4510,13 +4496,6 @@ __metadata: languageName: node linkType: hard -"arrify@npm:^1.0.1": - version: 1.0.1 - resolution: "arrify@npm:1.0.1" - checksum: c35c8d1a81bcd5474c0c57fe3f4bad1a4d46a5fa353cedcff7a54da315df60db71829e69104b859dff96c5d68af46bd2be259fe5e50dc6aa9df3b36bea0383ab - languageName: node - linkType: hard - "arrow-key-navigation@npm:^1.2.0": version: 1.2.0 resolution: "arrow-key-navigation@npm:1.2.0" @@ -5390,18 +5369,6 @@ __metadata: languageName: node linkType: hard -"camelcase-keys@npm:^7.0.0": - version: 7.0.2 - resolution: "camelcase-keys@npm:7.0.2" - dependencies: - camelcase: "npm:^6.3.0" - map-obj: "npm:^4.1.0" - quick-lru: "npm:^5.1.1" - type-fest: "npm:^1.2.1" - checksum: ae86a51168643e9e8a2f2c7bfa17850729979ec3dafc5253056a7d97931cbb0e3ef5b4185e59d54b7a56c54405dee2874b0c82033498d8626e512ff9034cb05c - languageName: node - linkType: hard - "camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" @@ -5409,7 +5376,7 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^6.2.0, camelcase@npm:^6.3.0": +"camelcase@npm:^6.2.0": version: 6.3.0 resolution: "camelcase@npm:6.3.0" checksum: 0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 @@ -6006,15 +5973,20 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^8.2.0": - version: 8.2.0 - resolution: "cosmiconfig@npm:8.2.0" +"cosmiconfig@npm:^9.0.0": + version: 9.0.0 + resolution: "cosmiconfig@npm:9.0.0" dependencies: - import-fresh: "npm:^3.2.1" + env-paths: "npm:^2.2.1" + import-fresh: "npm:^3.3.0" js-yaml: "npm:^4.1.0" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - checksum: 4180aa6d1881b75ba591b2fc04b022741a3a4b67e9e243c0eb8d169b6e1efbd3cdf7e8ca19243c0f2e53a9d59ac3eccd5cad5f95f487fcbf4e740f9e86745747 + parse-json: "npm:^5.2.0" + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 1c1703be4f02a250b1d6ca3267e408ce16abfe8364193891afc94c2d5c060b69611fdc8d97af74b7e6d5d1aac0ab2fb94d6b079573146bc2d756c2484ce5f0ee languageName: node linkType: hard @@ -6143,12 +6115,12 @@ __metadata: languageName: node linkType: hard -"css-declaration-sorter@npm:^6.3.1": - version: 6.4.0 - resolution: "css-declaration-sorter@npm:6.4.0" +"css-declaration-sorter@npm:^7.0.0": + version: 7.1.1 + resolution: "css-declaration-sorter@npm:7.1.1" peerDependencies: postcss: ^8.0.9 - checksum: aef4d5927e576bae04349457be0607af44525cf5f4b28a91843c7b7f28fcbb302ba149385bb0e2172380556994e31680c5177b42d03502c417789b139e20cbc2 + checksum: bea446e441bafde21c3c7b3f7639559311da12eea140db7ee3c61e4f41df455b7b098df107f99bc0cca32a5020841cc94bf8a2d5efb1b383e51f9de478c4816e languageName: node linkType: hard @@ -6281,63 +6253,72 @@ __metadata: languageName: node linkType: hard -"cssnano-preset-default@npm:^6.0.1": - version: 6.0.1 - resolution: "cssnano-preset-default@npm:6.0.1" - dependencies: - css-declaration-sorter: "npm:^6.3.1" - cssnano-utils: "npm:^4.0.0" - postcss-calc: "npm:^9.0.0" - postcss-colormin: "npm:^6.0.0" - postcss-convert-values: "npm:^6.0.0" - postcss-discard-comments: "npm:^6.0.0" - postcss-discard-duplicates: "npm:^6.0.0" - postcss-discard-empty: "npm:^6.0.0" - postcss-discard-overridden: "npm:^6.0.0" - postcss-merge-longhand: "npm:^6.0.0" - postcss-merge-rules: "npm:^6.0.1" - postcss-minify-font-values: "npm:^6.0.0" - postcss-minify-gradients: "npm:^6.0.0" - postcss-minify-params: "npm:^6.0.0" - postcss-minify-selectors: "npm:^6.0.0" - postcss-normalize-charset: "npm:^6.0.0" - postcss-normalize-display-values: "npm:^6.0.0" - postcss-normalize-positions: "npm:^6.0.0" - postcss-normalize-repeat-style: "npm:^6.0.0" - postcss-normalize-string: "npm:^6.0.0" - postcss-normalize-timing-functions: "npm:^6.0.0" - postcss-normalize-unicode: "npm:^6.0.0" - postcss-normalize-url: "npm:^6.0.0" - postcss-normalize-whitespace: "npm:^6.0.0" - postcss-ordered-values: "npm:^6.0.0" - postcss-reduce-initial: "npm:^6.0.0" - postcss-reduce-transforms: "npm:^6.0.0" - postcss-svgo: "npm:^6.0.0" - postcss-unique-selectors: "npm:^6.0.0" +"cssnano-preset-default@npm:^6.0.2": + version: 6.0.2 + resolution: "cssnano-preset-default@npm:6.0.2" + dependencies: + css-declaration-sorter: "npm:^7.0.0" + cssnano-utils: "npm:^4.0.1" + postcss-calc: "npm:^9.0.1" + postcss-colormin: "npm:^6.0.1" + postcss-convert-values: "npm:^6.0.1" + postcss-discard-comments: "npm:^6.0.1" + postcss-discard-duplicates: "npm:^6.0.1" + postcss-discard-empty: "npm:^6.0.1" + postcss-discard-overridden: "npm:^6.0.1" + postcss-merge-longhand: "npm:^6.0.1" + postcss-merge-rules: "npm:^6.0.2" + postcss-minify-font-values: "npm:^6.0.1" + postcss-minify-gradients: "npm:^6.0.1" + postcss-minify-params: "npm:^6.0.1" + postcss-minify-selectors: "npm:^6.0.1" + postcss-normalize-charset: "npm:^6.0.1" + postcss-normalize-display-values: "npm:^6.0.1" + postcss-normalize-positions: "npm:^6.0.1" + postcss-normalize-repeat-style: "npm:^6.0.1" + postcss-normalize-string: "npm:^6.0.1" + postcss-normalize-timing-functions: "npm:^6.0.1" + postcss-normalize-unicode: "npm:^6.0.1" + postcss-normalize-url: "npm:^6.0.1" + postcss-normalize-whitespace: "npm:^6.0.1" + postcss-ordered-values: "npm:^6.0.1" + postcss-reduce-initial: "npm:^6.0.1" + postcss-reduce-transforms: "npm:^6.0.1" + postcss-svgo: "npm:^6.0.1" + postcss-unique-selectors: "npm:^6.0.1" peerDependencies: - postcss: ^8.2.15 - checksum: 401a8d0712cca6577df52cf4aac234ff4a946f0f51c0d09e7c518fff389706cff54d702ff22762e834b23401a89b836aef113e69cc66fa5dfa1f361bdd932495 + postcss: ^8.4.31 + checksum: c6f97674704c3a2a2473440549eac38ac722feebabbd39f2d4d1b8fae7f137f8fd0dfb88929e1ff737d54008de583c39e96f9dc450f2d71f8be6fc3bac2840a3 languageName: node linkType: hard -"cssnano-utils@npm:^4.0.0": - version: 4.0.0 - resolution: "cssnano-utils@npm:4.0.0" +"cssnano-utils@npm:^4.0.1": + version: 4.0.1 + resolution: "cssnano-utils@npm:4.0.1" peerDependencies: - postcss: ^8.2.15 - checksum: ca5cb2be5ec8ea624c28f5f54c00a440557afd3c2b25cb568517db44d230833743f3db30729126efe4d7fc616a42718dd76255bbefcb7d3cc7e3ff5989d907b3 + postcss: ^8.4.31 + checksum: 20513a393402f283c85c450ece43d1a6a06a9906b524481043ac203a86888a4ca5cbef878c615a58fdd82a9e870ce62c6f3fea9f51814034a084d8980e17cf96 languageName: node linkType: hard "cssnano@npm:^6.0.1": - version: 6.0.1 - resolution: "cssnano@npm:6.0.1" + version: 6.0.2 + resolution: "cssnano@npm:6.0.2" dependencies: - cssnano-preset-default: "npm:^6.0.1" - lilconfig: "npm:^2.1.0" + cssnano-preset-default: "npm:^6.0.2" + lilconfig: "npm:^3.0.0" peerDependencies: - postcss: ^8.2.15 - checksum: b73a3a257dd32201ce504cb34b08f1259c8a260b063f58d33e03283149d94ee2ba938d7f9beae1413f0f34e06828759575ade6ae95fa01d199f291e1d4f6d2c2 + postcss: ^8.4.31 + checksum: 5f4146a6c8937d24b0d1d33e3acd85db7913c7558cc80b23169f86c9a552d091a26e0af6adcc535f8355561872f797a917b9353e38fe935bbaf08ec2b66f5ff8 + languageName: node + linkType: hard + +"csso@npm:5.0.5": + version: 5.0.5 + resolution: "csso@npm:5.0.5" + dependencies: + css-tree: "npm:~2.2.0" + checksum: ab4beb1e97dd7e207c10e9925405b45f15a6cd1b4880a8686ad573aa6d476aed28b4121a666cffd26c37a26179f7b54741f7c257543003bfb244d06a62ad569b languageName: node linkType: hard @@ -6350,15 +6331,6 @@ __metadata: languageName: node linkType: hard -"csso@npm:^5.0.5": - version: 5.0.5 - resolution: "csso@npm:5.0.5" - dependencies: - css-tree: "npm:~2.2.0" - checksum: ab4beb1e97dd7e207c10e9925405b45f15a6cd1b4880a8686ad573aa6d476aed28b4121a666cffd26c37a26179f7b54741f7c257543003bfb244d06a62ad569b - languageName: node - linkType: hard - "cssom@npm:^0.5.0": version: 0.5.0 resolution: "cssom@npm:0.5.0" @@ -6463,30 +6435,13 @@ __metadata: languageName: node linkType: hard -"decamelize-keys@npm:^1.1.0": - version: 1.1.1 - resolution: "decamelize-keys@npm:1.1.1" - dependencies: - decamelize: "npm:^1.1.0" - map-obj: "npm:^1.0.0" - checksum: 4ca385933127437658338c65fb9aead5f21b28d3dd3ccd7956eb29aab0953b5d3c047fbc207111672220c71ecf7a4d34f36c92851b7bbde6fca1a02c541bdd7d - languageName: node - linkType: hard - -"decamelize@npm:^1.1.0, decamelize@npm:^1.2.0": +"decamelize@npm:^1.2.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" checksum: 85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 languageName: node linkType: hard -"decamelize@npm:^5.0.0": - version: 5.0.1 - resolution: "decamelize@npm:5.0.1" - checksum: 3da71022bc1e85487810fa0833138effb599fa331ca21e179650e93a765d0c4dabeb1ecdd6ad1474fa0bacd2457953c63ea335afb6e53b35f2b4bf779514e2a3 - languageName: node - linkType: hard - "decimal.js@npm:^10.4.2, decimal.js@npm:^10.4.3": version: 10.4.3 resolution: "decimal.js@npm:10.4.3" @@ -7121,7 +7076,7 @@ __metadata: languageName: node linkType: hard -"env-paths@npm:^2.2.0": +"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": version: 2.2.1 resolution: "env-paths@npm:2.2.1" checksum: 285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 @@ -7422,8 +7377,8 @@ __metadata: linkType: hard "eslint-plugin-import@npm:~2.29.0": - version: 2.29.0 - resolution: "eslint-plugin-import@npm:2.29.0" + version: 2.29.1 + resolution: "eslint-plugin-import@npm:2.29.1" dependencies: array-includes: "npm:^3.1.7" array.prototype.findlastindex: "npm:^1.2.3" @@ -7441,16 +7396,16 @@ __metadata: object.groupby: "npm:^1.0.1" object.values: "npm:^1.1.7" semver: "npm:^6.3.1" - tsconfig-paths: "npm:^3.14.2" + tsconfig-paths: "npm:^3.15.0" peerDependencies: eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 761a4e1fbc2cd318e62350bed4c448f8b11ed83091d6bb7776f096556363a09debd9922b39fd2714c895edc9aaea82e08e684eb632283f880c58a91e4bae6733 + checksum: 5f35dfbf4e8e67f741f396987de9504ad125c49f4144508a93282b4ea0127e052bde65ab6def1f31b6ace6d5d430be698333f75bdd7dca3bc14226c92a083196 languageName: node linkType: hard "eslint-plugin-jsdoc@npm:^46.1.0": - version: 46.9.0 - resolution: "eslint-plugin-jsdoc@npm:46.9.0" + version: 46.9.1 + resolution: "eslint-plugin-jsdoc@npm:46.9.1" dependencies: "@es-joy/jsdoccomment": "npm:~0.41.0" are-docs-informative: "npm:^0.0.2" @@ -7460,10 +7415,10 @@ __metadata: esquery: "npm:^1.5.0" is-builtin-module: "npm:^3.2.1" semver: "npm:^7.5.4" - spdx-expression-parse: "npm:^3.0.1" + spdx-expression-parse: "npm:^4.0.0" peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 4566b0f9bda54b446c813cf5ea93ae6d5866cbc4d448cb957b9ce2563f934d3ed2ed4e665e5a870750860a57137a1714c38599c35c60be16dce0f8e5a75b6ff6 + checksum: d15d68797e85bb7b6fdcfc1170653683c16ab1d62c2e9c537101e774cb3231913e2bc4781f2bb808d074adce5699e5b545e450c6801b637c6434587d226ad6ac languageName: node linkType: hard @@ -7584,13 +7539,13 @@ __metadata: linkType: hard "eslint@npm:^8.41.0": - version: 8.55.0 - resolution: "eslint@npm:8.55.0" + version: 8.56.0 + resolution: "eslint@npm:8.56.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.6.1" "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.55.0" + "@eslint/js": "npm:8.56.0" "@humanwhocodes/config-array": "npm:^0.11.13" "@humanwhocodes/module-importer": "npm:^1.0.1" "@nodelib/fs.walk": "npm:^1.2.8" @@ -7627,7 +7582,7 @@ __metadata: text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: d28c0b60f19bb7d355cb8393e77b018c8f548dba3f820b799c89bb2e0c436ee26084e700c5e57e1e97e7972ec93065277849141b82e7b0c0d02c2dc1e553a2a1 + checksum: 2be598f7da1339d045ad933ffd3d4742bee610515cd2b0d9a2b8b729395a01d4e913552fff555b559fccaefd89d7b37632825789d1b06470608737ae69ab43fb languageName: node linkType: hard @@ -7956,16 +7911,16 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1": - version: 3.3.1 - resolution: "fast-glob@npm:3.3.1" +"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1, fast-glob@npm:^3.3.2": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" dependencies: "@nodelib/fs.stat": "npm:^2.0.2" "@nodelib/fs.walk": "npm:^1.2.3" glob-parent: "npm:^5.1.2" merge2: "npm:^1.3.0" micromatch: "npm:^4.0.4" - checksum: b68431128fb6ce4b804c5f9622628426d990b66c75b21c0d16e3d80e2d1398bf33f7e1724e66a2e3f299285dcf5b8d745b122d0304e7dd66f5231081f33ec67c + checksum: 42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 languageName: node linkType: hard @@ -8026,12 +7981,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^7.0.0": - version: 7.0.1 - resolution: "file-entry-cache@npm:7.0.1" +"file-entry-cache@npm:^7.0.2": + version: 7.0.2 + resolution: "file-entry-cache@npm:7.0.2" dependencies: - flat-cache: "npm:^3.1.1" - checksum: fc0e4f830777e07087f97da9a6734820fdffa2945583355433f40d9819dd97b89f16ac87c07118737a6bc3eb9cf4bd896e7b38b07f0768aefcf44da33e797363 + flat-cache: "npm:^3.2.0" + checksum: 822664e35c3e295e6a8ca7ec490d8d8077017607f41f94b29922f1f49c6dd07025048e3ed528e2909a1439eba66d60f802c0774aa612cf6ee053ee4ecc16c8c5 languageName: node linkType: hard @@ -8165,7 +8120,7 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4, flat-cache@npm:^3.1.1": +"flat-cache@npm:^3.0.4, flat-cache@npm:^3.2.0": version: 3.2.0 resolution: "flat-cache@npm:3.2.0" dependencies: @@ -8697,13 +8652,6 @@ __metadata: languageName: node linkType: hard -"hard-rejection@npm:^2.1.0": - version: 2.1.0 - resolution: "hard-rejection@npm:2.1.0" - checksum: febc3343a1ad575aedcc112580835b44a89a89e01f400b4eda6e8110869edfdab0b00cd1bd4c3bfec9475a57e79e0b355aecd5be46454b6a62b9a359af60e564 - languageName: node - linkType: hard - "has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": version: 1.0.2 resolution: "has-bigints@npm:1.0.2" @@ -8883,15 +8831,6 @@ __metadata: languageName: node linkType: hard -"hosted-git-info@npm:^4.0.1": - version: 4.1.0 - resolution: "hosted-git-info@npm:4.1.0" - dependencies: - lru-cache: "npm:^6.0.0" - checksum: 150fbcb001600336d17fdbae803264abed013548eea7946c2264c49ebe2ebd8c4441ba71dd23dd8e18c65de79d637f98b22d4760ba5fb2e0b15d62543d0fff07 - languageName: node - linkType: hard - "hpack.js@npm:^2.1.6": version: 2.1.6 resolution: "hpack.js@npm:2.1.6" @@ -9145,10 +9084,10 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 7c7cd90edd9fea6e037f9b9da4b01bf0a86b198ce78345f9bbd983929d68ff14830be31111edc5d70c264921f4962404d75b7262b4d9cc3bc12381eccbd03096 +"ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.0": + version: 5.3.0 + resolution: "ignore@npm:5.3.0" + checksum: dc06bea5c23aae65d0725a957a0638b57e235ae4568dda51ca142053ed2c352de7e3bc93a69b2b32ac31966a1952e9a93c5ef2e2ab7c6b06aef9808f6b55b571 languageName: node linkType: hard @@ -9173,7 +9112,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.2.1": +"import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: @@ -9183,13 +9122,6 @@ __metadata: languageName: node linkType: hard -"import-lazy@npm:^4.0.0": - version: 4.0.0 - resolution: "import-lazy@npm:4.0.0" - checksum: a3520313e2c31f25c0b06aa66d167f329832b68a4f957d7c9daf6e0fa41822b6e84948191648b9b9d8ca82f94740cdf15eecf2401a5b42cd1c33fd84f2225cca - languageName: node - linkType: hard - "import-local@npm:^2.0.0": version: 2.0.0 resolution: "import-local@npm:2.0.0" @@ -9242,13 +9174,6 @@ __metadata: languageName: node linkType: hard -"indent-string@npm:^5.0.0": - version: 5.0.0 - resolution: "indent-string@npm:5.0.0" - checksum: 8ee77b57d92e71745e133f6f444d6fa3ed503ad0e1bcd7e80c8da08b42375c07117128d670589725ed07b1978065803fa86318c309ba45415b7fe13e7f170220 - languageName: node - linkType: hard - "infer-owner@npm:^1.0.4": version: 1.0.4 resolution: "infer-owner@npm:1.0.4" @@ -9510,7 +9435,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.5.0, is-core-module@npm:^2.9.0": +"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.9.0": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" dependencies: @@ -9792,13 +9717,6 @@ __metadata: languageName: node linkType: hard -"is-plain-obj@npm:^1.1.0": - version: 1.1.0 - resolution: "is-plain-obj@npm:1.1.0" - checksum: daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c - languageName: node - linkType: hard - "is-plain-object@npm:^2.0.3, is-plain-object@npm:^2.0.4": version: 2.0.4 resolution: "is-plain-object@npm:2.0.4" @@ -10937,20 +10855,13 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:3.0.0": +"lilconfig@npm:3.0.0, lilconfig@npm:^3.0.0": version: 3.0.0 resolution: "lilconfig@npm:3.0.0" checksum: 7f5ee7a658dc016cacf146815e8d88b06f06f4402823b8b0934e305a57a197f55ccc9c5cd4fb5ea1b2b821c8ccaf2d54abd59602a4931af06eabda332388d3e6 languageName: node linkType: hard -"lilconfig@npm:^2.1.0": - version: 2.1.0 - resolution: "lilconfig@npm:2.1.0" - checksum: 64645641aa8d274c99338e130554abd6a0190533c0d9eb2ce7ebfaf2e05c7d9961f3ffe2bfa39efd3b60c521ba3dd24fa236fe2775fc38501bf82bf49d4678b8 - languageName: node - linkType: hard - "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -11292,20 +11203,6 @@ __metadata: languageName: node linkType: hard -"map-obj@npm:^1.0.0": - version: 1.0.1 - resolution: "map-obj@npm:1.0.1" - checksum: ccca88395e7d38671ed9f5652ecf471ecd546924be2fb900836b9da35e068a96687d96a5f93dcdfa94d9a27d649d2f10a84595590f89a347fb4dda47629dcc52 - languageName: node - linkType: hard - -"map-obj@npm:^4.1.0": - version: 4.3.0 - resolution: "map-obj@npm:4.3.0" - checksum: 1c19e1c88513c8abdab25c316367154c6a0a6a0f77e3e8c391bb7c0e093aefed293f539d026dc013d86219e5e4c25f23b0003ea588be2101ccd757bacc12d43b - languageName: node - linkType: hard - "map-visit@npm:^1.0.0": version: 1.0.0 resolution: "map-visit@npm:1.0.0" @@ -11409,23 +11306,10 @@ __metadata: languageName: node linkType: hard -"meow@npm:^10.1.5": - version: 10.1.5 - resolution: "meow@npm:10.1.5" - dependencies: - "@types/minimist": "npm:^1.2.2" - camelcase-keys: "npm:^7.0.0" - decamelize: "npm:^5.0.0" - decamelize-keys: "npm:^1.1.0" - hard-rejection: "npm:^2.1.0" - minimist-options: "npm:4.1.0" - normalize-package-data: "npm:^3.0.2" - read-pkg-up: "npm:^8.0.0" - redent: "npm:^4.0.0" - trim-newlines: "npm:^4.0.2" - type-fest: "npm:^1.2.2" - yargs-parser: "npm:^20.2.9" - checksum: a513849022edd5ddcc41d28c679d31978abe414d9db5bc457e95e537a4327b2910fd2f699cdd883293f9a5da8951a50939bf60fbd62f7fe12b9ddf96a84b1b27 +"meow@npm:^12.1.1": + version: 12.1.1 + resolution: "meow@npm:12.1.1" + checksum: a125ca99a32e2306e2f4cbe651a0d27f6eb67918d43a075f6e80b35e9bf372ebf0fc3a9fbc201cbbc9516444b6265fb3c9f80c5b7ebd32f548aa93eb7c28e088 languageName: node linkType: hard @@ -11548,7 +11432,7 @@ __metadata: languageName: node linkType: hard -"min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": +"min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" checksum: 7e207bd5c20401b292de291f02913230cb1163abca162044f7db1d951fa245b174dc00869d40dd9a9f32a885ad6a5f3e767ee104cf278f399cb4e92d3f582d5c @@ -11609,17 +11493,6 @@ __metadata: languageName: node linkType: hard -"minimist-options@npm:4.1.0": - version: 4.1.0 - resolution: "minimist-options@npm:4.1.0" - dependencies: - arrify: "npm:^1.0.1" - is-plain-obj: "npm:^1.1.0" - kind-of: "npm:^6.0.3" - checksum: 7871f9cdd15d1e7374e5b013e2ceda3d327a06a8c7b38ae16d9ef941e07d985e952c589e57213f7aa90a8744c60aed9524c0d85e501f5478382d9181f2763f54 - languageName: node - linkType: hard - "minimist@npm:^1.2.0, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -11977,18 +11850,6 @@ __metadata: languageName: node linkType: hard -"normalize-package-data@npm:^3.0.2": - version: 3.0.3 - resolution: "normalize-package-data@npm:3.0.3" - dependencies: - hosted-git-info: "npm:^4.0.1" - is-core-module: "npm:^2.5.0" - semver: "npm:^7.3.4" - validate-npm-package-license: "npm:^3.0.1" - checksum: e5d0f739ba2c465d41f77c9d950e291ea4af78f8816ddb91c5da62257c40b76d8c83278b0d08ffbcd0f187636ebddad20e181e924873916d03e6e5ea2ef026be - languageName: node - linkType: hard - "normalize-path@npm:^2.1.1": version: 2.1.1 resolution: "normalize-path@npm:2.1.1" @@ -12833,7 +12694,7 @@ __metadata: languageName: node linkType: hard -"postcss-calc@npm:^9.0.0": +"postcss-calc@npm:^9.0.1": version: 9.0.1 resolution: "postcss-calc@npm:9.0.1" dependencies: @@ -12845,65 +12706,65 @@ __metadata: languageName: node linkType: hard -"postcss-colormin@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-colormin@npm:6.0.0" +"postcss-colormin@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-colormin@npm:6.0.1" dependencies: browserslist: "npm:^4.21.4" caniuse-api: "npm:^3.0.0" colord: "npm:^2.9.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: b05763b68f7f23333f408734f13be4bde641934ecbde25ac7d7fa648ab5e826716bffac0193067b317e861c6dabad81db9c012e865a83f81b6bce5c7e25c0fdd + postcss: ^8.4.31 + checksum: b0056812b3436b05b6b84284a1ebe68a72299f23e7eeb0b7b40a775978d06a1cbe235f3665e3f694f5de76fe7d9b93db607536d07697b31a59fd4e8705e5b64d languageName: node linkType: hard -"postcss-convert-values@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-convert-values@npm:6.0.0" +"postcss-convert-values@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-convert-values@npm:6.0.1" dependencies: browserslist: "npm:^4.21.4" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: 8c20d31a39e0ddf7db4fde0da62e293279b5ee84c36919f2e5760650fa6f2984f1a40bfdbe8d1f7829bd37b17e5e589535f0aaaf71d4df29ad203cef830b9d7a + postcss: ^8.4.31 + checksum: 53b951d7475206969c63b8427a2dea0ccba0a7cb08122e5f05aee8d12b09c870c070b101c9f8eceda76ff4d0fd9e5fa9385e83f143d658bb729dbb6a3583b872 languageName: node linkType: hard -"postcss-discard-comments@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-discard-comments@npm:6.0.0" +"postcss-discard-comments@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-discard-comments@npm:6.0.1" peerDependencies: - postcss: ^8.2.15 - checksum: c8792cd99c7696b21917d55937e02fb854a82ee308edf7564f18ad19bec4abf4756ba234e17f7d129d6b0dbaf6253bcddc435b1aeee190d4d26dcc2448f5453a + postcss: ^8.4.31 + checksum: 5e9128ffb8c005081bb0521f5a23cf090e8513d928ed39935504ffde2e335a62a7e1a749c5c7bc2d03f06a8667900d19dd7eed19dfa4273043b5fd760476260d languageName: node linkType: hard -"postcss-discard-duplicates@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-discard-duplicates@npm:6.0.0" +"postcss-discard-duplicates@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-discard-duplicates@npm:6.0.1" peerDependencies: - postcss: ^8.2.15 - checksum: 5fb0de3b187b09538a8c10f25bcc3e7b0865337a96a0599f8213864f0d52812f6c90142d170258293a30484b95e096dee28fc8fddb302016f93d4a8d269bb18f + postcss: ^8.4.31 + checksum: b9ea10a3c7528bb1630613c11756f809a95da634822d943fa91b28f2a37787e7cdb9ff96deed9776e2c3753d35e42c8afd5074b630930df7b5150573d4beda23 languageName: node linkType: hard -"postcss-discard-empty@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-discard-empty@npm:6.0.0" +"postcss-discard-empty@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-discard-empty@npm:6.0.1" peerDependencies: - postcss: ^8.2.15 - checksum: 5dfe01f93ee2bb85e71f7832498bd051b772b9c724a5630f749237b07a14b47c2b2800b4215ab4cf0d8cba29552725b40334f3ef9d349f7aacf410ad351715dc + postcss: ^8.4.31 + checksum: 6b95e588a3e8fb262e56bd313060daf29d7c9d44184bb6c4c5858ae81d6cd2907b15b3e3023b6621d50a67cfc10e6077920ff1e908892b207dee29477376498f languageName: node linkType: hard -"postcss-discard-overridden@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-discard-overridden@npm:6.0.0" +"postcss-discard-overridden@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-discard-overridden@npm:6.0.1" peerDependencies: - postcss: ^8.2.15 - checksum: 3a0c91241a95a887ef10227c761fb2c48870966bda5530de635002e485abc2743dfbfdc96e3b6a21f10c6231f0cfbe1a0eae0a01a89629d64a711eab3ee008c6 + postcss: ^8.4.31 + checksum: 22f9d56e53b90bc0f8e6d1c24d6da6c7c1a9d757644a128a7a4263a5479aaa8eca4ce3bfe9db10358051635ed40e8778a68c3f1831b7163eae10ced001db4a87 languageName: node linkType: hard @@ -12930,77 +12791,77 @@ __metadata: languageName: node linkType: hard -"postcss-merge-longhand@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-merge-longhand@npm:6.0.0" +"postcss-merge-longhand@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-merge-longhand@npm:6.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" - stylehacks: "npm:^6.0.0" + stylehacks: "npm:^6.0.1" peerDependencies: - postcss: ^8.2.15 - checksum: 0b67c590d301ab7f087ea7421e1eac0cccd2ff1c146a2dfa16d3f32b770d12a5999b8c6ea177efc443f4fb9df13b941c401365c634533878eef1982ad9d0bb98 + postcss: ^8.4.31 + checksum: 2c0eb81b6c6d3d2af3b129c46d10317b7923f218db1cadcb4723091fb951fe4624638002b65f235151129d4ce9b4775a6ed0d5fa13419c0df580f72e15fa4ad3 languageName: node linkType: hard -"postcss-merge-rules@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-merge-rules@npm:6.0.1" +"postcss-merge-rules@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-merge-rules@npm:6.0.2" dependencies: browserslist: "npm:^4.21.4" caniuse-api: "npm:^3.0.0" - cssnano-utils: "npm:^4.0.0" + cssnano-utils: "npm:^4.0.1" postcss-selector-parser: "npm:^6.0.5" peerDependencies: - postcss: ^8.2.15 - checksum: b6a2a196905cd170757aa7b8bc74dab1fc7e2b2ca6a19c6d355fb7c41ff736023b4176c1008a7049f6a1b24a94a30d066c4e51229c1282a941f7fd6056085af7 + postcss: ^8.4.31 + checksum: 138a9921423420116b20e5761a1139392f0bcfcf34264fe11e254917d9c3170e3c0478a1b409e227d22bb0d9820b0168a871a240215d114e9c1e218ee6c132e6 languageName: node linkType: hard -"postcss-minify-font-values@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-minify-font-values@npm:6.0.0" +"postcss-minify-font-values@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-minify-font-values@npm:6.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: 6b74b1ec19bf76dcae7947c42145cb200b38767680512728f76168ae246db453798760e56111bd28ade9011d3655a79da4b33a93e5349f98fb0c1b22cc65ff36 + postcss: ^8.4.31 + checksum: 15af236245a6d27f1c83c943ef90d144ca043894bbd86f134506a984811a936a06824739984824965c7c3fd5a0ff4ed299f26a33f3b628662aa4fb40d7536fd0 languageName: node linkType: hard -"postcss-minify-gradients@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-minify-gradients@npm:6.0.0" +"postcss-minify-gradients@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-minify-gradients@npm:6.0.1" dependencies: colord: "npm:^2.9.1" - cssnano-utils: "npm:^4.0.0" + cssnano-utils: "npm:^4.0.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: 59046acd470bee151291ba99421846d776c4ed243acb05a005e74f64f92b968d712d35e727f5e4a90e632d6d6aeb3a01083469f50bfdf1fb9ecae7f4ae52d9b8 + postcss: ^8.4.31 + checksum: e700c3f6dc425072ff739fb18bb71c970599e0d909b326f4a5c84e91cf24c4f1ee78e4d161bd4cdf6e25b7d78f1ad082bb885afdd2a150f9b281520fc6359d5c languageName: node linkType: hard -"postcss-minify-params@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-minify-params@npm:6.0.0" +"postcss-minify-params@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-minify-params@npm:6.0.1" dependencies: browserslist: "npm:^4.21.4" - cssnano-utils: "npm:^4.0.0" + cssnano-utils: "npm:^4.0.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: d4d1469b7ad7fe53900eb19c156ec6dcfeaf71641d29ba4df31f47d8fa8ac700df5b8d3e3768e66d695d5356ed348cea901314653046c8e48422962f165a1933 + postcss: ^8.4.31 + checksum: 0b34817f032ec9793fad4d33f3ba5551531073a36c9120d77194a3edeee860132951ed6954913494e5a6752ae8da1bc5cdb2a44fa5f428621afae8edddb0ca80 languageName: node linkType: hard -"postcss-minify-selectors@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-minify-selectors@npm:6.0.0" +"postcss-minify-selectors@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-minify-selectors@npm:6.0.1" dependencies: postcss-selector-parser: "npm:^6.0.5" peerDependencies: - postcss: ^8.2.15 - checksum: 1cdd3bd231cf25f54ab370d959f727dfcbe839a1d97bcfd65add9df73747a45d299a009ff16111bbe78943e8f81dcf5f84ae4106847b23dd3652de7aadc0b297 + postcss: ^8.4.31 + checksum: ffc7ebb286beda2b2aa0ed13abafc89b5ffe232a48d57d3f2b9f69e167e354482a6f5279e9118bed753bf6e82d3cfb21228a6b07acd93d0dc9e01bbf0e7ebc75 languageName: node linkType: hard @@ -13048,136 +12909,136 @@ __metadata: languageName: node linkType: hard -"postcss-normalize-charset@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-normalize-charset@npm:6.0.0" +"postcss-normalize-charset@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-normalize-charset@npm:6.0.1" peerDependencies: - postcss: ^8.2.15 - checksum: 5232eac7f62097b1d349546182af2db7db34989867c147517cd407ab23c8450558a7f858eb8dac130959dae2d02d3460c5afa510e0ffe22221cb218f2bd79adb + postcss: ^8.4.31 + checksum: 8c09eedaf8813123875c65ab35120f14a87d6b9e8d6805fa808e3a714a8f868d15123f34f61e2240d89225f2f5c2bdabbcdf6385ce86b2487370d8994a65a857 languageName: node linkType: hard -"postcss-normalize-display-values@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-normalize-display-values@npm:6.0.0" +"postcss-normalize-display-values@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-normalize-display-values@npm:6.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: 58163258a52610fa0d2b61bd6e872b9a2b25da1f2209cbf34fad3b62a4139fff9e0e6b298dcd1adfe6ac556098aad8b79c387280f3a949180f8fb12e6b41fecf + postcss: ^8.4.31 + checksum: d08a92c653fb4f2506e029ceb8e3fdae9bc937fb1a7e80ecde759d02f6d15f69211af384d89d8582b160fd129abd9c77c8c64d75379417098ee5a2ba779e33d3 languageName: node linkType: hard -"postcss-normalize-positions@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-normalize-positions@npm:6.0.0" +"postcss-normalize-positions@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-normalize-positions@npm:6.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: de2ced6cfdf2931d7cbc8f9c96bb12487119dba1b454c7ac01fd19f7afdaa9bf6c63f59624281293379ead5a3d5e883007a3f192f02c40ab41528ccc5a399f5c + postcss: ^8.4.31 + checksum: bb0267b13c92791543f5e9f94b119a0540e08aa46f600acd73a692cd38d07d2d2fddb11148a81adb58e3f65671eebb05ea38d2ded48f3202b2582f1199aa848e languageName: node linkType: hard -"postcss-normalize-repeat-style@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-normalize-repeat-style@npm:6.0.0" +"postcss-normalize-repeat-style@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-normalize-repeat-style@npm:6.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: 1643132094067709ca7d1fa2beededd28565c83bc8a6c2a4dec879a97e1d425ca1293a8832a45732eef12b52960f024330cfb654a8a222fb7ea768a75989c31e + postcss: ^8.4.31 + checksum: f6e943dbbf9341dd6ce2c9fc6820e8ae2a838d1db84f58f75b1e5c1b8b9d6895d17fb30b320e2189b8747f844713ec687540b5b1d52ccd6c9108d6d35328c659 languageName: node linkType: hard -"postcss-normalize-string@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-normalize-string@npm:6.0.0" +"postcss-normalize-string@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-normalize-string@npm:6.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: d586ce274451229c6a3d625edef882b342ab7702babb632845c8c201c7bcc08481f282000d19d17edb7b5ef0b1982e715a16ab60990d124e937c4aef3304151e + postcss: ^8.4.31 + checksum: afcdd69522fc3ebafc349c2ef4b62f1e734ade9b6148fd20f2b841477808ac6cf6e5bfbb533c492fdc6bb2184b84be8ebb800a6ae174c4313f87fb0695088cc0 languageName: node linkType: hard -"postcss-normalize-timing-functions@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-normalize-timing-functions@npm:6.0.0" +"postcss-normalize-timing-functions@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-normalize-timing-functions@npm:6.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: a70742648cec15eea031096f2ad99c21c79228ce4c4ccc9f63c277c07e9e3add96298cc67b0b1797896507248153e0a662f85f490f53147ded7008b459dd5ba3 + postcss: ^8.4.31 + checksum: c1c81d0dcb2f74fbd69cc45b0b6bd6cde390a0c9df602aabbf3eb2149a49da48e808837e811d22a525ffb036e158e63b4b2cf12c94cf28f2c2f6af858876134e languageName: node linkType: hard -"postcss-normalize-unicode@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-normalize-unicode@npm:6.0.0" +"postcss-normalize-unicode@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-normalize-unicode@npm:6.0.1" dependencies: browserslist: "npm:^4.21.4" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: cd9b06ed09c29ccc0b2cb222044d7ec49fb710fdd6f0878b26d7f3324478d8271a555ba3d82fc8d9fdcf8671a83c499cdfa09c0e73d4dee928adff4042ed8b22 + postcss: ^8.4.31 + checksum: 8057748dade94dc2dd63a3b75a85e394c2e9a7076053886ff08aa9b7729d383f204eda52d882e5361ae1ec493036e90b2e18dcc5f8c9b3a8f1cbfada12bcc05b languageName: node linkType: hard -"postcss-normalize-url@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-normalize-url@npm:6.0.0" +"postcss-normalize-url@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-normalize-url@npm:6.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: 719a7feee4adf638cc0b4bc204d89485388ca81f0ad0a181a225122f488f956abd29f429d69e5a57fffe93fbd2a22eab7737bd8b55b19979efba26e008b2ec11 + postcss: ^8.4.31 + checksum: 4e3e713a95e01f263feccd041b2b10016a0a09e494c81567f012d1326d9b2d57dc4a68956a820313630370c0ef591bdbb37cc96ed259022559623be179aad436 languageName: node linkType: hard -"postcss-normalize-whitespace@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-normalize-whitespace@npm:6.0.0" +"postcss-normalize-whitespace@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-normalize-whitespace@npm:6.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: 8421dd5813c1e555d7c2847dd8b71a5138ee2091341ebd1ea686d5b00cd46d249a29027e142289f873ca7f5fc995b51eb68f9693fec6d61cf951c759d109c37d + postcss: ^8.4.31 + checksum: 259c0b7653f033ed14303602a30e458c37dc63ee55f47226b6379a6ea553ca7c9b971d49715b8f3f36a3a06927f6f87d7997c027ad4664af3bca37a5fe30352e languageName: node linkType: hard -"postcss-ordered-values@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-ordered-values@npm:6.0.0" +"postcss-ordered-values@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-ordered-values@npm:6.0.1" dependencies: - cssnano-utils: "npm:^4.0.0" + cssnano-utils: "npm:^4.0.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: b01352b0ea014e0037a5b8b3bd866696924bfb2cf3b47b73547786a1954e6771c04790fbe4c651bf029bafdbfde70f49e611f9ef309e945f753425841f343017 + postcss: ^8.4.31 + checksum: 2e71f035c90b26d7a8d31e1b716f977532367f75bc76de3318b6ba7b2e1ec43c011cc09e741f59f7d93dff427b7d90a35db0b460d2f171a6f0c6e8c938ef30ad languageName: node linkType: hard -"postcss-reduce-initial@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-reduce-initial@npm:6.0.0" +"postcss-reduce-initial@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-reduce-initial@npm:6.0.1" dependencies: browserslist: "npm:^4.21.4" caniuse-api: "npm:^3.0.0" peerDependencies: - postcss: ^8.2.15 - checksum: 7cf6340bde9f70c7d9b20bc3ee53e883bf27ed56fcc3bb2a2c736b311d977098a7c3a6b9e4be4d2c159d0042bf7742bb5af59628cd89cf838968dacc5ae15c80 + postcss: ^8.4.31 + checksum: 3f8f6c26ceeb79ddc285b0e01183fe30e911dd26b3abcdca56568e2bef3747f2b7f22ee3f9117e9752e1e93c10bcd88bd6a2842ca525b54336726292ebd3c3ad languageName: node linkType: hard -"postcss-reduce-transforms@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-reduce-transforms@npm:6.0.0" +"postcss-reduce-transforms@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-reduce-transforms@npm:6.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.2.15 - checksum: 6da900d22dd8760b8a2ace32013036e3c4c4d9d560c31255eceea54563e3ddb2ca830bc9072fe2a1abacb8c48a008656887fc2f6ba1873e590342ad8e6bc269d + postcss: ^8.4.31 + checksum: de7631302311071d86622166539162e69df506785e3674afab0602c86ed9aa67799e44405b40327f0011d58089d2dc4e2ae481b21812177818e28f9272d350a5 languageName: node linkType: hard @@ -13188,12 +13049,12 @@ __metadata: languageName: node linkType: hard -"postcss-safe-parser@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-safe-parser@npm:6.0.0" +"postcss-safe-parser@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-safe-parser@npm:7.0.0" peerDependencies: - postcss: ^8.3.3 - checksum: 5b0997b63de6ab4afb4b718a52dd7902e465c21d1f2e516762bcb59047787459b4dc5713132f6a19c9c8c483043b20b8a380a55fb61152ee66cbffcddf3b57f0 + postcss: ^8.4.31 + checksum: 4217afd8ce2809e959dc365e4675f499303cc6b91f94db06c8164422822db2d3b3124df701ee2234db4127ad05619b016bfb9c2bccae9bf9cf898a396f1632c9 languageName: node linkType: hard @@ -13216,26 +13077,26 @@ __metadata: languageName: node linkType: hard -"postcss-svgo@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-svgo@npm:6.0.0" +"postcss-svgo@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-svgo@npm:6.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" - svgo: "npm:^3.0.2" + svgo: "npm:^3.0.5" peerDependencies: - postcss: ^8.2.15 - checksum: ec567cd5e982e3c0393695628bc508b87dcfe4e4b2049930e79e6c629c349fad19403f0d39d76ceda3e0f15ffd065304e76152f397fae2f3f848cdb847a0b564 + postcss: ^8.4.31 + checksum: 021da9b0d0696fce970f407891a0d6c05e51d1908af435026e0cd5936a75cd8502a7d504cd0e6a33b6f3369fee41f01b848e5bd919aecc3e804ce6308e91a6cc languageName: node linkType: hard -"postcss-unique-selectors@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-unique-selectors@npm:6.0.0" +"postcss-unique-selectors@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-unique-selectors@npm:6.0.1" dependencies: postcss-selector-parser: "npm:^6.0.5" peerDependencies: - postcss: ^8.2.15 - checksum: 63e81a7965ff8874fdf39ef0ae0f12cc21352548733538f52eda73f0ed5a7fab7fda9090facf50395d07873c5a6f02d31a6171fd476c80858b03090ec4c61d31 + postcss: ^8.4.31 + checksum: 637e35775d0ee8fbcf4a81b28d3832c5076de7c0232eb7769d4fbbf783f26793e2ec95e18461ae3b9f5f5cd63c3de9db102464487ba2488d4947aad24dc8841f languageName: node linkType: hard @@ -13246,7 +13107,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.28": +"postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.32": version: 8.4.32 resolution: "postcss@npm:8.4.32" dependencies: @@ -13400,12 +13261,12 @@ __metadata: linkType: hard "prom-client@npm:^15.0.0": - version: 15.0.0 - resolution: "prom-client@npm:15.0.0" + version: 15.1.0 + resolution: "prom-client@npm:15.1.0" dependencies: "@opentelemetry/api": "npm:^1.4.0" tdigest: "npm:^0.1.1" - checksum: 4d69d4a6e086a80f1e7b5716c53d6be49d99dba8451f2a8117708f581f69648f47df68060cbea1c18e24fc1efe675868f85c5da89d0ef8d6f962a52b5f50c356 + checksum: c10781adbf49225298e44da5396a51a0bd4d0cddc3c7e237ba50e888e12ead26a8f98261f362a442f1bbcdaddd6e7302d5675b37beac67ea9b6f82e4d39fb3cc languageName: node linkType: hard @@ -13569,13 +13430,6 @@ __metadata: languageName: node linkType: hard -"quick-lru@npm:^5.1.1": - version: 5.1.1 - resolution: "quick-lru@npm:5.1.1" - checksum: a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da - languageName: node - linkType: hard - "raf-schd@npm:^4.0.3": version: 4.0.3 resolution: "raf-schd@npm:4.0.3" @@ -14062,29 +13916,6 @@ __metadata: languageName: node linkType: hard -"read-pkg-up@npm:^8.0.0": - version: 8.0.0 - resolution: "read-pkg-up@npm:8.0.0" - dependencies: - find-up: "npm:^5.0.0" - read-pkg: "npm:^6.0.0" - type-fest: "npm:^1.0.1" - checksum: cf3905ccbe5cd602f23192cc7ca65ed17561bab117eadb9aed817441d5bfc6b9a11215c2a3e9505f501d046818f3c4180dbea61fa83c42083e0b4e407d5cc745 - languageName: node - linkType: hard - -"read-pkg@npm:^6.0.0": - version: 6.0.0 - resolution: "read-pkg@npm:6.0.0" - dependencies: - "@types/normalize-package-data": "npm:^2.4.0" - normalize-package-data: "npm:^3.0.2" - parse-json: "npm:^5.2.0" - type-fest: "npm:^1.0.1" - checksum: b51ee5eed75324f4fac34c9a40b5e4b403de4c532242be01959c9bbdb1ff9db1c6c2aefaba569622fec49d1ead866e97ba856ab145f6e11039b11f7bec1318ba - languageName: node - linkType: hard - "readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.6": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" @@ -14153,16 +13984,6 @@ __metadata: languageName: node linkType: hard -"redent@npm:^4.0.0": - version: 4.0.0 - resolution: "redent@npm:4.0.0" - dependencies: - indent-string: "npm:^5.0.0" - strip-indent: "npm:^4.0.0" - checksum: a9b640c8f4b2b5b26a1a908706475ff404dd50a97d6f094bc3c59717be922622927cc7d601d4ae2857d897ad243fd979bd76d751a0481cee8be7024e5fb4c662 - languageName: node - linkType: hard - "redis-errors@npm:^1.0.0, redis-errors@npm:^1.2.0": version: 1.2.0 resolution: "redis-errors@npm:1.2.0" @@ -14251,9 +14072,9 @@ __metadata: linkType: hard "regenerator-runtime@npm:^0.14.0": - version: 0.14.0 - resolution: "regenerator-runtime@npm:0.14.0" - checksum: e25f062c1a183f81c99681691a342760e65c55e8d3a4d4fe347ebe72433b123754b942b70b622959894e11f8a9131dc549bd3c9a5234677db06a4af42add8d12 + version: 0.14.1 + resolution: "regenerator-runtime@npm:0.14.1" + checksum: 1b16eb2c4bceb1665c89de70dcb64126a22bc8eb958feef3cd68fe11ac6d2a4899b5cd1b80b0774c7c03591dc57d16631a7f69d2daa2ec98100e2f29f7ec4cc4 languageName: node linkType: hard @@ -14699,8 +14520,8 @@ __metadata: linkType: hard "sass-loader@npm:^10.2.0": - version: 10.5.0 - resolution: "sass-loader@npm:10.5.0" + version: 10.5.1 + resolution: "sass-loader@npm:10.5.1" dependencies: klona: "npm:^2.0.4" loader-utils: "npm:^2.0.0" @@ -14719,7 +14540,7 @@ __metadata: optional: true sass: optional: true - checksum: be5da7784fd21c4f526cc3afaa1a765ba44cdc2f9798ecbac87b296ab44184ac5ba9bbda68a7a86f8cdcb6130acceefeb8912260fca14bdfc97f9dad02658400 + checksum: 841448d02045b0c65595eab4cb701384b01a2adcb3594beacbb767b0cee5bd9d444027f4fc3a10acef3fe1c7eb6510fccffdee72a20e9877777789a5e349cb49 languageName: node linkType: hard @@ -15305,16 +15126,6 @@ __metadata: languageName: node linkType: hard -"spdx-correct@npm:^3.0.0": - version: 3.2.0 - resolution: "spdx-correct@npm:3.2.0" - dependencies: - spdx-expression-parse: "npm:^3.0.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 - languageName: node - linkType: hard - "spdx-exceptions@npm:^2.1.0": version: 2.3.0 resolution: "spdx-exceptions@npm:2.3.0" @@ -15322,13 +15133,13 @@ __metadata: languageName: node linkType: hard -"spdx-expression-parse@npm:^3.0.0, spdx-expression-parse@npm:^3.0.1": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" +"spdx-expression-parse@npm:^4.0.0": + version: 4.0.0 + resolution: "spdx-expression-parse@npm:4.0.0" dependencies: spdx-exceptions: "npm:^2.1.0" spdx-license-ids: "npm:^3.0.0" - checksum: 6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 + checksum: 965c487e77f4fb173f1c471f3eef4eb44b9f0321adc7f93d95e7620da31faa67d29356eb02523cd7df8a7fc1ec8238773cdbf9e45bd050329d2b26492771b736 languageName: node linkType: hard @@ -15758,15 +15569,6 @@ __metadata: languageName: node linkType: hard -"strip-indent@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-indent@npm:4.0.0" - dependencies: - min-indent: "npm:^1.0.1" - checksum: 6b1fb4e22056867f5c9e7a6f3f45922d9a2436cac758607d58aeaac0d3b16ec40b1c43317de7900f1b8dd7a4107352fa47fb960f2c23566538c51e8585c8870e - languageName: node - linkType: hard - "strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -15774,22 +15576,15 @@ __metadata: languageName: node linkType: hard -"style-search@npm:^0.1.0": - version: 0.1.0 - resolution: "style-search@npm:0.1.0" - checksum: 9e5cb735e5dc4fc2f8c61bebdf211d5352f1cf01511a64da12bb726a01e8c6948c50d357eb8fd7893d44b4e3189655bdddcf8ab338f9d508fe89a8942c650b14 - languageName: node - linkType: hard - -"stylehacks@npm:^6.0.0": - version: 6.0.0 - resolution: "stylehacks@npm:6.0.0" +"stylehacks@npm:^6.0.1": + version: 6.0.1 + resolution: "stylehacks@npm:6.0.1" dependencies: browserslist: "npm:^4.21.4" postcss-selector-parser: "npm:^6.0.4" peerDependencies: - postcss: ^8.2.15 - checksum: 6ce277c816dd826fdc765258d612a160bad03dae52ab51ef1676efae07e96923ebeb6880d6522eefc50d2e81cb90b632615120c73aed190f345e8d836def67b6 + postcss: ^8.4.31 + checksum: 0877016f5b2a06b8ceaf39382b0c33da11ea93268209444f67f29b1ce465994058f305fc3bc90dda21e8664c959561fbb06ba12b82289c3b26ba832c6979d513 languageName: node linkType: hard @@ -15861,53 +15656,51 @@ __metadata: languageName: node linkType: hard -"stylelint@npm:^15.10.1": - version: 15.11.0 - resolution: "stylelint@npm:15.11.0" +"stylelint@npm:^16.0.2": + version: 16.0.2 + resolution: "stylelint@npm:16.0.2" dependencies: - "@csstools/css-parser-algorithms": "npm:^2.3.1" - "@csstools/css-tokenizer": "npm:^2.2.0" - "@csstools/media-query-list-parser": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^2.3.2" + "@csstools/css-tokenizer": "npm:^2.2.1" + "@csstools/media-query-list-parser": "npm:^2.1.5" "@csstools/selector-specificity": "npm:^3.0.0" balanced-match: "npm:^2.0.0" colord: "npm:^2.9.3" - cosmiconfig: "npm:^8.2.0" + cosmiconfig: "npm:^9.0.0" css-functions-list: "npm:^3.2.1" css-tree: "npm:^2.3.1" debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.1" + fast-glob: "npm:^3.3.2" fastest-levenshtein: "npm:^1.0.16" - file-entry-cache: "npm:^7.0.0" + file-entry-cache: "npm:^7.0.2" global-modules: "npm:^2.0.0" globby: "npm:^11.1.0" globjoin: "npm:^0.1.4" html-tags: "npm:^3.3.1" - ignore: "npm:^5.2.4" - import-lazy: "npm:^4.0.0" + ignore: "npm:^5.3.0" imurmurhash: "npm:^0.1.4" is-plain-object: "npm:^5.0.0" known-css-properties: "npm:^0.29.0" mathml-tag-names: "npm:^2.1.3" - meow: "npm:^10.1.5" + meow: "npm:^12.1.1" micromatch: "npm:^4.0.5" normalize-path: "npm:^3.0.0" picocolors: "npm:^1.0.0" - postcss: "npm:^8.4.28" + postcss: "npm:^8.4.32" postcss-resolve-nested-selector: "npm:^0.1.1" - postcss-safe-parser: "npm:^6.0.0" + postcss-safe-parser: "npm:^7.0.0" postcss-selector-parser: "npm:^6.0.13" postcss-value-parser: "npm:^4.2.0" resolve-from: "npm:^5.0.0" string-width: "npm:^4.2.3" - strip-ansi: "npm:^6.0.1" - style-search: "npm:^0.1.0" + strip-ansi: "npm:^7.1.0" supports-hyperlinks: "npm:^3.0.0" svg-tags: "npm:^1.0.0" table: "npm:^6.8.1" write-file-atomic: "npm:^5.0.1" bin: stylelint: bin/stylelint.mjs - checksum: 2d88b7293e308b7e418c14ba4130777b1a28b214304957f03b41a6dc8e00005266caf47479f718a6ec5e572cb52e903ca34aabf3febbe3a3ae32fff6b018d9fd + checksum: 5ec755e209beb1877ff40d50f18c1ebb05bf251925da1f98f28fb3911e4031195eb86adaf641ac5cdb01ba973f4c999bc0c6b0270d08c1d5c070adbdd9e734cf languageName: node linkType: hard @@ -16015,19 +15808,20 @@ __metadata: languageName: node linkType: hard -"svgo@npm:^3.0.2": - version: 3.0.2 - resolution: "svgo@npm:3.0.2" +"svgo@npm:^3.0.5": + version: 3.1.0 + resolution: "svgo@npm:3.1.0" dependencies: "@trysound/sax": "npm:0.2.0" commander: "npm:^7.2.0" css-select: "npm:^5.1.0" css-tree: "npm:^2.2.1" - csso: "npm:^5.0.5" + css-what: "npm:^6.1.0" + csso: "npm:5.0.5" picocolors: "npm:^1.0.0" bin: - svgo: bin/svgo - checksum: d682d416dd68cdcbab5e1e77b93d621325480e97dfe87777e845ea9a0ce05d03fc837ce17080af67e787f6b24430b805ff79f4591dda30a0ab4060b6a3ac2adf + svgo: ./bin/svgo + checksum: b3f00b3319dee6ddc53f8b8ac5acef581860e1708c98b492169e096621edc1bdf46e3778099e3dffb5116bf0d4c074a686099843dbc020c73b3ccfae7b6a88f0 languageName: node linkType: hard @@ -16361,13 +16155,6 @@ __metadata: languageName: node linkType: hard -"trim-newlines@npm:^4.0.2": - version: 4.1.1 - resolution: "trim-newlines@npm:4.1.1" - checksum: 70e60e652305efd0dda1f2bce1a5edc9bb5834a2e00d05dfde178715ec48faa8264a2bc1a7efc593b7936d03f6d42c398616329eef44b7bd5070180a02056981 - languageName: node - linkType: hard - "ts-api-utils@npm:^1.0.1": version: 1.0.3 resolution: "ts-api-utils@npm:1.0.3" @@ -16377,15 +16164,15 @@ __metadata: languageName: node linkType: hard -"tsconfig-paths@npm:^3.14.2": - version: 3.14.2 - resolution: "tsconfig-paths@npm:3.14.2" +"tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" dependencies: "@types/json5": "npm:^0.0.29" json5: "npm:^1.0.2" minimist: "npm:^1.2.6" strip-bom: "npm:^3.0.0" - checksum: fdc92bb7b18b31c0e76f8ec4f98d07236b09590fd6578e587ad024792c8b2235d65125a8fd007fa47a84400f84ceccbf33f24e5198d953249e7204f4cef3517c + checksum: 5b4f301a2b7a3766a986baf8fc0e177eb80bdba6e396792ff92dc23b5bca8bb279fc96517dcaaef63a3b49bebc6c4c833653ec58155780bc906bdbcf7dda0ef5 languageName: node linkType: hard @@ -16459,13 +16246,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^1.0.1, type-fest@npm:^1.2.1, type-fest@npm:^1.2.2": - version: 1.4.0 - resolution: "type-fest@npm:1.4.0" - checksum: a3c0f4ee28ff6ddf800d769eafafcdeab32efa38763c1a1b8daeae681920f6e345d7920bf277245235561d8117dab765cb5f829c76b713b4c9de0998a5397141 - languageName: node - linkType: hard - "type-fest@npm:^3.0.0": version: 3.13.1 resolution: "type-fest@npm:3.13.1" @@ -16941,16 +16721,6 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: "npm:^3.0.0" - spdx-expression-parse: "npm:^3.0.0" - checksum: 7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f - languageName: node - linkType: hard - "value-equal@npm:^1.0.1": version: 1.0.1 resolution: "value-equal@npm:1.0.1" @@ -17877,7 +17647,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.1, yargs-parser@npm:^20.2.9": +"yargs-parser@npm:^20.2.1": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" checksum: 0685a8e58bbfb57fab6aefe03c6da904a59769bd803a722bb098bd5b0f29d274a1357762c7258fb487512811b8063fb5d2824a3415a0a4540598335b3b086c72