Merge remote-tracking branch 'parent/main' into upstream-20240117

This commit is contained in:
KMY 2025-01-17 16:29:11 +09:00
commit 5d79bd078c
150 changed files with 2982 additions and 1485 deletions

View file

@ -1,10 +1,6 @@
[production]
defaults defaults
> 0.2% > 0.2%
firefox >= 78 firefox >= 78
ios >= 15.6 ios >= 15.6
not dead not dead
not OperaMini all not OperaMini all
[development]
supports es6-module

View file

@ -46,4 +46,4 @@ jobs:
- name: Run haml-lint - name: Run haml-lint
run: | run: |
echo "::add-matcher::.github/workflows/haml-lint-problem-matcher.json" echo "::add-matcher::.github/workflows/haml-lint-problem-matcher.json"
bin/haml-lint --reporter github bin/haml-lint --parallel --reporter github

View file

@ -58,3 +58,6 @@ Style/TrailingCommaInArrayLiteral:
Style/TrailingCommaInHashLiteral: Style/TrailingCommaInHashLiteral:
EnforcedStyleForMultiline: comma EnforcedStyleForMultiline: comma
Style/WordArray:
MinSize: 3 # Override default of 2

View file

@ -1,6 +1,6 @@
# This configuration was generated by # This configuration was generated by
# `rubocop --auto-gen-config --auto-gen-only-exclude --no-offense-counts --no-auto-gen-timestamp` # `rubocop --auto-gen-config --auto-gen-only-exclude --no-offense-counts --no-auto-gen-timestamp`
# using RuboCop version 1.69.1. # using RuboCop version 1.70.0.
# The point is for the user to remove these configuration records # The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base. # one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new # Note that changes in the inspected code, or installation of new
@ -8,7 +8,7 @@
Lint/NonLocalExitFromIterator: Lint/NonLocalExitFromIterator:
Exclude: Exclude:
- 'app/helpers/jsonld_helper.rb' - 'app/helpers/json_ld_helper.rb'
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes. # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
Metrics/AbcSize: Metrics/AbcSize:
@ -73,20 +73,11 @@ Style/MapToHash:
Exclude: Exclude:
- 'app/models/status.rb' - 'app/models/status.rb'
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: literals, strict
Style/MutableConstant:
Exclude:
- 'app/models/tag.rb'
- 'app/services/delete_account_service.rb'
- 'lib/mastodon/migration_warning.rb'
# Configuration parameters: AllowedMethods. # Configuration parameters: AllowedMethods.
# AllowedMethods: respond_to_missing? # AllowedMethods: respond_to_missing?
Style/OptionalBooleanParameter: Style/OptionalBooleanParameter:
Exclude: Exclude:
- 'app/helpers/jsonld_helper.rb' - 'app/helpers/json_ld_helper.rb'
- 'app/lib/admin/system_check/message.rb' - 'app/lib/admin/system_check/message.rb'
- 'app/lib/request.rb' - 'app/lib/request.rb'
- 'app/lib/webfinger.rb' - 'app/lib/webfinger.rb'
@ -107,10 +98,3 @@ Style/RedundantConstantBase:
Exclude: Exclude:
- 'config/environments/production.rb' - 'config/environments/production.rb'
- 'config/initializers/sidekiq.rb' - 'config/initializers/sidekiq.rb'
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: WordRegex.
# SupportedStyles: percent, brackets
Style/WordArray:
EnforcedStyle: percent
MinSize: 3

View file

@ -2,6 +2,24 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [4.3.3] - 2025-01-16
### Security
- Fix insufficient validation of account URIs ([GHSA-5wxh-3p65-r4g6](https://github.com/mastodon/mastodon/security/advisories/GHSA-5wxh-3p65-r4g6))
- Update dependencies
### Fixed
- Fix `libyaml` missing from `Dockerfile` build stage (#33591 by @vmstan)
- Fix incorrect notification settings migration for non-followers (#33348 by @ClearlyClaire)
- Fix down clause for notification policy v2 migrations (#33340 by @jesseplusplus)
- Fix error decrementing status count when `FeaturedTags#last_status_at` is `nil` (#33320 by @ClearlyClaire)
- Fix last paginated notification group only including data on a single notification (#33271 by @ClearlyClaire)
- Fix processing of mentions for post edits with an existing corresponding silent mention (#33227 by @ClearlyClaire)
- Fix deletion of unconfirmed users with Webauthn set (#33186 by @ClearlyClaire)
- Fix empty authors preview card serialization (#33151, #33466 by @mjankowski and @ClearlyClaire)
## [4.3.2] - 2024-12-03 ## [4.3.2] - 2024-12-03
### Added ### Added

View file

@ -153,6 +153,7 @@ RUN \
libpq-dev \ libpq-dev \
libssl-dev \ libssl-dev \
libtool \ libtool \
libyaml-dev \
meson \ meson \
nasm \ nasm \
pkg-config \ pkg-config \

30
Gemfile
View file

@ -94,7 +94,7 @@ gem 'twitter-text', '~> 3.1.0'
gem 'tzinfo-data', '~> 1.2023' gem 'tzinfo-data', '~> 1.2023'
gem 'webauthn', '~> 3.0' gem 'webauthn', '~> 3.0'
gem 'webpacker', '~> 5.4' gem 'webpacker', '~> 5.4'
gem 'webpush', github: 'ClearlyClaire/webpush', ref: 'f14a4d52e201128b1b00245d11b6de80d6cfdcd9' gem 'webpush', github: 'mastodon/webpush', ref: '9631ac63045cfabddacc69fc06e919b4c13eb913'
gem 'json-ld' gem 'json-ld'
gem 'json-ld-preloaded', '~> 3.2' gem 'json-ld-preloaded', '~> 3.2'
@ -104,19 +104,19 @@ gem 'opentelemetry-api', '~> 1.4.0'
group :opentelemetry do group :opentelemetry do
gem 'opentelemetry-exporter-otlp', '~> 0.29.0', require: false gem 'opentelemetry-exporter-otlp', '~> 0.29.0', require: false
gem 'opentelemetry-instrumentation-active_job', '~> 0.7.1', require: false gem 'opentelemetry-instrumentation-active_job', '~> 0.8.0', require: false
gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.21.0', require: false gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.22.0', require: false
gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.21.2', require: false gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.22.0', require: false
gem 'opentelemetry-instrumentation-excon', '~> 0.22.0', require: false gem 'opentelemetry-instrumentation-excon', '~> 0.23.0', require: false
gem 'opentelemetry-instrumentation-faraday', '~> 0.25.0', require: false gem 'opentelemetry-instrumentation-faraday', '~> 0.26.0', require: false
gem 'opentelemetry-instrumentation-http', '~> 0.23.2', require: false gem 'opentelemetry-instrumentation-http', '~> 0.24.0', require: false
gem 'opentelemetry-instrumentation-http_client', '~> 0.22.3', require: false gem 'opentelemetry-instrumentation-http_client', '~> 0.23.0', require: false
gem 'opentelemetry-instrumentation-net_http', '~> 0.22.4', require: false gem 'opentelemetry-instrumentation-net_http', '~> 0.23.0', require: false
gem 'opentelemetry-instrumentation-pg', '~> 0.29.0', require: false gem 'opentelemetry-instrumentation-pg', '~> 0.30.0', require: false
gem 'opentelemetry-instrumentation-rack', '~> 0.25.0', require: false gem 'opentelemetry-instrumentation-rack', '~> 0.26.0', require: false
gem 'opentelemetry-instrumentation-rails', '~> 0.34.0', require: false gem 'opentelemetry-instrumentation-rails', '~> 0.35.0', require: false
gem 'opentelemetry-instrumentation-redis', '~> 0.25.3', require: false gem 'opentelemetry-instrumentation-redis', '~> 0.26.0', require: false
gem 'opentelemetry-instrumentation-sidekiq', '~> 0.25.2', require: false gem 'opentelemetry-instrumentation-sidekiq', '~> 0.26.0', require: false
gem 'opentelemetry-sdk', '~> 1.4', require: false gem 'opentelemetry-sdk', '~> 1.4', require: false
end end
@ -125,7 +125,7 @@ group :test do
gem 'flatware-rspec' gem 'flatware-rspec'
# Adds RSpec Error/Warning annotations to GitHub PRs on the Files tab # Adds RSpec Error/Warning annotations to GitHub PRs on the Files tab
gem 'rspec-github', '~> 2.4', require: false gem 'rspec-github', '~> 3.0', require: false
# RSpec helpers for email specs # RSpec helpers for email specs
gem 'email_spec' gem 'email_spec'

View file

@ -1,9 +1,9 @@
GIT GIT
remote: https://github.com/ClearlyClaire/webpush.git remote: https://github.com/mastodon/webpush.git
revision: f14a4d52e201128b1b00245d11b6de80d6cfdcd9 revision: 9631ac63045cfabddacc69fc06e919b4c13eb913
ref: f14a4d52e201128b1b00245d11b6de80d6cfdcd9 ref: 9631ac63045cfabddacc69fc06e919b4c13eb913
specs: specs:
webpush (0.3.8) webpush (1.1.0)
hkdf (~> 0.2) hkdf (~> 0.2)
jwt (~> 2.0) jwt (~> 2.0)
@ -94,20 +94,20 @@ GEM
ast (2.4.2) ast (2.4.2)
attr_required (1.0.2) attr_required (1.0.2)
aws-eventstream (1.3.0) aws-eventstream (1.3.0)
aws-partitions (1.1032.0) aws-partitions (1.1038.0)
aws-sdk-core (3.214.1) aws-sdk-core (3.216.0)
aws-eventstream (~> 1, >= 1.3.0) aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0) aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9) aws-sigv4 (~> 1.9)
jmespath (~> 1, >= 1.6.1) jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.96.0) aws-sdk-kms (1.97.0)
aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-core (~> 3, >= 3.216.0)
aws-sigv4 (~> 1.5) aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.177.0) aws-sdk-s3 (1.178.0)
aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-core (~> 3, >= 3.216.0)
aws-sdk-kms (~> 1) aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5) aws-sigv4 (~> 1.5)
aws-sigv4 (1.10.1) aws-sigv4 (1.11.0)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
azure-blob (0.5.4) azure-blob (0.5.4)
rexml rexml
@ -159,7 +159,7 @@ GEM
climate_control (1.2.0) climate_control (1.2.0)
cocoon (1.2.15) cocoon (1.2.15)
color_diff (0.1) color_diff (0.1)
concurrent-ruby (1.3.4) concurrent-ruby (1.3.5)
connection_pool (2.5.0) connection_pool (2.5.0)
cose (1.3.1) cose (1.3.1)
cbor (~> 0.5.9) cbor (~> 0.5.9)
@ -473,77 +473,78 @@ GEM
opentelemetry-common (~> 0.20) opentelemetry-common (~> 0.20)
opentelemetry-sdk (~> 1.2) opentelemetry-sdk (~> 1.2)
opentelemetry-semantic_conventions opentelemetry-semantic_conventions
opentelemetry-helpers-sql-obfuscation (0.2.1) opentelemetry-helpers-sql-obfuscation (0.3.0)
opentelemetry-common (~> 0.21) opentelemetry-common (~> 0.21)
opentelemetry-instrumentation-action_mailer (0.3.0) opentelemetry-instrumentation-action_mailer (0.4.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-active_support (~> 0.7) opentelemetry-instrumentation-active_support (~> 0.7)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-action_pack (0.10.0) opentelemetry-instrumentation-action_pack (0.11.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-rack (~> 0.21) opentelemetry-instrumentation-rack (~> 0.21)
opentelemetry-instrumentation-action_view (0.8.0) opentelemetry-instrumentation-action_view (0.9.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-active_support (~> 0.7) opentelemetry-instrumentation-active_support (~> 0.7)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-active_job (0.7.8) opentelemetry-instrumentation-active_job (0.8.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-active_model_serializers (0.21.1) opentelemetry-instrumentation-active_model_serializers (0.22.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-active_support (>= 0.7.0) opentelemetry-instrumentation-active_support (>= 0.7.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-active_record (0.8.1) opentelemetry-instrumentation-active_record (0.9.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-active_support (0.7.0) opentelemetry-instrumentation-active_support (0.8.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-base (0.22.6) opentelemetry-instrumentation-base (0.23.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-common (~> 0.21) opentelemetry-common (~> 0.21)
opentelemetry-registry (~> 0.1) opentelemetry-registry (~> 0.1)
opentelemetry-instrumentation-concurrent_ruby (0.21.4) opentelemetry-instrumentation-concurrent_ruby (0.22.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-excon (0.22.5) opentelemetry-instrumentation-excon (0.23.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-faraday (0.25.0) opentelemetry-instrumentation-faraday (0.26.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-http (0.23.5) opentelemetry-instrumentation-http (0.24.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-http_client (0.22.8) opentelemetry-instrumentation-http_client (0.23.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-net_http (0.22.8) opentelemetry-instrumentation-net_http (0.23.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-pg (0.29.2) opentelemetry-instrumentation-pg (0.30.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-helpers-sql-obfuscation opentelemetry-helpers-sql-obfuscation
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-rack (0.25.0) opentelemetry-instrumentation-rack (0.26.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-rails (0.34.0) opentelemetry-instrumentation-rails (0.35.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-action_mailer (~> 0.3.0) opentelemetry-instrumentation-action_mailer (~> 0.4.0)
opentelemetry-instrumentation-action_pack (~> 0.10.0) opentelemetry-instrumentation-action_pack (~> 0.11.0)
opentelemetry-instrumentation-action_view (~> 0.8.0) opentelemetry-instrumentation-action_view (~> 0.9.0)
opentelemetry-instrumentation-active_job (~> 0.7.0) opentelemetry-instrumentation-active_job (~> 0.8.0)
opentelemetry-instrumentation-active_record (~> 0.8.0) opentelemetry-instrumentation-active_record (~> 0.9.0)
opentelemetry-instrumentation-active_support (~> 0.7.0) opentelemetry-instrumentation-active_support (~> 0.8.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-redis (0.25.7) opentelemetry-instrumentation-concurrent_ruby (~> 0.22.0)
opentelemetry-instrumentation-redis (0.26.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-sidekiq (0.25.7) opentelemetry-instrumentation-sidekiq (0.26.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-registry (0.3.1) opentelemetry-registry (0.3.1)
opentelemetry-api (~> 1.1) opentelemetry-api (~> 1.1)
opentelemetry-sdk (1.6.0) opentelemetry-sdk (1.6.0)
@ -555,7 +556,7 @@ GEM
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
orm_adapter (0.5.0) orm_adapter (0.5.0)
ostruct (0.6.1) ostruct (0.6.1)
ox (2.14.19) ox (2.14.20)
bigdecimal (>= 3.0) bigdecimal (>= 3.0)
parallel (1.26.3) parallel (1.26.3)
parser (3.3.6.0) parser (3.3.6.0)
@ -690,7 +691,7 @@ GEM
rspec-expectations (3.13.3) rspec-expectations (3.13.3)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0) rspec-support (~> 3.13.0)
rspec-github (2.4.0) rspec-github (3.0.0)
rspec-core (~> 3.0) rspec-core (~> 3.0)
rspec-mocks (3.13.2) rspec-mocks (3.13.2)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
@ -709,7 +710,7 @@ GEM
rspec-mocks (~> 3.0) rspec-mocks (~> 3.0)
sidekiq (>= 5, < 8) sidekiq (>= 5, < 8)
rspec-support (3.13.2) rspec-support (3.13.2)
rubocop (1.69.2) rubocop (1.70.0)
json (~> 2.3) json (~> 2.3)
language_server-protocol (>= 3.17.0) language_server-protocol (>= 3.17.0)
parallel (~> 1.10) parallel (~> 1.10)
@ -793,7 +794,7 @@ GEM
simplecov-html (0.13.1) simplecov-html (0.13.1)
simplecov-lcov (0.8.0) simplecov-lcov (0.8.0)
simplecov_json_formatter (0.1.4) simplecov_json_formatter (0.1.4)
stackprof (0.2.26) stackprof (0.2.27)
stoplight (4.1.0) stoplight (4.1.0)
redlock (~> 1.0) redlock (~> 1.0)
stringio (3.1.2) stringio (3.1.2)
@ -959,19 +960,19 @@ DEPENDENCIES
omniauth_openid_connect (~> 0.6.1) omniauth_openid_connect (~> 0.6.1)
opentelemetry-api (~> 1.4.0) opentelemetry-api (~> 1.4.0)
opentelemetry-exporter-otlp (~> 0.29.0) opentelemetry-exporter-otlp (~> 0.29.0)
opentelemetry-instrumentation-active_job (~> 0.7.1) opentelemetry-instrumentation-active_job (~> 0.8.0)
opentelemetry-instrumentation-active_model_serializers (~> 0.21.0) opentelemetry-instrumentation-active_model_serializers (~> 0.22.0)
opentelemetry-instrumentation-concurrent_ruby (~> 0.21.2) opentelemetry-instrumentation-concurrent_ruby (~> 0.22.0)
opentelemetry-instrumentation-excon (~> 0.22.0) opentelemetry-instrumentation-excon (~> 0.23.0)
opentelemetry-instrumentation-faraday (~> 0.25.0) opentelemetry-instrumentation-faraday (~> 0.26.0)
opentelemetry-instrumentation-http (~> 0.23.2) opentelemetry-instrumentation-http (~> 0.24.0)
opentelemetry-instrumentation-http_client (~> 0.22.3) opentelemetry-instrumentation-http_client (~> 0.23.0)
opentelemetry-instrumentation-net_http (~> 0.22.4) opentelemetry-instrumentation-net_http (~> 0.23.0)
opentelemetry-instrumentation-pg (~> 0.29.0) opentelemetry-instrumentation-pg (~> 0.30.0)
opentelemetry-instrumentation-rack (~> 0.25.0) opentelemetry-instrumentation-rack (~> 0.26.0)
opentelemetry-instrumentation-rails (~> 0.34.0) opentelemetry-instrumentation-rails (~> 0.35.0)
opentelemetry-instrumentation-redis (~> 0.25.3) opentelemetry-instrumentation-redis (~> 0.26.0)
opentelemetry-instrumentation-sidekiq (~> 0.25.2) opentelemetry-instrumentation-sidekiq (~> 0.26.0)
opentelemetry-sdk (~> 1.4) opentelemetry-sdk (~> 1.4)
ox (~> 2.14) ox (~> 2.14)
parslet parslet
@ -994,7 +995,7 @@ DEPENDENCIES
redis (~> 4.5) redis (~> 4.5)
redis-namespace (~> 1.10) redis-namespace (~> 1.10)
rqrcode (~> 2.2) rqrcode (~> 2.2)
rspec-github (~> 2.4) rspec-github (~> 3.0)
rspec-rails (~> 7.0) rspec-rails (~> 7.0)
rspec-sidekiq (~> 5.0) rspec-sidekiq (~> 5.0)
rubocop rubocop

View file

@ -49,7 +49,7 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
def collection_presenter def collection_presenter
ActivityPub::CollectionPresenter.new( ActivityPub::CollectionPresenter.new(
id: account_collection_url(@account, params[:id]), id: ActivityPub::TagManager.instance.collection_uri_for(@account, params[:id]),
type: @type, type: @type,
size: @size, size: @size,
items: @items items: @items

View file

@ -41,12 +41,8 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController
end end
end end
def outbox_url(**) def outbox_url(...)
if params[:account_username].present? ActivityPub::TagManager.instance.outbox_uri_for(@account, ...)
account_outbox_url(@account, **)
else
instance_actor_outbox_url(**)
end
end end
def next_page def next_page

View file

@ -21,6 +21,7 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController
endpoint: subscription_params[:endpoint], endpoint: subscription_params[:endpoint],
key_p256dh: subscription_params[:keys][:p256dh], key_p256dh: subscription_params[:keys][:p256dh],
key_auth: subscription_params[:keys][:auth], key_auth: subscription_params[:keys][:auth],
standard: subscription_params[:standard] || false,
data: data_params, data: data_params,
user_id: current_user.id, user_id: current_user.id,
access_token_id: doorkeeper_token.id access_token_id: doorkeeper_token.id
@ -55,7 +56,7 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController
end end
def subscription_params def subscription_params
params.require(:subscription).permit(:endpoint, keys: [:auth, :p256dh]) params.require(:subscription).permit(:endpoint, :standard, keys: [:auth, :p256dh])
end end
def data_params def data_params

View file

@ -80,10 +80,31 @@ class Api::V2::NotificationsController < Api::BaseController
return [] if @notifications.empty? return [] if @notifications.empty?
MastodonOTELTracer.in_span('Api::V2::NotificationsController#load_grouped_notifications') do MastodonOTELTracer.in_span('Api::V2::NotificationsController#load_grouped_notifications') do
NotificationGroup.from_notifications(@notifications, pagination_range: (@notifications.last.id)..(@notifications.first.id), grouped_types: params[:grouped_types]) pagination_range = (@notifications.last.id)..@notifications.first.id
# If the page is incomplete, we know we are on the last page
if incomplete_page?
if paginating_up?
pagination_range = @notifications.last.id...(params[:max_id]&.to_i)
else
range_start = params[:since_id]&.to_i
range_start += 1 unless range_start.nil?
pagination_range = range_start..(@notifications.first.id)
end
end
NotificationGroup.from_notifications(@notifications, pagination_range: pagination_range, grouped_types: params[:grouped_types])
end end
end end
def incomplete_page?
@notifications.size < limit_param(DEFAULT_NOTIFICATIONS_LIMIT)
end
def paginating_up?
params[:min_id].present?
end
def browserable_account_notifications def browserable_account_notifications
current_account.notifications.without_suspended.browserable( current_account.notifications.without_suspended.browserable(
types: Array(browserable_params[:types]), types: Array(browserable_params[:types]),

View file

@ -66,7 +66,7 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController
end end
def subscription_params def subscription_params
@subscription_params ||= params.require(:subscription).permit(:endpoint, keys: [:auth, :p256dh]) @subscription_params ||= params.require(:subscription).permit(:standard, :endpoint, keys: [:auth, :p256dh])
end end
def web_push_subscription_params def web_push_subscription_params
@ -76,6 +76,7 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController
endpoint: subscription_params[:endpoint], endpoint: subscription_params[:endpoint],
key_auth: subscription_params[:keys][:auth], key_auth: subscription_params[:keys][:auth],
key_p256dh: subscription_params[:keys][:p256dh], key_p256dh: subscription_params[:keys][:p256dh],
standard: subscription_params[:standard] || false,
user_id: active_session.user_id, user_id: active_session.user_id,
} }
end end

View file

@ -18,7 +18,7 @@ class Auth::SetupController < ApplicationController
if @user.update(user_params) if @user.update(user_params)
@user.resend_confirmation_instructions unless @user.confirmed? @user.resend_confirmation_instructions unless @user.confirmed?
redirect_to auth_setup_path, notice: I18n.t('auth.setup.new_confirmation_instructions_sent') redirect_to auth_setup_path, notice: t('auth.setup.new_confirmation_instructions_sent')
else else
render :show render :show
end end

View file

@ -46,7 +46,7 @@ class FollowerAccountsController < ApplicationController
end end
def page_url(page) def page_url(page)
account_followers_url(@account, page: page) unless page.nil? ActivityPub::TagManager.instance.followers_uri_for(@account, page: page) unless page.nil?
end end
def next_page_url def next_page_url

View file

@ -63,7 +63,9 @@ module ThemeHelper
end end
def cached_custom_css_digest def cached_custom_css_digest
Rails.cache.read(:setting_digest_custom_css) Rails.cache.fetch(:setting_digest_custom_css) do
Setting.custom_css&.then { |content| Digest::SHA256.hexdigest(content) }
end
end end
def theme_color_for(theme) def theme_color_for(theme)

View file

@ -33,7 +33,7 @@ const unsubscribe = ({ registration, subscription }) =>
subscription ? subscription.unsubscribe().then(() => registration) : registration; subscription ? subscription.unsubscribe().then(() => registration) : registration;
const sendSubscriptionToBackend = (subscription) => { const sendSubscriptionToBackend = (subscription) => {
const params = { subscription }; const params = { subscription: { ...subscription.toJSON(), standard: true } };
if (me) { if (me) {
const data = pushNotificationsSetting.get(me); const data = pushNotificationsSetting.get(me);

View file

@ -45,7 +45,7 @@ export interface BaseApiAccountJSON {
avatar_static: string; avatar_static: string;
bot: boolean; bot: boolean;
created_at: string; created_at: string;
discoverable: boolean; discoverable?: boolean;
indexable: boolean; indexable: boolean;
display_name: string; display_name: string;
emojis: ApiCustomEmojiJSON[]; emojis: ApiCustomEmojiJSON[];

View file

@ -335,15 +335,29 @@ class Announcement extends ImmutablePureComponent {
const endsAt = announcement.get('ends_at') && new Date(announcement.get('ends_at')); const endsAt = announcement.get('ends_at') && new Date(announcement.get('ends_at'));
const now = new Date(); const now = new Date();
const hasTimeRange = startsAt && endsAt; const hasTimeRange = startsAt && endsAt;
const skipYear = hasTimeRange && startsAt.getFullYear() === endsAt.getFullYear() && endsAt.getFullYear() === now.getFullYear();
const skipEndDate = hasTimeRange && startsAt.getDate() === endsAt.getDate() && startsAt.getMonth() === endsAt.getMonth() && startsAt.getFullYear() === endsAt.getFullYear();
const skipTime = announcement.get('all_day'); const skipTime = announcement.get('all_day');
let timestamp = null;
if (hasTimeRange) {
const skipYear = startsAt.getFullYear() === endsAt.getFullYear() && endsAt.getFullYear() === now.getFullYear();
const skipEndDate = startsAt.getDate() === endsAt.getDate() && startsAt.getMonth() === endsAt.getMonth() && startsAt.getFullYear() === endsAt.getFullYear();
timestamp = (
<>
<FormattedDate value={startsAt} year={(skipYear || startsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month='short' day='2-digit' hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /> - <FormattedDate value={endsAt} year={(skipYear || endsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month={skipEndDate ? undefined : 'short'} day={skipEndDate ? undefined : '2-digit'} hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} />
</>
);
} else {
const publishedAt = new Date(announcement.get('published_at'));
timestamp = (
<FormattedDate value={publishedAt} year={publishedAt.getFullYear() === now.getFullYear() ? undefined : 'numeric'} month='short' day='2-digit' hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} />
);
}
return ( return (
<div className='announcements__item'> <div className='announcements__item'>
<strong className='announcements__item__range'> <strong className='announcements__item__range'>
<FormattedMessage id='announcement.announcement' defaultMessage='Announcement' /> <FormattedMessage id='announcement.announcement' defaultMessage='Announcement' />
{hasTimeRange && <span> · <FormattedDate value={startsAt} year={(skipYear || startsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month='short' day='2-digit' hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /> - <FormattedDate value={endsAt} year={(skipYear || endsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month={skipEndDate ? undefined : 'short'} day={skipEndDate ? undefined : '2-digit'} hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /></span>} <span> · {timestamp}</span>
</strong> </strong>
<Content announcement={announcement} /> <Content announcement={announcement} />

View file

@ -12,6 +12,7 @@ import AddPhotoAlternateIcon from '@/material-icons/400-24px/add_photo_alternate
import EditIcon from '@/material-icons/400-24px/edit.svg?react'; import EditIcon from '@/material-icons/400-24px/edit.svg?react';
import PersonIcon from '@/material-icons/400-24px/person.svg?react'; import PersonIcon from '@/material-icons/400-24px/person.svg?react';
import { updateAccount } from 'mastodon/actions/accounts'; import { updateAccount } from 'mastodon/actions/accounts';
import { closeOnboarding } from 'mastodon/actions/onboarding';
import { Button } from 'mastodon/components/button'; import { Button } from 'mastodon/components/button';
import { Column } from 'mastodon/components/column'; import { Column } from 'mastodon/components/column';
import { ColumnHeader } from 'mastodon/components/column_header'; import { ColumnHeader } from 'mastodon/components/column_header';
@ -58,7 +59,9 @@ export const Profile: React.FC<{
); );
const [avatar, setAvatar] = useState<File>(); const [avatar, setAvatar] = useState<File>();
const [header, setHeader] = useState<File>(); const [header, setHeader] = useState<File>();
const [discoverable, setDiscoverable] = useState(true); const [discoverable, setDiscoverable] = useState(
account?.discoverable ?? true,
);
const [isSaving, setIsSaving] = useState(false); const [isSaving, setIsSaving] = useState(false);
const [errors, setErrors] = useState<ApiAccountErrors>(); const [errors, setErrors] = useState<ApiAccountErrors>();
const avatarFileRef = createRef<HTMLInputElement>(); const avatarFileRef = createRef<HTMLInputElement>();
@ -132,6 +135,7 @@ export const Profile: React.FC<{
) )
.then(() => { .then(() => {
history.push('/start/follows'); history.push('/start/follows');
dispatch(closeOnboarding());
return ''; return '';
}) })
// eslint-disable-next-line @typescript-eslint/use-unknown-in-catch-callback-variable // eslint-disable-next-line @typescript-eslint/use-unknown-in-catch-callback-variable

View file

@ -110,6 +110,7 @@ const mapStateToProps = state => ({
hasMediaAttachments: state.getIn(['compose', 'media_attachments']).size > 0, hasMediaAttachments: state.getIn(['compose', 'media_attachments']).size > 0,
canUploadMore: !state.getIn(['compose', 'media_attachments']).some(x => ['audio', 'video'].includes(x.get('type'))) && state.getIn(['compose', 'media_attachments']).size < state.getIn(['server', 'server', 'configuration', 'statuses', 'max_media_attachments']), canUploadMore: !state.getIn(['compose', 'media_attachments']).some(x => ['audio', 'video'].includes(x.get('type'))) && state.getIn(['compose', 'media_attachments']).size < state.getIn(['server', 'server', 'configuration', 'statuses', 'max_media_attachments']),
firstLaunch: state.getIn(['settings', 'introductionVersion'], 0) < INTRODUCTION_VERSION, firstLaunch: state.getIn(['settings', 'introductionVersion'], 0) < INTRODUCTION_VERSION,
newAccount: !state.getIn(['accounts', me, 'note']) && !state.getIn(['accounts', me, 'bot']) && state.getIn(['accounts', me, 'following_count'], 0) === 0 && state.getIn(['accounts', me, 'statuses_count'], 0) === 0,
username: state.getIn(['accounts', me, 'username']), username: state.getIn(['accounts', me, 'username']),
}); });
@ -154,6 +155,7 @@ class SwitchingColumnsArea extends PureComponent {
children: PropTypes.node, children: PropTypes.node,
location: PropTypes.object, location: PropTypes.object,
singleColumn: PropTypes.bool, singleColumn: PropTypes.bool,
forceOnboarding: PropTypes.bool,
}; };
UNSAFE_componentWillMount () { UNSAFE_componentWillMount () {
@ -184,14 +186,16 @@ class SwitchingColumnsArea extends PureComponent {
}; };
render () { render () {
const { children, singleColumn } = this.props; const { children, singleColumn, forceOnboarding } = this.props;
const { signedIn } = this.props.identity; const { signedIn } = this.props.identity;
const pathName = this.props.location.pathname; const pathName = this.props.location.pathname;
let redirect; let redirect;
if (signedIn) { if (signedIn) {
if (singleColumn) { if (forceOnboarding) {
redirect = <Redirect from='/' to='/start' exact />;
} else if (singleColumn) {
redirect = <Redirect from='/' to='/home' exact />; redirect = <Redirect from='/' to='/home' exact />;
} else { } else {
redirect = <Redirect from='/' to='/deck/getting-started' exact />; redirect = <Redirect from='/' to='/deck/getting-started' exact />;
@ -320,6 +324,7 @@ class UI extends PureComponent {
intl: PropTypes.object.isRequired, intl: PropTypes.object.isRequired,
layout: PropTypes.string.isRequired, layout: PropTypes.string.isRequired,
firstLaunch: PropTypes.bool, firstLaunch: PropTypes.bool,
newAccount: PropTypes.bool,
username: PropTypes.string, username: PropTypes.string,
...WithRouterPropTypes, ...WithRouterPropTypes,
}; };
@ -616,7 +621,7 @@ class UI extends PureComponent {
render () { render () {
const { draggingOver } = this.state; const { draggingOver } = this.state;
const { children, isComposing, location, layout } = this.props; const { children, isComposing, location, layout, firstLaunch, newAccount } = this.props;
const handlers = { const handlers = {
help: this.handleHotkeyToggleHelp, help: this.handleHotkeyToggleHelp,
@ -646,7 +651,7 @@ class UI extends PureComponent {
<div className={classNames('ui', { 'is-composing': isComposing })} ref={this.setRef}> <div className={classNames('ui', { 'is-composing': isComposing })} ref={this.setRef}>
<Header /> <Header />
<SwitchingColumnsArea identity={this.props.identity} location={location} singleColumn={layout === 'mobile' || layout === 'single-column'}> <SwitchingColumnsArea identity={this.props.identity} location={location} singleColumn={layout === 'mobile' || layout === 'single-column'} forceOnboarding={firstLaunch && newAccount}>
{children} {children}
</SwitchingColumnsArea> </SwitchingColumnsArea>

View file

@ -104,10 +104,11 @@
"annual_report.summary.most_used_hashtag.none": "Žádné", "annual_report.summary.most_used_hashtag.none": "Žádné",
"annual_report.summary.new_posts.new_posts": "nové příspěvky", "annual_report.summary.new_posts.new_posts": "nové příspěvky",
"annual_report.summary.percentile.text": "<topLabel>To vás umisťuje do vrcholu</topLabel><percentage></percentage><bottomLabel>{domain} uživatelů.</bottomLabel>", "annual_report.summary.percentile.text": "<topLabel>To vás umisťuje do vrcholu</topLabel><percentage></percentage><bottomLabel>{domain} uživatelů.</bottomLabel>",
"annual_report.summary.percentile.we_wont_tell_bernie": "To, že jste zdejší smetánka zůstane mezi námi ;).",
"annual_report.summary.thanks": "Děkujeme, že jste součástí Mastodonu!", "annual_report.summary.thanks": "Děkujeme, že jste součástí Mastodonu!",
"attachments_list.unprocessed": "(nezpracováno)", "attachments_list.unprocessed": "(nezpracováno)",
"audio.hide": "Skrýt zvuk", "audio.hide": "Skrýt zvuk",
"block_modal.remote_users_caveat": "Požádáme server {domain}, aby respektoval vaše rozhodnutí. Úplné dodržování nastavení však není zaručeno, protože některé servery mohou řešit blokování různě. Veřejné příspěvky mohou stále být viditelné pro nepřihlášené uživatele.", "block_modal.remote_users_caveat": "Požádáme server {domain}, aby respektoval vaše rozhodnutí. Úplné dodržování nastavení však není zaručeno, protože některé servery mohou řešit blokování různě. Veřejné příspěvky mohou být stále viditelné pro nepřihlášené uživatele.",
"block_modal.show_less": "Zobrazit méně", "block_modal.show_less": "Zobrazit méně",
"block_modal.show_more": "Zobrazit více", "block_modal.show_more": "Zobrazit více",
"block_modal.they_cant_mention": "Nemůže vás zmiňovat ani sledovat.", "block_modal.they_cant_mention": "Nemůže vás zmiňovat ani sledovat.",
@ -180,6 +181,7 @@
"compose_form.poll.duration": "Doba trvání ankety", "compose_form.poll.duration": "Doba trvání ankety",
"compose_form.poll.multiple": "Výběr z více možností", "compose_form.poll.multiple": "Výběr z více možností",
"compose_form.poll.option_placeholder": "Volba {number}", "compose_form.poll.option_placeholder": "Volba {number}",
"compose_form.poll.single": "Jediná volba",
"compose_form.poll.switch_to_multiple": "Povolit u ankety výběr více voleb", "compose_form.poll.switch_to_multiple": "Povolit u ankety výběr více voleb",
"compose_form.poll.switch_to_single": "Povolit u ankety výběr pouze jedné volby", "compose_form.poll.switch_to_single": "Povolit u ankety výběr pouze jedné volby",
"compose_form.poll.type": "Styl", "compose_form.poll.type": "Styl",
@ -204,6 +206,7 @@
"confirmations.edit.message": "Editovat teď znamená přepsání zprávy, kterou právě tvoříte. Opravdu chcete pokračovat?", "confirmations.edit.message": "Editovat teď znamená přepsání zprávy, kterou právě tvoříte. Opravdu chcete pokračovat?",
"confirmations.edit.title": "Přepsat příspěvek?", "confirmations.edit.title": "Přepsat příspěvek?",
"confirmations.follow_to_list.confirm": "Sledovat a přidat do seznamu", "confirmations.follow_to_list.confirm": "Sledovat a přidat do seznamu",
"confirmations.follow_to_list.message": "Musíte {name} sledovat, abyste je přidali do seznamu.",
"confirmations.follow_to_list.title": "Sledovat uživatele?", "confirmations.follow_to_list.title": "Sledovat uživatele?",
"confirmations.logout.confirm": "Odhlásit se", "confirmations.logout.confirm": "Odhlásit se",
"confirmations.logout.message": "Opravdu se chcete odhlásit?", "confirmations.logout.message": "Opravdu se chcete odhlásit?",
@ -236,19 +239,25 @@
"disabled_account_banner.text": "Váš účet {disabledAccount} je momentálně deaktivován.", "disabled_account_banner.text": "Váš účet {disabledAccount} je momentálně deaktivován.",
"dismissable_banner.community_timeline": "Toto jsou nejnovější veřejné příspěvky od lidí, jejichž účty hostuje {domain}.", "dismissable_banner.community_timeline": "Toto jsou nejnovější veřejné příspěvky od lidí, jejichž účty hostuje {domain}.",
"dismissable_banner.dismiss": "Zavřít", "dismissable_banner.dismiss": "Zavřít",
"dismissable_banner.explore_links": "Tyto zprávy jsou dnes nejvíce sdíleny ve fediversu. Novější novinky publikované více různými lidmi jsou v pořadí vyšší.",
"dismissable_banner.explore_statuses": "Tyto příspěvky napříč fediversem dnes získávají na popularitě. Novější příspěvky s více boosty a oblíbenými jsou výše v pořadí.",
"dismissable_banner.explore_tags": "Tyto hashtagy dnes na fediversu získávají na popularitě. Hashtagy, které používá více různých lidí, jsou řazeny výše.",
"dismissable_banner.public_timeline": "Toto jsou nejnovější veřejné příspěvky od lidí na fediversu, které lidé na {domain} sledují.",
"domain_block_modal.block": "Blokovat server", "domain_block_modal.block": "Blokovat server",
"domain_block_modal.block_account_instead": "Raději blokovat @{name}", "domain_block_modal.block_account_instead": "Raději blokovat @{name}",
"domain_block_modal.they_can_interact_with_old_posts": "Lidé z tohoto serveru mohou interagovat s vašimi starými příspěvky.", "domain_block_modal.they_can_interact_with_old_posts": "Lidé z tohoto serveru mohou interagovat s vašimi starými příspěvky.",
"domain_block_modal.they_cant_follow": "Nikdo z tohoto serveru vás nemůže sledovat.", "domain_block_modal.they_cant_follow": "Nikdo z tohoto serveru vás nemůže sledovat.",
"domain_block_modal.they_wont_know": "Nebude vědět, že je zablokován*a.", "domain_block_modal.they_wont_know": "Nebude vědět, že je zablokován*a.",
"domain_block_modal.title": "Blokovat doménu?", "domain_block_modal.title": "Blokovat doménu?",
"domain_block_modal.you_will_lose_num_followers": "Ztratíte {followersCount, plural, one {{followersCountDisplay} sledujícího} few {{followersCountDisplay} sledující} many {{followersCountDisplay} sledujících} other {{followersCountDisplay} sledujících}} a {followingCount, plural, one {{followingCountDisplay} sledovaného} few {{followingCountDisplay} sledované} many {{followingCountDisplay} sledovaných} other {{followingCountDisplay} sledovaných}}.",
"domain_block_modal.you_will_lose_relationships": "Ztratíte všechny sledující a lidi, které sledujete z tohoto serveru.",
"domain_block_modal.you_wont_see_posts": "Neuvidíte příspěvky ani upozornění od uživatelů z tohoto serveru.", "domain_block_modal.you_wont_see_posts": "Neuvidíte příspěvky ani upozornění od uživatelů z tohoto serveru.",
"domain_pill.activitypub_lets_connect": "Umožňuje vám spojit se a komunikovat s lidmi nejen na Mastodonu, ale i s dalšími sociálními aplikacemi.", "domain_pill.activitypub_lets_connect": "Umožňuje vám spojit se a komunikovat s lidmi nejen na Mastodonu, ale i s dalšími sociálními aplikacemi.",
"domain_pill.activitypub_like_language": "ActivityPub je jako jazyk, kterým Mastodon mluví s jinými sociálními sítěmi.", "domain_pill.activitypub_like_language": "ActivityPub je jako jazyk, kterým Mastodon mluví s jinými sociálními sítěmi.",
"domain_pill.server": "Server", "domain_pill.server": "Server",
"domain_pill.their_handle": "Handle:", "domain_pill.their_handle": "Handle:",
"domain_pill.their_server": "Digitální domov, kde žijí všechny příspěvky.", "domain_pill.their_server": "Jejich digitální domov, kde žijí jejich všechny příspěvky.",
"domain_pill.their_username": "Jedinečný identikátor na serveru. Je možné najít uživatele se stejným uživatelským jménem na různých serverech.", "domain_pill.their_username": "Jejich jedinečný identikátor na jejich serveru. Je možné najít uživatele se stejným uživatelským jménem na jiných serverech.",
"domain_pill.username": "Uživatelské jméno", "domain_pill.username": "Uživatelské jméno",
"domain_pill.whats_in_a_handle": "Co obsahuje handle?", "domain_pill.whats_in_a_handle": "Co obsahuje handle?",
"domain_pill.who_they_are": "Protože handle říkají kdo je kdo a také kde, je možné interagovat s lidmi napříč sociálními weby <button>platforem postavených na ActivityPub</button>.", "domain_pill.who_they_are": "Protože handle říkají kdo je kdo a také kde, je možné interagovat s lidmi napříč sociálními weby <button>platforem postavených na ActivityPub</button>.",
@ -322,6 +331,7 @@
"filter_modal.select_filter.title": "Filtrovat tento příspěvek", "filter_modal.select_filter.title": "Filtrovat tento příspěvek",
"filter_modal.title.status": "Filtrovat příspěvek", "filter_modal.title.status": "Filtrovat příspěvek",
"filter_warning.matches_filter": "Odpovídá filtru “<span>{title}</span>”", "filter_warning.matches_filter": "Odpovídá filtru “<span>{title}</span>”",
"filtered_notifications_banner.pending_requests": "Od {count, plural, =0 {nikoho, koho možná znáte} one {člověka, kterého možná znáte} few {#, které možná znáte} many {#, které možná znáte} other {#, které možná znáte}}",
"filtered_notifications_banner.title": "Filtrovaná oznámení", "filtered_notifications_banner.title": "Filtrovaná oznámení",
"firehose.all": "Vše", "firehose.all": "Vše",
"firehose.local": "Tento server", "firehose.local": "Tento server",
@ -329,14 +339,14 @@
"follow_request.authorize": "Autorizovat", "follow_request.authorize": "Autorizovat",
"follow_request.reject": "Zamítnout", "follow_request.reject": "Zamítnout",
"follow_requests.unlocked_explanation": "Přestože váš účet není uzamčen, personál {domain} usoudil, že byste mohli chtít tyto požadavky na sledování zkontrolovat ručně.", "follow_requests.unlocked_explanation": "Přestože váš účet není uzamčen, personál {domain} usoudil, že byste mohli chtít tyto požadavky na sledování zkontrolovat ručně.",
"follow_suggestions.curated_suggestion": "Výběr personálů", "follow_suggestions.curated_suggestion": "Výběr personálu",
"follow_suggestions.dismiss": "Znovu nezobrazovat", "follow_suggestions.dismiss": "Znovu nezobrazovat",
"follow_suggestions.featured_longer": "Ručně vybráno týmem {domain}", "follow_suggestions.featured_longer": "Ručně vybráno týmem {domain}",
"follow_suggestions.friends_of_friends_longer": "Populární mezi lidmi, které sledujete", "follow_suggestions.friends_of_friends_longer": "Populární mezi lidmi, které sledujete",
"follow_suggestions.hints.featured": "Tento profil byl ručně vybrán týmem {domain}.", "follow_suggestions.hints.featured": "Tento profil byl ručně vybrán týmem {domain}.",
"follow_suggestions.hints.friends_of_friends": "Tento profil je populární mezi lidmi, které sledujete.", "follow_suggestions.hints.friends_of_friends": "Tento profil je populární mezi lidmi, které sledujete.",
"follow_suggestions.hints.most_followed": "Tento profil je jedním z nejvíce sledovaných na {domain}.", "follow_suggestions.hints.most_followed": "Tento profil je jedním z nejsledovanějších na {domain}.",
"follow_suggestions.hints.most_interactions": "Tento profil nedávno dostalo velkou pozornost na {domain}.", "follow_suggestions.hints.most_interactions": "Tomuto profilu se nedávno dostalo velké pozornosti na {domain}.",
"follow_suggestions.hints.similar_to_recently_followed": "Tento profil je podobný profilům, které jste nedávno sledovali.", "follow_suggestions.hints.similar_to_recently_followed": "Tento profil je podobný profilům, které jste nedávno sledovali.",
"follow_suggestions.personalized_suggestion": "Přizpůsobený návrh", "follow_suggestions.personalized_suggestion": "Přizpůsobený návrh",
"follow_suggestions.popular_suggestion": "Populární návrh", "follow_suggestions.popular_suggestion": "Populární návrh",
@ -355,6 +365,7 @@
"footer.terms_of_service": "Obchodní podmínky", "footer.terms_of_service": "Obchodní podmínky",
"generic.saved": "Uloženo", "generic.saved": "Uloženo",
"getting_started.heading": "Začínáme", "getting_started.heading": "Začínáme",
"hashtag.admin_moderation": "Otevřít moderátorské rozhraní pro #{name}",
"hashtag.column_header.tag_mode.all": "a {additional}", "hashtag.column_header.tag_mode.all": "a {additional}",
"hashtag.column_header.tag_mode.any": "nebo {additional}", "hashtag.column_header.tag_mode.any": "nebo {additional}",
"hashtag.column_header.tag_mode.none": "bez {additional}", "hashtag.column_header.tag_mode.none": "bez {additional}",
@ -370,9 +381,13 @@
"hashtag.follow": "Sledovat hashtag", "hashtag.follow": "Sledovat hashtag",
"hashtag.unfollow": "Přestat sledovat hashtag", "hashtag.unfollow": "Přestat sledovat hashtag",
"hashtags.and_other": "…a {count, plural, one {# další} few {# další} other {# dalších}}", "hashtags.and_other": "…a {count, plural, one {# další} few {# další} other {# dalších}}",
"hints.profiles.followers_may_be_missing": "Sledující mohou pro tento profil chybět.",
"hints.profiles.follows_may_be_missing": "Sledování mohou pro tento profil chybět.",
"hints.profiles.posts_may_be_missing": "Některé příspěvky z tohoto profilu mohou chybět.",
"hints.profiles.see_more_followers": "Zobrazit více sledujících na {domain}", "hints.profiles.see_more_followers": "Zobrazit více sledujících na {domain}",
"hints.profiles.see_more_follows": "Zobrazit další sledování na {domain}", "hints.profiles.see_more_follows": "Zobrazit další sledování na {domain}",
"hints.profiles.see_more_posts": "Zobrazit další příspěvky na {domain}", "hints.profiles.see_more_posts": "Zobrazit další příspěvky na {domain}",
"hints.threads.replies_may_be_missing": "Odpovědi z jiných serverů mohou chybět.",
"hints.threads.see_more": "Zobrazit další odpovědi na {domain}", "hints.threads.see_more": "Zobrazit další odpovědi na {domain}",
"home.column_settings.show_reblogs": "Zobrazit boosty", "home.column_settings.show_reblogs": "Zobrazit boosty",
"home.column_settings.show_replies": "Zobrazit odpovědi", "home.column_settings.show_replies": "Zobrazit odpovědi",
@ -381,7 +396,22 @@
"home.pending_critical_update.link": "Zobrazit aktualizace", "home.pending_critical_update.link": "Zobrazit aktualizace",
"home.pending_critical_update.title": "K dispozici je kritická bezpečnostní aktualizace!", "home.pending_critical_update.title": "K dispozici je kritická bezpečnostní aktualizace!",
"home.show_announcements": "Zobrazit oznámení", "home.show_announcements": "Zobrazit oznámení",
"ignore_notifications_modal.disclaimer": "Mastodon nemůže informovat uživatele, že jste ignorovali jejich oznámení. Ignorování oznámení nezabrání odesílání zpráv samotných.",
"ignore_notifications_modal.filter_instead": "Místo toho filtrovat",
"ignore_notifications_modal.filter_to_act_users": "Stále budete moci přijmout, odmítnout nebo nahlásit uživatele",
"ignore_notifications_modal.filter_to_avoid_confusion": "Filtrování pomáhá vyhnout se možným nejasnostem",
"ignore_notifications_modal.filter_to_review_separately": "Filtrovaná oznámení můžete zkontrolovat samostatně",
"ignore_notifications_modal.ignore": "Ignorovat oznámení", "ignore_notifications_modal.ignore": "Ignorovat oznámení",
"ignore_notifications_modal.limited_accounts_title": "Ignorovat oznámení z moderovaných účtů?",
"ignore_notifications_modal.new_accounts_title": "Ignorovat oznámení z nových účtů?",
"ignore_notifications_modal.not_followers_title": "Ignorovat oznámení od lidí, kteří vás nesledují?",
"ignore_notifications_modal.not_following_title": "Ignorovat oznámení od lidí, které nesledujete?",
"ignore_notifications_modal.private_mentions_title": "Ignorovat oznámení z nevyžádaných soukromých zmínek?",
"interaction_modal.action.favourite": "Chcete-li pokračovat, musíte oblíbit z vašeho účtu.",
"interaction_modal.action.follow": "Chcete-li pokračovat, musíte sledovat z vašeho účtu.",
"interaction_modal.action.reblog": "Chcete-li pokračovat, musíte dát boost z vašeho účtu.",
"interaction_modal.action.reply": "Chcete-li pokračovat, musíte odpovědět z vašeho účtu.",
"interaction_modal.action.vote": "Chcete-li pokračovat, musíte hlasovat z vašeho účtu.",
"interaction_modal.go": "Přejít", "interaction_modal.go": "Přejít",
"interaction_modal.no_account_yet": "Ještě nemáte účet?", "interaction_modal.no_account_yet": "Ještě nemáte účet?",
"interaction_modal.on_another_server": "Na jiném serveru", "interaction_modal.on_another_server": "Na jiném serveru",
@ -433,20 +463,27 @@
"lightbox.close": "Zavřít", "lightbox.close": "Zavřít",
"lightbox.next": "Další", "lightbox.next": "Další",
"lightbox.previous": "Předchozí", "lightbox.previous": "Předchozí",
"lightbox.zoom_in": "Přiblížit na skutečnou velikost",
"lightbox.zoom_out": "Přizpůsobit velikost",
"limited_account_hint.action": "Přesto profil zobrazit", "limited_account_hint.action": "Přesto profil zobrazit",
"limited_account_hint.title": "Tento profil byl skryt moderátory {domain}.", "limited_account_hint.title": "Tento profil byl skryt moderátory {domain}.",
"link_preview.author": "Podle {name}", "link_preview.author": "Podle {name}",
"link_preview.more_from_author": "Více od {name}", "link_preview.more_from_author": "Více od {name}",
"link_preview.shares": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} many {{counter} příspěvků} other {{counter} příspěvků}}", "link_preview.shares": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} many {{counter} příspěvků} other {{counter} příspěvků}}",
"lists.add_member": "Přidat", "lists.add_member": "Přidat",
"lists.add_to_list": "Přidat do seznamu",
"lists.add_to_lists": "Přidat {name} do seznamů", "lists.add_to_lists": "Přidat {name} do seznamů",
"lists.create": "Vytvořit", "lists.create": "Vytvořit",
"lists.create_a_list_to_organize": "Vytvořte nový seznam pro organizaci vašeho domovského kanálu",
"lists.create_list": "Vytvořit seznam", "lists.create_list": "Vytvořit seznam",
"lists.delete": "Smazat seznam", "lists.delete": "Smazat seznam",
"lists.done": "Hotovo", "lists.done": "Hotovo",
"lists.edit": "Upravit seznam", "lists.edit": "Upravit seznam",
"lists.exclusive": "Skrýt členy na domovském kanálu",
"lists.exclusive_hint": "Pokud je někdo na tomto seznamu, skryjte jej ve vašem domovském kanálu, abyste se vyhnuli dvojímu vidění jejich příspěvků.",
"lists.find_users_to_add": "Najít uživatele, které chcete přidat", "lists.find_users_to_add": "Najít uživatele, které chcete přidat",
"lists.list_members": "Členové seznamu", "lists.list_members": "Členové seznamu",
"lists.list_members_count": "{count, plural, one {# člen} few {# členové} many {# členů} other {# členů}}",
"lists.list_name": "Název seznamu", "lists.list_name": "Název seznamu",
"lists.new_list_name": "Název nového seznamu", "lists.new_list_name": "Název nového seznamu",
"lists.no_lists_yet": "Zatím žádné seznamy.", "lists.no_lists_yet": "Zatím žádné seznamy.",
@ -458,6 +495,7 @@
"lists.replies_policy.none": "Nikomu", "lists.replies_policy.none": "Nikomu",
"lists.save": "Uložit", "lists.save": "Uložit",
"lists.search": "Hledat", "lists.search": "Hledat",
"lists.show_replies_to": "Zahrnout odpovědi od členů seznamu pro",
"load_pending": "{count, plural, one {# nová položka} few {# nové položky} many {# nových položek} other {# nových položek}}", "load_pending": "{count, plural, one {# nová položka} few {# nové položky} many {# nových položek} other {# nových položek}}",
"loading_indicator.label": "Načítání…", "loading_indicator.label": "Načítání…",
"media_gallery.hide": "Skrýt", "media_gallery.hide": "Skrýt",
@ -500,14 +538,25 @@
"navigation_bar.security": "Zabezpečení", "navigation_bar.security": "Zabezpečení",
"not_signed_in_indicator.not_signed_in": "Pro přístup k tomuto zdroji se musíte přihlásit.", "not_signed_in_indicator.not_signed_in": "Pro přístup k tomuto zdroji se musíte přihlásit.",
"notification.admin.report": "Uživatel {name} nahlásil {target}", "notification.admin.report": "Uživatel {name} nahlásil {target}",
"notification.admin.report_account": "{name} nahlásil {count, plural, one {jeden příspěvek} few {# příspěvky} many {# příspěvků} other {# příspěvků}} od {target} za {category}",
"notification.admin.report_account_other": "{name} nahlásil {count, plural, one {jeden příspěvek} few {# příspěvky} many {# příspěvků} other {# příspěvků}} od {target}",
"notification.admin.report_statuses": "{name} nahlásil {target} za {category}", "notification.admin.report_statuses": "{name} nahlásil {target} za {category}",
"notification.admin.report_statuses_other": "{name} nahlásil {target}", "notification.admin.report_statuses_other": "{name} nahlásil {target}",
"notification.admin.sign_up": "Uživatel {name} se zaregistroval", "notification.admin.sign_up": "Uživatel {name} se zaregistroval",
"notification.admin.sign_up.name_and_others": "{name} a {count, plural, one {# další} few {# další} many {# dalších} other {# dalších}} se zaregistrovali",
"notification.annual_report.message": "Váš #Wrapstodon {year} na Vás čeká! Podívejte se, jak vypadal tento Váš rok na Mastodonu!",
"notification.annual_report.view": "Zobrazit #Wrapstodon",
"notification.favourite": "Uživatel {name} si oblíbil váš příspěvek", "notification.favourite": "Uživatel {name} si oblíbil váš příspěvek",
"notification.favourite.name_and_others_with_link": "{name} a {count, plural, one {<a># další</a> si oblíbil} few {<a># další</a> si oblíbili} other {<a># dalších</a> si oblíbilo}} Váš příspěvek",
"notification.favourite_pm": "{name} si oblíbil vaši soukromou zmínku",
"notification.favourite_pm.name_and_others_with_link": "{name} a {count, plural, one {<a># další</a> si oblíbil} few {<a># další</a> si oblíbili} other {<a># dalších</a> si oblíbilo}} Vaši soukromou zmínku",
"notification.follow": "Uživatel {name} vás začal sledovat", "notification.follow": "Uživatel {name} vás začal sledovat",
"notification.follow.name_and_others": "{name} a {count, plural, one {<a># další</a> Vás začal sledovat} few {<a># další</a> Vás začali sledovat} other {<a># dalších</a> Vás začalo sledovat}}",
"notification.follow_request": "Uživatel {name} požádal o povolení vás sledovat", "notification.follow_request": "Uživatel {name} požádal o povolení vás sledovat",
"notification.follow_request.name_and_others": "{name} a {count, plural, one {# další Vám poslal žádost o sledování} few {# další Vám poslali žádost o sledování} other {# dalších Vám poslalo žádost o sledování}}",
"notification.label.mention": "Zmínka", "notification.label.mention": "Zmínka",
"notification.label.private_mention": "Soukromá zmínka", "notification.label.private_mention": "Soukromá zmínka",
"notification.label.private_reply": "Privátní odpověď",
"notification.label.reply": "Odpověď", "notification.label.reply": "Odpověď",
"notification.mention": "Zmínka", "notification.mention": "Zmínka",
"notification.mentioned_you": "{name} vás zmínil", "notification.mentioned_you": "{name} vás zmínil",
@ -523,6 +572,7 @@
"notification.own_poll": "Vaše anketa skončila", "notification.own_poll": "Vaše anketa skončila",
"notification.poll": "Anketa, ve které jste hlasovali, skončila", "notification.poll": "Anketa, ve které jste hlasovali, skončila",
"notification.reblog": "Uživatel {name} boostnul váš příspěvek", "notification.reblog": "Uživatel {name} boostnul váš příspěvek",
"notification.reblog.name_and_others_with_link": "{name} a {count, plural, one {<a># další</a> boostnul} few {<a># další</a> boostnuli} other {<a># dalších</a> boostnulo}} Váš příspěvek",
"notification.relationships_severance_event": "Kontakt ztracen s {name}", "notification.relationships_severance_event": "Kontakt ztracen s {name}",
"notification.relationships_severance_event.account_suspension": "Administrátor z {from} pozastavil {target}, což znamená, že již od nich nemůžete přijímat aktualizace nebo s nimi interagovat.", "notification.relationships_severance_event.account_suspension": "Administrátor z {from} pozastavil {target}, což znamená, že již od nich nemůžete přijímat aktualizace nebo s nimi interagovat.",
"notification.relationships_severance_event.domain_block": "Administrátor z {from} pozastavil {target}, včetně {followersCount} z vašich sledujících a {followingCount, plural, one {# účet, který sledujete} few {# účty, které sledujete} many {# účtů, které sledujete} other {# účtů, které sledujete}}.", "notification.relationships_severance_event.domain_block": "Administrátor z {from} pozastavil {target}, včetně {followersCount} z vašich sledujících a {followingCount, plural, one {# účet, který sledujete} few {# účty, které sledujete} many {# účtů, které sledujete} other {# účtů, které sledujete}}.",
@ -531,10 +581,19 @@
"notification.status": "Uživatel {name} právě přidal příspěvek", "notification.status": "Uživatel {name} právě přidal příspěvek",
"notification.update": "Uživatel {name} upravil příspěvek", "notification.update": "Uživatel {name} upravil příspěvek",
"notification_requests.accept": "Přijmout", "notification_requests.accept": "Přijmout",
"notification_requests.accept_multiple": "{count, plural, one {Schválit # požadavek…} few {Schválit # požadavky…} other {Schválit # požadavků…}}",
"notification_requests.confirm_accept_multiple.button": "{count, plural, one {Schválit požadavek} other {Schválit požadavky}}",
"notification_requests.confirm_accept_multiple.message": "Chystáte se schválit {count, plural, one {jeden požadavek} few {# požadavky} other {# požadavků}} na oznámení. Opravdu chcete pokračovat?",
"notification_requests.confirm_accept_multiple.title": "Přijmout žádosti o oznámení?", "notification_requests.confirm_accept_multiple.title": "Přijmout žádosti o oznámení?",
"notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Zamítnout požadavek} other {Zamítnout požadavky}}",
"notification_requests.confirm_dismiss_multiple.message": "Chystáte se zamítnout {count, plural, one {jeden požadavek} few {# požadavky} many {# požadavků} other {# požadavků}} na oznámení. Poté k {count, plural, one {němu} other {něm}} již nebudete mít snadný přístup. Opravdu chcete pokračovat?",
"notification_requests.confirm_dismiss_multiple.title": "Zamítnout požadavky na oznámení?",
"notification_requests.dismiss": "Zamítnout", "notification_requests.dismiss": "Zamítnout",
"notification_requests.dismiss_multiple": "Zamítnout {count, plural, one {# požadavek} few {# požadavky} many {# požadavků} other {# požadavků}}…",
"notification_requests.edit_selection": "Upravit", "notification_requests.edit_selection": "Upravit",
"notification_requests.exit_selection": "Hotovo", "notification_requests.exit_selection": "Hotovo",
"notification_requests.explainer_for_limited_account": "Oznámení z tohoto účtu byla filtrována, protože tento účet byl omezen moderátorem.",
"notification_requests.explainer_for_limited_remote_account": "Oznámení z tohoto účtu byla filtrována, protože tento účet nebo jeho server byl omezen moderátorem.",
"notification_requests.maximize": "Maximalizovat", "notification_requests.maximize": "Maximalizovat",
"notification_requests.minimize_banner": "Minimalizovat banner filtrovaných oznámení", "notification_requests.minimize_banner": "Minimalizovat banner filtrovaných oznámení",
"notification_requests.notifications_from": "Oznámení od {name}", "notification_requests.notifications_from": "Oznámení od {name}",
@ -578,6 +637,7 @@
"notifications.policy.accept": "Přijmout", "notifications.policy.accept": "Přijmout",
"notifications.policy.accept_hint": "Zobrazit v oznámeních", "notifications.policy.accept_hint": "Zobrazit v oznámeních",
"notifications.policy.drop": "Ignorovat", "notifications.policy.drop": "Ignorovat",
"notifications.policy.drop_hint": "Permanentně odstranit, aby již nikdy nespatřil světlo světa",
"notifications.policy.filter": "Filtrovat", "notifications.policy.filter": "Filtrovat",
"notifications.policy.filter_hint": "Odeslat do filtrované schránky oznámení", "notifications.policy.filter_hint": "Odeslat do filtrované schránky oznámení",
"notifications.policy.filter_limited_accounts_hint": "Omezeno moderátory serveru", "notifications.policy.filter_limited_accounts_hint": "Omezeno moderátory serveru",

View file

@ -407,6 +407,13 @@
"ignore_notifications_modal.not_followers_title": "An dtugann tú aird ar fhógraí ó dhaoine nach leanann tú?", "ignore_notifications_modal.not_followers_title": "An dtugann tú aird ar fhógraí ó dhaoine nach leanann tú?",
"ignore_notifications_modal.not_following_title": "An ndéanann tú neamhaird de fhógraí ó dhaoine nach leanann tú?", "ignore_notifications_modal.not_following_title": "An ndéanann tú neamhaird de fhógraí ó dhaoine nach leanann tú?",
"ignore_notifications_modal.private_mentions_title": "An dtugann tú aird ar fhógraí ó Luaintí Príobháideacha gan iarraidh?", "ignore_notifications_modal.private_mentions_title": "An dtugann tú aird ar fhógraí ó Luaintí Príobháideacha gan iarraidh?",
"interaction_modal.action.favourite": "Chun leanúint ar aghaidh, ní mór duit an ceann is fearr leat ó do chuntas.",
"interaction_modal.action.follow": "Chun leanúint ar aghaidh, ní mór duit leanúint ó do chuntas.",
"interaction_modal.action.reblog": "Chun leanúint ar aghaidh, ní mór duit athbhlagáil ó do chuntas.",
"interaction_modal.action.reply": "Chun leanúint ar aghaidh, ní mór duit freagra a thabhairt ó do chuntas.",
"interaction_modal.action.vote": "Chun leanúint ar aghaidh, ní mór duit vótáil ó do chuntas.",
"interaction_modal.go": "Téigh",
"interaction_modal.no_account_yet": "Níl cuntas agat fós?",
"interaction_modal.on_another_server": "Ar freastalaí eile", "interaction_modal.on_another_server": "Ar freastalaí eile",
"interaction_modal.on_this_server": "Ar an freastalaí seo", "interaction_modal.on_this_server": "Ar an freastalaí seo",
"interaction_modal.title.favourite": "An postáil {name} is fearr leat", "interaction_modal.title.favourite": "An postáil {name} is fearr leat",
@ -414,6 +421,7 @@
"interaction_modal.title.reblog": "Mol postáil de chuid {name}", "interaction_modal.title.reblog": "Mol postáil de chuid {name}",
"interaction_modal.title.reply": "Freagair postáil {name}", "interaction_modal.title.reply": "Freagair postáil {name}",
"interaction_modal.title.vote": "Vótáil i vótaíocht {name}", "interaction_modal.title.vote": "Vótáil i vótaíocht {name}",
"interaction_modal.username_prompt": "M.sh. {example}",
"intervals.full.days": "{number, plural, one {# lá} other {# lá}}", "intervals.full.days": "{number, plural, one {# lá} other {# lá}}",
"intervals.full.hours": "{number, plural, one {# uair} other {# uair}}", "intervals.full.hours": "{number, plural, one {# uair} other {# uair}}",
"intervals.full.minutes": "{number, plural, one {# nóiméad} other {# nóiméad}}", "intervals.full.minutes": "{number, plural, one {# nóiméad} other {# nóiméad}}",
@ -449,6 +457,7 @@
"keyboard_shortcuts.toggle_hidden": "Taispeáin/folaigh an téacs taobh thiar de CW", "keyboard_shortcuts.toggle_hidden": "Taispeáin/folaigh an téacs taobh thiar de CW",
"keyboard_shortcuts.toggle_sensitivity": "Taispeáin / cuir i bhfolach meáin", "keyboard_shortcuts.toggle_sensitivity": "Taispeáin / cuir i bhfolach meáin",
"keyboard_shortcuts.toot": "Cuir tús le postáil nua", "keyboard_shortcuts.toot": "Cuir tús le postáil nua",
"keyboard_shortcuts.translate": "post a aistriú",
"keyboard_shortcuts.unfocus": "Unfocus cum textarea/search", "keyboard_shortcuts.unfocus": "Unfocus cum textarea/search",
"keyboard_shortcuts.up": "Bog suas ar an liosta", "keyboard_shortcuts.up": "Bog suas ar an liosta",
"lightbox.close": "Dún", "lightbox.close": "Dún",
@ -687,6 +696,8 @@
"privacy_policy.title": "Polasaí príobháideachais", "privacy_policy.title": "Polasaí príobháideachais",
"recommended": "Molta", "recommended": "Molta",
"refresh": "Athnuaigh", "refresh": "Athnuaigh",
"regeneration_indicator.please_stand_by": "Fan i do sheasamh, le do thoil.",
"regeneration_indicator.preparing_your_home_feed": "Ag ullmhú do bheatha baile…",
"relative_time.days": "{number}l", "relative_time.days": "{number}l",
"relative_time.full.days": "{number, plural, one {# lá} other {# lá}} ó shin", "relative_time.full.days": "{number, plural, one {# lá} other {# lá}} ó shin",
"relative_time.full.hours": "{number, plural, one {# uair} other {# uair}} ó shin", "relative_time.full.hours": "{number, plural, one {# uair} other {# uair}} ó shin",
@ -826,6 +837,7 @@
"status.reblogs.empty": "Níor mhol éinne an phostáil seo fós. Nuair a mholfaidh duine éigin í, taispeánfar anseo é sin.", "status.reblogs.empty": "Níor mhol éinne an phostáil seo fós. Nuair a mholfaidh duine éigin í, taispeánfar anseo é sin.",
"status.redraft": "Scrios ⁊ athdhréachtaigh", "status.redraft": "Scrios ⁊ athdhréachtaigh",
"status.remove_bookmark": "Bain leabharmharc", "status.remove_bookmark": "Bain leabharmharc",
"status.remove_favourite": "Bain ó cheanáin",
"status.replied_in_thread": "D'fhreagair sa snáithe", "status.replied_in_thread": "D'fhreagair sa snáithe",
"status.replied_to": "D'fhreagair {name}", "status.replied_to": "D'fhreagair {name}",
"status.reply": "Freagair", "status.reply": "Freagair",

View file

@ -453,10 +453,11 @@
"keyboard_shortcuts.requests": "Követési kérések listájának megnyitása", "keyboard_shortcuts.requests": "Követési kérések listájának megnyitása",
"keyboard_shortcuts.search": "Fókuszálás a keresősávra", "keyboard_shortcuts.search": "Fókuszálás a keresősávra",
"keyboard_shortcuts.spoilers": "Tartalmi figyelmeztetés mező megjelenítése/elrejtése", "keyboard_shortcuts.spoilers": "Tartalmi figyelmeztetés mező megjelenítése/elrejtése",
"keyboard_shortcuts.start": "\"Első lépések\" oszlop megnyitása", "keyboard_shortcuts.start": "„Első lépések” oszlop megnyitása",
"keyboard_shortcuts.toggle_hidden": "Tartalmi figyelmeztetéssel ellátott szöveg megjelenítése/elrejtése", "keyboard_shortcuts.toggle_hidden": "Tartalmi figyelmeztetéssel ellátott szöveg megjelenítése/elrejtése",
"keyboard_shortcuts.toggle_sensitivity": "Média megjelenítése/elrejtése", "keyboard_shortcuts.toggle_sensitivity": "Média megjelenítése/elrejtése",
"keyboard_shortcuts.toot": "Új bejegyzés írása", "keyboard_shortcuts.toot": "Új bejegyzés írása",
"keyboard_shortcuts.translate": "Bejegyzés lefordítása",
"keyboard_shortcuts.unfocus": "Szerkesztés/keresés fókuszból való kivétele", "keyboard_shortcuts.unfocus": "Szerkesztés/keresés fókuszból való kivétele",
"keyboard_shortcuts.up": "Mozgás felfelé a listában", "keyboard_shortcuts.up": "Mozgás felfelé a listában",
"lightbox.close": "Bezárás", "lightbox.close": "Bezárás",

View file

@ -457,6 +457,7 @@
"keyboard_shortcuts.toggle_hidden": "Monstrar/celar texto detra advertimento de contento", "keyboard_shortcuts.toggle_hidden": "Monstrar/celar texto detra advertimento de contento",
"keyboard_shortcuts.toggle_sensitivity": "Monstrar/celar multimedia", "keyboard_shortcuts.toggle_sensitivity": "Monstrar/celar multimedia",
"keyboard_shortcuts.toot": "Initiar un nove message", "keyboard_shortcuts.toot": "Initiar un nove message",
"keyboard_shortcuts.translate": "a traducer un message",
"keyboard_shortcuts.unfocus": "Disfocalisar le area de composition de texto/de recerca", "keyboard_shortcuts.unfocus": "Disfocalisar le area de composition de texto/de recerca",
"keyboard_shortcuts.up": "Displaciar in alto in le lista", "keyboard_shortcuts.up": "Displaciar in alto in le lista",
"lightbox.close": "Clauder", "lightbox.close": "Clauder",
@ -802,7 +803,7 @@
"status.bookmark": "Adder al marcapaginas", "status.bookmark": "Adder al marcapaginas",
"status.cancel_reblog_private": "Disfacer impulso", "status.cancel_reblog_private": "Disfacer impulso",
"status.cannot_reblog": "Iste message non pote esser impulsate", "status.cannot_reblog": "Iste message non pote esser impulsate",
"status.continued_thread": "Discussion continuate", "status.continued_thread": "Continuation del discussion",
"status.copy": "Copiar ligamine a message", "status.copy": "Copiar ligamine a message",
"status.delete": "Deler", "status.delete": "Deler",
"status.detailed_status": "Vista detaliate del conversation", "status.detailed_status": "Vista detaliate del conversation",
@ -836,6 +837,7 @@
"status.reblogs.empty": "Necuno ha ancora impulsate iste message. Quando alcuno lo face, le impulsos apparera hic.", "status.reblogs.empty": "Necuno ha ancora impulsate iste message. Quando alcuno lo face, le impulsos apparera hic.",
"status.redraft": "Deler e reconciper", "status.redraft": "Deler e reconciper",
"status.remove_bookmark": "Remover marcapagina", "status.remove_bookmark": "Remover marcapagina",
"status.remove_favourite": "Remover del favoritos",
"status.replied_in_thread": "Respondite in le discussion", "status.replied_in_thread": "Respondite in le discussion",
"status.replied_to": "Respondite a {name}", "status.replied_to": "Respondite a {name}",
"status.reply": "Responder", "status.reply": "Responder",

View file

@ -431,11 +431,11 @@
"keyboard_shortcuts.column": "Focalizza alla colonna", "keyboard_shortcuts.column": "Focalizza alla colonna",
"keyboard_shortcuts.compose": "Focalizza l'area di composizione testuale", "keyboard_shortcuts.compose": "Focalizza l'area di composizione testuale",
"keyboard_shortcuts.description": "Descrizione", "keyboard_shortcuts.description": "Descrizione",
"keyboard_shortcuts.direct": "per aprire la colonna menzioni private", "keyboard_shortcuts.direct": "Apre la colonna \"menzioni private\"",
"keyboard_shortcuts.down": "Scorri in basso nell'elenco", "keyboard_shortcuts.down": "Scorri in basso nell'elenco",
"keyboard_shortcuts.enter": "Apre il post", "keyboard_shortcuts.enter": "Apre il post",
"keyboard_shortcuts.favourite": "Contrassegna il post come preferito", "keyboard_shortcuts.favourite": "Contrassegna il post come preferito",
"keyboard_shortcuts.favourites": "Apri l'elenco dei preferiti", "keyboard_shortcuts.favourites": "Apre l'elenco dei preferiti",
"keyboard_shortcuts.federated": "Apre la cronologia federata", "keyboard_shortcuts.federated": "Apre la cronologia federata",
"keyboard_shortcuts.heading": "Scorciatoie da tastiera", "keyboard_shortcuts.heading": "Scorciatoie da tastiera",
"keyboard_shortcuts.home": "Apre la cronologia domestica", "keyboard_shortcuts.home": "Apre la cronologia domestica",
@ -457,6 +457,7 @@
"keyboard_shortcuts.toggle_hidden": "Mostra/Nasconde il testo dietro CW", "keyboard_shortcuts.toggle_hidden": "Mostra/Nasconde il testo dietro CW",
"keyboard_shortcuts.toggle_sensitivity": "Mostra/Nasconde media", "keyboard_shortcuts.toggle_sensitivity": "Mostra/Nasconde media",
"keyboard_shortcuts.toot": "Crea un nuovo post", "keyboard_shortcuts.toot": "Crea un nuovo post",
"keyboard_shortcuts.translate": "Traduce un post",
"keyboard_shortcuts.unfocus": "Rimuove il focus sull'area di composizione testuale/ricerca", "keyboard_shortcuts.unfocus": "Rimuove il focus sull'area di composizione testuale/ricerca",
"keyboard_shortcuts.up": "Scorre in su nell'elenco", "keyboard_shortcuts.up": "Scorre in su nell'elenco",
"lightbox.close": "Chiudi", "lightbox.close": "Chiudi",

View file

@ -533,6 +533,13 @@
"ignore_notifications_modal.not_followers_title": "本当に「フォローされていないアカウントからの通知」を無視するようにしますか?", "ignore_notifications_modal.not_followers_title": "本当に「フォローされていないアカウントからの通知」を無視するようにしますか?",
"ignore_notifications_modal.not_following_title": "本当に「フォローしていないアカウントからの通知」を無視するようにしますか?", "ignore_notifications_modal.not_following_title": "本当に「フォローしていないアカウントからの通知」を無視するようにしますか?",
"ignore_notifications_modal.private_mentions_title": "本当に「外部からの非公開の返信」を無視するようにしますか?", "ignore_notifications_modal.private_mentions_title": "本当に「外部からの非公開の返信」を無視するようにしますか?",
"interaction_modal.action.favourite": "お気に入り登録はあなたのアカウントがあるサーバーで行う必要があります。",
"interaction_modal.action.follow": "ユーザーをフォローするには、あなたのアカウントがあるサーバーからフォローする必要があります。",
"interaction_modal.action.reblog": "投稿をブーストするには、あなたのアカウントがあるサーバーでブーストする必要があります。",
"interaction_modal.action.reply": "リプライを送るには、あなたのアカウントがあるサーバーから送る必要があります。",
"interaction_modal.action.vote": "票を入れるには、あなたのアカウントがあるサーバーから投票する必要があります。",
"interaction_modal.go": "サーバーに移動",
"interaction_modal.no_account_yet": "アカウントを持っていない場合は:",
"interaction_modal.on_another_server": "別のサーバー", "interaction_modal.on_another_server": "別のサーバー",
"interaction_modal.on_this_server": "このサーバー", "interaction_modal.on_this_server": "このサーバー",
"interaction_modal.title.favourite": "{name}さんの投稿をお気に入り登録", "interaction_modal.title.favourite": "{name}さんの投稿をお気に入り登録",
@ -540,6 +547,7 @@
"interaction_modal.title.reblog": "{name}さんの投稿をブースト", "interaction_modal.title.reblog": "{name}さんの投稿をブースト",
"interaction_modal.title.reply": "{name}さんの投稿にリプライ", "interaction_modal.title.reply": "{name}さんの投稿にリプライ",
"interaction_modal.title.vote": "{name}さんのアンケートに投票", "interaction_modal.title.vote": "{name}さんのアンケートに投票",
"interaction_modal.username_prompt": "例: {example}",
"intervals.full.days": "{number}日", "intervals.full.days": "{number}日",
"intervals.full.hours": "{number}時間", "intervals.full.hours": "{number}時間",
"intervals.full.minutes": "{number}分", "intervals.full.minutes": "{number}分",

View file

@ -345,7 +345,7 @@
"hints.profiles.see_more_followers": "Skatīt vairāk sekotāju {domain}", "hints.profiles.see_more_followers": "Skatīt vairāk sekotāju {domain}",
"hints.profiles.see_more_follows": "Skatīt vairāk sekojumu {domain}", "hints.profiles.see_more_follows": "Skatīt vairāk sekojumu {domain}",
"hints.profiles.see_more_posts": "Skatīt vairāk ierakstu {domain}", "hints.profiles.see_more_posts": "Skatīt vairāk ierakstu {domain}",
"hints.threads.replies_may_be_missing": "Var trūkt atbildes no citiem serveriem.", "hints.threads.replies_may_be_missing": "Var trūkt atbilžu no citiem serveriem.",
"hints.threads.see_more": "Skatīt vairāk atbilžu {domain}", "hints.threads.see_more": "Skatīt vairāk atbilžu {domain}",
"home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus", "home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus",
"home.column_settings.show_replies": "Rādīt atbildes", "home.column_settings.show_replies": "Rādīt atbildes",

View file

@ -126,9 +126,35 @@
"bundle_column_error.network.title": "網路錯誤", "bundle_column_error.network.title": "網路錯誤",
"bundle_column_error.retry": "Koh試", "bundle_column_error.retry": "Koh試",
"bundle_column_error.return": "Tńg去頭頁", "bundle_column_error.return": "Tńg去頭頁",
"bundle_column_error.routing.body": "Tshuē bô所要求ê頁面。Lí kám確定地址liâu-á ê URL正確",
"bundle_column_error.routing.title": "404", "bundle_column_error.routing.title": "404",
"bundle_modal_error.close": "關", "bundle_modal_error.close": "關",
"bundle_modal_error.message": "Tī載入tsit ê畫面ê時起錯誤。",
"bundle_modal_error.retry": "Koh試",
"column.create_list": "建立列單",
"column.direct": "私人ê提起",
"column.directory": "瀏覽個人資料",
"column.domain_blocks": "封鎖ê域名",
"column.edit_list": "編輯列單",
"column.favourites": "Siōng kah意",
"column.firehose": "Tsit-má ê動態",
"column.follow_requests": "跟tuè請求",
"column.home": "頭頁",
"column_header.pin": "釘",
"column_header.show_settings": "顯示設定",
"column_header.unpin": "Pak掉",
"column_search.cancel": "取消",
"column_subheading.settings": "設定",
"community.column_settings.local_only": "Kan-ta展示本地ê",
"community.column_settings.media_only": "Kan-ta展示媒體",
"community.column_settings.remote_only": "Kan-ta展示遠距離ê",
"compose.language.change": "換語言", "compose.language.change": "換語言",
"compose.language.search": "Tshiau-tshuē語言……",
"compose.published.body": "成功PO文。",
"compose.published.open": "開",
"compose.saved.body": "PO文儲存ah。",
"compose_form.direct_message_warning_learn_more": "詳細資訊",
"compose_form.encryption_warning": "Mastodon ê PO文無點tuì點加密。M̄通用Mastodon分享任何敏感ê資訊。",
"confirmations.follow_to_list.confirm": "跟tuè加入kàu列單", "confirmations.follow_to_list.confirm": "跟tuè加入kàu列單",
"notification.favourite_pm": "{name} kah意lí ê私人提起", "notification.favourite_pm": "{name} kah意lí ê私人提起",
"notification.favourite_pm.name_and_others_with_link": "{name} kap<a>{count, plural, other {另外 # ê lâng}}</a>kah意lí ê私人提起", "notification.favourite_pm.name_and_others_with_link": "{name} kap<a>{count, plural, other {另外 # ê lâng}}</a>kah意lí ê私人提起",

View file

@ -47,11 +47,13 @@
"account.mutual": "आपसी", "account.mutual": "आपसी",
"account.no_bio": "कुनै विवरण प्रदान गरिएको छैन।", "account.no_bio": "कुनै विवरण प्रदान गरिएको छैन।",
"account.posts": "पोस्टहरू", "account.posts": "पोस्टहरू",
"account.posts_with_replies": "पोस्ट र जवाफहरू",
"account.report": "@{name}लाई रिपोर्ट गर्नुहोस्", "account.report": "@{name}लाई रिपोर्ट गर्नुहोस्",
"account.requested": "स्वीकृतिको पर्खाइमा। फलो अनुरोध रद्द गर्न क्लिक गर्नुहोस्", "account.requested": "स्वीकृतिको पर्खाइमा। फलो अनुरोध रद्द गर्न क्लिक गर्नुहोस्",
"account.requested_follow": "{name} ले तपाईंलाई फलो गर्न अनुरोध गर्नुभएको छ", "account.requested_follow": "{name} ले तपाईंलाई फलो गर्न अनुरोध गर्नुभएको छ",
"account.share": "@{name} को प्रोफाइल सेयर गर्नुहोस्", "account.share": "@{name} को प्रोफाइल सेयर गर्नुहोस्",
"account.show_reblogs": "@{name} को बूस्टहरू देखाउनुहोस्", "account.show_reblogs": "@{name} को बूस्टहरू देखाउनुहोस्",
"account.statuses_counter": "{count, plural, one {{counter} पोस्ट} other {{counter} पोस्टहरू}}",
"account.unblock": "@{name} लाई अनब्लक गर्नुहोस्", "account.unblock": "@{name} लाई अनब्लक गर्नुहोस्",
"account.unblock_domain": "{domain} डोमेनलाई अनब्लक गर्नुहोस्", "account.unblock_domain": "{domain} डोमेनलाई अनब्लक गर्नुहोस्",
"account.unblock_short": "अनब्लक गर्नुहोस्", "account.unblock_short": "अनब्लक गर्नुहोस्",
@ -67,14 +69,18 @@
"alert.unexpected.message": "एउटा अनपेक्षित त्रुटि भयो।", "alert.unexpected.message": "एउटा अनपेक्षित त्रुटि भयो।",
"announcement.announcement": "घोषणा", "announcement.announcement": "घोषणा",
"annual_report.summary.followers.followers": "फलोअरहरु", "annual_report.summary.followers.followers": "फलोअरहरु",
"annual_report.summary.highlighted_post.by_reblogs": "सबैभन्दा बढि बूस्ट गरिएको पोस्ट",
"annual_report.summary.new_posts.new_posts": "नयाँ पोस्टहरू", "annual_report.summary.new_posts.new_posts": "नयाँ पोस्टहरू",
"block_modal.remote_users_caveat": "हामी सर्भर {domain} लाई तपाईंको निर्णयको सम्मान गर्न सोध्नेछौं। तर, हामी अनुपालनको ग्यारेन्टी दिन सक्दैनौं किनभने केही सर्भरहरूले ब्लकहरू फरक रूपमा ह्यान्डल गर्न सक्छन्। सार्वजनिक पोस्टहरू लग इन नभएका प्रयोगकर्ताहरूले देख्न सक्छन्।", "block_modal.remote_users_caveat": "हामी सर्भर {domain} लाई तपाईंको निर्णयको सम्मान गर्न सोध्नेछौं। तर, हामी अनुपालनको ग्यारेन्टी दिन सक्दैनौं किनभने केही सर्भरहरूले ब्लकहरू फरक रूपमा ह्यान्डल गर्न सक्छन्। सार्वजनिक पोस्टहरू लग इन नभएका प्रयोगकर्ताहरूले देख्न सक्छन्।",
"block_modal.show_less": "कम देखाउनुहोस्", "block_modal.show_less": "कम देखाउनुहोस्",
"block_modal.show_more": "थप देखाउनुहोस्", "block_modal.show_more": "थप देखाउनुहोस्",
"block_modal.title": "प्रयोगकर्तालाई ब्लक गर्ने हो?", "block_modal.title": "प्रयोगकर्तालाई ब्लक गर्ने?",
"boost_modal.reblog": "पोस्ट बुस्ट गर्ने?",
"boost_modal.undo_reblog": "पोस्ट अनबुस्ट गर्ने?",
"bundle_column_error.copy_stacktrace": "त्रुटि रिपोर्ट प्रतिलिपि गर्नुहोस्", "bundle_column_error.copy_stacktrace": "त्रुटि रिपोर्ट प्रतिलिपि गर्नुहोस्",
"bundle_column_error.network.title": "नेटवर्क त्रुटि", "bundle_column_error.network.title": "नेटवर्क त्रुटि",
"bundle_column_error.retry": "पुन: प्रयास गर्नुहोस्", "bundle_column_error.retry": "पुन: प्रयास गर्नुहोस्",
"bundle_column_error.routing.title": "४०४",
"bundle_modal_error.close": "बन्द गर्नुहोस्", "bundle_modal_error.close": "बन्द गर्नुहोस्",
"bundle_modal_error.retry": "Try again", "bundle_modal_error.retry": "Try again",
"closed_registrations.other_server_instructions": "Mastodon विकेन्द्रीकृत भएकोले, तपाइँ अर्को सर्भरमा खाता खोल्न सक्नुहुन्छ र पनि यो सर्भरसँग अन्तरक्रिया गर्न सक्नुहुन्छ।", "closed_registrations.other_server_instructions": "Mastodon विकेन्द्रीकृत भएकोले, तपाइँ अर्को सर्भरमा खाता खोल्न सक्नुहुन्छ र पनि यो सर्भरसँग अन्तरक्रिया गर्न सक्नुहुन्छ।",
@ -82,23 +88,54 @@
"closed_registrations_modal.find_another_server": "अर्को सर्भर खोज्नुहोस्", "closed_registrations_modal.find_another_server": "अर्को सर्भर खोज्नुहोस्",
"closed_registrations_modal.title": "Mastodon मा साइन अप गर्दै", "closed_registrations_modal.title": "Mastodon मा साइन अप गर्दै",
"column.blocks": "ब्लक गरिएको प्रयोगकर्ताहरु", "column.blocks": "ब्लक गरिएको प्रयोगकर्ताहरु",
"column.bookmarks": "बुकमार्कहरू",
"column.create_list": "सूची बनाउनुहोस्",
"column.direct": "निजी उल्लेखहरू",
"column.directory": "प्रोफाइल ब्राउज गर्नुहोस्", "column.directory": "प्रोफाइल ब्राउज गर्नुहोस्",
"column.domain_blocks": "ब्लक गरिएको डोमेन", "column.domain_blocks": "ब्लक गरिएको डोमेन",
"column.edit_list": "सूची सम्पादन गर्नुहोस्",
"column.follow_requests": "फलो अनुरोधहरू", "column.follow_requests": "फलो अनुरोधहरू",
"column.home": "गृहपृष्ठ",
"column.lists": "सूचीहरू", "column.lists": "सूचीहरू",
"column.mutes": "म्यूट गरिएका प्रयोगकर्ताहरू",
"column.notifications": "सूचनाहरू", "column.notifications": "सूचनाहरू",
"column.pins": "पिन गरिएका पोस्टहरू",
"column_header.hide_settings": "सेटिङ्हरू लुकाउनुहोस्", "column_header.hide_settings": "सेटिङ्हरू लुकाउनुहोस्",
"column_header.pin": "पिन गर्नुहोस्",
"column_header.unpin": "अनपिन गर्नुहोस्",
"column_search.cancel": "रद्द गर्नुहोस्",
"column_subheading.settings": "सेटिङहरू", "column_subheading.settings": "सेटिङहरू",
"community.column_settings.media_only": "मिडिया मात्र",
"compose.language.change": "भाषा परिवर्तन गर्नुहोस्", "compose.language.change": "भाषा परिवर्तन गर्नुहोस्",
"compose.language.search": "भाषाहरू खोज्नुहोस्...", "compose.language.search": "भाषाहरू खोज्नुहोस्...",
"compose.published.body": "पोस्ट प्रकाशित भयो।",
"compose.published.open": "खोल्नुहोस्",
"compose.saved.body": "पोस्ट सेभ गरियो।",
"compose_form.direct_message_warning_learn_more": "थप जान्नुहोस्", "compose_form.direct_message_warning_learn_more": "थप जान्नुहोस्",
"compose_form.placeholder": "तपाईको मनमा के छ?",
"compose_form.publish": "पोस्ट गर्नुहोस्",
"compose_form.publish_form": "नयाँ पोस्ट", "compose_form.publish_form": "नयाँ पोस्ट",
"compose_form.reply": "जवाफ दिनुहोस्",
"compose_form.save_changes": "अपडेट गर्नुहोस्",
"confirmations.delete.message": "के तपाइँ पक्का हुनुहुन्छ कि तपाईं यो पोष्ट मेटाउन चाहनुहुन्छ?",
"confirmations.delete.title": "पोस्ट मेटाउने?",
"confirmations.delete_list.message": "के तपाइँ पक्का हुनुहुन्छ कि तपाईं यो सूची स्थायी रूपमा मेटाउन चाहनुहुन्छ?",
"confirmations.delete_list.title": "सूची मेटाउने?",
"confirmations.edit.confirm": "सम्पादन गर्नुहोस्",
"confirmations.edit.message": "अहिले सम्पादन गर्नाले तपाईंले हाल लेखिरहनुभएको सन्देश अधिलेखन हुनेछ। के तपाईं अगाडि बढ्न चाहनुहुन्छ?",
"confirmations.edit.title": "पोस्ट अधिलेखन गर्ने?",
"confirmations.follow_to_list.confirm": "फलो गर्नुहोस र सूचीमा थप्नुहोस्", "confirmations.follow_to_list.confirm": "फलो गर्नुहोस र सूचीमा थप्नुहोस्",
"confirmations.follow_to_list.message": "सूचीमा {name}लाई थप्नको लागि तपाईंले तिनीहरूलाई फलो गरेको हुनुपर्छ।", "confirmations.follow_to_list.message": "सूचीमा {name}लाई थप्नको लागि तपाईंले तिनीहरूलाई फलो गरेको हुनुपर्छ।",
"confirmations.follow_to_list.title": "प्रयोगकर्तालाई फलो गर्ने हो?", "confirmations.follow_to_list.title": "प्रयोगकर्तालाई फलो गर्ने?",
"confirmations.logout.message": "के तपाइँ पक्का हुनुहुन्छ कि तपाइँ लाई लग आउट गर्न चाहनुहुन्छ?",
"confirmations.logout.title": "लग आउट गर्ने?",
"confirmations.redraft.title": "पोस्ट मेटाएर पुन: ड्राफ्ट गर्ने?",
"confirmations.reply.message": "अहिले जवाफ दिनाले तपाईंले हाल लेखिरहनुभएको सन्देश अधिलेखन हुनेछ। के तपाईं अगाडि बढ्न चाहनुहुन्छ?",
"confirmations.reply.title": "पोस्ट अधिलेखन गर्ने?",
"confirmations.unfollow.confirm": "अनफलो गर्नुहोस्", "confirmations.unfollow.confirm": "अनफलो गर्नुहोस्",
"confirmations.unfollow.message": "के तपाइँ पक्का हुनुहुन्छ कि तपाइँ {name}लाई अनफलो गर्न चाहनुहुन्छ?", "confirmations.unfollow.message": "के तपाइँ पक्का हुनुहुन्छ कि तपाइँ {name}लाई अनफलो गर्न चाहनुहुन्छ?",
"confirmations.unfollow.title": "प्रयोगकर्तालाई अनफलो गर्ने हो?", "confirmations.unfollow.title": "प्रयोगकर्तालाई अनफलो गर्ने?",
"disabled_account_banner.account_settings": "खाता सेटिङहरू",
"empty_column.follow_requests": "तपाईंले अहिलेसम्म कुनै पनि फलो अनुरोधहरू प्राप्त गर्नुभएको छैन। तपाईंले कुनै प्राप्त गरेपछि त्यो यहाँ देखिनेछ।", "empty_column.follow_requests": "तपाईंले अहिलेसम्म कुनै पनि फलो अनुरोधहरू प्राप्त गर्नुभएको छैन। तपाईंले कुनै प्राप्त गरेपछि त्यो यहाँ देखिनेछ।",
"empty_column.followed_tags": "तपाईंले अहिलेसम्म कुनै पनि ह्यासट्यागहरू फलो गर्नुभएको छैन। तपाईंले ह्यासट्याग फलो गरेपछि तिनीहरू यहाँ देखिनेछन्।", "empty_column.followed_tags": "तपाईंले अहिलेसम्म कुनै पनि ह्यासट्यागहरू फलो गर्नुभएको छैन। तपाईंले ह्यासट्याग फलो गरेपछि तिनीहरू यहाँ देखिनेछन्।",
"follow_suggestions.dismiss": "फेरि नदेखाउनुहोस्", "follow_suggestions.dismiss": "फेरि नदेखाउनुहोस्",
@ -111,15 +148,35 @@
"followed_tags": "फलो गरिएका ह्यासट्यागहरू", "followed_tags": "फलो गरिएका ह्यासट्यागहरू",
"hashtag.follow": "ह्यासट्याग फलो गर्नुहोस्", "hashtag.follow": "ह्यासट्याग फलो गर्नुहोस्",
"hashtag.unfollow": "ह्यासट्याग अनफलो गर्नुहोस्", "hashtag.unfollow": "ह्यासट्याग अनफलो गर्नुहोस्",
"home.column_settings.show_reblogs": "बूस्टहरू देखाउनुहोस्",
"interaction_modal.no_account_yet": "अहिलेसम्म खाता छैन?",
"interaction_modal.title.follow": "{name} लाई फलो गर्नुहोस्", "interaction_modal.title.follow": "{name} लाई फलो गर्नुहोस्",
"interaction_modal.title.reblog": "{name} को पोस्ट बुस्ट गर्नुहोस्",
"keyboard_shortcuts.boost": "पोस्ट बुस्ट गर्नुहोस्",
"mute_modal.they_wont_know": "उनीहरूलाई म्यूट गरिएको बारे थाहा हुँदैन।", "mute_modal.they_wont_know": "उनीहरूलाई म्यूट गरिएको बारे थाहा हुँदैन।",
"mute_modal.title": "प्रयोगकर्तालाई म्युट गर्ने हो?", "mute_modal.title": "प्रयोगकर्तालाई म्युट गर्ने?",
"navigation_bar.blocks": "ब्लक गरिएको प्रयोगकर्ताहरु", "navigation_bar.blocks": "ब्लक गरिएको प्रयोगकर्ताहरु",
"navigation_bar.follow_requests": "फलो अनुरोधहरू", "navigation_bar.follow_requests": "फलो अनुरोधहरू",
"navigation_bar.followed_tags": "फलो गरिएका ह्यासट्यागहरू", "navigation_bar.followed_tags": "फलो गरिएका ह्यासट्यागहरू",
"notification.reblog": "{name} ले तपाईंको पोस्ट बूस्ट गर्नुभयो",
"notification_requests.confirm_accept_multiple.title": "सूचना अनुरोधहरू स्वीकार गर्ने?",
"notification_requests.confirm_dismiss_multiple.title": "सूचना अनुरोधहरू खारेज गर्ने?",
"notifications.clear_title": "सूचनाहरू खाली गर्ने?",
"notifications.column_settings.reblog": "बूस्टहरू:",
"notifications.filter.boosts": "बूस्टहरू",
"report.comment.title": "के हामीले थाहा पाउनुपर्ने अरू केही छ जस्तो लाग्छ?",
"report.forward_hint": "यो खाता अर्को सर्भरबाट हो। त्यहाँ पनि रिपोर्टको गुमनाम प्रतिलिपि पठाउने हो?",
"report.rules.title": "कुन नियमहरू उल्लङ्घन भइरहेका छन्?",
"report.statuses.title": "के यस रिपोर्टलाई समर्थन गर्ने कुनै पोस्टहरू छन्?",
"report.thanks.title": "यो हेर्न चाहनुहुन्न?",
"report.unfollow": "@{name} लाई अनफलो गर्नुहोस्", "report.unfollow": "@{name} लाई अनफलो गर्नुहोस्",
"search_results.hashtags": "ह्यासट्यागहरू", "search_results.hashtags": "ह्यासट्यागहरू",
"status.cancel_reblog_private": "अनबुस्ट गर्नुहोस्",
"status.cannot_reblog": "यो पोस्टलाई बुस्ट गर्न सकिँदैन",
"status.mute": "@{name}लाई म्यूट गर्नुहोस्", "status.mute": "@{name}लाई म्यूट गर्नुहोस्",
"status.mute_conversation": "कुराकानी म्यूट गर्नुहोस्", "status.mute_conversation": "कुराकानी म्यूट गर्नुहोस्",
"status.reblog": "बूस्ट गर्नुहोस्",
"status.reblogged_by": "{name} ले बूस्ट गर्नुभएको",
"status.reblogs": "{count, plural, one {बूस्ट} other {बूस्टहरू}}",
"status.unmute_conversation": "कुराकानी अनम्यूट गर्नुहोस्" "status.unmute_conversation": "कुराकानी अनम्यूट गर्नुहोस्"
} }

View file

@ -837,6 +837,7 @@
"status.reblogs.empty": "Ingen har framheva dette tutet enno. Om nokon gjer, så dukkar det opp her.", "status.reblogs.empty": "Ingen har framheva dette tutet enno. Om nokon gjer, så dukkar det opp her.",
"status.redraft": "Slett & skriv på nytt", "status.redraft": "Slett & skriv på nytt",
"status.remove_bookmark": "Fjern bokmerke", "status.remove_bookmark": "Fjern bokmerke",
"status.remove_favourite": "Fjern frå favorittar",
"status.replied_in_thread": "Svara i tråden", "status.replied_in_thread": "Svara i tråden",
"status.replied_to": "Svarte {name}", "status.replied_to": "Svarte {name}",
"status.reply": "Svar", "status.reply": "Svar",

View file

@ -406,6 +406,9 @@
"ignore_notifications_modal.not_followers_title": "Ignoruj powiadomienia od użytkowników którzy cię nie obserwują?", "ignore_notifications_modal.not_followers_title": "Ignoruj powiadomienia od użytkowników którzy cię nie obserwują?",
"ignore_notifications_modal.not_following_title": "Ignoruj powiadomienia od użytkowników których nie obserwujesz?", "ignore_notifications_modal.not_following_title": "Ignoruj powiadomienia od użytkowników których nie obserwujesz?",
"ignore_notifications_modal.private_mentions_title": "Ignoruj powiadomienia o nieproszonych wzmiankach prywatnych?", "ignore_notifications_modal.private_mentions_title": "Ignoruj powiadomienia o nieproszonych wzmiankach prywatnych?",
"interaction_modal.action.favourite": "Aby kontynuować, musisz dodać do ulubionych na swoim koncie.",
"interaction_modal.action.follow": "Aby kontynuować, musisz obserwować ze swojego konta.",
"interaction_modal.no_account_yet": "Nie masz jeszcze konta?",
"interaction_modal.on_another_server": "Na innym serwerze", "interaction_modal.on_another_server": "Na innym serwerze",
"interaction_modal.on_this_server": "Na tym serwerze", "interaction_modal.on_this_server": "Na tym serwerze",
"interaction_modal.title.favourite": "Polub wpis użytkownika {name}", "interaction_modal.title.favourite": "Polub wpis użytkownika {name}",
@ -413,6 +416,7 @@
"interaction_modal.title.reblog": "Podbij wpis {name}", "interaction_modal.title.reblog": "Podbij wpis {name}",
"interaction_modal.title.reply": "Odpowiedz na post {name}", "interaction_modal.title.reply": "Odpowiedz na post {name}",
"interaction_modal.title.vote": "Weź udział w głosowaniu {name}", "interaction_modal.title.vote": "Weź udział w głosowaniu {name}",
"interaction_modal.username_prompt": "Np. {example}",
"intervals.full.days": "{number, plural, one {# dzień} few {# dni} many {# dni} other {# dni}}", "intervals.full.days": "{number, plural, one {# dzień} few {# dni} many {# dni} other {# dni}}",
"intervals.full.hours": "{number, plural, one {# godzina} few {# godziny} many {# godzin} other {# godzin}}", "intervals.full.hours": "{number, plural, one {# godzina} few {# godziny} many {# godzin} other {# godzin}}",
"intervals.full.minutes": "{number, plural, one {# minuta} few {# minuty} many {# minut} other {# minut}}", "intervals.full.minutes": "{number, plural, one {# minuta} few {# minuty} many {# minut} other {# minut}}",
@ -825,6 +829,7 @@
"status.reblogs.empty": "Nikt nie podbił jeszcze tego wpisu. Gdy ktoś to zrobi, pojawi się tutaj.", "status.reblogs.empty": "Nikt nie podbił jeszcze tego wpisu. Gdy ktoś to zrobi, pojawi się tutaj.",
"status.redraft": "Usuń i przeredaguj", "status.redraft": "Usuń i przeredaguj",
"status.remove_bookmark": "Usuń zakładkę", "status.remove_bookmark": "Usuń zakładkę",
"status.remove_favourite": "Usuń z ulubionych",
"status.replied_in_thread": "Odpowiedź w wątku", "status.replied_in_thread": "Odpowiedź w wątku",
"status.replied_to": "Odpowiedź do wpisu użytkownika {name}", "status.replied_to": "Odpowiedź do wpisu użytkownika {name}",
"status.reply": "Odpowiedz", "status.reply": "Odpowiedz",

View file

@ -108,7 +108,7 @@
"annual_report.summary.thanks": "Obrigada por fazer parte do Mastodon!", "annual_report.summary.thanks": "Obrigada por fazer parte do Mastodon!",
"attachments_list.unprocessed": "(não processado)", "attachments_list.unprocessed": "(não processado)",
"audio.hide": "Ocultar áudio", "audio.hide": "Ocultar áudio",
"block_modal.remote_users_caveat": "Pediremos ao servidor {domínio} que respeite sua decisão. No entanto, a conformidade não é garantida pois alguns servidores podem lidar com os blocos de maneira diferente. As postagens públicas ainda podem estar visíveis para usuários não logados.", "block_modal.remote_users_caveat": "Pediremos ao servidor {domain} que respeite sua decisão. No entanto, a conformidade não é garantida, já que alguns servidores podem lidar com bloqueios de maneira diferente. As postagens públicas ainda podem estar visíveis para usuários não logados.",
"block_modal.show_less": "Mostrar menos", "block_modal.show_less": "Mostrar menos",
"block_modal.show_more": "Mostrar mais", "block_modal.show_more": "Mostrar mais",
"block_modal.they_cant_mention": "Eles não podem mencionar ou seguir você.", "block_modal.they_cant_mention": "Eles não podem mencionar ou seguir você.",
@ -243,12 +243,12 @@
"dismissable_banner.explore_statuses": "Estas publicações através do fediverse estão ganhando atenção hoje. Publicações mais recentes com mais boosts e favoritos são classificados mais altamente.", "dismissable_banner.explore_statuses": "Estas publicações através do fediverse estão ganhando atenção hoje. Publicações mais recentes com mais boosts e favoritos são classificados mais altamente.",
"dismissable_banner.explore_tags": "Estas hashtags estão ganhando atenção hoje no fediverse. Hashtags usadas por muitas pessoas diferentes são classificadas mais altamente.", "dismissable_banner.explore_tags": "Estas hashtags estão ganhando atenção hoje no fediverse. Hashtags usadas por muitas pessoas diferentes são classificadas mais altamente.",
"dismissable_banner.public_timeline": "Estas são as publicações mais recentes das pessoas no fediverse que as pessoas do {domain} seguem.", "dismissable_banner.public_timeline": "Estas são as publicações mais recentes das pessoas no fediverse que as pessoas do {domain} seguem.",
"domain_block_modal.block": "Servidor de blocos.", "domain_block_modal.block": "Bloquear servidor",
"domain_block_modal.block_account_instead": "Bloco @(nome)", "domain_block_modal.block_account_instead": "Bloquear @{name}",
"domain_block_modal.they_can_interact_with_old_posts": "Pessoas deste servidor podem interagir com suas publicações antigas.", "domain_block_modal.they_can_interact_with_old_posts": "Pessoas deste servidor podem interagir com suas publicações antigas.",
"domain_block_modal.they_cant_follow": "Ninguém deste servidor pode lhe seguir.", "domain_block_modal.they_cant_follow": "Ninguém deste servidor pode lhe seguir.",
"domain_block_modal.they_wont_know": "Eles não saberão que foram bloqueados.", "domain_block_modal.they_wont_know": "Eles não saberão que foram bloqueados.",
"domain_block_modal.title": "Dominio do bloco", "domain_block_modal.title": "Bloquear domínio?",
"domain_block_modal.you_will_lose_num_followers": "Você perderá {followersCount, plural, one {{followersCountDisplay} seguidor} other {{followersCountDisplay} seguidores}} e {followingCount, plural, one {{followingCountDisplay} pessoa que você segue} other {{followingCountDisplay} pessoas que você segue}}.", "domain_block_modal.you_will_lose_num_followers": "Você perderá {followersCount, plural, one {{followersCountDisplay} seguidor} other {{followersCountDisplay} seguidores}} e {followingCount, plural, one {{followingCountDisplay} pessoa que você segue} other {{followingCountDisplay} pessoas que você segue}}.",
"domain_block_modal.you_will_lose_relationships": "Você irá perder todos os seguidores e pessoas que você segue neste servidor.", "domain_block_modal.you_will_lose_relationships": "Você irá perder todos os seguidores e pessoas que você segue neste servidor.",
"domain_block_modal.you_wont_see_posts": "Você não verá postagens ou notificações de usuários neste servidor.", "domain_block_modal.you_wont_see_posts": "Você não verá postagens ou notificações de usuários neste servidor.",
@ -259,9 +259,9 @@
"domain_pill.their_server": "Sua casa digital, onde ficam todas as suas postagens.", "domain_pill.their_server": "Sua casa digital, onde ficam todas as suas postagens.",
"domain_pill.their_username": "Seu identificador exclusivo em seu servidor. É possível encontrar usuários com o mesmo nome de usuário em servidores diferentes.", "domain_pill.their_username": "Seu identificador exclusivo em seu servidor. É possível encontrar usuários com o mesmo nome de usuário em servidores diferentes.",
"domain_pill.username": "Nome de usuário", "domain_pill.username": "Nome de usuário",
"domain_pill.whats_in_a_handle": "O que há em uma alça?", "domain_pill.whats_in_a_handle": "O que há em um identificador?",
"domain_pill.who_they_are": "Como os identificadores indicam quem alguém é e onde está, você pode interagir com pessoas na web social de <button>plataformas alimentadas pelo ActivityPub</button>.", "domain_pill.who_they_are": "Como os identificadores indicam quem alguém é e onde está, você pode interagir com pessoas na rede de <button>plataformas alimentadas pelo ActivityPub</button>.",
"domain_pill.who_you_are": "Como seu identificador indica quem você é e onde está, as pessoas podem interagir com você nas redes sociais das <button>plataformas alimentadas pelo ActivityPub</button>.", "domain_pill.who_you_are": "Como seu identificador indica quem você é e onde está, as pessoas podem interagir com você na rede de <button>plataformas alimentadas pelo ActivityPub</button>.",
"domain_pill.your_handle": "Seu identificador:", "domain_pill.your_handle": "Seu identificador:",
"domain_pill.your_server": "Sua casa digital, onde ficam todas as suas postagens. Não gosta deste? Transfira servidores a qualquer momento e traga seus seguidores também.", "domain_pill.your_server": "Sua casa digital, onde ficam todas as suas postagens. Não gosta deste? Transfira servidores a qualquer momento e traga seus seguidores também.",
"domain_pill.your_username": "Seu identificador exclusivo neste servidor. É possível encontrar usuários com o mesmo nome de usuário em servidores diferentes.", "domain_pill.your_username": "Seu identificador exclusivo neste servidor. É possível encontrar usuários com o mesmo nome de usuário em servidores diferentes.",

View file

@ -1,7 +1,7 @@
{ {
"about.blocks": "Servidores moderados", "about.blocks": "Servidores moderados",
"about.contact": "Contacto:", "about.contact": "Contacto:",
"about.disclaimer": "O Mastodon é um software livre, de código aberto e uma marca registada do Mastodon gGmbH.", "about.disclaimer": "O Mastodon é um software livre, de código aberto e uma marca registada de Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Motivo não disponível", "about.domain_blocks.no_reason_available": "Motivo não disponível",
"about.domain_blocks.preamble": "O Mastodon geralmente permite ver e interagir com o conteúdo de utilizadores de qualquer outra instância no fediverso. Estas são as exceções desta instância em específico.", "about.domain_blocks.preamble": "O Mastodon geralmente permite ver e interagir com o conteúdo de utilizadores de qualquer outra instância no fediverso. Estas são as exceções desta instância em específico.",
"about.domain_blocks.silenced.explanation": "Normalmente não verás perfis e conteúdos deste servidor, a não ser que os procures explicitamente ou optes por segui-los.", "about.domain_blocks.silenced.explanation": "Normalmente não verás perfis e conteúdos deste servidor, a não ser que os procures explicitamente ou optes por segui-los.",
@ -85,7 +85,7 @@
"alert.rate_limited.title": "Limite de tentativas", "alert.rate_limited.title": "Limite de tentativas",
"alert.unexpected.message": "Ocorreu um erro inesperado.", "alert.unexpected.message": "Ocorreu um erro inesperado.",
"alert.unexpected.title": "Bolas!", "alert.unexpected.title": "Bolas!",
"alt_text_badge.title": "Texto alternativo", "alt_text_badge.title": "Texto descritivo",
"announcement.announcement": "Mensagem de manutenção", "announcement.announcement": "Mensagem de manutenção",
"annual_report.summary.archetype.booster": "O caçador de frescura", "annual_report.summary.archetype.booster": "O caçador de frescura",
"annual_report.summary.archetype.lurker": "O espreitador", "annual_report.summary.archetype.lurker": "O espreitador",
@ -244,7 +244,7 @@
"dismissable_banner.explore_tags": "Estas etiquetas estão a ganhar força no fediverso atualmente. As etiquetas que são utilizadas por mais pessoas diferentes são classificadas numa posição mais elevada.", "dismissable_banner.explore_tags": "Estas etiquetas estão a ganhar força no fediverso atualmente. As etiquetas que são utilizadas por mais pessoas diferentes são classificadas numa posição mais elevada.",
"dismissable_banner.public_timeline": "Estas são as publicações públicas mais recentes de pessoas no fediverso que as pessoas em {domain} seguem.", "dismissable_banner.public_timeline": "Estas são as publicações públicas mais recentes de pessoas no fediverso que as pessoas em {domain} seguem.",
"domain_block_modal.block": "Bloquear servidor", "domain_block_modal.block": "Bloquear servidor",
"domain_block_modal.block_account_instead": "Bloquear antes @{name}", "domain_block_modal.block_account_instead": "Em vez disso, bloquear @{name}",
"domain_block_modal.they_can_interact_with_old_posts": "As pessoas deste servidor podem interagir com as tuas publicações antigas.", "domain_block_modal.they_can_interact_with_old_posts": "As pessoas deste servidor podem interagir com as tuas publicações antigas.",
"domain_block_modal.they_cant_follow": "Ninguém deste servidor pode seguir-te.", "domain_block_modal.they_cant_follow": "Ninguém deste servidor pode seguir-te.",
"domain_block_modal.they_wont_know": "Eles não saberão que foram bloqueados.", "domain_block_modal.they_wont_know": "Eles não saberão que foram bloqueados.",
@ -260,7 +260,7 @@
"domain_pill.their_username": "O identificador único dele no seu servidor. É possível encontrar utilizadores com o mesmo nome de utilizador em servidores diferentes.", "domain_pill.their_username": "O identificador único dele no seu servidor. É possível encontrar utilizadores com o mesmo nome de utilizador em servidores diferentes.",
"domain_pill.username": "Nome de utilizador", "domain_pill.username": "Nome de utilizador",
"domain_pill.whats_in_a_handle": "Em que consiste um identificador?", "domain_pill.whats_in_a_handle": "Em que consiste um identificador?",
"domain_pill.who_they_are": "Uma vez que os identificadores dizem quem é alguém e onde está, pode interagir com as pessoas através da rede social de <button>plataformas que suportam ActivityPub</button>.", "domain_pill.who_they_are": "Uma vez que os identificadores dizem quem é alguém e onde está, podes interagir com as pessoas através da rede social de <button>plataformas que suportam ActivityPub</button>.",
"domain_pill.who_you_are": "Uma vez que o teu identificador indica quem és e onde estás, as pessoas podem interagir contigo através da rede social de <button>plataformas que suportam ActivityPub</button>.", "domain_pill.who_you_are": "Uma vez que o teu identificador indica quem és e onde estás, as pessoas podem interagir contigo através da rede social de <button>plataformas que suportam ActivityPub</button>.",
"domain_pill.your_handle": "O teu identificador:", "domain_pill.your_handle": "O teu identificador:",
"domain_pill.your_server": "A tua casa digital, onde se encontram todas as tuas publicações. Não gostas deste? Muda de servidor a qualquer momento e leva também os teus seguidores.", "domain_pill.your_server": "A tua casa digital, onde se encontram todas as tuas publicações. Não gostas deste? Muda de servidor a qualquer momento e leva também os teus seguidores.",
@ -642,10 +642,10 @@
"notifications.policy.filter_hint": "Enviar para a caixa de notificações filtradas", "notifications.policy.filter_hint": "Enviar para a caixa de notificações filtradas",
"notifications.policy.filter_limited_accounts_hint": "Limitado pelos moderadores do servidor", "notifications.policy.filter_limited_accounts_hint": "Limitado pelos moderadores do servidor",
"notifications.policy.filter_limited_accounts_title": "Contas moderadas", "notifications.policy.filter_limited_accounts_title": "Contas moderadas",
"notifications.policy.filter_new_accounts.hint": "Criada {days, plural, one {no último dia} other {nos últimos # dias}}", "notifications.policy.filter_new_accounts.hint": "Criadas {days, plural, one {no último dia} other {nos últimos # dias}}",
"notifications.policy.filter_new_accounts_title": "Novas contas", "notifications.policy.filter_new_accounts_title": "Novas contas",
"notifications.policy.filter_not_followers_hint": "Incluindo pessoas que te seguem há menos de {days, plural, one {um dia} other {# dias}}", "notifications.policy.filter_not_followers_hint": "Incluindo pessoas que te seguem há menos de {days, plural, one {um dia} other {# dias}}",
"notifications.policy.filter_not_followers_title": "Pessoas não te seguem", "notifications.policy.filter_not_followers_title": "Pessoas que não te seguem",
"notifications.policy.filter_not_following_hint": "Até que os aproves manualmente", "notifications.policy.filter_not_following_hint": "Até que os aproves manualmente",
"notifications.policy.filter_not_following_title": "Pessoas que não segues", "notifications.policy.filter_not_following_title": "Pessoas que não segues",
"notifications.policy.filter_private_mentions_hint": "Filtrado, a não ser que seja em resposta à tua própria menção ou se seguires o remetente", "notifications.policy.filter_private_mentions_hint": "Filtrado, a não ser que seja em resposta à tua própria menção ou se seguires o remetente",
@ -723,7 +723,7 @@
"report.category.title_account": "perfil", "report.category.title_account": "perfil",
"report.category.title_status": "publicação", "report.category.title_status": "publicação",
"report.close": "Concluído", "report.close": "Concluído",
"report.comment.title": "Há algo mais que pensa que devemos saber?", "report.comment.title": "Há mais alguma coisa que devamos saber?",
"report.forward": "Reencaminhar para {target}", "report.forward": "Reencaminhar para {target}",
"report.forward_hint": "A conta pertence a outro servidor. Enviar uma cópia anónima da denúncia para esse servidor também?", "report.forward_hint": "A conta pertence a outro servidor. Enviar uma cópia anónima da denúncia para esse servidor também?",
"report.mute": "Ocultar", "report.mute": "Ocultar",
@ -739,15 +739,15 @@
"report.reasons.spam": "É spam", "report.reasons.spam": "É spam",
"report.reasons.spam_description": "Hiperligações maliciosas, contactos falsos ou respostas repetitivas", "report.reasons.spam_description": "Hiperligações maliciosas, contactos falsos ou respostas repetitivas",
"report.reasons.violation": "Viola as regras do servidor", "report.reasons.violation": "Viola as regras do servidor",
"report.reasons.violation_description": "Está ciente de que infringe regras específicas", "report.reasons.violation_description": "Infringe regras específicas",
"report.rules.subtitle": "Selecione tudo o que se aplicar", "report.rules.subtitle": "Seleciona tudo o que se aplicar",
"report.rules.title": "Que regras estão a ser violadas?", "report.rules.title": "Que regras estão a ser violadas?",
"report.statuses.subtitle": "Selecione tudo o que se aplicar", "report.statuses.subtitle": "Seleciona tudo o que se aplicar",
"report.statuses.title": "Existe alguma publicação que suporte esta denúncia?", "report.statuses.title": "Existe alguma publicação que suporte esta denúncia?",
"report.submit": "Enviar", "report.submit": "Enviar",
"report.target": "A denunciar {target}", "report.target": "A denunciar {target}",
"report.thanks.take_action": "Aqui estão as suas opções para controlar o que vê no Mastodon:", "report.thanks.take_action": "Aqui estão as suas opções para controlar o que vê no Mastodon:",
"report.thanks.take_action_actionable": "Enquanto revemos a sua denúncia, pode tomar medidas contra @{name}:", "report.thanks.take_action_actionable": "Enquanto revemos a tua denúncia, podes tomar medidas contra @{name}:",
"report.thanks.title": "Não quer ver isto?", "report.thanks.title": "Não quer ver isto?",
"report.thanks.title_actionable": "Obrigado por nos informares, vamos analisar a situação.", "report.thanks.title_actionable": "Obrigado por nos informares, vamos analisar a situação.",
"report.unfollow": "Deixar de seguir @{name}", "report.unfollow": "Deixar de seguir @{name}",
@ -758,7 +758,7 @@
"report_notification.categories.other": "Outro", "report_notification.categories.other": "Outro",
"report_notification.categories.other_sentence": "outro", "report_notification.categories.other_sentence": "outro",
"report_notification.categories.spam": "Spam", "report_notification.categories.spam": "Spam",
"report_notification.categories.spam_sentence": "spam", "report_notification.categories.spam_sentence": "publicidade indesejada / spam",
"report_notification.categories.violation": "Violação de regra", "report_notification.categories.violation": "Violação de regra",
"report_notification.categories.violation_sentence": "violação de regra", "report_notification.categories.violation_sentence": "violação de regra",
"report_notification.open": "Abrir denúncia", "report_notification.open": "Abrir denúncia",
@ -813,7 +813,7 @@
"status.edited": "Última edição em {date}", "status.edited": "Última edição em {date}",
"status.edited_x_times": "Editado {count, plural,one {{count} vez} other {{count} vezes}}", "status.edited_x_times": "Editado {count, plural,one {{count} vez} other {{count} vezes}}",
"status.embed": "Obter código de incorporação", "status.embed": "Obter código de incorporação",
"status.favourite": "Assinalar como favorito", "status.favourite": "Adicionar aos favoritos",
"status.favourites": "{count, plural, one {favorito} other {favoritos}}", "status.favourites": "{count, plural, one {favorito} other {favoritos}}",
"status.filter": "Filtrar esta publicação", "status.filter": "Filtrar esta publicação",
"status.history.created": "{name} criado em {date}", "status.history.created": "{name} criado em {date}",

View file

@ -378,6 +378,8 @@
"ignore_notifications_modal.not_followers_title": "Nevšímať si oznámenia od ľudí, ktorí ťa nenasledujú?", "ignore_notifications_modal.not_followers_title": "Nevšímať si oznámenia od ľudí, ktorí ťa nenasledujú?",
"ignore_notifications_modal.not_following_title": "Nevšímať si oznámenia od ľudí, ktorých nenasleduješ?", "ignore_notifications_modal.not_following_title": "Nevšímať si oznámenia od ľudí, ktorých nenasleduješ?",
"ignore_notifications_modal.private_mentions_title": "Nevšímať si oznámenia o nevyžiadaných súkromných spomínaniach?", "ignore_notifications_modal.private_mentions_title": "Nevšímať si oznámenia o nevyžiadaných súkromných spomínaniach?",
"interaction_modal.action.favourite": "Pre pokračovanie si musíš obľúbiť zo svojho účtu.",
"interaction_modal.action.follow": "Pre pokračovanie musíš nasledovať zo svojho účtu.",
"interaction_modal.action.reply": "Pre pokračovanie musíš odpovedať s tvojho účtu.", "interaction_modal.action.reply": "Pre pokračovanie musíš odpovedať s tvojho účtu.",
"interaction_modal.action.vote": "Pre pokračovanie musíš hlasovať s tvojho účtu.", "interaction_modal.action.vote": "Pre pokračovanie musíš hlasovať s tvojho účtu.",
"interaction_modal.go": "Prejdi", "interaction_modal.go": "Prejdi",
@ -389,6 +391,7 @@
"interaction_modal.title.reblog": "Zdieľať príspevok od {name}", "interaction_modal.title.reblog": "Zdieľať príspevok od {name}",
"interaction_modal.title.reply": "Odpovedať na príspevok od {name}", "interaction_modal.title.reply": "Odpovedať na príspevok od {name}",
"interaction_modal.title.vote": "Hlasuj v ankete od {name}", "interaction_modal.title.vote": "Hlasuj v ankete od {name}",
"interaction_modal.username_prompt": "Napr. {example}",
"intervals.full.days": "{number, plural, one {# deň} few {# dni} many {# dní} other {# dní}}", "intervals.full.days": "{number, plural, one {# deň} few {# dni} many {# dní} other {# dní}}",
"intervals.full.hours": "{number, plural, one {# hodina} few {# hodiny} many {# hodín} other {# hodín}}", "intervals.full.hours": "{number, plural, one {# hodina} few {# hodiny} many {# hodín} other {# hodín}}",
"intervals.full.minutes": "{number, plural, one {# minúta} few {# minúty} many {# minút} other {# minút}}", "intervals.full.minutes": "{number, plural, one {# minúta} few {# minúty} many {# minút} other {# minút}}",
@ -517,6 +520,7 @@
"notification.moderation_warning": "Dostal/a si varovanie od moderátora", "notification.moderation_warning": "Dostal/a si varovanie od moderátora",
"notification.moderation_warning.action_delete_statuses": "Niektoré z tvojich príspevkov boli odstránené.", "notification.moderation_warning.action_delete_statuses": "Niektoré z tvojich príspevkov boli odstránené.",
"notification.moderation_warning.action_disable": "Tvoj účet bol vypnutý.", "notification.moderation_warning.action_disable": "Tvoj účet bol vypnutý.",
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Niektoré tvoje príspevky boli označené za chúlostivé.",
"notification.moderation_warning.action_none": "Tvoj účet dostal upozornenie od moderátora.", "notification.moderation_warning.action_none": "Tvoj účet dostal upozornenie od moderátora.",
"notification.moderation_warning.action_sensitive": "Tvoje príspevky budú odteraz označované ako chúlostivé.", "notification.moderation_warning.action_sensitive": "Tvoje príspevky budú odteraz označované ako chúlostivé.",
"notification.moderation_warning.action_silence": "Tvoj účet bol obmedzený.", "notification.moderation_warning.action_silence": "Tvoj účet bol obmedzený.",
@ -530,6 +534,7 @@
"notification.status": "{name} uverejňuje niečo nové", "notification.status": "{name} uverejňuje niečo nové",
"notification.update": "{name} upravuje príspevok", "notification.update": "{name} upravuje príspevok",
"notification_requests.accept": "Prijať", "notification_requests.accept": "Prijať",
"notification_requests.confirm_accept_multiple.title": "Priať požiadavku o oboznámenia?",
"notification_requests.dismiss": "Zamietnuť", "notification_requests.dismiss": "Zamietnuť",
"notification_requests.edit_selection": "Uprav", "notification_requests.edit_selection": "Uprav",
"notification_requests.exit_selection": "Hotovo", "notification_requests.exit_selection": "Hotovo",
@ -574,9 +579,11 @@
"notifications.policy.accept_hint": "Ukáž v oznámeniach", "notifications.policy.accept_hint": "Ukáž v oznámeniach",
"notifications.policy.drop": "Ignoruj", "notifications.policy.drop": "Ignoruj",
"notifications.policy.filter": "Triediť", "notifications.policy.filter": "Triediť",
"notifications.policy.filter_limited_accounts_hint": "Obmedzené moderátormi servera",
"notifications.policy.filter_limited_accounts_title": "Moderované účty", "notifications.policy.filter_limited_accounts_title": "Moderované účty",
"notifications.policy.filter_new_accounts_title": "Nové účty", "notifications.policy.filter_new_accounts_title": "Nové účty",
"notifications.policy.filter_not_followers_title": "Ľudia, ktorí ťa nenasledujú", "notifications.policy.filter_not_followers_title": "Ľudia, ktorí ťa nenasledujú",
"notifications.policy.filter_not_following_hint": "Pokiaľ ich ručne neschváliš",
"notifications.policy.filter_not_following_title": "Ľudia, ktorých nenasleduješ", "notifications.policy.filter_not_following_title": "Ľudia, ktorých nenasleduješ",
"notifications.policy.filter_private_mentions_title": "Nevyžiadané priame spomenutia", "notifications.policy.filter_private_mentions_title": "Nevyžiadané priame spomenutia",
"notifications.policy.title": "Spravuj oznámenia od…", "notifications.policy.title": "Spravuj oznámenia od…",
@ -624,6 +631,8 @@
"privacy_policy.title": "Pravidlá ochrany súkromia", "privacy_policy.title": "Pravidlá ochrany súkromia",
"recommended": "Odporúčané", "recommended": "Odporúčané",
"refresh": "Obnoviť", "refresh": "Obnoviť",
"regeneration_indicator.please_stand_by": "Prosím, čakajte.",
"regeneration_indicator.preparing_your_home_feed": "Pripravuje sa tvoj domáci kanál…",
"relative_time.days": "{number} dní", "relative_time.days": "{number} dní",
"relative_time.full.days": "Pred {number, plural, one {# dňom} other {# dňami}}", "relative_time.full.days": "Pred {number, plural, one {# dňom} other {# dňami}}",
"relative_time.full.hours": "Pred {number, plural, one {# hodinou} other {# hodinami}}", "relative_time.full.hours": "Pred {number, plural, one {# hodinou} other {# hodinami}}",
@ -714,6 +723,7 @@
"server_banner.about_active_users": "Ľudia používajúci tento server za posledných 30 dní (aktívni používatelia za mesiac)", "server_banner.about_active_users": "Ľudia používajúci tento server za posledných 30 dní (aktívni používatelia za mesiac)",
"server_banner.active_users": "Aktívne účty", "server_banner.active_users": "Aktívne účty",
"server_banner.administered_by": "Správa servera:", "server_banner.administered_by": "Správa servera:",
"server_banner.is_one_of_many": "{domain} je jeden z mnohých nezávislých Mastodon serverov, ktoré môžeš použiť na zúčastňovanie sa v rámci fediversa.",
"server_banner.server_stats": "Štatistiky servera:", "server_banner.server_stats": "Štatistiky servera:",
"sign_in_banner.create_account": "Vytvoriť účet", "sign_in_banner.create_account": "Vytvoriť účet",
"sign_in_banner.sign_in": "Prihlásiť sa", "sign_in_banner.sign_in": "Prihlásiť sa",
@ -756,6 +766,7 @@
"status.reblogs.empty": "Nikto ešte tento príspevok nezdieľal. Keď tak niekto urobí, zobrazí sa to tu.", "status.reblogs.empty": "Nikto ešte tento príspevok nezdieľal. Keď tak niekto urobí, zobrazí sa to tu.",
"status.redraft": "Vymazať a prepísať", "status.redraft": "Vymazať a prepísať",
"status.remove_bookmark": "Odstrániť záložku", "status.remove_bookmark": "Odstrániť záložku",
"status.remove_favourite": "Odstráň z obľúbených",
"status.replied_in_thread": "Odpovedal/a vo vlákne", "status.replied_in_thread": "Odpovedal/a vo vlákne",
"status.replied_to": "Odpoveď na {name}", "status.replied_to": "Odpoveď na {name}",
"status.reply": "Odpovedať", "status.reply": "Odpovedať",

View file

@ -697,6 +697,7 @@
"recommended": "Rekommenderas", "recommended": "Rekommenderas",
"refresh": "Läs om", "refresh": "Läs om",
"regeneration_indicator.please_stand_by": "Vänligen vänta.", "regeneration_indicator.please_stand_by": "Vänligen vänta.",
"regeneration_indicator.preparing_your_home_feed": "Förbereder ditt hemflöde…",
"relative_time.days": "{number}d", "relative_time.days": "{number}d",
"relative_time.full.days": "{number, plural, one {# dag} other {# dagar}} sedan", "relative_time.full.days": "{number, plural, one {# dag} other {# dagar}} sedan",
"relative_time.full.hours": "{number, plural, one {# timme} other {# timmar}} sedan", "relative_time.full.hours": "{number, plural, one {# timme} other {# timmar}} sedan",

View file

@ -550,7 +550,7 @@
"notification.favourite.name_and_others_with_link": "{name} và <a>{count, plural, other {# người khác}}</a> đã thích tút của bạn", "notification.favourite.name_and_others_with_link": "{name} và <a>{count, plural, other {# người khác}}</a> đã thích tút của bạn",
"notification.favourite_pm": "{name} đã thích lượt nhắn riêng của bạn", "notification.favourite_pm": "{name} đã thích lượt nhắn riêng của bạn",
"notification.favourite_pm.name_and_others_with_link": "{name} và <a>{count, plural, other {# người khác}}</a> đã thích lượt nhắn riêng của bạn", "notification.favourite_pm.name_and_others_with_link": "{name} và <a>{count, plural, other {# người khác}}</a> đã thích lượt nhắn riêng của bạn",
"notification.follow": "{name} theo dõi bạn", "notification.follow": "{name} đã theo dõi bạn",
"notification.follow.name_and_others": "{name} và <a>{count, plural, other {# người khác}}</a> theo dõi bạn", "notification.follow.name_and_others": "{name} và <a>{count, plural, other {# người khác}}</a> theo dõi bạn",
"notification.follow_request": "{name} yêu cầu theo dõi bạn", "notification.follow_request": "{name} yêu cầu theo dõi bạn",
"notification.follow_request.name_and_others": "{name} và {count, plural, other {# người khác}} đã yêu cầu theo dõi bạn", "notification.follow_request.name_and_others": "{name} và {count, plural, other {# người khác}} đã yêu cầu theo dõi bạn",
@ -764,7 +764,7 @@
"report_notification.open": "Mở báo cáo", "report_notification.open": "Mở báo cáo",
"search.no_recent_searches": "Gần đây chưa tìm gì", "search.no_recent_searches": "Gần đây chưa tìm gì",
"search.placeholder": "Tìm kiếm", "search.placeholder": "Tìm kiếm",
"search.quick_action.account_search": "Người tên {x}", "search.quick_action.account_search": "Người tên {x}",
"search.quick_action.go_to_account": "Xem trang {x}", "search.quick_action.go_to_account": "Xem trang {x}",
"search.quick_action.go_to_hashtag": "Xem hashtag {x}", "search.quick_action.go_to_hashtag": "Xem hashtag {x}",
"search.quick_action.open_url": "Mở liên kết trong Mastodon", "search.quick_action.open_url": "Mở liên kết trong Mastodon",

View file

@ -7119,6 +7119,8 @@ a.status-card {
} }
&--layout-3 { &--layout-3 {
min-height: calc(64px * 2 + 8px);
& > .media-gallery__item:nth-child(1) { & > .media-gallery__item:nth-child(1) {
border-end-end-radius: 0; border-end-end-radius: 0;
border-start-end-radius: 0; border-start-end-radius: 0;
@ -7138,6 +7140,8 @@ a.status-card {
} }
&--layout-4 { &--layout-4 {
min-height: calc(64px * 2 + 8px);
& > .media-gallery__item:nth-child(1) { & > .media-gallery__item:nth-child(1) {
border-end-end-radius: 0; border-end-end-radius: 0;
border-start-end-radius: 0; border-start-end-radius: 0;

View file

@ -5,6 +5,7 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
def perform def perform
return reject_payload! if delete_arrived_first?(@json['id']) || !related_to_local_activity? return reject_payload! if delete_arrived_first?(@json['id']) || !related_to_local_activity?
return reject_payload! if @object.nil?
with_redis_lock("announce:#{value_or_id(@object)}") do with_redis_lock("announce:#{value_or_id(@object)}") do
original_status = status_from_object original_status = status_from_object

View file

@ -98,8 +98,34 @@ class ActivityPub::TagManager
account_status_shares_url(target.account, target) account_status_shares_url(target.account, target)
end end
def followers_uri_for(target) def following_uri_for(target, ...)
target.local? ? account_followers_url(target) : target.followers_url.presence raise ArgumentError, 'target must be a local account' unless target.local?
account_following_index_url(target, ...)
end
def followers_uri_for(target, ...)
return target.followers_url.presence unless target.local?
account_followers_url(target, ...)
end
def collection_uri_for(target, ...)
raise NotImplementedError unless target.local?
account_collection_url(target, ...)
end
def inbox_uri_for(target)
raise NotImplementedError unless target.local?
target.instance_actor? ? instance_actor_inbox_url : account_inbox_url(target)
end
def outbox_uri_for(target, ...)
raise NotImplementedError unless target.local?
target.instance_actor? ? instance_actor_outbox_url(...) : account_outbox_url(target, ...)
end end
# Primary audience of a status # Primary audience of a status
@ -111,9 +137,9 @@ class ActivityPub::TagManager
when 'public' when 'public'
[COLLECTIONS[:public]] [COLLECTIONS[:public]]
when 'unlisted', 'public_unlisted', 'private' when 'unlisted', 'public_unlisted', 'private'
[account_followers_url(status.account)] [followers_uri_for(status.account)]
when 'login' when 'login'
[account_followers_url(status.account), 'as:LoginOnly', 'kmyblue:LoginOnly', 'LoginUser'] [followers_uri_for(status.account), 'as:LoginOnly', 'kmyblue:LoginOnly', 'LoginUser']
when 'direct' when 'direct'
if status.account.silenced? if status.account.silenced?
# Only notify followers if the account is locally silenced # Only notify followers if the account is locally silenced
@ -156,7 +182,7 @@ class ActivityPub::TagManager
case status.visibility case status.visibility
when 'public' when 'public'
cc << account_followers_url(status.account) cc << followers_uri_for(status.account)
when 'unlisted', 'public_unlisted' when 'unlisted', 'public_unlisted'
cc << COLLECTIONS[:public] cc << COLLECTIONS[:public]
end end

View file

@ -46,6 +46,8 @@ class DeliveryFailureTracker
urls.reject do |url| urls.reject do |url|
host = Addressable::URI.parse(url).normalized_host host = Addressable::URI.parse(url).normalized_host
unavailable_domains_map[host] unavailable_domains_map[host]
rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError
true
end end
end end

View file

@ -111,16 +111,10 @@ class Request
end end
begin begin
# If we are using a persistent connection, we have to
# read every response to be able to move forward at all.
# However, simply calling #to_s or #flush may not be safe,
# as the response body, if malicious, could be too big
# for our memory. So we use the #body_with_limit method
response.body_with_limit if http_client.persistent?
yield response if block_given? yield response if block_given?
ensure ensure
http_client.close unless http_client.persistent? response.truncated_body if http_client.persistent? && !response.connection.finished_request?
http_client.close unless http_client.persistent? && response.connection.finished_request?
end end
end end

View file

@ -2,7 +2,8 @@
class WebPushRequest class WebPushRequest
SIGNATURE_ALGORITHM = 'p256ecdsa' SIGNATURE_ALGORITHM = 'p256ecdsa'
AUTH_HEADER = 'WebPush' LEGACY_AUTH_HEADER = 'WebPush'
STANDARD_AUTH_HEADER = 'vapid'
PAYLOAD_EXPIRATION = 24.hours PAYLOAD_EXPIRATION = 24.hours
JWT_ALGORITHM = 'ES256' JWT_ALGORITHM = 'ES256'
JWT_TYPE = 'JWT' JWT_TYPE = 'JWT'
@ -10,6 +11,7 @@ class WebPushRequest
attr_reader :web_push_subscription attr_reader :web_push_subscription
delegate( delegate(
:standard,
:endpoint, :endpoint,
:key_auth, :key_auth,
:key_p256dh, :key_p256dh,
@ -24,20 +26,36 @@ class WebPushRequest
@audience ||= Addressable::URI.parse(endpoint).normalized_site @audience ||= Addressable::URI.parse(endpoint).normalized_site
end end
def authorization_header def legacy_authorization_header
[AUTH_HEADER, encoded_json_web_token].join(' ') [LEGACY_AUTH_HEADER, encoded_json_web_token].join(' ')
end end
def crypto_key_header def crypto_key_header
[SIGNATURE_ALGORITHM, vapid_key.public_key_for_push_header].join('=') [SIGNATURE_ALGORITHM, vapid_key.public_key_for_push_header].join('=')
end end
def encrypt(payload) def legacy_encrypt(payload)
Webpush::Legacy::Encryption.encrypt(payload, key_p256dh, key_auth)
end
def standard_authorization_header
[STANDARD_AUTH_HEADER, standard_vapid_value].join(' ')
end
def standard_encrypt(payload)
Webpush::Encryption.encrypt(payload, key_p256dh, key_auth) Webpush::Encryption.encrypt(payload, key_p256dh, key_auth)
end end
def legacy
!standard
end
private private
def standard_vapid_value
"t=#{encoded_json_web_token},k=#{vapid_key.public_key_for_push_header}"
end
def encoded_json_web_token def encoded_json_web_token
JWT.encode( JWT.encode(
web_token_payload, web_token_payload,

View file

@ -114,25 +114,27 @@ class Account < ApplicationRecord
validates_with UniqueUsernameValidator, if: -> { will_save_change_to_username? } validates_with UniqueUsernameValidator, if: -> { will_save_change_to_username? }
# Remote user validations, also applies to internal actors # Remote user validations, also applies to internal actors
validates :username, format: { with: USERNAME_ONLY_RE }, if: -> { (remote? || actor_type == 'Application') && will_save_change_to_username? } validates :username, format: { with: USERNAME_ONLY_RE }, if: -> { (remote? || actor_type_application?) && will_save_change_to_username? }
# Remote user validations # Remote user validations
validates :uri, presence: true, unless: :local?, on: :create validates :uri, presence: true, unless: :local?, on: :create
# Local user validations # Local user validations
validates :username, format: { with: /\A[a-z0-9_]+\z/i }, length: { maximum: USERNAME_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' } validates :username, format: { with: /\A[a-z0-9_]+\z/i }, length: { maximum: USERNAME_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_username? && !actor_type_application? }
validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' } validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? && !actor_type_application? }
validates :display_name, length: { maximum: DISPLAY_NAME_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_display_name? } validates :display_name, length: { maximum: DISPLAY_NAME_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_display_name? }
validates :note, note_length: { maximum: NOTE_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_note? } validates :note, note_length: { maximum: NOTE_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_note? }
validates :fields, length: { maximum: DEFAULT_FIELDS_SIZE }, if: -> { local? && will_save_change_to_fields? } validates :fields, length: { maximum: DEFAULT_FIELDS_SIZE }, if: -> { local? && will_save_change_to_fields? }
validates_with EmptyProfileFieldNamesValidator, if: -> { local? && will_save_change_to_fields? } validates_with EmptyProfileFieldNamesValidator, if: -> { local? && will_save_change_to_fields? }
with_options on: :create do with_options on: :create, if: :local? do
validates :uri, absence: true, if: :local? validates :followers_url, absence: true
validates :inbox_url, absence: true, if: :local? validates :inbox_url, absence: true
validates :shared_inbox_url, absence: true, if: :local? validates :shared_inbox_url, absence: true
validates :followers_url, absence: true, if: :local? validates :uri, absence: true
end end
validates :domain, exclusion: { in: [''] }
normalizes :username, with: ->(username) { username.squish } normalizes :username, with: ->(username) { username.squish }
scope :without_internal, -> { where(id: 1...) } scope :without_internal, -> { where(id: 1...) }
@ -194,7 +196,7 @@ class Account < ApplicationRecord
end end
def remote? def remote?
domain.present? !domain.nil?
end end
def moved? def moved?
@ -215,6 +217,10 @@ class Account < ApplicationRecord
self.actor_type = ActiveModel::Type::Boolean.new.cast(val) ? 'Service' : 'Person' self.actor_type = ActiveModel::Type::Boolean.new.cast(val) ? 'Service' : 'Person'
end end
def actor_type_application?
actor_type == 'Application'
end
def group? def group?
actor_type == 'Group' actor_type == 'Group'
end end

View file

@ -28,6 +28,7 @@ class AccountWarning < ApplicationRecord
suspend: 4_000, suspend: 4_000,
}, suffix: :action }, suffix: :action
APPEAL_WINDOW = 20.days
RECENT_PERIOD = 3.months.freeze RECENT_PERIOD = 3.months.freeze
normalizes :text, with: ->(text) { text.to_s }, apply_to_nil: true normalizes :text, with: ->(text) { text.to_s }, apply_to_nil: true
@ -50,6 +51,10 @@ class AccountWarning < ApplicationRecord
overruled_at.present? overruled_at.present?
end end
def appeal_eligible?
created_at >= APPEAL_WINDOW.ago
end
def to_log_human_identifier def to_log_human_identifier
target_account.acct target_account.acct
end end

View file

@ -16,8 +16,6 @@
# updated_at :datetime not null # updated_at :datetime not null
# #
class Appeal < ApplicationRecord class Appeal < ApplicationRecord
MAX_STRIKE_AGE = 20.days
TEXT_LENGTH_LIMIT = 2_000 TEXT_LENGTH_LIMIT = 2_000
belongs_to :account belongs_to :account
@ -68,6 +66,6 @@ class Appeal < ApplicationRecord
private private
def validate_time_frame def validate_time_frame
errors.add(:base, I18n.t('strikes.errors.too_late')) if strike.created_at < MAX_STRIKE_AGE.ago errors.add(:base, I18n.t('strikes.errors.too_late')) unless strike.appeal_eligible?
end end
end end

View file

@ -0,0 +1,99 @@
# frozen_string_literal: true
module Status::Visibility
extend ActiveSupport::Concern
included do
enum :visibility,
{ public: 0, unlisted: 1, private: 2, direct: 3, limited: 4, public_unlisted: 10, login: 11 },
suffix: :visibility,
validate: true
enum :searchability,
{ public: 0, private: 1, direct: 2, limited: 3, unsupported: 4, public_unlisted: 10 },
suffix: :searchability
enum :limited_scope,
{ none: 0, mutual: 1, circle: 2, personal: 3, reply: 4 },
suffix: :limited
scope :unset_searchability, -> { where(searchability: nil, reblog_of_id: nil) }
scope :distributable_visibility, -> { where(visibility: %i(public unlisted)) }
scope :distributable_visibility_for_anonymous, -> { where(visibility: %i(public public_unlisted unlisted)) }
scope :list_eligible_visibility, -> { where(visibility: %i(public unlisted private)) }
scope :not_direct_visibility, -> { where.not(visibility: :direct) }
validates :visibility, exclusion: { in: %w(direct limited) }, if: :reblog?
before_validation :set_visibility, unless: :visibility?
before_validation :set_searchability
end
class_methods do
def selectable_visibilities
selectable_all_visibilities - %w(mutual circle reply direct)
end
def selectable_all_visibilities
vs = %w(public public_unlisted login unlisted private mutual circle reply direct)
vs -= %w(public_unlisted) unless Setting.enable_public_unlisted_visibility
vs -= %w(public) unless Setting.enable_public_visibility
vs
end
def selectable_reblog_visibilities
%w(unset) + selectable_visibilities
end
def all_visibilities
visibilities.keys
end
def selectable_searchabilities
ss = searchabilities.keys - %w(unsupported)
ss -= %w(public_unlisted) unless Setting.enable_public_unlisted_visibility
ss
end
def selectable_searchabilities_for_search
searchabilities.keys - %w(public_unlisted unsupported)
end
def all_searchabilities
searchabilities.keys - %w(unlisted login unsupported)
end
end
def hidden?
!distributable?
end
def distributable?
public_visibility? || unlisted_visibility? || public_unlisted_visibility?
end
alias sign? distributable?
private
def set_visibility
self.visibility ||= reblog.visibility if reblog?
self.visibility ||= visibility_from_account
end
def visibility_from_account
account.locked? ? :private : :public
end
def set_searchability
return if searchability.nil?
self.searchability = if %w(public public_unlisted login unlisted).include?(visibility)
searchability
elsif ['limited', 'direct'].include?(visibility)
searchability == 'limited' ? :limited : :direct
elsif visibility == 'private'
['public', 'public_unlisted'].include?(searchability) ? :private : searchability
else
:direct
end
end
end

View file

@ -31,7 +31,7 @@ class DomainBlock < ApplicationRecord
include DomainNormalizable include DomainNormalizable
include DomainMaterializable include DomainMaterializable
enum :severity, { silence: 0, suspend: 1, noop: 2 } enum :severity, { silence: 0, suspend: 1, noop: 2 }, validate: true
validates :domain, presence: true, uniqueness: true, domain: true validates :domain, presence: true, uniqueness: true, domain: true

View file

@ -31,7 +31,7 @@ class Invite < ApplicationRecord
validates :comment, length: { maximum: COMMENT_SIZE_LIMIT } validates :comment, length: { maximum: COMMENT_SIZE_LIMIT }
before_validation :set_code before_validation :set_code, on: :create
def valid_for_use? def valid_for_use?
(max_uses.nil? || uses < max_uses) && !expired? && user&.functional? (max_uses.nil? || uses < max_uses) && !expired? && user&.functional?

View file

@ -24,7 +24,7 @@ class IpBlock < ApplicationRecord
sign_up_requires_approval: 5000, sign_up_requires_approval: 5000,
sign_up_block: 5500, sign_up_block: 5500,
no_access: 9999, no_access: 9999,
}, prefix: true }, prefix: true, validate: true
validates :ip, :severity, presence: true validates :ip, :severity, presence: true
validates :ip, uniqueness: true validates :ip, uniqueness: true

View file

@ -89,22 +89,32 @@ class NotificationGroup < ActiveModelSerializers::Model
binds = [ binds = [
account_id, account_id,
SAMPLE_ACCOUNTS_SIZE, SAMPLE_ACCOUNTS_SIZE,
pagination_range.begin,
pagination_range.end,
ActiveRecord::Relation::QueryAttribute.new('group_keys', group_keys, ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Array.new(ActiveModel::Type::String.new)), ActiveRecord::Relation::QueryAttribute.new('group_keys', group_keys, ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Array.new(ActiveModel::Type::String.new)),
pagination_range.begin || 0,
] ]
binds << pagination_range.end unless pagination_range.end.nil?
upper_bound_cond = begin
if pagination_range.end.nil?
''
elsif pagination_range.exclude_end?
'AND id < $5'
else
'AND id <= $5'
end
end
ActiveRecord::Base.connection.select_all(<<~SQL.squish, 'grouped_notifications', binds).cast_values.to_h { |k, *values| [k, values] } ActiveRecord::Base.connection.select_all(<<~SQL.squish, 'grouped_notifications', binds).cast_values.to_h { |k, *values| [k, values] }
SELECT SELECT
groups.group_key, groups.group_key,
(SELECT id FROM notifications WHERE notifications.account_id = $1 AND notifications.group_key = groups.group_key AND id <= $4 ORDER BY id DESC LIMIT 1), (SELECT id FROM notifications WHERE notifications.account_id = $1 AND notifications.group_key = groups.group_key #{upper_bound_cond} ORDER BY id DESC LIMIT 1),
array(SELECT from_account_id FROM notifications WHERE notifications.account_id = $1 AND notifications.group_key = groups.group_key AND id <= $4 ORDER BY id DESC LIMIT $2), array(SELECT from_account_id FROM notifications WHERE notifications.account_id = $1 AND notifications.group_key = groups.group_key #{upper_bound_cond} ORDER BY id DESC LIMIT $2),
(SELECT count(*) FROM notifications WHERE notifications.account_id = $1 AND notifications.group_key = groups.group_key AND id <= $4) AS notifications_count, (SELECT count(*) FROM notifications WHERE notifications.account_id = $1 AND notifications.group_key = groups.group_key #{upper_bound_cond}) AS notifications_count,
array(SELECT activity_id FROM notifications WHERE notifications.account_id = $1 AND notifications.group_key = groups.group_key AND id <= $4 AND activity_type = 'EmojiReaction'), array(SELECT activity_id FROM notifications WHERE notifications.account_id = $1 AND notifications.group_key = groups.group_key #{upper_bound_cond} AND activity_type = 'EmojiReaction'),
(SELECT id FROM notifications WHERE notifications.account_id = $1 AND notifications.group_key = groups.group_key AND id >= $3 ORDER BY id ASC LIMIT 1) AS min_id, (SELECT id FROM notifications WHERE notifications.account_id = $1 AND notifications.group_key = groups.group_key AND id >= $4 ORDER BY id ASC LIMIT 1) AS min_id,
(SELECT created_at FROM notifications WHERE notifications.account_id = $1 AND notifications.group_key = groups.group_key AND id <= $4 ORDER BY id DESC LIMIT 1) (SELECT created_at FROM notifications WHERE notifications.account_id = $1 AND notifications.group_key = groups.group_key #{upper_bound_cond} ORDER BY id DESC LIMIT 1)
FROM FROM
unnest($5::text[]) AS groups(group_key); unnest($3::text[]) AS groups(group_key);
SQL SQL
else else
binds = [ binds = [

View file

@ -45,6 +45,7 @@ class Status < ApplicationRecord
include Status::SearchConcern include Status::SearchConcern
include Status::SnapshotConcern include Status::SnapshotConcern
include Status::ThreadingConcern include Status::ThreadingConcern
include Status::Visibility
include DtlHelper include DtlHelper
MEDIA_ATTACHMENTS_LIMIT = 4 MEDIA_ATTACHMENTS_LIMIT = 4
@ -62,10 +63,6 @@ class Status < ApplicationRecord
update_index('statuses', :proper) update_index('statuses', :proper)
update_index('public_statuses', :proper) update_index('public_statuses', :proper)
enum :visibility, { public: 0, unlisted: 1, private: 2, direct: 3, limited: 4, public_unlisted: 10, login: 11 }, suffix: :visibility, validate: true
enum :searchability, { public: 0, private: 1, direct: 2, limited: 3, unsupported: 4, public_unlisted: 10 }, suffix: :searchability
enum :limited_scope, { none: 0, mutual: 1, circle: 2, personal: 3, reply: 4 }, suffix: :limited
belongs_to :application, class_name: 'Doorkeeper::Application', optional: true belongs_to :application, class_name: 'Doorkeeper::Application', optional: true
belongs_to :account, inverse_of: :statuses belongs_to :account, inverse_of: :statuses
@ -130,7 +127,6 @@ class Status < ApplicationRecord
validates_with StatusLengthValidator validates_with StatusLengthValidator
validates_with DisallowedHashtagsValidator validates_with DisallowedHashtagsValidator
validates :reblog, uniqueness: { scope: :account }, if: :reblog? validates :reblog, uniqueness: { scope: :account }, if: :reblog?
validates :visibility, exclusion: { in: %w(direct limited) }, if: :reblog?
accepts_nested_attributes_for :poll accepts_nested_attributes_for :poll
@ -159,11 +155,6 @@ class Status < ApplicationRecord
scope :tagged_with_none, lambda { |tag_ids| scope :tagged_with_none, lambda { |tag_ids|
where('NOT EXISTS (SELECT * FROM statuses_tags forbidden WHERE forbidden.status_id = statuses.id AND forbidden.tag_id IN (?))', tag_ids) where('NOT EXISTS (SELECT * FROM statuses_tags forbidden WHERE forbidden.status_id = statuses.id AND forbidden.tag_id IN (?))', tag_ids)
} }
scope :unset_searchability, -> { where(searchability: nil, reblog_of_id: nil) }
scope :distributable_visibility, -> { where(visibility: %i(public public_unlisted login unlisted)) }
scope :distributable_visibility_for_anonymous, -> { where(visibility: %i(public public_unlisted unlisted)) }
scope :list_eligible_visibility, -> { where(visibility: %i(public public_unlisted login unlisted private)) }
scope :not_direct_visibility, -> { where.not(visibility: :direct) }
after_create_commit :trigger_create_webhooks after_create_commit :trigger_create_webhooks
after_update_commit :trigger_update_webhooks after_update_commit :trigger_update_webhooks
@ -176,8 +167,6 @@ class Status < ApplicationRecord
before_validation :prepare_contents, if: :local? before_validation :prepare_contents, if: :local?
before_validation :set_reblog before_validation :set_reblog
before_validation :set_visibility
before_validation :set_searchability
before_validation :set_conversation before_validation :set_conversation
before_validation :set_local before_validation :set_local
@ -305,16 +294,6 @@ class Status < ApplicationRecord
PreviewCardsStatus.where(status_id: id).delete_all PreviewCardsStatus.where(status_id: id).delete_all
end end
def hidden?
!distributable?
end
def distributable?
public_visibility? || unlisted_visibility? || public_unlisted_visibility?
end
alias sign? distributable?
def with_media? def with_media?
media_attachments.any? media_attachments.any?
end end
@ -521,39 +500,6 @@ class Status < ApplicationRecord
end end
class << self class << self
def selectable_visibilities
selectable_all_visibilities - %w(mutual circle reply direct)
end
def selectable_all_visibilities
vs = %w(public public_unlisted login unlisted private mutual circle reply direct)
vs -= %w(public_unlisted) unless Setting.enable_public_unlisted_visibility
vs -= %w(public) unless Setting.enable_public_visibility
vs
end
def selectable_reblog_visibilities
%w(unset) + selectable_visibilities
end
def all_visibilities
visibilities.keys
end
def selectable_searchabilities
ss = searchabilities.keys - %w(unsupported)
ss -= %w(public_unlisted) unless Setting.enable_public_unlisted_visibility
ss
end
def selectable_searchabilities_for_search
searchabilities.keys - %w(public_unlisted unsupported)
end
def all_searchabilities
searchabilities.keys - %w(unlisted login unsupported)
end
def favourites_map(status_ids, account_id) def favourites_map(status_ids, account_id)
Favourite.select(:status_id).where(status_id: status_ids).where(account_id: account_id).each_with_object({}) { |f, h| h[f.status_id] = true } Favourite.select(:status_id).where(status_id: status_ids).where(account_id: account_id).each_with_object({}) { |f, h| h[f.status_id] = true }
end end
@ -660,25 +606,6 @@ class Status < ApplicationRecord
update_column(:poll_id, poll.id) if association(:poll).loaded? && poll.present? update_column(:poll_id, poll.id) if association(:poll).loaded? && poll.present?
end end
def set_visibility
self.visibility = reblog.visibility if reblog? && visibility.nil?
self.visibility = (account.locked? ? :private : :public) if visibility.nil?
end
def set_searchability
return if searchability.nil?
self.searchability = if %w(public public_unlisted login unlisted).include?(visibility)
searchability
elsif visibility == 'limited' || visibility == 'direct'
searchability == 'limited' ? :limited : :direct
elsif visibility == 'private'
searchability == 'public' || searchability == 'public_unlisted' ? :private : searchability
else
:direct
end
end
def set_conversation def set_conversation
self.thread = thread.reblog if thread&.reblog? self.thread = thread.reblog if thread&.reblog?

View file

@ -36,11 +36,11 @@ class Tag < ApplicationRecord
has_one :trend, class_name: 'TagTrend', inverse_of: :tag, dependent: :destroy has_one :trend, class_name: 'TagTrend', inverse_of: :tag, dependent: :destroy
HASHTAG_SEPARATORS = "_\u00B7\u30FB\u200c" HASHTAG_SEPARATORS = "_\u00B7\u30FB\u200c"
HASHTAG_FIRST_SEQUENCE_CHUNK_ONE = "[[:word:]_][[:word:]#{HASHTAG_SEPARATORS}]*[[:alpha:]#{HASHTAG_SEPARATORS}]" HASHTAG_FIRST_SEQUENCE_CHUNK_ONE = "[[:word:]_][[:word:]#{HASHTAG_SEPARATORS}]*[[:alpha:]#{HASHTAG_SEPARATORS}]".freeze
HASHTAG_FIRST_SEQUENCE_CHUNK_TWO = "[[:word:]#{HASHTAG_SEPARATORS}]*[[:word:]_]" HASHTAG_FIRST_SEQUENCE_CHUNK_TWO = "[[:word:]#{HASHTAG_SEPARATORS}]*[[:word:]_]".freeze
HASHTAG_FIRST_SEQUENCE = "(#{HASHTAG_FIRST_SEQUENCE_CHUNK_ONE}#{HASHTAG_FIRST_SEQUENCE_CHUNK_TWO})" HASHTAG_FIRST_SEQUENCE = "(#{HASHTAG_FIRST_SEQUENCE_CHUNK_ONE}#{HASHTAG_FIRST_SEQUENCE_CHUNK_TWO})".freeze
HASHTAG_LAST_SEQUENCE = '([[:word:]_]*[[:alpha:]][[:word:]_]*)' HASHTAG_LAST_SEQUENCE = '([[:word:]_]*[[:alpha:]][[:word:]_]*)'
HASHTAG_NAME_PAT = "#{HASHTAG_FIRST_SEQUENCE}|#{HASHTAG_LAST_SEQUENCE}" HASHTAG_NAME_PAT = "#{HASHTAG_FIRST_SEQUENCE}|#{HASHTAG_LAST_SEQUENCE}".freeze
HASHTAG_RE = %r{(?<![=/)\p{Alnum}])#(#{HASHTAG_NAME_PAT})} HASHTAG_RE = %r{(?<![=/)\p{Alnum}])#(#{HASHTAG_NAME_PAT})}
HASHTAG_NAME_RE = /\A(#{HASHTAG_NAME_PAT})\z/i HASHTAG_NAME_RE = /\A(#{HASHTAG_NAME_PAT})\z/i

View file

@ -16,7 +16,7 @@ class Trends::Links < Trends::Base
class Query < Trends::Query class Query < Trends::Query
def to_arel def to_arel
scope = PreviewCard.joins(:trend).reorder(score: :desc) scope = PreviewCard.joins(:trend).reorder(score: :desc)
scope = scope.reorder(language_order_clause.desc, score: :desc) if preferred_languages.present? scope = scope.reorder(language_order_clause, score: :desc) if preferred_languages.present?
scope = scope.merge(PreviewCardTrend.allowed) if @allowed scope = scope.merge(PreviewCardTrend.allowed) if @allowed
scope = scope.offset(@offset) if @offset.present? scope = scope.offset(@offset) if @offset.present?
scope = scope.limit(@limit) if @limit.present? scope = scope.limit(@limit) if @limit.present?
@ -25,8 +25,8 @@ class Trends::Links < Trends::Base
private private
def language_order_clause def trend_class
Arel::Nodes::Case.new.when(PreviewCardTrend.arel_table[:language].in(preferred_languages)).then(1).else(0) PreviewCardTrend
end end
end end

View file

@ -94,6 +94,16 @@ class Trends::Query
to_arel.to_a to_arel.to_a
end end
def language_order_clause
Arel::Nodes::Case.new.when(language_is_preferred).then(1).else(0).desc
end
def language_is_preferred
trend_class
.arel_table[:language]
.in(preferred_languages)
end
def preferred_languages def preferred_languages
if @account&.chosen_languages.present? if @account&.chosen_languages.present?
@account.chosen_languages @account.chosen_languages

View file

@ -15,7 +15,7 @@ class Trends::Statuses < Trends::Base
class Query < Trends::Query class Query < Trends::Query
def to_arel def to_arel
scope = Status.joins(:trend).reorder(score: :desc) scope = Status.joins(:trend).reorder(score: :desc)
scope = scope.reorder(language_order_clause.desc, score: :desc) if preferred_languages.present? scope = scope.reorder(language_order_clause, score: :desc) if preferred_languages.present?
scope = scope.merge(StatusTrend.allowed) if @allowed scope = scope.merge(StatusTrend.allowed) if @allowed
scope = scope.not_excluded_by_account(@account).not_domain_blocked_by_account(@account) if @account.present? scope = scope.not_excluded_by_account(@account).not_domain_blocked_by_account(@account) if @account.present?
scope = scope.offset(@offset) if @offset.present? scope = scope.offset(@offset) if @offset.present?
@ -25,8 +25,8 @@ class Trends::Statuses < Trends::Base
private private
def language_order_clause def trend_class
Arel::Nodes::Case.new.when(StatusTrend.arel_table[:language].in(preferred_languages)).then(1).else(0) StatusTrend
end end
end end

View file

@ -15,7 +15,8 @@ class Trends::Tags < Trends::Base
class Query < Trends::Query class Query < Trends::Query
def to_arel def to_arel
scope = Tag.joins(:trend).reorder(language_order_clause.desc, score: :desc) scope = Tag.joins(:trend).reorder(score: :desc)
scope = scope.reorder(language_order_clause, score: :desc) if preferred_languages.present?
scope = scope.merge(TagTrend.allowed) if @allowed scope = scope.merge(TagTrend.allowed) if @allowed
scope = scope.offset(@offset) if @offset.present? scope = scope.offset(@offset) if @offset.present?
scope = scope.limit(@limit) if @limit.present? scope = scope.limit(@limit) if @limit.present?
@ -24,8 +25,8 @@ class Trends::Tags < Trends::Base
private private
def language_order_clause def trend_class
Arel::Nodes::Case.new.when(TagTrend.arel_table[:language].in(preferred_languages)).then(1).else(0) TagTrend
end end
end end

View file

@ -44,6 +44,7 @@ class UserRole < ApplicationRecord
NOBODY_POSITION = -1 NOBODY_POSITION = -1
POSITION_LIMIT = (2**31) - 1 POSITION_LIMIT = (2**31) - 1
CSS_COLORS = /\A#?(?:[A-F0-9]{3}){1,2}\z/i # CSS-style hex colors
module Flags module Flags
NONE = 0 NONE = 0
@ -95,7 +96,7 @@ class UserRole < ApplicationRecord
attr_writer :current_account attr_writer :current_account
validates :name, presence: true, unless: :everyone? validates :name, presence: true, unless: :everyone?
validates :color, format: { with: /\A#?(?:[A-F0-9]{3}){1,2}\z/i }, unless: -> { color.blank? } validates :color, format: { with: CSS_COLORS }, if: :color?
validates :position, numericality: { in: (-POSITION_LIMIT..POSITION_LIMIT) } validates :position, numericality: { in: (-POSITION_LIMIT..POSITION_LIMIT) }
validate :validate_permissions_elevation validate :validate_permissions_elevation

View file

@ -5,10 +5,11 @@
# Table name: web_push_subscriptions # Table name: web_push_subscriptions
# #
# id :bigint(8) not null, primary key # id :bigint(8) not null, primary key
# endpoint :string not null
# key_p256dh :string not null
# key_auth :string not null
# data :json # data :json
# endpoint :string not null
# key_auth :string not null
# key_p256dh :string not null
# standard :boolean default(FALSE), not null
# created_at :datetime not null # created_at :datetime not null
# updated_at :datetime not null # updated_at :datetime not null
# access_token_id :bigint(8) # access_token_id :bigint(8)

View file

@ -6,7 +6,7 @@ class AccountWarningPolicy < ApplicationPolicy
end end
def appeal? def appeal?
target? && record.created_at >= Appeal::MAX_STRIKE_AGE.ago target? && record.appeal_eligible?
end end
private private

View file

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
class LanguagePresenter < ActiveModelSerializers::Model class LanguagePresenter < ActiveModelSerializers::Model
attributes :code, :name, :native_name attributes :code, :name
def initialize(code) def initialize(code)
super() super()
@ -13,8 +13,4 @@ class LanguagePresenter < ActiveModelSerializers::Model
def name def name
@item[0] @item[0]
end end
def native_name
@item[1]
end
end end

View file

@ -44,7 +44,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
delegate :suspended?, :instance_actor?, to: :object delegate :suspended?, :instance_actor?, to: :object
def id def id
object.instance_actor? ? instance_actor_url : account_url(object) ActivityPub::TagManager.instance.uri_for(object)
end end
def type def type
@ -60,27 +60,27 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
end end
def following def following
account_following_index_url(object) ActivityPub::TagManager.instance.following_uri_for(object)
end end
def followers def followers
account_followers_url(object) ActivityPub::TagManager.instance.followers_uri_for(object)
end end
def inbox def inbox
object.instance_actor? ? instance_actor_inbox_url : account_inbox_url(object) ActivityPub::TagManager.instance.inbox_uri_for(object)
end end
def outbox def outbox
object.instance_actor? ? instance_actor_outbox_url : account_outbox_url(object) ActivityPub::TagManager.instance.outbox_uri_for(object)
end end
def featured def featured
account_collection_url(object, :featured) ActivityPub::TagManager.instance.collection_uri_for(object, :featured)
end end
def featured_tags def featured_tags
account_collection_url(object, :tags) ActivityPub::TagManager.instance.collection_uri_for(object, :tags)
end end
def endpoints def endpoints

View file

@ -38,6 +38,6 @@ class ActivityPub::AddSerializer < ActivityPub::Serializer
end end
def target def target
account_collection_url(object.account, :featured) ActivityPub::TagManager.instance.collection_uri_for(object.account, :featured)
end end
end end

View file

@ -38,6 +38,6 @@ class ActivityPub::RemoveSerializer < ActivityPub::Serializer
end end
def target def target
account_collection_url(object.account, :featured) ActivityPub::TagManager.instance.collection_uri_for(object.account, :featured)
end end
end end

View file

@ -8,8 +8,4 @@ class REST::ScheduledStatusSerializer < ActiveModel::Serializer
def id def id
object.id.to_s object.id.to_s
end end
def params
object.params.without('application_id')
end
end end

View file

@ -1,7 +1,9 @@
# frozen_string_literal: true # frozen_string_literal: true
class REST::WebPushSubscriptionSerializer < ActiveModel::Serializer class REST::WebPushSubscriptionSerializer < ActiveModel::Serializer
attributes :id, :endpoint, :alerts, :server_key, :policy attributes :id, :endpoint, :standard, :alerts, :server_key, :policy
delegate :standard, to: :object
def alerts def alerts
(object.data&.dig('alerts') || {}).each_with_object({}) { |(k, v), h| h[k] = ActiveModel::Type::Boolean.new.cast(v) } (object.data&.dig('alerts') || {}).each_with_object({}) { |(k, v), h| h[k] = ActiveModel::Type::Boolean.new.cast(v) }

View file

@ -13,7 +13,7 @@ class WebfingerSerializer < ActiveModel::Serializer
if object.instance_actor? if object.instance_actor?
[instance_actor_url] [instance_actor_url]
else else
[short_account_url(object), account_url(object)] [short_account_url(object), ActivityPub::TagManager.instance.uri_for(object)]
end end
end end
@ -43,6 +43,6 @@ class WebfingerSerializer < ActiveModel::Serializer
end end
def self_href def self_href
object.instance_actor? ? instance_actor_url : account_url(object) ActivityPub::TagManager.instance.uri_for(object)
end end
end end

View file

@ -11,6 +11,8 @@ class ActivityPub::ProcessAccountService < BaseService
SCAN_SEARCHABILITY_RE = /\[searchability:(public|followers|reactors|private)\]/ SCAN_SEARCHABILITY_RE = /\[searchability:(public|followers|reactors|private)\]/
SCAN_SEARCHABILITY_FEDIBIRD_RE = /searchable_by_(all_users|followers_only|reacted_users_only|nobody)/ SCAN_SEARCHABILITY_FEDIBIRD_RE = /searchable_by_(all_users|followers_only|reacted_users_only|nobody)/
VALID_URI_SCHEMES = %w(http https).freeze
# Should be called with confirmed valid JSON # Should be called with confirmed valid JSON
# and WebFinger-resolved username and domain # and WebFinger-resolved username and domain
def call(username, domain, json, options = {}) # rubocop:disable Metrics/PerceivedComplexity def call(username, domain, json, options = {}) # rubocop:disable Metrics/PerceivedComplexity
@ -113,16 +115,28 @@ class ActivityPub::ProcessAccountService < BaseService
end end
def set_immediate_protocol_attributes! def set_immediate_protocol_attributes!
@account.inbox_url = @json['inbox'] || '' @account.inbox_url = valid_collection_uri(@json['inbox'])
@account.outbox_url = @json['outbox'] || '' @account.outbox_url = valid_collection_uri(@json['outbox'])
@account.shared_inbox_url = (@json['endpoints'].is_a?(Hash) ? @json['endpoints']['sharedInbox'] : @json['sharedInbox']) || '' @account.shared_inbox_url = valid_collection_uri(@json['endpoints'].is_a?(Hash) ? @json['endpoints']['sharedInbox'] : @json['sharedInbox'])
@account.followers_url = @json['followers'] || '' @account.followers_url = valid_collection_uri(@json['followers'])
@account.url = url || @uri @account.url = url || @uri
@account.uri = @uri @account.uri = @uri
@account.actor_type = actor_type @account.actor_type = actor_type
@account.created_at = @json['published'] if @json['published'].present? @account.created_at = @json['published'] if @json['published'].present?
end end
def valid_collection_uri(uri)
uri = uri.first if uri.is_a?(Array)
uri = uri['id'] if uri.is_a?(Hash)
return '' unless uri.is_a?(String)
parsed_uri = Addressable::URI.parse(uri)
VALID_URI_SCHEMES.include?(parsed_uri.scheme) && parsed_uri.host.present? ? parsed_uri : ''
rescue Addressable::URI::InvalidURIError
''
end
def set_immediate_attributes! def set_immediate_attributes!
@account.featured_collection_url = @json['featured'] || '' @account.featured_collection_url = @json['featured'] || ''
@account.display_name = @json['name'] || '' @account.display_name = @json['name'] || ''
@ -398,10 +412,11 @@ class ActivityPub::ProcessAccountService < BaseService
end end
def collection_info(type) def collection_info(type)
return [nil, nil] if @json[type].blank? collection_uri = valid_collection_uri(@json[type])
return [nil, nil] if collection_uri.blank?
return @collections[type] if @collections.key?(type) return @collections[type] if @collections.key?(type)
collection = fetch_resource_without_id_validation(@json[type]) collection = fetch_resource_without_id_validation(collection_uri)
total_items = collection.is_a?(Hash) && collection['totalItems'].present? && collection['totalItems'].is_a?(Numeric) ? collection['totalItems'] : nil total_items = collection.is_a?(Hash) && collection['totalItems'].present? && collection['totalItems'].is_a?(Numeric) ? collection['totalItems'] : nil
has_first_page = collection.is_a?(Hash) && collection['first'].present? has_first_page = collection.is_a?(Hash) && collection['first'].present?

View file

@ -65,7 +65,7 @@ class DeleteAccountService < BaseService
scheduled_expiration_statuses scheduled_expiration_statuses
status_pins status_pins
tag_follows tag_follows
) ).freeze
ASSOCIATIONS_ON_DESTROY = %w( ASSOCIATIONS_ON_DESTROY = %w(
reports reports

View file

@ -19,7 +19,19 @@ class Web::PushNotificationWorker
# in the meantime, so we have to double-check before proceeding # in the meantime, so we have to double-check before proceeding
return unless @notification.activity.present? && @subscription.pushable?(@notification) return unless @notification.activity.present? && @subscription.pushable?(@notification)
payload = web_push_request.encrypt(push_notification_json) if web_push_request.legacy
perform_legacy_request
else
perform_standard_request
end
rescue ActiveRecord::RecordNotFound
true
end
private
def perform_legacy_request
payload = web_push_request.legacy_encrypt(push_notification_json)
request_pool.with(web_push_request.audience) do |http_client| request_pool.with(web_push_request.audience) do |http_client|
request = Request.new(:post, web_push_request.endpoint, body: payload.fetch(:ciphertext), http_client: http_client) request = Request.new(:post, web_push_request.endpoint, body: payload.fetch(:ciphertext), http_client: http_client)
@ -31,28 +43,48 @@ class Web::PushNotificationWorker
'Content-Encoding' => 'aesgcm', 'Content-Encoding' => 'aesgcm',
'Encryption' => "salt=#{Webpush.encode64(payload.fetch(:salt)).delete('=')}", 'Encryption' => "salt=#{Webpush.encode64(payload.fetch(:salt)).delete('=')}",
'Crypto-Key' => "dh=#{Webpush.encode64(payload.fetch(:server_public_key)).delete('=')};#{web_push_request.crypto_key_header}", 'Crypto-Key' => "dh=#{Webpush.encode64(payload.fetch(:server_public_key)).delete('=')};#{web_push_request.crypto_key_header}",
'Authorization' => web_push_request.authorization_header, 'Authorization' => web_push_request.legacy_authorization_header,
'Unsubscribe-URL' => subscription_url 'Unsubscribe-URL' => subscription_url
) )
request.perform do |response| send(request)
# If the server responds with an error in the 4xx range
# that isn't about rate-limiting or timeouts, we can
# assume that the subscription is invalid or expired
# and must be removed
if (400..499).cover?(response.code) && ![408, 429].include?(response.code)
@subscription.destroy!
elsif !(200...300).cover?(response.code)
raise Mastodon::UnexpectedResponseError, response
end
end
end end
rescue ActiveRecord::RecordNotFound
true
end end
private def perform_standard_request
payload = web_push_request.standard_encrypt(push_notification_json)
request_pool.with(web_push_request.audience) do |http_client|
request = Request.new(:post, web_push_request.endpoint, body: payload, http_client: http_client)
request.add_headers(
'Content-Type' => 'application/octet-stream',
'Ttl' => TTL.to_s,
'Urgency' => URGENCY,
'Content-Encoding' => 'aes128gcm',
'Authorization' => web_push_request.standard_authorization_header,
'Unsubscribe-URL' => subscription_url,
'Content-Length' => payload.length.to_s
)
send(request)
end
end
def send(request)
request.perform do |response|
# If the server responds with an error in the 4xx range
# that isn't about rate-limiting or timeouts, we can
# assume that the subscription is invalid or expired
# and must be removed
if (400..499).cover?(response.code) && ![408, 429].include?(response.code)
@subscription.destroy!
elsif !(200...300).cover?(response.code)
raise Mastodon::UnexpectedResponseError, response
end
end
end
def web_push_request def web_push_request
@web_push_request || WebPushRequest.new(@subscription) @web_push_request || WebPushRequest.new(@subscription)

View file

@ -15,9 +15,17 @@ cs:
user/invite_request: user/invite_request:
text: Důvod text: Důvod
errors: errors:
attributes:
domain:
invalid: není platný název domény
messages:
invalid_domain_on_line: "%{value} není platný název domény"
too_many_lines: překročil limit %{limit} řádků
models: models:
account: account:
attributes: attributes:
fields:
fields_with_values_missing_labels: obsahuje hodnoty s chybějícími popisky
username: username:
invalid: musí obsahovat pouze písmena, číslice a podtržítka invalid: musí obsahovat pouze písmena, číslice a podtržítka
reserved: je vyhrazeno reserved: je vyhrazeno
@ -33,6 +41,11 @@ cs:
attributes: attributes:
data: data:
malformed: je chybný malformed: je chybný
list_account:
attributes:
account_id:
taken: již je na seznamu
must_be_following: musí být sledovaný účet
status: status:
attributes: attributes:
reblog: reblog:

View file

@ -24,6 +24,8 @@ de:
models: models:
account: account:
attributes: attributes:
fields:
fields_with_values_missing_labels: enthält Werte, bei denen Beschriftungen fehlen
username: username:
invalid: nur Buchstaben, Ziffern und Unterstriche invalid: nur Buchstaben, Ziffern und Unterstriche
reserved: ist bereits vergeben reserved: ist bereits vergeben

View file

@ -24,6 +24,8 @@ ga:
models: models:
account: account:
attributes: attributes:
fields:
fields_with_values_missing_labels: ina bhfuil luachanna a bhfuil lipéid in easnamh orthu
username: username:
invalid: ní mór go mbeadh litreacha, uimhreacha agus pointí béime amháin invalid: ní mór go mbeadh litreacha, uimhreacha agus pointí béime amháin
reserved: in áirithe reserved: in áirithe

View file

@ -24,6 +24,8 @@ hu:
models: models:
account: account:
attributes: attributes:
fields:
fields_with_values_missing_labels: hiányzó címkékkel rendelkező értékeket tartalmaz
username: username:
invalid: csak betűket, számokat vagy alávonást tartalmazhat invalid: csak betűket, számokat vagy alávonást tartalmazhat
reserved: foglalt reserved: foglalt

View file

@ -24,6 +24,8 @@ ia:
models: models:
account: account:
attributes: attributes:
fields:
fields_with_values_missing_labels: contine valores con etiquettas perdite
username: username:
invalid: debe continer solmente litteras, numeros e lineettas basse invalid: debe continer solmente litteras, numeros e lineettas basse
reserved: es reservate reserved: es reservate

View file

@ -24,6 +24,8 @@ it:
models: models:
account: account:
attributes: attributes:
fields:
fields_with_values_missing_labels: contiene valori con label mancanti
username: username:
invalid: deve contenere solo lettere, numeri e trattini bassi invalid: deve contenere solo lettere, numeri e trattini bassi
reserved: è riservato reserved: è riservato

View file

@ -24,6 +24,8 @@ lv:
models: models:
account: account:
attributes: attributes:
fields:
fields_with_values_missing_labels: satur vērtības ar trūkstošām iezīmēm
username: username:
invalid: drīkst saturēt tikai burtus, ciparus un pasvītras invalid: drīkst saturēt tikai burtus, ciparus un pasvītras
reserved: ir rezervēts reserved: ir rezervēts
@ -39,6 +41,11 @@ lv:
attributes: attributes:
data: data:
malformed: ir nepareizi veidots malformed: ir nepareizi veidots
list_account:
attributes:
account_id:
taken: jau ir sarakstā
must_be_following: jābūt kontam, kuram seko
status: status:
attributes: attributes:
reblog: reblog:

View file

@ -1 +1,35 @@
---
ne: ne:
activerecord:
attributes:
user:
agreement: सेवा सम्झौता
email: ईमेल ठेगाना
password: पासवर्ड
user/account:
username: प्रयोगकर्ता नाम
user/invite_request:
text: कारण
errors:
attributes:
domain:
invalid: मान्य डोमेन नाम होइन
messages:
invalid_domain_on_line: "%{value} मान्य डोमेन नाम होइन"
models:
account:
attributes:
username:
invalid: अक्षर, संख्या र अन्डरस्कोर मात्र हुनु पर्छ
admin/webhook:
attributes:
url:
invalid: मान्य URL होइन
doorkeeper/application:
attributes:
website:
invalid: मान्य URL होइन
list_account:
attributes:
account_id:
taken: पहिले नै सूचीमा छ

View file

@ -27,7 +27,7 @@ pt-PT:
fields: fields:
fields_with_values_missing_labels: contém valores com etiquetas em falta fields_with_values_missing_labels: contém valores com etiquetas em falta
username: username:
invalid: deve conter apenas letras, números e traços inferiores invalid: deve conter apenas letras, números e traços inferiores (_)
reserved: está reservado reserved: está reservado
admin/webhook: admin/webhook:
attributes: attributes:

View file

@ -24,6 +24,8 @@ sv:
models: models:
account: account:
attributes: attributes:
fields:
fields_with_values_missing_labels: innehåller värden med saknade etiketter
username: username:
invalid: endast bokstäver, siffror och understrykning invalid: endast bokstäver, siffror och understrykning
reserved: är reserverat reserved: är reserverat

View file

@ -937,6 +937,7 @@ ca:
generates: generates:
action: Generar action: Generar
chance_to_review_html: "<strong>Les condicions de servei generades no es publicaran automàticament.</strong> Tindreu l'oportunitat de revisar-ne els resultats. Empleneu els detalls necessaris per a procedir." chance_to_review_html: "<strong>Les condicions de servei generades no es publicaran automàticament.</strong> Tindreu l'oportunitat de revisar-ne els resultats. Empleneu els detalls necessaris per a procedir."
explanation_html: La plantilla de condicions de servei proveïda ho és només a títol informatiu i no s'ha d'interpretar com a consell jurídic en cap cas. Consulteu el vostre propi servei legal sobre la vostra situació i les qüestions legals específiques que tingueu.
title: Configuració de les condicions de servei title: Configuració de les condicions de servei
history: Historial history: Historial
live: En ús live: En ús
@ -1892,6 +1893,8 @@ ca:
title: Un inici de sessió nou title: Un inici de sessió nou
terms_of_service_changed: terms_of_service_changed:
sign_off: L'equip de %{domain} sign_off: L'equip de %{domain}
subject: Actualitzacions de les condicions de servei
subtitle: Les condicions de servei de %{domain} canvien
title: Actualització important title: Actualització important
warning: warning:
appeal: Envia una apel·lació appeal: Envia una apel·lació

View file

@ -78,10 +78,10 @@ cs:
enabled: Povoleno enabled: Povoleno
enabled_msg: Účet %{username} byl úspěšně rozmrazen enabled_msg: Účet %{username} byl úspěšně rozmrazen
followers: Sledující followers: Sledující
follows: Sledované follows: Sledovaní
header: Záhlaví header: Záhlaví
inbox_url: URL příchozí schránky inbox_url: URL příchozí schránky
invite_request_text: Důvody založení invite_request_text: Důvody pro připojení
invited_by: Pozván uživatelem invited_by: Pozván uživatelem
ip: IP adresa ip: IP adresa
joined: Uživatelem od joined: Uživatelem od
@ -187,29 +187,40 @@ cs:
confirm_user: Potvrdit uživatele confirm_user: Potvrdit uživatele
create_account_warning: Vytvořit varování create_account_warning: Vytvořit varování
create_announcement: Nové oznámení create_announcement: Nové oznámení
create_canonical_email_block: Vytvořit blok e-mailu
create_custom_emoji: Vytvořit vlastní emoji create_custom_emoji: Vytvořit vlastní emoji
create_domain_allow: Vytvořit povolení domény create_domain_allow: Vytvořit povolení domény
create_domain_block: Vytvořit blokaci domény create_domain_block: Vytvořit blokaci domény
create_email_domain_block: Vytvořit blok e-mailové domény
create_ip_block: Vytvořit IP pravidlo create_ip_block: Vytvořit IP pravidlo
create_relay: Vytvořit relay
create_unavailable_domain: Vytvořit nedostupnou doménu create_unavailable_domain: Vytvořit nedostupnou doménu
create_user_role: Vytvořit roli create_user_role: Vytvořit roli
demote_user: Snížit roli uživatele demote_user: Snížit roli uživatele
destroy_announcement: Odstranit oznámení destroy_announcement: Odstranit oznámení
destroy_canonical_email_block: Odblokovat email
destroy_custom_emoji: Odstranit vlastní emoji destroy_custom_emoji: Odstranit vlastní emoji
destroy_domain_allow: Odstranit povolení domény destroy_domain_allow: Odstranit povolení domény
destroy_domain_block: Odstranit blokaci domény destroy_domain_block: Odstranit blokaci domény
destroy_email_domain_block: Smazat blokaci e-mailové domény
destroy_instance: Odmazat doménu destroy_instance: Odmazat doménu
destroy_ip_block: Smazat IP pravidlo destroy_ip_block: Smazat IP pravidlo
destroy_relay: Smazat relay
destroy_status: Odstranit Příspěvek destroy_status: Odstranit Příspěvek
destroy_unavailable_domain: Smazat nedostupnou doménu destroy_unavailable_domain: Smazat nedostupnou doménu
destroy_user_role: Zničit roli destroy_user_role: Zničit roli
disable_2fa_user: Vypnout 2FA disable_2fa_user: Vypnout 2FA
disable_custom_emoji: Zakázat vlastní emoji disable_custom_emoji: Zakázat vlastní emoji
disable_relay: Deaktivovat relay
disable_sign_in_token_auth_user: Zrušit uživatelovo ověřování e-mailovým tokenem
disable_user: Deaktivovat uživatele disable_user: Deaktivovat uživatele
enable_custom_emoji: Povolit vlastní emoji enable_custom_emoji: Povolit vlastní emoji
enable_relay: Aktivovat relay
enable_sign_in_token_auth_user: Povolit uživatelovo ověřování e-mailovým tokenem
enable_user: Povolit uživatele enable_user: Povolit uživatele
memorialize_account: Změna na „in memoriam“ memorialize_account: Změna na „in memoriam“
promote_user: Povýšit uživatele promote_user: Povýšit uživatele
publish_terms_of_service: Zveřejnit smluvní podmínky
reject_appeal: Zamítnout odvolání reject_appeal: Zamítnout odvolání
reject_user: Odmítnout uživatele reject_user: Odmítnout uživatele
remove_avatar_user: Odstranit avatar remove_avatar_user: Odstranit avatar
@ -236,36 +247,50 @@ cs:
approve_appeal_html: Uživatel %{name} schválil odvolání proti rozhodnutí moderátora %{target} approve_appeal_html: Uživatel %{name} schválil odvolání proti rozhodnutí moderátora %{target}
approve_user_html: "%{name} schválil registraci od %{target}" approve_user_html: "%{name} schválil registraci od %{target}"
assigned_to_self_report_html: Uživatel %{name} si přidělil hlášení %{target} assigned_to_self_report_html: Uživatel %{name} si přidělil hlášení %{target}
change_email_user_html: "%{name} změnil*a e-mailovou adresu %{target}"
change_role_user_html: "%{name} změnil roli %{target}" change_role_user_html: "%{name} změnil roli %{target}"
confirm_user_html: Uživatel %{name} potvrdil e-mailovou adresu uživatele %{target}
create_account_warning_html: Uživatel %{name} poslal %{target} varování create_account_warning_html: Uživatel %{name} poslal %{target} varování
create_announcement_html: Uživatel %{name} vytvořil nové oznámení %{target} create_announcement_html: Uživatel %{name} vytvořil nové oznámení %{target}
create_canonical_email_block_html: "%{name} zablokoval e-mail s hashem %{target}"
create_custom_emoji_html: Uživatel %{name} nahrál nové emoji %{target} create_custom_emoji_html: Uživatel %{name} nahrál nové emoji %{target}
create_domain_allow_html: Uživatel %{name} povolil federaci s doménou %{target} create_domain_allow_html: Uživatel %{name} povolil federaci s doménou %{target}
create_domain_block_html: Uživatel %{name} zablokoval doménu %{target} create_domain_block_html: Uživatel %{name} zablokoval doménu %{target}
create_email_domain_block_html: Uživatel %{name} zablokoval e-mailovou doménu %{target}
create_ip_block_html: Uživatel %{name} vytvořil pravidlo pro IP %{target} create_ip_block_html: Uživatel %{name} vytvořil pravidlo pro IP %{target}
create_relay_html: "%{name} vytvořil*a relay %{target}"
create_unavailable_domain_html: "%{name} zastavil doručování na doménu %{target}" create_unavailable_domain_html: "%{name} zastavil doručování na doménu %{target}"
create_user_role_html: "%{name} vytvořil %{target} roli" create_user_role_html: "%{name} vytvořil %{target} roli"
demote_user_html: Uživatel %{name} degradoval uživatele %{target} demote_user_html: Uživatel %{name} degradoval uživatele %{target}
destroy_announcement_html: Uživatel %{name} odstranil oznámení %{target} destroy_announcement_html: Uživatel %{name} odstranil oznámení %{target}
destroy_canonical_email_block_html: "%{name} odblokoval*a e-mail s hashem %{target}"
destroy_custom_emoji_html: "%{name} odstranil emoji %{target}" destroy_custom_emoji_html: "%{name} odstranil emoji %{target}"
destroy_domain_allow_html: Uživatel %{name} zakázal federaci s doménou %{target} destroy_domain_allow_html: Uživatel %{name} zakázal federaci s doménou %{target}
destroy_domain_block_html: Uživatel %{name} odblokoval doménu %{target} destroy_domain_block_html: Uživatel %{name} odblokoval doménu %{target}
destroy_email_domain_block_html: "%{name} odblokoval*a e-mailovou doménu %{target}"
destroy_instance_html: Uživatel %{name} odmazal doménu %{target} destroy_instance_html: Uživatel %{name} odmazal doménu %{target}
destroy_ip_block_html: Uživatel %{name} odstranil pravidlo pro IP %{target} destroy_ip_block_html: Uživatel %{name} odstranil pravidlo pro IP %{target}
destroy_relay_html: "%{name} odstranil*a relay %{target}"
destroy_status_html: Uživatel %{name} odstranil příspěvek uživatele %{target} destroy_status_html: Uživatel %{name} odstranil příspěvek uživatele %{target}
destroy_unavailable_domain_html: "%{name} obnovil doručování na doménu %{target}" destroy_unavailable_domain_html: "%{name} obnovil doručování na doménu %{target}"
destroy_user_role_html: "%{name} odstranil %{target} roli" destroy_user_role_html: "%{name} odstranil %{target} roli"
disable_2fa_user_html: Uživatel %{name} vypnul dvoufázové ověřování pro uživatele %{target} disable_2fa_user_html: Uživatel %{name} vypnul dvoufázové ověřování pro uživatele %{target}
disable_custom_emoji_html: Uživatel %{name} zakázal emoji %{target} disable_custom_emoji_html: Uživatel %{name} zakázal emoji %{target}
disable_relay_html: "%{name} deaktivoval*a relay %{target}"
disable_sign_in_token_auth_user_html: "%{name} deaktivoval*a ověřování e-mailovým tokenem pro %{target}"
disable_user_html: Uživatel %{name} zakázal přihlašování pro uživatele %{target} disable_user_html: Uživatel %{name} zakázal přihlašování pro uživatele %{target}
enable_custom_emoji_html: Uživatel %{name} povolil emoji %{target} enable_custom_emoji_html: Uživatel %{name} povolil emoji %{target}
enable_relay_html: "%{name} aktivoval*a relay %{target}"
enable_sign_in_token_auth_user_html: "%{name} aktivoval*a ověřování e-mailovým tokenem pro %{target}"
enable_user_html: Uživatel %{name} povolil přihlašování pro uživatele %{target} enable_user_html: Uživatel %{name} povolil přihlašování pro uživatele %{target}
memorialize_account_html: Uživatel %{name} změnil účet %{target} na „in memoriam“ stránku memorialize_account_html: Uživatel %{name} změnil účet %{target} na „in memoriam“ stránku
promote_user_html: Uživatel %{name} povýšil uživatele %{target} promote_user_html: Uživatel %{name} povýšil uživatele %{target}
publish_terms_of_service_html: "%{name} zveřejnil*a aktualizace podmínek služby"
reject_appeal_html: Uživatel %{name} zamítl odvolání proti rozhodnutí moderátora %{target} reject_appeal_html: Uživatel %{name} zamítl odvolání proti rozhodnutí moderátora %{target}
reject_user_html: "%{name} odmítl registraci od %{target}" reject_user_html: "%{name} odmítl registraci od %{target}"
remove_avatar_user_html: Uživatel %{name} odstranil avatar uživatele %{target} remove_avatar_user_html: Uživatel %{name} odstranil avatar uživatele %{target}
reopen_report_html: Uživatel %{name} znovu otevřel hlášení %{target} reopen_report_html: Uživatel %{name} znovu otevřel hlášení %{target}
resend_user_html: "%{name} znovu odeslal*a potvrzovací e-mail pro %{target}"
reset_password_user_html: Uživatel %{name} obnovil heslo uživatele %{target} reset_password_user_html: Uživatel %{name} obnovil heslo uživatele %{target}
resolve_report_html: Uživatel %{name} vyřešil hlášení %{target} resolve_report_html: Uživatel %{name} vyřešil hlášení %{target}
sensitive_account_html: "%{name} označil média účtu %{target} jako citlivá" sensitive_account_html: "%{name} označil média účtu %{target} jako citlivá"
@ -436,6 +461,7 @@ cs:
many: "%{count} pokusů o registraci za poslední týden" many: "%{count} pokusů o registraci za poslední týden"
one: "%{count} pokus o registraci za poslední týden" one: "%{count} pokus o registraci za poslední týden"
other: "%{count} pokusů o registraci za poslední týden" other: "%{count} pokusů o registraci za poslední týden"
created_msg: E-mailová doména úspěšně zablokována
delete: Smazat delete: Smazat
dns: dns:
types: types:
@ -445,7 +471,9 @@ cs:
create: Přidat doménu create: Přidat doménu
resolve: Přeložit doménu resolve: Přeložit doménu
title: Blokovat novou e-mailovou doménu title: Blokovat novou e-mailovou doménu
no_email_domain_block_selected: Žádné blokace e-mailové domény nebyly změněny, protože žádné nebyly vybrány
not_permitted: Nepovoleno not_permitted: Nepovoleno
resolved_dns_records_hint_html: Doménové jméno vede na následující MX domény, které mají nakonec na starost přijímání e-mailů. Blokování MX domény zablokuje registrace z jakékoliv e-mailové adresy, která používá stejnou MX doménu, i když je viditelné doménové jméno jiné. <strong>Dejte si pozor, abyste nezablokovali velké e-mailové poskytovatele.</strong>
resolved_through_html: Přeložena přes %{domain} resolved_through_html: Přeložena přes %{domain}
title: Blokované e-mailové domény title: Blokované e-mailové domény
export_domain_allows: export_domain_allows:
@ -609,7 +637,9 @@ cs:
resolve_description_html: Nebudou učiněny žádné kroky proti nahlášenému účtu, žádný prohřešek zaznamenán a hlášení bude uzavřeno. resolve_description_html: Nebudou učiněny žádné kroky proti nahlášenému účtu, žádný prohřešek zaznamenán a hlášení bude uzavřeno.
silence_description_html: Účet bude viditelný pouze těm, kdo jej již sledují nebo si jej ručně vyhledají, což výrazně omezí jeho dosah. Vždy lze vrátit zpět. Uzavře všechna hlášení proti tomuto účtu. silence_description_html: Účet bude viditelný pouze těm, kdo jej již sledují nebo si jej ručně vyhledají, což výrazně omezí jeho dosah. Vždy lze vrátit zpět. Uzavře všechna hlášení proti tomuto účtu.
suspend_description_html: Účet a veškerý jeho obsah se znepřístupní a bude nakonec smazán, interakce s ním nebude možná. Lze vrátit zpět do 30 dnů. Uzavře všechna hlášení proti tomuto účtu. suspend_description_html: Účet a veškerý jeho obsah se znepřístupní a bude nakonec smazán, interakce s ním nebude možná. Lze vrátit zpět do 30 dnů. Uzavře všechna hlášení proti tomuto účtu.
actions_description_html: Rozhodněte, který krok učinit pro vyřešení tohoto hlášení. Pokud podniknete kárný krok proti nahlášenému účtu, bude mu zasláno e-mailové oznámení, s výjimkou případu, kdy je zvolena kategorie <strong>Spam</strong>.
actions_description_remote_html: Rozhodněte, co podniknout pro vyřešení tohoto hlášení. Toto ovlivní pouze to, jak <strong>váš</strong> server komunikuje s tímto vzdáleným účtem, a zpracuje jeho obsah. actions_description_remote_html: Rozhodněte, co podniknout pro vyřešení tohoto hlášení. Toto ovlivní pouze to, jak <strong>váš</strong> server komunikuje s tímto vzdáleným účtem, a zpracuje jeho obsah.
actions_no_posts: Toto hlášení nemá žádné související příspěvky k odstranění
add_to_report: Přidat do hlášení další add_to_report: Přidat do hlášení další
already_suspended_badges: already_suspended_badges:
local: Již pozastaveno na tomto serveru local: Již pozastaveno na tomto serveru
@ -673,6 +703,7 @@ cs:
delete_data_html: Odstranit profil a obsah <strong>@%{acct}</strong> ode dneška po 30 dní, pokud mezitím nebude zrušeno jeho pozastavení delete_data_html: Odstranit profil a obsah <strong>@%{acct}</strong> ode dneška po 30 dní, pokud mezitím nebude zrušeno jeho pozastavení
preview_preamble_html: "<strong>@%{acct}</strong> obdrží varování s následujícím obsahem:" preview_preamble_html: "<strong>@%{acct}</strong> obdrží varování s následujícím obsahem:"
record_strike_html: Zaznamenat prohřešek <strong>@%{acct}</strong> pro pomoc s řešením budoucích přestupků z tohoto účtu record_strike_html: Zaznamenat prohřešek <strong>@%{acct}</strong> pro pomoc s řešením budoucích přestupků z tohoto účtu
send_email_html: Poslat varovný e-mail pro <strong>@%{acct}</strong>
warning_placeholder: Volitelné další odůvodnění moderační akce. warning_placeholder: Volitelné další odůvodnění moderační akce.
target_origin: Původ nahlášeného účtu target_origin: Původ nahlášeného účtu
title: Hlášení title: Hlášení
@ -716,6 +747,7 @@ cs:
manage_appeals: Spravovat odvolání manage_appeals: Spravovat odvolání
manage_appeals_description: Umožňuje uživatelům posuzovat odvolání proti moderátorským zásahům manage_appeals_description: Umožňuje uživatelům posuzovat odvolání proti moderátorským zásahům
manage_blocks: Spravovat blokace manage_blocks: Spravovat blokace
manage_blocks_description: Umožňuje uživatelům blokovat poskytovatele e-mailů a IP adresy
manage_custom_emojis: Spravovat vlastní emoji manage_custom_emojis: Spravovat vlastní emoji
manage_custom_emojis_description: Umožňuje uživatelům spravovat vlastní emoji na serveru manage_custom_emojis_description: Umožňuje uživatelům spravovat vlastní emoji na serveru
manage_federation: Spravovat federaci manage_federation: Spravovat federaci
@ -733,6 +765,7 @@ cs:
manage_taxonomies: Správa taxonomií manage_taxonomies: Správa taxonomií
manage_taxonomies_description: Umožňuje uživatelům zkontrolovat populární obsah a aktualizovat nastavení hashtag manage_taxonomies_description: Umožňuje uživatelům zkontrolovat populární obsah a aktualizovat nastavení hashtag
manage_user_access: Spravovat uživatelské přístupy manage_user_access: Spravovat uživatelské přístupy
manage_user_access_description: Umožňuje uživatelům rušit jiným uživatelům dvoufázové ověřování, měnit jejich e-mailovou adresu a obnovovat jim hesla
manage_users: Spravovat uživatele manage_users: Spravovat uživatele
manage_users_description: Umožňuje uživatelům zobrazit podrobnosti ostatních uživatelů a provádět moderování proti nim manage_users_description: Umožňuje uživatelům zobrazit podrobnosti ostatních uživatelů a provádět moderování proti nim
manage_webhooks: Spravovat webhooky manage_webhooks: Spravovat webhooky
@ -807,6 +840,7 @@ cs:
destroyed_msg: Upload stránky byl úspěšně smazán! destroyed_msg: Upload stránky byl úspěšně smazán!
software_updates: software_updates:
critical_update: Kritické — aktualizujte, prosím, co nejdříve critical_update: Kritické — aktualizujte, prosím, co nejdříve
description: Doporučuje se udržovat vaši instalaci Mastodonu aktuální, aby se využily nejnovější opravy a funkce. Kromě toho je někdy velmi důležité včas aktualizovat Mastodon, aby se předešlo bezpečnostním problémům. Z těchto důvodů Mastodon kontroluje aktualizace každých 30 minut a bude vás informovat podle nastavení vašeho e-mailového oznámení.
documentation_link: Zjistit více documentation_link: Zjistit více
release_notes: Poznámky k vydání release_notes: Poznámky k vydání
title: Dostupné aktualizace title: Dostupné aktualizace
@ -822,6 +856,7 @@ cs:
back_to_account: Zpět na stránku účtu back_to_account: Zpět na stránku účtu
back_to_report: Zpět na stránku hlášení back_to_report: Zpět na stránku hlášení
batch: batch:
add_to_report: 'Přidat do hlášení #%{id}'
remove_from_report: Odebrat z hlášení remove_from_report: Odebrat z hlášení
report: Nahlásit report: Nahlásit
contents: Obsah contents: Obsah
@ -833,12 +868,17 @@ cs:
media: media:
title: Média title: Média
metadata: Metadata metadata: Metadata
no_history: Tento příspěvek nebyl upraven
no_status_selected: Nebyly změněny žádné příspěvky, neboť žádné nebyly vybrány no_status_selected: Nebyly změněny žádné příspěvky, neboť žádné nebyly vybrány
open: Otevřít příspěvek open: Otevřít příspěvek
original_status: Původní příspěvek original_status: Původní příspěvek
reblogs: Boosty reblogs: Boosty
replied_to_html: Odpověděl %{acct_link}
status_changed: Příspěvek změněn status_changed: Příspěvek změněn
status_title: Příspěvek od @%{name}
title: Příspěvky na účtu - @%{name}
trending: Populární trending: Populární
view_publicly: Zobrazit veřejně
visibility: Viditelnost visibility: Viditelnost
with_media: S médii with_media: S médii
strikes: strikes:
@ -880,6 +920,9 @@ cs:
message_html: Nedefinovali jste žádná pravidla serveru. message_html: Nedefinovali jste žádná pravidla serveru.
sidekiq_process_check: sidekiq_process_check:
message_html: Pro %{value} frontu/fronty neběží žádný Sidekiq proces. Zkontrolujte prosím svou Sidekiq konfiguraci message_html: Pro %{value} frontu/fronty neběží žádný Sidekiq proces. Zkontrolujte prosím svou Sidekiq konfiguraci
software_version_check:
action: Zobrazit dostupné aktualizace
message_html: K dispozici je aktualizace Mastodonu.
software_version_critical_check: software_version_critical_check:
action: Zobrazit dostupné aktualizace action: Zobrazit dostupné aktualizace
message_html: K dispozici je kritická aktualizace Mastodonu, prosím aktualizujte co nejrychleji. message_html: K dispozici je kritická aktualizace Mastodonu, prosím aktualizujte co nejrychleji.
@ -906,19 +949,57 @@ cs:
name: Název name: Název
newest: Nejnovější newest: Nejnovější
oldest: Nejstarší oldest: Nejstarší
open: Zobrazit veřejně
reset: Resetovat reset: Resetovat
review: Stav posouzení review: Stav posouzení
search: Hledat search: Hledat
title: Hashtagy title: Hashtagy
updated_msg: Nastavení hashtagů bylo úspěšně aktualizováno updated_msg: Nastavení hashtagů bylo úspěšně aktualizováno
terms_of_service:
back: Zpět na podmínky služby
changelog: Co se změnilo
create: Použít vlastní
current: Aktuální
draft: Koncept
generate: Použít šablonu
generates:
action: Vygenerovat
chance_to_review_html: "<strong>Vygenerované podmínky služby nebudou zveřejněny automaticky.</strong> Výsledky budete mít možnost zkontrolovat. Pro pokračování vyplňte potřebné podrobnosti."
explanation_html: Poskytovaná šablona služeb je určena pouze pro informační účely a neměla by být vykládána jako právní poradenství v jakékoli věci. Prosíme, konzultujte Vaši situaci a konkrétní právní otázky s Vaším pravním zástupcem.
title: Nastavení podmínek služby
history: Historie
live: Živě
no_history: Zatím nejsou zaznamenány žádné změny podmínek služby.
no_terms_of_service_html: Momentálně nemáte nakonfigurovány žádné podmínky služby. Podmínky služby jsou určeny k zajištění jasnosti a ochránit Vás před případnými právními závazky ve sporech s vašimi uživateli.
notified_on_html: Uživatelé upozorněni dne %{date}
notify_users: Upozornit uživatele
preview:
explanation_html: 'E-mail bude poslán <strong>%{display_count} uživatelům</strong>, kteří se zaregistrovali před datem %{date}. Následující text bude obsažen v onom e-mailu:'
send_preview: Poslat náhled na %{email}
send_to_all:
few: Poslat %{display_count} emaily
many: Poslat %{display_count} emailů
one: Poslat %{display_count} email
other: Poslat %{display_count} emailů
title: Náhled oznámení o podmínkách služby
publish: Zveřejnit
published_on_html: Zveřejněno %{date}
save_draft: Uložit koncept
title: Podmínky služby
title: Administrace title: Administrace
trends: trends:
allow: Povolit allow: Povolit
approved: Schválené approved: Schválené
confirm_allow: Opravdu chcete povolit vybrané štítky?
confirm_disallow: Opravdu chcete zakázat vybrané štítky?
disallow: Zakázat disallow: Zakázat
links: links:
allow: Povolit odkaz allow: Povolit odkaz
allow_provider: Povolit vydavatele allow_provider: Povolit vydavatele
confirm_allow: Jste si jist, že chcete povolit vybrané odkazy?
confirm_allow_provider: Opravdu chcete povolit vybrané poskytovatele?
confirm_disallow: Opravdu chcete zakázat vybrané odkazy?
confirm_disallow_provider: Opravdu chcete zakázat vybrané poskytovatele?
description_html: Toto jsou odkazy, které jsou momentálně hojně sdíleny účty, jejichž příspěvky váš server vidí. To může pomoct vašim uživatelům zjistit, co se děje ve světě. Žádné odkazy se nezobrazují veřejně, dokud neschválíte vydavatele. Můžete také povolit nebo zamítnout jednotlivé odkazy. description_html: Toto jsou odkazy, které jsou momentálně hojně sdíleny účty, jejichž příspěvky váš server vidí. To může pomoct vašim uživatelům zjistit, co se děje ve světě. Žádné odkazy se nezobrazují veřejně, dokud neschválíte vydavatele. Můžete také povolit nebo zamítnout jednotlivé odkazy.
disallow: Zakázat odkaz disallow: Zakázat odkaz
disallow_provider: Zakázat vydavatele disallow_provider: Zakázat vydavatele
@ -944,6 +1025,10 @@ cs:
statuses: statuses:
allow: Povolit příspěvek allow: Povolit příspěvek
allow_account: Povolit autora allow_account: Povolit autora
confirm_allow: Opravdu chcete povolit vybrané tooty?
confirm_allow_account: Opravdu chcete povolit vybrané účty?
confirm_disallow: Opravdu chcete zakázat vybrané tooty?
confirm_disallow_account: Opravdu chcete zakázat vybrané účty?
description_html: Toto jsou příspěvky, o kterých váš server ví, že jsou momentálně hodně sdíleny a oblibovány. To může pomoci vašim novým i vracejícím se uživatelům najít další lidi ke sledování. Žádné příspěvky se nezobrazují veřejně, dokud neschválíte autora a tento autor nepovolí navrhování svého účtu ostatním. Můžete také povolit či zamítnout jednotlivé příspěvky. description_html: Toto jsou příspěvky, o kterých váš server ví, že jsou momentálně hodně sdíleny a oblibovány. To může pomoci vašim novým i vracejícím se uživatelům najít další lidi ke sledování. Žádné příspěvky se nezobrazují veřejně, dokud neschválíte autora a tento autor nepovolí navrhování svého účtu ostatním. Můžete také povolit či zamítnout jednotlivé příspěvky.
disallow: Zakázat příspěvek disallow: Zakázat příspěvek
disallow_account: Zakázat autora disallow_account: Zakázat autora
@ -980,6 +1065,7 @@ cs:
many: Použit %{count} lidmi za poslední týden many: Použit %{count} lidmi za poslední týden
one: Použit jedním člověkem za poslední týden one: Použit jedním člověkem za poslední týden
other: Použit %{count} lidmi za poslední týden other: Použit %{count} lidmi za poslední týden
title: Doporučení & Trendy
trending: Populární trending: Populární
warning_presets: warning_presets:
add_new: Přidat nové add_new: Přidat nové
@ -1066,7 +1152,9 @@ cs:
guide_link_text: Zapojit se může každý. guide_link_text: Zapojit se může každý.
sensitive_content: Citlivý obsah sensitive_content: Citlivý obsah
application_mailer: application_mailer:
notification_preferences: Změnit předvolby e-mailu
salutation: "%{name}," salutation: "%{name},"
settings: 'Změnit předvolby e-mailu: %{link}'
unsubscribe: Přestat odebírat unsubscribe: Přestat odebírat
view: 'Zobrazit:' view: 'Zobrazit:'
view_profile: Zobrazit profil view_profile: Zobrazit profil
@ -1086,6 +1174,7 @@ cs:
hint_html: Ještě jedna věc! Musíme potvrdit, že jste člověk (to proto, abychom drželi stranou spam!). Vyřešte CAPTCHA níže a klikněte na "Pokračovat". hint_html: Ještě jedna věc! Musíme potvrdit, že jste člověk (to proto, abychom drželi stranou spam!). Vyřešte CAPTCHA níže a klikněte na "Pokračovat".
title: Bezpečnostní kontrola title: Bezpečnostní kontrola
confirmations: confirmations:
awaiting_review: Vaše e-mailová adresa je potvrzena! Personál %{domain} nyní kontrolují vaši registraci. Pokud váš účet schválí, obdržíte e-mail!
awaiting_review_title: Vaše registrace se ověřuje awaiting_review_title: Vaše registrace se ověřuje
clicking_this_link: kliknutím na tento odkaz clicking_this_link: kliknutím na tento odkaz
login_link: přihlásit se login_link: přihlásit se
@ -1093,6 +1182,7 @@ cs:
redirect_to_app_html: Měli byste být přesměrováni do aplikace <strong>%{app_name}</strong>. Pokud se tak nestalo, zkuste %{clicking_this_link} nebo ručně se vrátit do aplikace. redirect_to_app_html: Měli byste být přesměrováni do aplikace <strong>%{app_name}</strong>. Pokud se tak nestalo, zkuste %{clicking_this_link} nebo ručně se vrátit do aplikace.
registration_complete: Vaše registrace na %{domain} je hotová! registration_complete: Vaše registrace na %{domain} je hotová!
welcome_title: Vítám uživatele %{name}! welcome_title: Vítám uživatele %{name}!
wrong_email_hint: Pokud není tento e-mail správný, můžete si ho změnit v nastavení účtu.
delete_account: Odstranit účet delete_account: Odstranit účet
delete_account_html: Chcete-li odstranit svůj účet, <a href="%{path}">pokračujte zde</a>. Budete požádáni o potvrzení. delete_account_html: Chcete-li odstranit svůj účet, <a href="%{path}">pokračujte zde</a>. Budete požádáni o potvrzení.
description: description:
@ -1112,6 +1202,7 @@ cs:
migrate_account_html: Zde můžete <a href="%{path}">nastavit přesměrování tohoto účtu na jiný</a>. migrate_account_html: Zde můžete <a href="%{path}">nastavit přesměrování tohoto účtu na jiný</a>.
or_log_in_with: Nebo se přihlaste pomocí or_log_in_with: Nebo se přihlaste pomocí
progress: progress:
confirm: Potvrdit e-mail
details: Vaše údaje details: Vaše údaje
review: Naše hodnocení review: Naše hodnocení
rules: Přijmout pravidla rules: Přijmout pravidla
@ -1133,22 +1224,37 @@ cs:
security: Zabezpečení security: Zabezpečení
set_new_password: Nastavit nové heslo set_new_password: Nastavit nové heslo
setup: setup:
email_below_hint_html: Zkontrolujte složku se spamem, nebo požádejte o další. Svou e-mailovou adresu si můžete opravit, pokud je špatně.
email_settings_hint_html: Kliknutím na odkaz, který jsme poslali do %{email}, začnete používat Mastodon. Budeme tu čekat.
link_not_received: Nedostali jste odkaz? link_not_received: Nedostali jste odkaz?
new_confirmation_instructions_sent: Za několik minut obdržíte nový e-mail s potvrzovacím odkazem!
title: Zkontrolujte doručenou poštu title: Zkontrolujte doručenou poštu
sign_in: sign_in:
preamble_html: Přihlaste se svými <strong>%{domain}</strong> údaji. Pokud je váš účet hostován na jiném serveru, přihlásit se zde nemůžete. preamble_html: Přihlaste se svými <strong>%{domain}</strong> údaji. Pokud je váš účet hostován na jiném serveru, přihlásit se zde nemůžete.
title: Přihlásit se k %{domain} title: Přihlásit se k %{domain}
sign_up: sign_up:
manual_review: Registrace na %{domain} procházejí manuálním hodnocením od našich moderátorů. Abyste nám pomohli zpracovat Vaši registraci, napište trochu o sobě a proč chcete účet na %{domain}. manual_review: Registrace na %{domain} procházejí manuálním hodnocením od našich moderátorů. Abyste nám pomohli zpracovat Vaši registraci, napište trochu o sobě a proč chcete účet na %{domain}.
preamble: S účtem na tomto Mastodon serveru budete moci sledovat jakoukoli jinou osobu na fediversu, bez ohledu na to, kde je jejich účet hostován.
title: Pojďme vás nastavit na %{domain}. title: Pojďme vás nastavit na %{domain}.
status: status:
account_status: Stav účtu account_status: Stav účtu
confirming: Čekáme na dokončení potvrzení e-mailu.
functional: Váš účet je plně funkční. functional: Váš účet je plně funkční.
pending: Vaše žádost čeká na posouzení naším personálem. To může nějakou dobu trvat. Pokud bude váš požadavek schválen, obdržíte e-mail.
redirecting_to: Váš účet je neaktivní, protože je právě přesměrován na účet %{acct}. redirecting_to: Váš účet je neaktivní, protože je právě přesměrován na účet %{acct}.
self_destruct: Protože %{domain} končí, budete mít k účtu jen omezený přístup. self_destruct: Protože %{domain} končí, budete mít k účtu jen omezený přístup.
view_strikes: Zobrazit minulé prohřešky vašeho účtu view_strikes: Zobrazit minulé prohřešky vašeho účtu
too_fast: Formulář byl odeslán příliš rychle, zkuste to znovu. too_fast: Formulář byl odeslán příliš rychle, zkuste to znovu.
use_security_key: Použít bezpečnostní klíč use_security_key: Použít bezpečnostní klíč
user_agreement_html: Přečetl jsem si a souhlasím s <a href="%{terms_of_service_path}" target="_blank">podmínkami služby</a> a <a href="%{privacy_policy_path}" target="_blank">ochranou osobních údajů</a>
author_attribution:
example_title: Ukázkový text
hint_html: Píšete novinové články nebo blog mimo Mastodon? Kontrolujte, jak Vám bude připisováno autorství, když jsou sdíleny na Mastodonu.
instructions: 'Ujistěte se, že tento kód je v HTML vašeho článku:'
more_from_html: Více od %{name}
s_blog: Blog %{name}
then_instructions: Poté přidejte název domény publikace do níže uvedeného pole.
title: Připisování autorství
challenge: challenge:
confirm: Pokračovat confirm: Pokračovat
hint_html: "<strong>Tip:</strong> Po dobu jedné hodiny vás o heslo nebudeme znovu žádat." hint_html: "<strong>Tip:</strong> Po dobu jedné hodiny vás o heslo nebudeme znovu žádat."
@ -1185,6 +1291,9 @@ cs:
before: 'Před pokračováním si prosím pečlivě přečtěte tyto poznámky:' before: 'Před pokračováním si prosím pečlivě přečtěte tyto poznámky:'
caches: Obsah, který byl uložen do cache jiných serverů, nemusí být smazán caches: Obsah, který byl uložen do cache jiných serverů, nemusí být smazán
data_removal: Vaše příspěvky a další data budou trvale smazána data_removal: Vaše příspěvky a další data budou trvale smazána
email_change_html: Můžete <a href="%{path}">změnit svou e-mailovou adresu</a> bez odstranění svého účtu
email_contact_html: Pokud stále nedorazí, můžete poslat e-mail <a href="mailto:%{email}">%{email}</a> pro pomoc
email_reconfirmation_html: Pokud neobdržíte potvrzovací e-mail, můžete si ho <a href="%{path}">vyžádat znovu</a>
irreversible: Váš účet nebude možné obnovit ani znovu aktivovat irreversible: Váš účet nebude možné obnovit ani znovu aktivovat
more_details_html: Podrobnosti najdete v <a href="%{terms_path}">zásadách ochrany osobních údajů</a>. more_details_html: Podrobnosti najdete v <a href="%{terms_path}">zásadách ochrany osobních údajů</a>.
username_available: Vaše uživatelské jméno bude opět dostupné username_available: Vaše uživatelské jméno bude opět dostupné
@ -1356,6 +1465,68 @@ cs:
merge_long: Ponechat existující záznamy a přidat nové merge_long: Ponechat existující záznamy a přidat nové
overwrite: Přepsat overwrite: Přepsat
overwrite_long: Nahradit aktuální záznamy novými overwrite_long: Nahradit aktuální záznamy novými
overwrite_preambles:
blocking_html:
few: Chystáte se <strong>nahradit váš seznam bloků</strong> s <strong>%{count} účty</strong> z <strong>%{filename}</strong>.
many: Chystáte se <strong>nahradit váš seznam bloků</strong> s <strong>%{count} účty</strong> z <strong>%{filename}</strong>.
one: Chystáte se <strong>nahradit váš seznam bloků</strong> s <strong>%{count} účtem</strong> z <strong>%{filename}</strong>.
other: Chystáte se <strong>nahradit váš seznam bloků</strong> s <strong>%{count} účty</strong> z <strong>%{filename}</strong>.
bookmarks_html:
few: Chystáte se <strong>nahradit své záložky</strong> s <strong>%{count} příspěvky</strong> z <strong>%{filename}</strong>.
many: Chystáte se <strong>nahradit své záložky</strong> s <strong>%{count} příspěvky</strong> z <strong>%{filename}</strong>.
one: Chystáte se <strong>nahradit své záložky</strong> s <strong>%{count} příspěvkem</strong> z <strong>%{filename}</strong>.
other: Chystáte se <strong>nahradit své záložky</strong> s <strong>%{count} příspěvky</strong> z <strong>%{filename}</strong>.
domain_blocking_html:
few: Chystáte se <strong>nahradit Váš seznam zablokovaných domén</strong> s <strong>%{count} stránky</strong> z <strong>%{filename}</strong>.
many: Chystáte se <strong>nahradit Váš seznam zablokovaných domén</strong> s <strong>%{count} stránky</strong> z <strong>%{filename}</strong>.
one: Chystáte se <strong>nahradit Váš seznam zablokovaných domén</strong> s <strong>%{count} stránkou</strong> z <strong>%{filename}</strong>.
other: Chystáte se <strong>nahradit Váš seznam zablokovaných domén</strong> s <strong>%{count} stránky</strong> z <strong>%{filename}</strong>.
following_html:
few: Chystáte se <strong>sledovat</strong> až <strong>%{count} účty</strong> z <strong>%{filename}</strong> a <strong>přestanete sledovat kohokoliv jiného</strong>.
many: Chystáte se <strong>sledovat</strong> až <strong>%{count} účtů</strong> z <strong>%{filename}</strong> a <strong>přestanete sledovat kohokoliv jiného</strong>.
one: Chystáte se <strong>sledovat</strong> až <strong>%{count} účet</strong> z <strong>%{filename}</strong> a <strong>přestanete sledovat kohokoliv jiného</strong>.
other: Chystáte se <strong>sledovat</strong> až <strong>%{count} účtů</strong> z <strong>%{filename}</strong> a <strong>přestanete sledovat kohokoliv jiného</strong>.
lists_html:
few: Chystáte se <strong>nahradit své seznamy</strong> obsahem <strong>%{filename}</strong>. Až <strong>%{count} účty</strong> budou přidány do nových seznamů.
many: Chystáte se <strong>nahradit své seznamy</strong> obsahem <strong>%{filename}</strong>. Až <strong>%{count} účtů</strong> bude přidáno do nových seznamů.
one: Chystáte se <strong>nahradit své seznamy</strong> obsahem <strong>%{filename}</strong>. Až <strong>%{count} účet</strong> bude přidán do nových seznamů.
other: Chystáte se <strong>nahradit své seznamy</strong> obsahem <strong>%{filename}</strong>. Až <strong>%{count} účtů</strong> bude přidáno do nových seznamů.
muting_html:
few: Chystáte se <strong>nahradit svůj seznam ztišených účtů</strong> s <strong>%{count} účty</strong> z <strong>%{filename}</strong>.
many: Chystáte se <strong>nahradit svůj seznam ztišených účtů</strong> s <strong>%{count} účty</strong> z <strong>%{filename}</strong>.
one: Chystáte se <strong>nahradit svůj seznam ztišených účtů</strong> s <strong>%{count} účtem</strong> z <strong>%{filename}</strong>.
other: Chystáte se <strong>nahradit svůj seznam ztišených účtů</strong> s <strong>%{count} účty</strong> z <strong>%{filename}</strong>.
preambles:
blocking_html:
few: Chystáte se <strong>zablokovat</strong> až <strong>%{count} účty</strong> z <strong>%{filename}</strong>.
many: Chystáte se <strong>zablokovat</strong> až <strong>%{count} účtů</strong> z <strong>%{filename}</strong>.
one: Chystáte se <strong>zablokovat</strong> až <strong>%{count} účet</strong> z <strong>%{filename}</strong>.
other: Chystáte se <strong>zablokovat</strong> až <strong>%{count} účtů</strong> z <strong>%{filename}</strong>.
bookmarks_html:
few: Chystáte se přidat až <strong>%{count} příspěvky</strong> z <strong>%{filename}</strong> do vašich <strong>záložek</strong>.
many: Chystáte se přidat až <strong>%{count} příspěvků</strong> z <strong>%{filename}</strong> do vašich <strong>záložek</strong>.
one: Chystáte se přidat až <strong>%{count} příspěvek</strong> z <strong>%{filename}</strong> do vašich <strong>záložek</strong>.
other: Chystáte se přidat až <strong>%{count} příspěvků</strong> z <strong>%{filename}</strong> do vašich <strong>záložek</strong>.
domain_blocking_html:
few: Chystáte se <strong>zablokovat</strong> až <strong>%{count} domény</strong> z <strong>%{filename}</strong>.
many: Chystáte se <strong>zablokovat</strong> až <strong>%{count} domén</strong> z <strong>%{filename}</strong>.
one: Chystáte se <strong>zablokovat</strong> až <strong>%{count} doménu</strong> z <strong>%{filename}</strong>.
other: Chystáte se <strong>zablokovat</strong> až <strong>%{count} domén</strong> z <strong>%{filename}</strong>.
following_html:
few: Chystáte se <strong>sledovat</strong> až <strong>%{count} účty</strong> z <strong>%{filename}</strong>.
many: Chystáte se <strong>sledovat</strong> až <strong>%{count} účtů</strong> z <strong>%{filename}</strong>.
one: Chystáte se <strong>sledovat</strong> až <strong>%{count} účet</strong> z <strong>%{filename}</strong>.
other: Chystáte se <strong>sledovat</strong> až <strong>%{count} účtů</strong> z <strong>%{filename}</strong>.
lists_html:
few: Chystáte se přidat <strong>%{count} účty</strong> z <strong>%{filename}</strong> do vaších <strong>seznamů</strong>. Nové seznamy budou vytvořeny, pokud neexistuje žádný seznam, do kterého by je bylo možné přidat.
many: Chystáte se přidat <strong>%{count} účtů</strong> z <strong>%{filename}</strong> do vaších <strong>seznamů</strong>. Nové seznamy budou vytvořeny, pokud neexistuje žádný seznam, do kterého by je bylo možné přidat.
one: Chystáte se přidat <strong>%{count} účet</strong> z <strong>%{filename}</strong> do vaších <strong>seznamů</strong>. Nové seznamy budou vytvořeny, pokud neexistuje žádný seznam, do kterého by jej bylo možné přidat.
other: Chystáte se přidat <strong>%{count} účtů</strong> z <strong>%{filename}</strong> do vaších <strong>seznamů</strong>. Nové seznamy budou vytvořeny, pokud neexistuje žádný seznam, do kterého by je bylo možné přidat.
muting_html:
few: Chystáte se <strong>ztišit</strong> až <strong>%{count} účty</strong> z <strong>%{filename}</strong>.
many: Chystáte se <strong>ztišit</strong> až <strong>%{count} účtů</strong> z <strong>%{filename}</strong>.
one: Chystáte se <strong>ztišit</strong> až <strong>%{count} účet</strong> z <strong>%{filename}</strong>.
other: Chystáte se <strong>ztišit</strong> až <strong>%{count} účtů</strong> z <strong>%{filename}</strong>.
preface: Můžete importovat data, která jste exportovali z jiného serveru, jako například seznam lidí, které sledujete či blokujete. preface: Můžete importovat data, která jste exportovali z jiného serveru, jako například seznam lidí, které sledujete či blokujete.
recent_imports: Nedávné importy recent_imports: Nedávné importy
states: states:
@ -1417,6 +1588,7 @@ cs:
authentication_methods: authentication_methods:
otp: aplikací pro dvoufaktorové ověření otp: aplikací pro dvoufaktorové ověření
password: heslem password: heslem
sign_in_token: bezpečnostní kód e-mailu
webauthn: bezpečnostními klíči webauthn: bezpečnostními klíči
description_html: Pokud vidíte aktivitu, kterou nepoznáváte, zvažte změnu hesla a zapnutí dvoufaktorového ověřování. description_html: Pokud vidíte aktivitu, kterou nepoznáváte, zvažte změnu hesla a zapnutí dvoufaktorového ověřování.
empty: Není k dispozici žádná historie přihlášení empty: Není k dispozici žádná historie přihlášení
@ -1427,10 +1599,21 @@ cs:
unsubscribe: unsubscribe:
action: Ano, odeberte odběr action: Ano, odeberte odběr
complete: Odběr byl odhlášen complete: Odběr byl odhlášen
confirmation_html: Jste si jisti, že chcete odhlásit odběr %{type} pro Mastodon na %{domain} na váš e-mail %{email}? Vždy se můžete znovu přihlásit ve svém nastavení <a href="%{settings_path}">e-mailových oznámení</a>.
emails:
notification_emails:
favourite: e-mailové oznámení při oblíbení
follow: e-mailové oznámení při sledování
follow_request: e-mail při žádost o sledování
mention: e-mailové oznámení při zmínění
reblog: e-mailové oznámení při boostu
resubscribe_html: Pokud jste se odhlásili omylem, můžete se znovu přihlásit ve svých nastavení <a href="%{settings_path}">e-mailových oznámení</a>.
success_html: Již nebudete dostávat %{type} pro Mastodon na %{domain} na vaši e-mailovou adresu %{email}.
title: Odhlásit odběr title: Odhlásit odběr
media_attachments: media_attachments:
validations: validations:
images_and_video: K příspěvku, který již obsahuje obrázky, nelze připojit video images_and_video: K příspěvku, který již obsahuje obrázky, nelze připojit video
not_found: Média %{ids} nebyla nalezena nebo již byla připojena k jinému příspěvku
not_ready: Nelze připojit soubory před jejich zpracováním. Zkuste to znovu za chvíli! not_ready: Nelze připojit soubory před jejich zpracováním. Zkuste to znovu za chvíli!
too_many: Nelze připojit více než 4 soubory too_many: Nelze připojit více než 4 soubory
migrations: migrations:
@ -1507,6 +1690,8 @@ cs:
update: update:
subject: Uživatel %{name} upravil příspěvek subject: Uživatel %{name} upravil příspěvek
notifications: notifications:
administration_emails: E-mailová oznámení administrátora
email_events: Události pro e-mailová oznámení
email_events_hint: 'Vyberte události, pro které chcete dostávat oznámení:' email_events_hint: 'Vyberte události, pro které chcete dostávat oznámení:'
number: number:
human: human:
@ -1600,6 +1785,7 @@ cs:
scheduled_statuses: scheduled_statuses:
over_daily_limit: Pro dnešek jste překročili limit %{limit} naplánovaných příspěvků over_daily_limit: Pro dnešek jste překročili limit %{limit} naplánovaných příspěvků
over_total_limit: Překročili jste limit %{limit} naplánovaných příspěvků over_total_limit: Překročili jste limit %{limit} naplánovaných příspěvků
too_soon: datum musí být v budoucnu
self_destruct: self_destruct:
lead_html: "<strong>%{domain}</strong> bohužel končí nadobro. Pokud jste tam měli účet, nebudete jej moci dále používat, ale stále si můžete vyžádat zálohu vašich dat." lead_html: "<strong>%{domain}</strong> bohužel končí nadobro. Pokud jste tam měli účet, nebudete jej moci dále používat, ale stále si můžete vyžádat zálohu vašich dat."
title: Tento server končí title: Tento server končí
@ -1659,10 +1845,12 @@ cs:
delete: Smazání účtu delete: Smazání účtu
development: Vývoj development: Vývoj
edit_profile: Upravit profil edit_profile: Upravit profil
export: Export
featured_tags: Zvýrazněné hashtagy featured_tags: Zvýrazněné hashtagy
import: Import import: Import
import_and_export: Import a export import_and_export: Import a export
migrate: Přesun účtu migrate: Přesun účtu
notifications: Emailové oznámení
preferences: Předvolby preferences: Předvolby
profile: Profil profile: Profil
relationships: Sledovaní a sledující relationships: Sledovaní a sledující
@ -1768,6 +1956,8 @@ cs:
too_late: Na odvolání proti tomuto prohřešku už je pozdě too_late: Na odvolání proti tomuto prohřešku už je pozdě
tags: tags:
does_not_match_previous_name: se neshoduje s předchozím názvem does_not_match_previous_name: se neshoduje s předchozím názvem
terms_of_service:
title: Podmínky služby
themes: themes:
contrast: Mastodon (vysoký kontrast) contrast: Mastodon (vysoký kontrast)
default: Mastodon (tmavý) default: Mastodon (tmavý)
@ -1828,6 +2018,15 @@ cs:
further_actions_html: Pokud jste to nebyli vy, doporučujeme pro zabezpečení vašeho účtu okamžitě %{action} a zapnout dvoufázové ověřování. further_actions_html: Pokud jste to nebyli vy, doporučujeme pro zabezpečení vašeho účtu okamžitě %{action} a zapnout dvoufázové ověřování.
subject: Váš účet byl použit z nové IP adresy subject: Váš účet byl použit z nové IP adresy
title: Nové přihlášení title: Nové přihlášení
terms_of_service_changed:
agreement: Pokračováním v používání %{domain} souhlasíte s těmito podmínkami. Pokud nesouhlasíte s aktualizovanými podmínkami, můžete svůj souhlas s %{domain} kdykoliv ukončit odstraněním vašeho účtu.
changelog: 'Ve zkratce, zde je to, co tato změna znamená pro vás:'
description: 'Tento e-mail jste obdrželi, protože na %{domain} provádíme určité změny našich smluvních podmínek. Doporučujeme vám zkontrolovat aktualizované podmínky v plném znění zde:'
description_html: Tento e-mail jste obdrželi, protože na %{domain} provádíme určité změny našich smluvních podmínek. Doporučujeme Vám zkontrolovat <a href="%{path}" target="_blank">aktualizované termíny v plném znění zde</a>.
sign_off: Tým %{domain}
subject: Aktualizace našich podmínek služby
subtitle: Podmínky služby %{domain} se mění
title: Důležitá aktualizace
warning: warning:
appeal: Podat odvolání appeal: Podat odvolání
appeal_description: Pokud se domníváte, že se jedná o chybu, můžete podat odvolání personálu %{instance}. appeal_description: Pokud se domníváte, že se jedná o chybu, můžete podat odvolání personálu %{instance}.
@ -1908,6 +2107,7 @@ cs:
invalid_otp_token: Neplatný kód pro dvoufázové ověřování invalid_otp_token: Neplatný kód pro dvoufázové ověřování
otp_lost_help_html: Pokud jste ztratili přístup k oběma, spojte se s %{email} otp_lost_help_html: Pokud jste ztratili přístup k oběma, spojte se s %{email}
rate_limited: Příliš mnoho pokusů o ověření, zkuste to znovu později. rate_limited: Příliš mnoho pokusů o ověření, zkuste to znovu později.
seamless_external_login: Jste přihlášeni přes externí službu, nastavení hesla a e-mailu proto nejsou dostupná.
signed_in_as: 'Přihlášeni jako:' signed_in_as: 'Přihlášeni jako:'
verification: verification:
extra_instructions_html: <strong>Tip:</strong> Odkaz na vaší webové stránce může být neviditelný. Důležitou součástí je <code>rel="me"</code>, která brání proti napodování vás na webových stránkách s obsahem vytvořeným uživatelem. Můžete dokonce použít <code>odkaz</code> v záhlaví stránky místo <code>a</code>, ale HTML musí být přístupné bez spuštění JavaScript. extra_instructions_html: <strong>Tip:</strong> Odkaz na vaší webové stránce může být neviditelný. Důležitou součástí je <code>rel="me"</code>, která brání proti napodování vás na webových stránkách s obsahem vytvořeným uživatelem. Můžete dokonce použít <code>odkaz</code> v záhlaví stránky místo <code>a</code>, ale HTML musí být přístupné bez spuštění JavaScript.
@ -1916,6 +2116,7 @@ cs:
instructions_html: Zkopírujte a vložte níže uvedený kód do HTML vašeho webu. Poté přidejte adresu vašeho webu do jednoho z extra políček na vašem profilu na záložce "Upravit profil" a uložte změny. instructions_html: Zkopírujte a vložte níže uvedený kód do HTML vašeho webu. Poté přidejte adresu vašeho webu do jednoho z extra políček na vašem profilu na záložce "Upravit profil" a uložte změny.
verification: Ověření verification: Ověření
verified_links: Vaše ověřené odkazy verified_links: Vaše ověřené odkazy
website_verification: Ověření webové stránky
webauthn_credentials: webauthn_credentials:
add: Přidat nový bezpečnostní klíč add: Přidat nový bezpečnostní klíč
create: create:

View file

@ -936,13 +936,22 @@ eo:
generate: Uzi ŝablonon generate: Uzi ŝablonon
generates: generates:
action: Generi action: Generi
chance_to_review_html: "<strong>La generataj kondiĉoj de uzado ne aŭtomate publikiĝos.</strong> Estos oportuni por vi kontroli la rezultojn. Bonvole entajpu la necesajn detalojn por daŭrigi."
explanation_html: La modelo por la kondiĉoj de la servo disponeblas sole por informi. Ĝi nepre ne estas leĝa konsilo pri iu ajn temo. Bonvole konsultu vian propran leĝan konsilanton pri via situacio kaj iuj leĝaj neklarecoj.
title: Agordo de kondiĉoj de uzado title: Agordo de kondiĉoj de uzado
history: Historio
live: Antaŭmontro
no_history: Ankoraŭ ne estas registritaj ŝanĝoj de la kondiĉoj de la servo. no_history: Ankoraŭ ne estas registritaj ŝanĝoj de la kondiĉoj de la servo.
no_terms_of_service_html: Vi nuntempe ne havas iujn ajn kondiĉojn de la servo agordita. La kondiĉoj de la servo celas doni klarecon kaj protekti vin kontraŭ eblaj respondecoj en disputoj kun viaj uzantoj. no_terms_of_service_html: Vi nuntempe ne havas iujn ajn kondiĉojn de la servo agordita. La kondiĉoj de la servo celas doni klarecon kaj protekti vin kontraŭ eblaj respondecoj en disputoj kun viaj uzantoj.
notified_on_html: Uzantojn sciigis je %{date}
notify_users: Informu uzantojn
preview: preview:
explanation_html: 'La retmesaĝo estos alsendata al <strong>%{display_count} uzantoj</strong>, kiuj kreis konton antaŭ %{date}. La sekvonta teksto inkluziviĝos en la retmesaĝo:'
send_preview: Sendu antaŭrigardon al %{email}
send_to_all: send_to_all:
one: Sendi %{display_count} retpoŝton one: Sendi %{display_count} retpoŝton
other: Sendi %{display_count} retpoŝtojn other: Sendi %{display_count} retpoŝtojn
title: Antaŭmontri sciigon pri la kondiĉoj de la servo
publish: Publikigi publish: Publikigi
published_on_html: Publikigita je %{date} published_on_html: Publikigita je %{date}
save_draft: Konservi malneton save_draft: Konservi malneton
@ -1926,6 +1935,10 @@ eo:
subject: Via konto estas alirita de nova IP-adreso subject: Via konto estas alirita de nova IP-adreso
title: Nova saluto title: Nova saluto
terms_of_service_changed: terms_of_service_changed:
agreement: Se vi daŭrige uzos %{domain}, vi aŭtomate interkonsentos pri ĉi tiuj kondiĉoj. Se vi malkonsentas pri la novaj kondiĉoj, vi ĉiutempe rajtas nuligi la interkonsenton kun %{domain} per forigi vian konton.
changelog: 'Facile dirite, la ŝanĝoj estas la jenaj:'
description: 'Vi ricevas ĉi tiun retmesaĝon ĉar ni faras iujn ŝanĝojn al niaj servokondiĉoj ĉe %{domain}. Ni instigas vin revizii la ĝisdatigitajn kondiĉojn tute ĉi tie:'
description_html: Vi ricevas ĉi tiun retmesaĝon ĉar ni faras iujn ŝanĝojn al niaj servokondiĉoj ĉe %{domain}. Ni instigas vin revizii la <a href="%{path}" target="_blank">ĝisdatigitajn kondiĉojn plene ĉi tie</a>.
sign_off: La teamo de %{domain} sign_off: La teamo de %{domain}
subject: Ĝisdatigoj al niaj kondiĉoj de servo subject: Ĝisdatigoj al niaj kondiĉoj de servo
subtitle: La kondiĉoj de la servo de %{domain} ŝanĝiĝas subtitle: La kondiĉoj de la servo de %{domain} ŝanĝiĝas

View file

@ -1859,9 +1859,9 @@ gl:
'63113904': 2 anos '63113904': 2 anos
'7889238': 3 meses '7889238': 3 meses
min_age_label: Límite temporal min_age_label: Límite temporal
min_favs: Manter as publicacións favorecidas polo menos min_favs: Manter publicacións favorecidas polo menos
min_favs_hint: Non elimina ningunha das túas publicacións que recibiron alomenos esta cantidade de favorecementos. Deixa en branco para eliminar publicacións independentemente do número de favorecementos min_favs_hint: Non elimina ningunha das túas publicacións que recibiron alomenos esta cantidade de favorecementos. Deixa en branco para eliminar publicacións independentemente do número de favorecementos
min_reblogs: Manter publicacións promovidas máis de min_reblogs: Manter publicacións promovidas polo menos
min_reblogs_hint: Non elimina ningunha das túas publicacións se foron promovidas máis deste número de veces. Deixa en branco para eliminar publicacións independentemente do seu número de promocións min_reblogs_hint: Non elimina ningunha das túas publicacións se foron promovidas máis deste número de veces. Deixa en branco para eliminar publicacións independentemente do seu número de promocións
stream_entries: stream_entries:
sensitive_content: Contido sensible sensitive_content: Contido sensible

View file

@ -217,6 +217,7 @@ lv:
enable_user: Ieslēgt Lietotāju enable_user: Ieslēgt Lietotāju
memorialize_account: Saglabāt Kontu Piemiņai memorialize_account: Saglabāt Kontu Piemiņai
promote_user: Izceltt Lietotāju promote_user: Izceltt Lietotāju
publish_terms_of_service: Publicēt pakalpojuma izmantošanas noteikumus
reject_appeal: Noraidīt Apelāciju reject_appeal: Noraidīt Apelāciju
reject_user: Noraidīt lietotāju reject_user: Noraidīt lietotāju
remove_avatar_user: Noņemt profila attēlu remove_avatar_user: Noņemt profila attēlu
@ -273,6 +274,7 @@ lv:
enable_user_html: "%{name} iespējoja pieteikšanos lietotājam %{target}" enable_user_html: "%{name} iespējoja pieteikšanos lietotājam %{target}"
memorialize_account_html: "%{name} pārvērta %{target} kontu par atmiņas lapu" memorialize_account_html: "%{name} pārvērta %{target} kontu par atmiņas lapu"
promote_user_html: "%{name} paaugstināja lietotāju %{target}" promote_user_html: "%{name} paaugstināja lietotāju %{target}"
publish_terms_of_service_html: "%{name} padarīja pieejamus pakalpojuma izmantošanas noteikumu atjauninājumus"
reject_appeal_html: "%{name} noraidīja satura pārraudzības lēmuma iebildumu no %{target}" reject_appeal_html: "%{name} noraidīja satura pārraudzības lēmuma iebildumu no %{target}"
reject_user_html: "%{name} noraidīja reģistrēšanos no %{target}" reject_user_html: "%{name} noraidīja reģistrēšanos no %{target}"
remove_avatar_user_html: "%{name} noņēma %{target} profila attēlu" remove_avatar_user_html: "%{name} noņēma %{target} profila attēlu"
@ -641,7 +643,7 @@ lv:
create_and_resolve: Atrisināt ar piezīmi create_and_resolve: Atrisināt ar piezīmi
create_and_unresolve: Atvērt atkārtoti ar piezīmi create_and_unresolve: Atvērt atkārtoti ar piezīmi
delete: Dzēst delete: Dzēst
placeholder: Apraksti veiktās darbības vai citus saistītus atjauninājumus... placeholder: Jāapraksta veiktās darbības vai jebkuri citi saistītie atjauninājumi...
title: Piezīmes title: Piezīmes
notes_description_html: Skati un atstāj piezīmes citiem moderatoriem un sev nākotnei notes_description_html: Skati un atstāj piezīmes citiem moderatoriem un sev nākotnei
processed_msg: 'Pārskats #%{id} veiksmīgi apstrādāts' processed_msg: 'Pārskats #%{id} veiksmīgi apstrādāts'
@ -746,13 +748,13 @@ lv:
rules: rules:
add_new: Pievienot noteikumu add_new: Pievienot noteikumu
delete: Dzēst delete: Dzēst
description_html: Lai gan lielākā daļa apgalvo, ka ir izlasījuši pakalpojumu sniegšanas noteikumus un piekrīt tiem, parasti cilvēki to izlasa tikai pēc problēmas rašanās. <strong>Padariet vienkāršāku sava servera noteikumu uztveršanu, veidojot tos vienkāršā sarakstā pa punktiem.</strong> Centieties, lai atsevišķi noteikumi būtu īsi un vienkārši, taču arī nesadaliet tos daudzos atsevišķos vienumos. description_html: Kaut arī lielākā daļa apgalvo, ka ir lasījuši un piekrīt pakalpojuma izmantošanas noteikumiem, parasti cilvēki tos neizlasa, līdz rodas sarežģījumi. <strong>Padari vienkāršāku sava servera noteikumu pārskatīšanu, sniedzot tos vienkāršā uzsvēruma punktu sarakstā!</strong> Jāmēģina atsevišķus noteikumus veidot īsus un vienkāršus, bet jāmēģina arī tos nesadalīt daudzos atsevišķos vienumos.
edit: Labot nosacījumu edit: Labot nosacījumu
empty: Servera noteikumi vēl nav definēti. empty: Vēl nav pievienots neviens servera noteikums.
title: Servera noteikumi title: Servera noteikumi
settings: settings:
about: about:
manage_rules: Pārvaldīt servera nosacījumus manage_rules: Pārvaldīt servera noteikumus
preamble: Sniedz padziļinātu informāciju par to, kā serveris tiek darbināts, moderēts un finansēts. preamble: Sniedz padziļinātu informāciju par to, kā serveris tiek darbināts, moderēts un finansēts.
rules_hint: Noteikumiem, kas taviem lietotājiem ir jāievēro, ir īpaša sadaļa. rules_hint: Noteikumiem, kas taviem lietotājiem ir jāievēro, ir īpaša sadaļa.
title: Par title: Par
@ -821,6 +823,7 @@ lv:
back_to_account: Atpakaļ uz konta lapu back_to_account: Atpakaļ uz konta lapu
back_to_report: Atpakaļ uz paziņojumu lapu back_to_report: Atpakaļ uz paziņojumu lapu
batch: batch:
add_to_report: 'Pievienot atskaitei #%{id}'
remove_from_report: Noņemt no ziņojuma remove_from_report: Noņemt no ziņojuma
report: Ziņojums report: Ziņojums
contents: Saturs contents: Saturs
@ -832,13 +835,17 @@ lv:
media: media:
title: Multivide title: Multivide
metadata: Metadati metadata: Metadati
no_history: Šis ieraksts nav bijis labots
no_status_selected: Neviena ziņa netika mainīta, jo neviena netika atlasīta no_status_selected: Neviena ziņa netika mainīta, jo neviena netika atlasīta
open: Atvērt ziņu open: Atvērt ziņu
original_status: Oriģinālā ziņa original_status: Oriģinālā ziņa
reblogs: Reblogi reblogs: Reblogi
replied_to_html: Atbildēja %{acct_link}
status_changed: Ziņa mainīta status_changed: Ziņa mainīta
status_title: Publicēja @%{name} status_title: Publicēja @%{name}
title: Konta ieraksti - @%{name}
trending: Aktuāli trending: Aktuāli
view_publicly: Skatīt publiski
visibility: Redzamība visibility: Redzamība
with_media: Ar multividi with_media: Ar multividi
strikes: strikes:
@ -876,8 +883,8 @@ lv:
message_html: 'Nesaderīga Elasticsearch versija: %{value}' message_html: 'Nesaderīga Elasticsearch versija: %{value}'
version_comparison: Darbojas Elasticsearch %{running_version}, tomēr ir nepieciešama %{required_version} version_comparison: Darbojas Elasticsearch %{running_version}, tomēr ir nepieciešama %{required_version}
rules_check: rules_check:
action: Pārvaldīt servera nosacījumus action: Pārvaldīt servera noteikumus
message_html: Tu neesi definējis nevienu servera nosacījumu. message_html: Nav pievienots neviens servera noteikums.
sidekiq_process_check: sidekiq_process_check:
message_html: Rindā(s) %{value} nedarbojas neviens Sidekiq process. Lūdzu, pārskati savu Sidekiq konfigurāciju message_html: Rindā(s) %{value} nedarbojas neviens Sidekiq process. Lūdzu, pārskati savu Sidekiq konfigurāciju
software_version_check: software_version_check:
@ -907,16 +914,42 @@ lv:
name: Nosaukums name: Nosaukums
newest: Jaunākie newest: Jaunākie
oldest: Vecākie oldest: Vecākie
open: Apskatīt publiski
reset: Atiestatīt reset: Atiestatīt
review: Pārskatīt stāvokli review: Pārskatīt stāvokli
search: Meklēt search: Meklēt
title: Tēmturi title: Tēmturi
updated_msg: Tēmtura iestatījumi ir veiksmīgi atjaunināti updated_msg: Tēmtura iestatījumi ir veiksmīgi atjaunināti
terms_of_service: terms_of_service:
back: Atpakaļ uz pakalpojuma izmantošanas noteikumiem
changelog: Kas ir mainījies changelog: Kas ir mainījies
create: Izmantot savus
current: Pašreizējie
draft: Melnraksts
generate: Izmantot sagatavi
generates:
action: Izveidot
chance_to_review_html: "<strong>Izveidotie pakalpojuma izmantošanas noteikumi netiks automātiski publicēti.</strong> Būs iespēja izskatīt iznākumu. Lūgums norādīt nepieciešamo informāciju, lai turpinātu."
explanation_html: Pakalpojuma izmantošanas noteikumu sagatave tiek piedāvāta tikai izzināšanas nolūkam, un to nevajadzētu izmantot kā juridisku padomu jebkurā jautājumā. Lūgums sazināties ar savu juridisko padomdevēju par saviem apstākļiem un noteiktiem juridiskiem jautājumiem.
title: Pakalpojuma izmantošānas noteikumu uzstādīšana
history: Vēsture history: Vēsture
live: Darbībā
no_history: Nav ierakstu par pakalpojuma izmantošanas noteikumu izmaiņām.
no_terms_of_service_html: Pašlaik nav uzstādīti pakalpojuma izmantošanas noteikumi. Tie ir paredzēti, lai sniegtu skaidrību un aizsargātu no iespējamas atbildības strīdos ar lietotājiem.
notified_on_html: Lietotājiem paziņots %{date}
notify_users: Paziņot lietotājiem
preview:
explanation_html: 'E-pasta ziņojums tiks nosūtīts <strong>%{display_count} lietotājiem</strong>, kuri ir reģistrējušies pirms %{date}. Šis teksts tiks iekļauts e-pasta ziņojumā:'
send_preview: Nosūtīt priekšskatījumu uz %{email}
send_to_all:
one: Nosūtīt %{display_count} e-pasta ziņojumu
other: Nosūtīt %{display_count} e-pasta ziņojumus
zero: Nosūtīt %{display_count} e-pasta ziņojumu
title: Priekškatīt pakalpojuma izmantošanas noteikumu paziņojumu
publish: Publicēt publish: Publicēt
published_on_html: Publicēts %{date} published_on_html: Publicēti %{date}
save_draft: Saglabāt melnrakstu
title: Pakalpojuma izmantošanas noteikumi
title: Pārvaldība title: Pārvaldība
trends: trends:
allow: Atļaut allow: Atļaut
@ -1157,6 +1190,7 @@ lv:
view_strikes: Skati iepriekšējos brīdinājumus par savu kontu view_strikes: Skati iepriekšējos brīdinājumus par savu kontu
too_fast: Veidlapa ir iesniegta pārāk ātri, mēģini vēlreiz. too_fast: Veidlapa ir iesniegta pārāk ātri, mēģini vēlreiz.
use_security_key: Lietot drošības atslēgu use_security_key: Lietot drošības atslēgu
user_agreement_html: Es esmu izlasījis un piekrītu <a href="%{terms_of_service_path}" target="_blank">pakalpojuma izmantošanas noteikumiem</a> un <a href="%{privacy_policy_path}" target="_blank">privātuma nosacījumiem</a>
author_attribution: author_attribution:
example_title: Parauga teksts example_title: Parauga teksts
more_from_html: Vairāk no %{name} more_from_html: Vairāk no %{name}
@ -1777,6 +1811,8 @@ lv:
too_late: Brīdinājuma apstrīdēšanas laiks ir nokavēts too_late: Brīdinājuma apstrīdēšanas laiks ir nokavēts
tags: tags:
does_not_match_previous_name: nesakrīt ar iepriekšējo nosaukumu does_not_match_previous_name: nesakrīt ar iepriekšējo nosaukumu
terms_of_service:
title: Pakalpojuma izmantošanas noteikumi
themes: themes:
contrast: Mastodon (Augsts kontrasts) contrast: Mastodon (Augsts kontrasts)
default: Mastodon (Tumšs) default: Mastodon (Tumšs)
@ -1826,6 +1862,15 @@ lv:
further_actions_html: Ja tas nebiji tu, iesakām nekavējoties %{action} un iespējot divu faktoru autentifikāciju, lai tavs konts būtu drošībā. further_actions_html: Ja tas nebiji tu, iesakām nekavējoties %{action} un iespējot divu faktoru autentifikāciju, lai tavs konts būtu drošībā.
subject: Tavam kontam ir piekļūts no jaunas IP adreses subject: Tavam kontam ir piekļūts no jaunas IP adreses
title: Jauna pieteikšanās title: Jauna pieteikšanās
terms_of_service_changed:
agreement: Ar %{domain} izmantošanas tuprināšanu tiek piekrists šiem noteikumiem. Ja ir iebildumi pret atjauninātajiem noteikumiem, savu piekrišanu var atcelt jebkurā laikā ar sava konta izdzēšanu.
changelog: 'Šeit īsumā ir aprakstīts, ko šis atjauninājums nozīmē:'
description: 'Šis e-pasta ziņojums tika saņemts, jo mēs veicam dažas izmaiņas savos pakalpojuma izmantošanas noteikumos %{domain}. Mēs aicinām pārskatīt pilnus atjauninātos noteikumus šeit:'
description_html: Šis e-pasta ziņojums tika saņemts, jo mēs veicam dažas izmaiņas savos pakalpojuma izmantošanas noteikumos %{domain}. Mēs aicinām pārskatīt <a href="%{path}" target="_blank">pilnus atjauninātos noteikumus šeit</a>.
sign_off: "%{domain} komanda"
subject: Mūsu pakalpojuma izmantošanas noteikumu atjauninājumi
subtitle: Mainās %{domain} pakalpojuma izmantošanas noteikumi
title: Svarīgs atjauninājums
warning: warning:
appeal: Iesniegt apelāciju appeal: Iesniegt apelāciju
appeal_description: Ja uzskatāt, ka tā ir kļūda, varat iesniegt apelāciju %{instance} darbiniekiem. appeal_description: Ja uzskatāt, ka tā ir kļūda, varat iesniegt apelāciju %{instance} darbiniekiem.

View file

@ -956,6 +956,8 @@ pl:
updated_msg: Pomyślnie uaktualniono ustawienia hashtagów updated_msg: Pomyślnie uaktualniono ustawienia hashtagów
terms_of_service: terms_of_service:
draft: Szkic draft: Szkic
generate: Użyj szablonu
save_draft: Zapisz wersję roboczą
title: Administracja title: Administracja
trends: trends:
allow: Zezwól allow: Zezwól
@ -1214,6 +1216,7 @@ pl:
view_strikes: Zobacz dawne ostrzeżenia nałożone na twoje konto view_strikes: Zobacz dawne ostrzeżenia nałożone na twoje konto
too_fast: Zbyt szybko przesłano formularz, spróbuj ponownie. too_fast: Zbyt szybko przesłano formularz, spróbuj ponownie.
use_security_key: Użyj klucza bezpieczeństwa use_security_key: Użyj klucza bezpieczeństwa
user_agreement_html: Przeczytałem i akceptuję <a href="%{terms_of_service_path}" target="_blank">warunki korzystania z usługi</a> oraz <a href="%{privacy_policy_path}" target="_blank">politykę prywatności</a>
author_attribution: author_attribution:
example_title: Przykładowy tekst example_title: Przykładowy tekst
hint_html: Piszesz wiadomości albo bloga poza Mastodonem? Kontroluj jak będą ci przypisywane podczas dizielenia się nimi na Mastodonie. hint_html: Piszesz wiadomości albo bloga poza Mastodonem? Kontroluj jak będą ci przypisywane podczas dizielenia się nimi na Mastodonie.

View file

@ -10,7 +10,7 @@ pt-PT:
followers: followers:
one: Seguidor one: Seguidor
other: Seguidores other: Seguidores
following: A seguir following: Seguindo
instance_actor_flash: Esta conta é um ator virtual utilizado para representar o servidor em si e não um utilizador individual. É utilizada para efeitos de federação e não deve ser suspensa. instance_actor_flash: Esta conta é um ator virtual utilizado para representar o servidor em si e não um utilizador individual. É utilizada para efeitos de federação e não deve ser suspensa.
last_active: última atividade last_active: última atividade
link_verified_on: A posse desta hiperligação foi verificada em %{date} link_verified_on: A posse desta hiperligação foi verificada em %{date}
@ -352,7 +352,7 @@ pt-PT:
not_permitted: Não estás autorizado a executar esta ação not_permitted: Não estás autorizado a executar esta ação
overwrite: Substituir overwrite: Substituir
shortcode: Código de atalho shortcode: Código de atalho
shortcode_hint: Pelo menos 2 caracteres, apenas caracteres alfanuméricos e traços inferiores shortcode_hint: Pelo menos 2 caracteres, apenas caracteres alfanuméricos e traços inferiores (_)
title: Emojis personalizados title: Emojis personalizados
uncategorized: Não categorizados uncategorized: Não categorizados
unlist: Não listar unlist: Não listar
@ -1826,8 +1826,8 @@ pt-PT:
private_long: Mostrar só aos seguidores private_long: Mostrar só aos seguidores
public: Público public: Público
public_long: Todos podem ver public_long: Todos podem ver
unlisted: Não inventariado unlisted: Não listado
unlisted_long: Todos podem ver, mas não será inventariado nas cronologias públicas unlisted_long: Todos podem ver, mas não aparecerá nas cronologias públicas
statuses_cleanup: statuses_cleanup:
enabled: Eliminar publicações antigas automaticamente enabled: Eliminar publicações antigas automaticamente
enabled_hint: Elimina automaticamente as tuas publicações assim que atingirem um certo limite de tempo, a não ser que correspondam a uma das seguintes exceções enabled_hint: Elimina automaticamente as tuas publicações assim que atingirem um certo limite de tempo, a não ser que correspondam a uma das seguintes exceções
@ -1945,7 +1945,7 @@ pt-PT:
appeal: Submeter uma contestação appeal: Submeter uma contestação
appeal_description: Se achas que isto é um erro, podes submeter uma contestação para a equipa de %{instance}. appeal_description: Se achas que isto é um erro, podes submeter uma contestação para a equipa de %{instance}.
categories: categories:
spam: Spam spam: Publicidade indesejada / spam
violation: O conteúdo infringe as seguintes diretrizes da comunidade violation: O conteúdo infringe as seguintes diretrizes da comunidade
explanation: explanation:
delete_statuses: Algumas das tuas mensagens foram consideradas como violando uma ou mais diretrizes da comunidade e foram subsequentemente removidas pelos moderadores do %{instance}. delete_statuses: Algumas das tuas mensagens foram consideradas como violando uma ou mais diretrizes da comunidade e foram subsequentemente removidas pelos moderadores do %{instance}.

View file

@ -130,6 +130,9 @@ ca:
show_application: Sempre podràs veure quina aplicació ha publicat els teus tuts. show_application: Sempre podràs veure quina aplicació ha publicat els teus tuts.
tag: tag:
name: Només pots canviar la caixa de les lletres, per exemple, per fer-la més llegible name: Només pots canviar la caixa de les lletres, per exemple, per fer-la més llegible
terms_of_service_generator:
domain: Identificació única del servei en línia que oferiu.
jurisdiction: Indiqueu el país on resideix qui paga les factures. Si és una empresa o una altra entitat, indiqueu el país en què està registrada, així com la ciutat, regió, territori o estat, segons calqui.
user: user:
chosen_languages: Quan estigui marcat, només es mostraran els tuts de les llengües seleccionades en les línies de temps públiques chosen_languages: Quan estigui marcat, només es mostraran els tuts de les llengües seleccionades en les línies de temps públiques
role: El rol controla quins permisos té l'usuari. role: El rol controla quins permisos té l'usuari.

View file

@ -3,12 +3,14 @@ cs:
simple_form: simple_form:
hints: hints:
account: account:
attribution_domains_as_text: Jeden na řádek. Chrání před falešným připisování autorství.
discoverable: Vaše veřejné příspěvky a profil mohou být zobrazeny nebo doporučeny v různých oblastech Mastodonu a váš profil může být navrhován ostatním uživatelům. discoverable: Vaše veřejné příspěvky a profil mohou být zobrazeny nebo doporučeny v různých oblastech Mastodonu a váš profil může být navrhován ostatním uživatelům.
display_name: Vaše celé jméno nebo přezdívka. display_name: Vaše celé jméno nebo přezdívka.
fields: Vaše domovská stránka, zájmena, věk, cokoliv chcete. fields: Vaše domovská stránka, zájmena, věk, cokoliv chcete.
indexable: Vaše veřejné příspěvky se mohou objevit ve výsledcích vyhledávání na Mastodonu. Lidé, kteří s vašimi příspěvky interagovaly, je mohou stále vyhledávat. indexable: Vaše veřejné příspěvky se mohou objevit ve výsledcích vyhledávání na Mastodonu. Lidé, kteří s vašimi příspěvky interagovaly, je mohou stále vyhledávat.
note: 'Můžete @zmínit jiné osoby nebo #hashtagy.' note: 'Můžete @zmínit jiné osoby nebo #hashtagy.'
show_collections: Lidé budou moci procházet skrz sledující. Lidé, které sledujete, uvidí, že je sledujete bezohledně. show_collections: Lidé budou moci procházet skrz sledující. Lidé, které sledujete, uvidí, že je sledujete bezohledně.
unlocked: Lidé vás budou moci sledovat, aniž by vás žádali o schválení. Zrušte zaškrtnutí, pokud chcete kontrolovat požadavky o sledování a vybírat si, zda přijmete nebo odmítnete nové sledující.
account_alias: account_alias:
acct: Zadejte svůj účet, ze kterého se chcete přesunout jinam, ve formátu přezdívka@doména acct: Zadejte svůj účet, ze kterého se chcete přesunout jinam, ve formátu přezdívka@doména
account_migration: account_migration:
@ -58,6 +60,7 @@ cs:
setting_display_media_default: Skrývat média označená jako citlivá setting_display_media_default: Skrývat média označená jako citlivá
setting_display_media_hide_all: Vždy skrývat média setting_display_media_hide_all: Vždy skrývat média
setting_display_media_show_all: Vždy zobrazovat média setting_display_media_show_all: Vždy zobrazovat média
setting_system_scrollbars_ui: Platí pouze pro desktopové prohlížeče založené na Safari nebo Chrome
setting_use_blurhash: Gradienty jsou vytvořeny na základě barvev skrytých médií, ale zakrývají veškeré detaily setting_use_blurhash: Gradienty jsou vytvořeny na základě barvev skrytých médií, ale zakrývají veškeré detaily
setting_use_pending_items: Aktualizovat časovou osu až po kliknutí namísto automatického rolování kanálu setting_use_pending_items: Aktualizovat časovou osu až po kliknutí namísto automatického rolování kanálu
username: Pouze písmena, číslice a podtržítka username: Pouze písmena, číslice a podtržítka
@ -130,8 +133,17 @@ cs:
terms_of_service: terms_of_service:
changelog: Může být strukturováno pomocí Markdown syntaxu. changelog: Může být strukturováno pomocí Markdown syntaxu.
text: Může být strukturováno pomocí Markdown syntaxu. text: Může být strukturováno pomocí Markdown syntaxu.
terms_of_service_generator:
admin_email: Právní oznámení zahrnují protioznámení, soudní příkazy, žádosti o stáhnutí příspěvků a žádosti od právních vymahačů.
arbitration_address: Může být stejné jako výše uvedená fyzická adresa, nebo „N/A“, pokud používáte e-mail
arbitration_website: Může být webový formulář nebo „N/A“, pokud používáte e-mail
dmca_address: V případě provozovatelů v USA použijte adresu zapsanou v DMCA Designated Agent Directory. Na přímou žádost je možné použít namísto domovské adresy PO box, použijte DMCA Designated Agent Post Office Box Waiver Request k e-mailovaní Copyright Office a řekněte jim, že jste malým moderátorem obsahu, který se obavá pomsty nabo odplaty za Vaši práci a potřebujete použít PO box, abyste schovali Vaši domovskou adresu před širokou veřejností.
dmca_email: Může být stejný e-mail použitý pro „E-mail adresy pro právní upozornění“
domain: Jedinečná identifikace online služby, kterou poskytujete.
jurisdiction: Uveďte zemi, kde žije ten, kdo platí účty. Pokud je to společnost nebo jiný subjekt, uveďte zemi, v níž je zapsán do obchodního rejstříku, a město, region, území, případně stát, pokud je to povinné.
user: user:
chosen_languages: Po zaškrtnutí budou ve veřejných časových osách zobrazeny pouze příspěvky ve zvolených jazycích chosen_languages: Po zaškrtnutí budou ve veřejných časových osách zobrazeny pouze příspěvky ve zvolených jazycích
role: Role určuje, která oprávnění uživatel má.
user_role: user_role:
color: Barva, která má být použita pro roli v celém UI, jako RGB v hex formátu color: Barva, která má být použita pro roli v celém UI, jako RGB v hex formátu
highlighted: Toto roli učiní veřejně viditelnou highlighted: Toto roli učiní veřejně viditelnou
@ -144,6 +156,7 @@ cs:
url: Kam budou události odesílány url: Kam budou události odesílány
labels: labels:
account: account:
attribution_domains_as_text: Webové stránky s povolením Vám připsat autorství
discoverable: Zobrazovat profil a příspěvky ve vyhledávacích algoritmech discoverable: Zobrazovat profil a příspěvky ve vyhledávacích algoritmech
fields: fields:
name: Označení name: Označení
@ -222,6 +235,7 @@ cs:
setting_hide_network: Skrýt mou síť setting_hide_network: Skrýt mou síť
setting_reduce_motion: Omezit pohyb v animacích setting_reduce_motion: Omezit pohyb v animacích
setting_system_font_ui: Použít výchozí písmo systému setting_system_font_ui: Použít výchozí písmo systému
setting_system_scrollbars_ui: Použít výchozí posuvník systému
setting_theme: Vzhled stránky setting_theme: Vzhled stránky
setting_trends: Zobrazit dnešní trendy setting_trends: Zobrazit dnešní trendy
setting_unfollow_modal: Před zrušením sledování zobrazovat potvrzovací okno setting_unfollow_modal: Před zrušením sledování zobrazovat potvrzovací okno

View file

@ -137,6 +137,7 @@ de:
admin_email: Rechtliche Hinweise umfassen Gegendarstellungen, Gerichtsbeschlüsse, Anfragen zum Herunternehmen von Inhalten und Anfragen von Strafverfolgungsbehörden. admin_email: Rechtliche Hinweise umfassen Gegendarstellungen, Gerichtsbeschlüsse, Anfragen zum Herunternehmen von Inhalten und Anfragen von Strafverfolgungsbehörden.
arbitration_address: Kann wie die Anschrift hierüber sein oder „N/A“, falls eine E-Mail verwendet wird arbitration_address: Kann wie die Anschrift hierüber sein oder „N/A“, falls eine E-Mail verwendet wird
arbitration_website: Kann ein Webformular sein oder „N/A“, falls eine E-Mail verwendet wird arbitration_website: Kann ein Webformular sein oder „N/A“, falls eine E-Mail verwendet wird
dmca_address: US-Betreiber sollten die im „DMCA Designated Agent Directory“ eingetragene Adresse verwenden. Eine Postfachadresse ist auf direkte Anfrage verfügbar. Verwenden Sie die „DMCA Designated Agent Post Box Waiver“-Anfrage, um per E-Mail die Urheberrechtsbehörde darüber zu unterrichten, dass Sie Inhalte per Heimarbeit moderieren, eventuelle Rache oder Vergeltung für Ihre Handlungen befürchten und deshalb eine Postfachadresse benötigen, um Ihre Privatadresse nicht preiszugeben.
dmca_email: Kann dieselbe E-Mail wie bei „E-Mail-Adresse für rechtliche Hinweise“ sein dmca_email: Kann dieselbe E-Mail wie bei „E-Mail-Adresse für rechtliche Hinweise“ sein
domain: Einzigartige Identifizierung des angebotenen Online-Services. domain: Einzigartige Identifizierung des angebotenen Online-Services.
jurisdiction: Gib das Land an, in dem die Person lebt, die alle Rechnungen bezahlt. Falls es sich dabei um ein Unternehmen oder eine andere Einrichtung handelt, gib das Land mit dem Sitz an, sowie die Stadt oder Region. jurisdiction: Gib das Land an, in dem die Person lebt, die alle Rechnungen bezahlt. Falls es sich dabei um ein Unternehmen oder eine andere Einrichtung handelt, gib das Land mit dem Sitz an, sowie die Stadt oder Region.

View file

@ -140,6 +140,7 @@ eo:
dmca_address: Por tenantoj en Usono, uzu la adreson registritan en la DMCA Designated Agenŭ Directory. Registrolibro de poŝtskatoloj haveblas per direkta postulo, uzu la DMCA Designated Agent Post Office Box Waiver Request por retpoŝti la Ofico de Kopirajto kaj priskribu, ke vi estas hejm-trovigita administranto por enhavo kaj devas uzi Poŝtskatolon por forigi vian hejmadreson de publika vido. dmca_address: Por tenantoj en Usono, uzu la adreson registritan en la DMCA Designated Agenŭ Directory. Registrolibro de poŝtskatoloj haveblas per direkta postulo, uzu la DMCA Designated Agent Post Office Box Waiver Request por retpoŝti la Ofico de Kopirajto kaj priskribu, ke vi estas hejm-trovigita administranto por enhavo kaj devas uzi Poŝtskatolon por forigi vian hejmadreson de publika vido.
dmca_email: Povas esti la sama retpoŝtadreso uzita por "Retpoŝtadreso por legalaj sciigoj" supre dmca_email: Povas esti la sama retpoŝtadreso uzita por "Retpoŝtadreso por legalaj sciigoj" supre
domain: Unika identigilo de la retaj servicoj, ke vi provizas. domain: Unika identigilo de la retaj servicoj, ke vi provizas.
jurisdiction: Enlistigu la landon, kie loĝas kiu pagas la fakturojn. Se ĝi estas kompanio aŭ alia ento, listigu la landon, kie ĝi estas enkorpigita, kaj la urbon, regionon, teritorion aŭ ŝtaton laŭeble.
user: user:
chosen_languages: Kun tio markita nur mesaĝoj en elektitaj lingvoj aperos en publikaj tempolinioj chosen_languages: Kun tio markita nur mesaĝoj en elektitaj lingvoj aperos en publikaj tempolinioj
role: La rolo kontrolas kiujn permesojn la uzanto havas. role: La rolo kontrolas kiujn permesojn la uzanto havas.
@ -333,7 +334,13 @@ eo:
changelog: Kio ŝanĝiĝis? changelog: Kio ŝanĝiĝis?
text: Kondiĉoj de uzado text: Kondiĉoj de uzado
terms_of_service_generator: terms_of_service_generator:
admin_email: Retpoŝtadreso por laŭleĝaj avizoj
arbitration_address: Fizika adreso por arbitraciaj avizoj
arbitration_website: Retejo por sendi arbitraciajn avizojn
dmca_address: Fizika adreso por DMCA/kopirajto-avizoj
dmca_email: Retpoŝtadreso por DMCA/kopirajto-avizoj
domain: Domajno domain: Domajno
jurisdiction: Laŭleĝa jurisdikcio
user: user:
role: Rolo role: Rolo
time_zone: Horzono time_zone: Horzono

View file

@ -53,7 +53,7 @@ lv:
locale: Lietotāja saskarnes, e-pasta ziņojumu un push paziņojumu valoda locale: Lietotāja saskarnes, e-pasta ziņojumu un push paziņojumu valoda
password: Izmanto vismaz 8 rakstzīmes password: Izmanto vismaz 8 rakstzīmes
phrase: Tiks saskaņots neatkarīgi no ziņas teksta reģistra vai satura brīdinājuma phrase: Tiks saskaņots neatkarīgi no ziņas teksta reģistra vai satura brīdinājuma
scopes: Kuriem API lietojumprogrammai būs atļauta piekļuve. Ja izvēlies augstākā līmeņa tvērumu, tev nav jāatlasa atsevišķi vienumi. scopes: Kuriem API lietotnei būs ļauts piekļūt. Ja atlasa augstākā līmeņa tvērumu, nav nepieciešamas atlasīt atsevišķus.
setting_aggregate_reblogs: Nerādīt jaunus izcēlumus ziņām, kas nesen tika palielinātas (ietekmē tikai nesen saņemtos palielinājumus) setting_aggregate_reblogs: Nerādīt jaunus izcēlumus ziņām, kas nesen tika palielinātas (ietekmē tikai nesen saņemtos palielinājumus)
setting_always_send_emails: Parasti e-pasta paziņojumi netiek sūtīti, kad aktīvi izmantojat Mastodon setting_always_send_emails: Parasti e-pasta paziņojumi netiek sūtīti, kad aktīvi izmantojat Mastodon
setting_default_sensitive: Sensitīva multivide pēc noklusējuma ir paslēpti, un tos var atklāt, noklikšķinot setting_default_sensitive: Sensitīva multivide pēc noklusējuma ir paslēpti, un tos var atklāt, noklikšķinot
@ -119,8 +119,8 @@ lv:
sign_up_requires_approval: Jaunām reģistrācijām būs nepieciešams tavs apstiprinājums sign_up_requires_approval: Jaunām reģistrācijām būs nepieciešams tavs apstiprinājums
severity: Izvēlies, kas notiks ar pieprasījumiem no šīs IP adreses severity: Izvēlies, kas notiks ar pieprasījumiem no šīs IP adreses
rule: rule:
hint: Izvēles. Sniedz vairāk informācijas par nosacījumu hint: Izvēles. Sniedz vairāk informācijas par noteikumu
text: Apraksti nosacījumus vai prasības šī servera lietotājiem. Centies, lai tas būtu īss un vienkāršs text: Jāapraksta nosacījums vai prasība šī servera lietotājiem. Jāmēģina to veidot īsu un vienkāršu
sessions: sessions:
otp: 'Ievadi divfaktoru kodu, ko ģenerējusi tava tālruņa lietotne, vai izmanto kādu no atkopšanas kodiem:' otp: 'Ievadi divfaktoru kodu, ko ģenerējusi tava tālruņa lietotne, vai izmanto kādu no atkopšanas kodiem:'
webauthn: Ja tā ir USB atslēga, noteikti ievieto to un, ja nepieciešams, pieskaries tai. webauthn: Ja tā ir USB atslēga, noteikti ievieto to un, ja nepieciešams, pieskaries tai.
@ -317,6 +317,11 @@ lv:
name: Tēmturis name: Tēmturis
trendable: Atļaut šim tēmturim parādīties zem tendencēm trendable: Atļaut šim tēmturim parādīties zem tendencēm
usable: Ļaut ierakstos vietēji izmantot šo tēmturi usable: Ļaut ierakstos vietēji izmantot šo tēmturi
terms_of_service:
changelog: Kas ir mainījies?
text: Pakalpojuma izmantošanas nosacījumi
terms_of_service_generator:
domain: Domēna vārds
user: user:
role: Loma role: Loma
time_zone: Laika josla time_zone: Laika josla

View file

@ -63,7 +63,7 @@ pt-PT:
setting_system_scrollbars_ui: Aplica-se apenas a navegadores de desktop baseados no Safari e Chrome setting_system_scrollbars_ui: Aplica-se apenas a navegadores de desktop baseados no Safari e Chrome
setting_use_blurhash: Os gradientes são baseados nas cores das imagens escondidas, mas ofuscam quaisquer pormenores setting_use_blurhash: Os gradientes são baseados nas cores das imagens escondidas, mas ofuscam quaisquer pormenores
setting_use_pending_items: Ocultar as atualizações da cronologia após um clique em vez de percorrer automaticamente a cronologia setting_use_pending_items: Ocultar as atualizações da cronologia após um clique em vez de percorrer automaticamente a cronologia
username: Pode utilizar letras, números e sublinhados username: Pode utilizar letras, números e traços inferiores (_)
whole_word: Quando a palavra-chave ou expressão-chave é somente alfanumérica, ela só será aplicada se corresponder à palavra completa whole_word: Quando a palavra-chave ou expressão-chave é somente alfanumérica, ela só será aplicada se corresponder à palavra completa
domain_allow: domain_allow:
domain: Este domínio será capaz de obter dados desta instância e os dados dele recebidos serão processados e armazenados domain: Este domínio será capaz de obter dados desta instância e os dados dele recebidos serão processados e armazenados
@ -161,7 +161,7 @@ pt-PT:
fields: fields:
name: Rótulo name: Rótulo
value: Conteúdo value: Conteúdo
indexable: Incluir mensagens públicas nos resultados da pesquisa indexable: Incluir mensagens públicas nos resultados de pesquisas
show_collections: Mostrar quem sigo e os meus seguidores no perfil show_collections: Mostrar quem sigo e os meus seguidores no perfil
unlocked: Aceitar automaticamente novos seguidores unlocked: Aceitar automaticamente novos seguidores
account_alias: account_alias:
@ -205,7 +205,7 @@ pt-PT:
email: Endereço de correio electrónico email: Endereço de correio electrónico
expires_in: Expira em expires_in: Expira em
fields: Metadados de perfil fields: Metadados de perfil
header: Cabeçalho header: Imagem de cabeçalho
honeypot: "%{label} (não preencher)" honeypot: "%{label} (não preencher)"
inbox_url: URL da caixa de entrada do repetidor inbox_url: URL da caixa de entrada do repetidor
irreversible: Expandir em vez de esconder irreversible: Expandir em vez de esconder

View file

@ -134,7 +134,9 @@ sv:
changelog: Kan struktureras med Markdown syntax. changelog: Kan struktureras med Markdown syntax.
text: Kan struktureras med Markdown syntax. text: Kan struktureras med Markdown syntax.
terms_of_service_generator: terms_of_service_generator:
arbitration_address: Kan vara samma som fysisk adress ovan, eller “N/A” om du använder e-post
arbitration_website: Kan vara ett webbformulär, eller ”N/A” om du använder e-post arbitration_website: Kan vara ett webbformulär, eller ”N/A” om du använder e-post
dmca_email: Kan vara samma e-postadress som används för “E-postadress för juridiska meddelanden” ovan
jurisdiction: Lista det land där vem som än betalar räkningarna bor. Om det är ett företag eller annan enhet, lista landet där det är inkorporerat, och staden, regionen, territoriet eller staten på lämpligt sätt. jurisdiction: Lista det land där vem som än betalar räkningarna bor. Om det är ett företag eller annan enhet, lista landet där det är inkorporerat, och staden, regionen, territoriet eller staten på lämpligt sätt.
user: user:
chosen_languages: Vid aktivering visas bara inlägg på dina valda språk i offentliga tidslinjer chosen_languages: Vid aktivering visas bara inlägg på dina valda språk i offentliga tidslinjer
@ -157,7 +159,7 @@ sv:
name: Etikett name: Etikett
value: Innehåll value: Innehåll
indexable: Inkludera offentliga inlägg i sökresultaten indexable: Inkludera offentliga inlägg i sökresultaten
show_collections: Göm följare och följeslagare på profilen show_collections: Visa följare och följeslagare på profilen
unlocked: Godkänn nya följare automatiskt unlocked: Godkänn nya följare automatiskt
account_alias: account_alias:
acct: Namnet på det gamla kontot acct: Namnet på det gamla kontot
@ -330,6 +332,9 @@ sv:
text: Användarvillkor text: Användarvillkor
terms_of_service_generator: terms_of_service_generator:
admin_email: E-postadress för juridiska meddelanden admin_email: E-postadress för juridiska meddelanden
dmca_address: Fysisk adress för meddelanden om DMCA/upphovsrätt
dmca_email: Fysisk adress för meddelanden om DMCA/upphovsrätt
domain: Domän
user: user:
role: Roll role: Roll
time_zone: Tidszon time_zone: Tidszon

View file

@ -28,6 +28,7 @@ sk:
admin: admin:
account_actions: account_actions:
action: Vykonaj action: Vykonaj
already_silenced: Tento účet už bol obmedzený.
title: Vykonaj moderovací úkon voči %{acct} title: Vykonaj moderovací úkon voči %{acct}
account_moderation_notes: account_moderation_notes:
create: Zanechaj poznámku create: Zanechaj poznámku
@ -204,6 +205,7 @@ sk:
enable_user: Povoľ užívateľa enable_user: Povoľ užívateľa
memorialize_account: Zmena na „in memoriam“ memorialize_account: Zmena na „in memoriam“
promote_user: Povýš užívateľskú rolu promote_user: Povýš užívateľskú rolu
publish_terms_of_service: Zverejni podmienky prevozu
reject_appeal: Zamietni námietku reject_appeal: Zamietni námietku
reject_user: Zamietni užívateľa reject_user: Zamietni užívateľa
remove_avatar_user: Vymaž avatar remove_avatar_user: Vymaž avatar

View file

@ -2,3 +2,10 @@
shared: shared:
self_destruct_value: <%= ENV.fetch('SELF_DESTRUCT', nil) %> self_destruct_value: <%= ENV.fetch('SELF_DESTRUCT', nil) %>
software_update_url: <%= ENV.fetch('UPDATE_CHECK_URL', 'https://kmy.blue/update-check') %> software_update_url: <%= ENV.fetch('UPDATE_CHECK_URL', 'https://kmy.blue/update-check') %>
source:
base_url: <%= ENV.fetch('SOURCE_BASE_URL', nil) %>
repository: <%= ENV.fetch('GITHUB_REPOSITORY', 'kmycode/mastodon') %>
tag: <%= ENV.fetch('SOURCE_TAG', nil) %>
version:
metadata: <%= ENV.fetch('MASTODON_VERSION_METADATA', nil) %>
prerelease: <%= ENV.fetch('MASTODON_VERSION_PRERELEASE', nil) %>

View file

@ -0,0 +1,7 @@
# frozen_string_literal: true
class AddStandardToPushSubscription < ActiveRecord::Migration[8.0]
def change
add_column :web_push_subscriptions, :standard, :boolean, null: false, default: false
end
end

View file

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.0].define(version: 2024_12_16_224825) do ActiveRecord::Schema[8.0].define(version: 2025_01_08_111200) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "pg_catalog.plpgsql" enable_extension "pg_catalog.plpgsql"
@ -1573,6 +1573,7 @@ ActiveRecord::Schema[8.0].define(version: 2024_12_16_224825) do
t.datetime "updated_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false
t.bigint "access_token_id" t.bigint "access_token_id"
t.bigint "user_id" t.bigint "user_id"
t.boolean "standard", default: false, null: false
t.index ["access_token_id"], name: "index_web_push_subscriptions_on_access_token_id", where: "(access_token_id IS NOT NULL)" t.index ["access_token_id"], name: "index_web_push_subscriptions_on_access_token_id", where: "(access_token_id IS NOT NULL)"
t.index ["user_id"], name: "index_web_push_subscriptions_on_user_id" t.index ["user_id"], name: "index_web_push_subscriptions_on_user_id"
end end

View file

@ -4,7 +4,7 @@ module Mastodon
module MigrationWarning module MigrationWarning
WARNING_SECONDS = 10 WARNING_SECONDS = 10
DEFAULT_WARNING = <<~WARNING_MESSAGE DEFAULT_WARNING = <<~WARNING_MESSAGE.freeze
WARNING: This migration may take a *long* time for large instances. WARNING: This migration may take a *long* time for large instances.
It will *not* lock tables for any significant time, but it may run It will *not* lock tables for any significant time, but it may run
for a very long time. We will pause for #{WARNING_SECONDS} seconds to allow you to for a very long time. We will pause for #{WARNING_SECONDS} seconds to allow you to

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