Merge commit '1e71c4e247eb8900a718b04113ffce9c1b8ad2f4' into glitch-soc/merge-upstream
|
@ -1 +1 @@
|
||||||
3.3.5
|
3.3.6
|
||||||
|
|
|
@ -12,7 +12,7 @@ ARG BUILDPLATFORM=${BUILDPLATFORM}
|
||||||
|
|
||||||
# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.3.x"]
|
# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.3.x"]
|
||||||
# renovate: datasource=docker depName=docker.io/ruby
|
# renovate: datasource=docker depName=docker.io/ruby
|
||||||
ARG RUBY_VERSION="3.3.5"
|
ARG RUBY_VERSION="3.3.6"
|
||||||
# # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
|
# # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
|
||||||
# renovate: datasource=node-version depName=node
|
# renovate: datasource=node-version depName=node
|
||||||
ARG NODE_MAJOR_VERSION="22"
|
ARG NODE_MAJOR_VERSION="22"
|
||||||
|
|
10
Gemfile
|
@ -6,7 +6,7 @@ ruby '>= 3.2.0'
|
||||||
gem 'propshaft'
|
gem 'propshaft'
|
||||||
gem 'puma', '~> 6.3'
|
gem 'puma', '~> 6.3'
|
||||||
gem 'rack', '~> 2.2.7'
|
gem 'rack', '~> 2.2.7'
|
||||||
gem 'rails', '~> 7.1.1'
|
gem 'rails', '~> 7.2.0'
|
||||||
gem 'thor', '~> 1.2'
|
gem 'thor', '~> 1.2'
|
||||||
|
|
||||||
gem 'dotenv'
|
gem 'dotenv'
|
||||||
|
@ -25,7 +25,7 @@ gem 'ruby-vips', '~> 2.2', require: false
|
||||||
gem 'active_model_serializers', '~> 0.10'
|
gem 'active_model_serializers', '~> 0.10'
|
||||||
gem 'addressable', '~> 2.8'
|
gem 'addressable', '~> 2.8'
|
||||||
gem 'bootsnap', '~> 1.18.0', require: false
|
gem 'bootsnap', '~> 1.18.0', require: false
|
||||||
gem 'browser', '< 6' # https://github.com/fnando/browser/issues/543
|
gem 'browser'
|
||||||
gem 'charlock_holmes', '~> 0.7.7'
|
gem 'charlock_holmes', '~> 0.7.7'
|
||||||
gem 'chewy', '~> 7.3'
|
gem 'chewy', '~> 7.3'
|
||||||
gem 'devise', '~> 4.9'
|
gem 'devise', '~> 4.9'
|
||||||
|
@ -47,13 +47,14 @@ gem 'color_diff', '~> 0.1'
|
||||||
gem 'csv', '~> 3.2'
|
gem 'csv', '~> 3.2'
|
||||||
gem 'discard', '~> 1.2'
|
gem 'discard', '~> 1.2'
|
||||||
gem 'doorkeeper', '~> 5.6'
|
gem 'doorkeeper', '~> 5.6'
|
||||||
|
gem 'faraday-httpclient'
|
||||||
gem 'fast_blank', '~> 1.0'
|
gem 'fast_blank', '~> 1.0'
|
||||||
gem 'fastimage'
|
gem 'fastimage'
|
||||||
gem 'hiredis', '~> 0.6'
|
gem 'hiredis', '~> 0.6'
|
||||||
gem 'htmlentities', '~> 4.3'
|
gem 'htmlentities', '~> 4.3'
|
||||||
gem 'http', '~> 5.2.0'
|
gem 'http', '~> 5.2.0'
|
||||||
gem 'http_accept_language', '~> 2.1'
|
gem 'http_accept_language', '~> 2.1'
|
||||||
gem 'httplog', '~> 1.7.0'
|
gem 'httplog', '~> 1.7.0', require: false
|
||||||
gem 'i18n'
|
gem 'i18n'
|
||||||
gem 'idn-ruby', require: 'idn'
|
gem 'idn-ruby', require: 'idn'
|
||||||
gem 'inline_svg'
|
gem 'inline_svg'
|
||||||
|
@ -62,6 +63,7 @@ gem 'kaminari', '~> 1.2'
|
||||||
gem 'link_header', '~> 0.0'
|
gem 'link_header', '~> 0.0'
|
||||||
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
|
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
|
||||||
gem 'mime-types', '~> 3.6.0', require: 'mime/types/columnar'
|
gem 'mime-types', '~> 3.6.0', require: 'mime/types/columnar'
|
||||||
|
gem 'mutex_m'
|
||||||
gem 'nokogiri', '~> 1.15'
|
gem 'nokogiri', '~> 1.15'
|
||||||
gem 'oj', '~> 3.14'
|
gem 'oj', '~> 3.14'
|
||||||
gem 'ox', '~> 2.14'
|
gem 'ox', '~> 2.14'
|
||||||
|
@ -220,7 +222,7 @@ gem 'concurrent-ruby', require: false
|
||||||
gem 'connection_pool', require: false
|
gem 'connection_pool', require: false
|
||||||
gem 'xorcist', '~> 1.1'
|
gem 'xorcist', '~> 1.1'
|
||||||
|
|
||||||
gem 'net-http', '~> 0.4.0'
|
gem 'net-http', '~> 0.5.0'
|
||||||
gem 'rubyzip', '~> 2.3'
|
gem 'rubyzip', '~> 2.3'
|
||||||
|
|
||||||
gem 'hcaptcha', '~> 7.1'
|
gem 'hcaptcha', '~> 7.1'
|
||||||
|
|
191
Gemfile.lock
|
@ -10,51 +10,46 @@ GIT
|
||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
actioncable (7.1.4.2)
|
actioncable (7.2.2)
|
||||||
actionpack (= 7.1.4.2)
|
actionpack (= 7.2.2)
|
||||||
activesupport (= 7.1.4.2)
|
activesupport (= 7.2.2)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
websocket-driver (>= 0.6.1)
|
websocket-driver (>= 0.6.1)
|
||||||
zeitwerk (~> 2.6)
|
zeitwerk (~> 2.6)
|
||||||
actionmailbox (7.1.4.2)
|
actionmailbox (7.2.2)
|
||||||
actionpack (= 7.1.4.2)
|
actionpack (= 7.2.2)
|
||||||
activejob (= 7.1.4.2)
|
activejob (= 7.2.2)
|
||||||
activerecord (= 7.1.4.2)
|
activerecord (= 7.2.2)
|
||||||
activestorage (= 7.1.4.2)
|
activestorage (= 7.2.2)
|
||||||
activesupport (= 7.1.4.2)
|
activesupport (= 7.2.2)
|
||||||
mail (>= 2.7.1)
|
mail (>= 2.8.0)
|
||||||
net-imap
|
actionmailer (7.2.2)
|
||||||
net-pop
|
actionpack (= 7.2.2)
|
||||||
net-smtp
|
actionview (= 7.2.2)
|
||||||
actionmailer (7.1.4.2)
|
activejob (= 7.2.2)
|
||||||
actionpack (= 7.1.4.2)
|
activesupport (= 7.2.2)
|
||||||
actionview (= 7.1.4.2)
|
mail (>= 2.8.0)
|
||||||
activejob (= 7.1.4.2)
|
|
||||||
activesupport (= 7.1.4.2)
|
|
||||||
mail (~> 2.5, >= 2.5.4)
|
|
||||||
net-imap
|
|
||||||
net-pop
|
|
||||||
net-smtp
|
|
||||||
rails-dom-testing (~> 2.2)
|
rails-dom-testing (~> 2.2)
|
||||||
actionpack (7.1.4.2)
|
actionpack (7.2.2)
|
||||||
actionview (= 7.1.4.2)
|
actionview (= 7.2.2)
|
||||||
activesupport (= 7.1.4.2)
|
activesupport (= 7.2.2)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
racc
|
racc
|
||||||
rack (>= 2.2.4)
|
rack (>= 2.2.4, < 3.2)
|
||||||
rack-session (>= 1.0.1)
|
rack-session (>= 1.0.1)
|
||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
rails-dom-testing (~> 2.2)
|
rails-dom-testing (~> 2.2)
|
||||||
rails-html-sanitizer (~> 1.6)
|
rails-html-sanitizer (~> 1.6)
|
||||||
actiontext (7.1.4.2)
|
useragent (~> 0.16)
|
||||||
actionpack (= 7.1.4.2)
|
actiontext (7.2.2)
|
||||||
activerecord (= 7.1.4.2)
|
actionpack (= 7.2.2)
|
||||||
activestorage (= 7.1.4.2)
|
activerecord (= 7.2.2)
|
||||||
activesupport (= 7.1.4.2)
|
activestorage (= 7.2.2)
|
||||||
|
activesupport (= 7.2.2)
|
||||||
globalid (>= 0.6.0)
|
globalid (>= 0.6.0)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
actionview (7.1.4.2)
|
actionview (7.2.2)
|
||||||
activesupport (= 7.1.4.2)
|
activesupport (= 7.2.2)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
erubi (~> 1.11)
|
erubi (~> 1.11)
|
||||||
rails-dom-testing (~> 2.2)
|
rails-dom-testing (~> 2.2)
|
||||||
|
@ -64,31 +59,33 @@ GEM
|
||||||
activemodel (>= 4.1)
|
activemodel (>= 4.1)
|
||||||
case_transform (>= 0.2)
|
case_transform (>= 0.2)
|
||||||
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
|
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
|
||||||
activejob (7.1.4.2)
|
activejob (7.2.2)
|
||||||
activesupport (= 7.1.4.2)
|
activesupport (= 7.2.2)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
activemodel (7.1.4.2)
|
activemodel (7.2.2)
|
||||||
activesupport (= 7.1.4.2)
|
activesupport (= 7.2.2)
|
||||||
activerecord (7.1.4.2)
|
activerecord (7.2.2)
|
||||||
activemodel (= 7.1.4.2)
|
activemodel (= 7.2.2)
|
||||||
activesupport (= 7.1.4.2)
|
activesupport (= 7.2.2)
|
||||||
timeout (>= 0.4.0)
|
timeout (>= 0.4.0)
|
||||||
activestorage (7.1.4.2)
|
activestorage (7.2.2)
|
||||||
actionpack (= 7.1.4.2)
|
actionpack (= 7.2.2)
|
||||||
activejob (= 7.1.4.2)
|
activejob (= 7.2.2)
|
||||||
activerecord (= 7.1.4.2)
|
activerecord (= 7.2.2)
|
||||||
activesupport (= 7.1.4.2)
|
activesupport (= 7.2.2)
|
||||||
marcel (~> 1.0)
|
marcel (~> 1.0)
|
||||||
activesupport (7.1.4.2)
|
activesupport (7.2.2)
|
||||||
base64
|
base64
|
||||||
|
benchmark (>= 0.3)
|
||||||
bigdecimal
|
bigdecimal
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.3.1)
|
||||||
connection_pool (>= 2.2.5)
|
connection_pool (>= 2.2.5)
|
||||||
drb
|
drb
|
||||||
i18n (>= 1.6, < 2)
|
i18n (>= 1.6, < 2)
|
||||||
|
logger (>= 1.4.2)
|
||||||
minitest (>= 5.1)
|
minitest (>= 5.1)
|
||||||
mutex_m
|
securerandom (>= 0.3)
|
||||||
tzinfo (~> 2.0)
|
tzinfo (~> 2.0, >= 2.0.5)
|
||||||
addressable (2.8.7)
|
addressable (2.8.7)
|
||||||
public_suffix (>= 2.0.2, < 7.0)
|
public_suffix (>= 2.0.2, < 7.0)
|
||||||
aes_key_wrap (1.1.0)
|
aes_key_wrap (1.1.0)
|
||||||
|
@ -100,8 +97,8 @@ GEM
|
||||||
attr_required (1.0.2)
|
attr_required (1.0.2)
|
||||||
awrence (1.2.1)
|
awrence (1.2.1)
|
||||||
aws-eventstream (1.3.0)
|
aws-eventstream (1.3.0)
|
||||||
aws-partitions (1.997.0)
|
aws-partitions (1.1001.0)
|
||||||
aws-sdk-core (3.211.0)
|
aws-sdk-core (3.212.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)
|
||||||
|
@ -109,7 +106,7 @@ GEM
|
||||||
aws-sdk-kms (1.95.0)
|
aws-sdk-kms (1.95.0)
|
||||||
aws-sdk-core (~> 3, >= 3.210.0)
|
aws-sdk-core (~> 3, >= 3.210.0)
|
||||||
aws-sigv4 (~> 1.5)
|
aws-sigv4 (~> 1.5)
|
||||||
aws-sdk-s3 (1.169.0)
|
aws-sdk-s3 (1.170.0)
|
||||||
aws-sdk-core (~> 3, >= 3.210.0)
|
aws-sdk-core (~> 3, >= 3.210.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.5)
|
aws-sigv4 (~> 1.5)
|
||||||
|
@ -120,6 +117,7 @@ GEM
|
||||||
base64 (0.2.0)
|
base64 (0.2.0)
|
||||||
bcp47_spec (0.2.1)
|
bcp47_spec (0.2.1)
|
||||||
bcrypt (3.1.20)
|
bcrypt (3.1.20)
|
||||||
|
benchmark (0.3.0)
|
||||||
better_errors (2.10.1)
|
better_errors (2.10.1)
|
||||||
erubi (>= 1.0.0)
|
erubi (>= 1.0.0)
|
||||||
rack (>= 0.9.0)
|
rack (>= 0.9.0)
|
||||||
|
@ -133,7 +131,7 @@ GEM
|
||||||
msgpack (~> 1.2)
|
msgpack (~> 1.2)
|
||||||
brakeman (6.2.2)
|
brakeman (6.2.2)
|
||||||
racc
|
racc
|
||||||
browser (5.3.1)
|
browser (6.0.0)
|
||||||
brpoplpush-redis_script (0.1.3)
|
brpoplpush-redis_script (0.1.3)
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.5)
|
concurrent-ruby (~> 1.0, >= 1.0.5)
|
||||||
redis (>= 1.0, < 6)
|
redis (>= 1.0, < 6)
|
||||||
|
@ -200,8 +198,8 @@ GEM
|
||||||
devise (>= 4.0.0)
|
devise (>= 4.0.0)
|
||||||
rpam2 (~> 4.0)
|
rpam2 (~> 4.0)
|
||||||
diff-lcs (1.5.1)
|
diff-lcs (1.5.1)
|
||||||
discard (1.3.0)
|
discard (1.4.0)
|
||||||
activerecord (>= 4.2, < 8)
|
activerecord (>= 4.2, < 9.0)
|
||||||
docile (1.4.1)
|
docile (1.4.1)
|
||||||
domain_name (0.6.20240107)
|
domain_name (0.6.20240107)
|
||||||
doorkeeper (5.7.1)
|
doorkeeper (5.7.1)
|
||||||
|
@ -229,29 +227,14 @@ GEM
|
||||||
fabrication (2.31.0)
|
fabrication (2.31.0)
|
||||||
faker (3.5.1)
|
faker (3.5.1)
|
||||||
i18n (>= 1.8.11, < 2)
|
i18n (>= 1.8.11, < 2)
|
||||||
faraday (1.10.3)
|
faraday (2.12.0)
|
||||||
faraday-em_http (~> 1.0)
|
faraday-net_http (>= 2.0, < 3.4)
|
||||||
faraday-em_synchrony (~> 1.0)
|
json
|
||||||
faraday-excon (~> 1.1)
|
logger
|
||||||
faraday-httpclient (~> 1.0)
|
faraday-httpclient (2.0.1)
|
||||||
faraday-multipart (~> 1.0)
|
httpclient (>= 2.2)
|
||||||
faraday-net_http (~> 1.0)
|
faraday-net_http (3.3.0)
|
||||||
faraday-net_http_persistent (~> 1.0)
|
net-http
|
||||||
faraday-patron (~> 1.0)
|
|
||||||
faraday-rack (~> 1.0)
|
|
||||||
faraday-retry (~> 1.0)
|
|
||||||
ruby2_keywords (>= 0.0.4)
|
|
||||||
faraday-em_http (1.0.0)
|
|
||||||
faraday-em_synchrony (1.0.0)
|
|
||||||
faraday-excon (1.1.0)
|
|
||||||
faraday-httpclient (1.0.1)
|
|
||||||
faraday-multipart (1.0.4)
|
|
||||||
multipart-post (~> 2)
|
|
||||||
faraday-net_http (1.0.2)
|
|
||||||
faraday-net_http_persistent (1.2.0)
|
|
||||||
faraday-patron (1.0.0)
|
|
||||||
faraday-rack (1.0.0)
|
|
||||||
faraday-retry (1.0.3)
|
|
||||||
fast_blank (1.0.1)
|
fast_blank (1.0.1)
|
||||||
fastimage (2.3.1)
|
fastimage (2.3.1)
|
||||||
ffi (1.17.0)
|
ffi (1.17.0)
|
||||||
|
@ -362,7 +345,7 @@ GEM
|
||||||
rack (>= 2.2, < 4)
|
rack (>= 2.2, < 4)
|
||||||
rdf (~> 3.3)
|
rdf (~> 3.3)
|
||||||
rexml (~> 3.2)
|
rexml (~> 3.2)
|
||||||
json-ld-preloaded (3.3.0)
|
json-ld-preloaded (3.3.1)
|
||||||
json-ld (~> 3.3)
|
json-ld (~> 3.3)
|
||||||
rdf (~> 3.3)
|
rdf (~> 3.3)
|
||||||
json-schema (5.0.1)
|
json-schema (5.0.1)
|
||||||
|
@ -430,9 +413,8 @@ GEM
|
||||||
minitest (5.25.1)
|
minitest (5.25.1)
|
||||||
msgpack (1.7.3)
|
msgpack (1.7.3)
|
||||||
multi_json (1.15.0)
|
multi_json (1.15.0)
|
||||||
multipart-post (2.4.1)
|
|
||||||
mutex_m (0.2.0)
|
mutex_m (0.2.0)
|
||||||
net-http (0.4.1)
|
net-http (0.5.0)
|
||||||
uri
|
uri
|
||||||
net-imap (0.5.0)
|
net-imap (0.5.0)
|
||||||
date
|
date
|
||||||
|
@ -448,7 +430,7 @@ GEM
|
||||||
nokogiri (1.16.7)
|
nokogiri (1.16.7)
|
||||||
mini_portile2 (~> 2.8.2)
|
mini_portile2 (~> 2.8.2)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
oj (3.16.6)
|
oj (3.16.7)
|
||||||
bigdecimal (>= 3.0)
|
bigdecimal (>= 3.0)
|
||||||
ostruct (>= 0.2)
|
ostruct (>= 0.2)
|
||||||
omniauth (2.1.2)
|
omniauth (2.1.2)
|
||||||
|
@ -629,20 +611,20 @@ GEM
|
||||||
rackup (1.0.0)
|
rackup (1.0.0)
|
||||||
rack (< 3)
|
rack (< 3)
|
||||||
webrick
|
webrick
|
||||||
rails (7.1.4.2)
|
rails (7.2.2)
|
||||||
actioncable (= 7.1.4.2)
|
actioncable (= 7.2.2)
|
||||||
actionmailbox (= 7.1.4.2)
|
actionmailbox (= 7.2.2)
|
||||||
actionmailer (= 7.1.4.2)
|
actionmailer (= 7.2.2)
|
||||||
actionpack (= 7.1.4.2)
|
actionpack (= 7.2.2)
|
||||||
actiontext (= 7.1.4.2)
|
actiontext (= 7.2.2)
|
||||||
actionview (= 7.1.4.2)
|
actionview (= 7.2.2)
|
||||||
activejob (= 7.1.4.2)
|
activejob (= 7.2.2)
|
||||||
activemodel (= 7.1.4.2)
|
activemodel (= 7.2.2)
|
||||||
activerecord (= 7.1.4.2)
|
activerecord (= 7.2.2)
|
||||||
activestorage (= 7.1.4.2)
|
activestorage (= 7.2.2)
|
||||||
activesupport (= 7.1.4.2)
|
activesupport (= 7.2.2)
|
||||||
bundler (>= 1.15.0)
|
bundler (>= 1.15.0)
|
||||||
railties (= 7.1.4.2)
|
railties (= 7.2.2)
|
||||||
rails-controller-testing (1.0.5)
|
rails-controller-testing (1.0.5)
|
||||||
actionpack (>= 5.0.1.rc1)
|
actionpack (>= 5.0.1.rc1)
|
||||||
actionview (>= 5.0.1.rc1)
|
actionview (>= 5.0.1.rc1)
|
||||||
|
@ -657,10 +639,10 @@ GEM
|
||||||
rails-i18n (7.0.10)
|
rails-i18n (7.0.10)
|
||||||
i18n (>= 0.7, < 2)
|
i18n (>= 0.7, < 2)
|
||||||
railties (>= 6.0.0, < 8)
|
railties (>= 6.0.0, < 8)
|
||||||
railties (7.1.4.2)
|
railties (7.2.2)
|
||||||
actionpack (= 7.1.4.2)
|
actionpack (= 7.2.2)
|
||||||
activesupport (= 7.1.4.2)
|
activesupport (= 7.2.2)
|
||||||
irb
|
irb (~> 1.13)
|
||||||
rackup (>= 1.0.0)
|
rackup (>= 1.0.0)
|
||||||
rake (>= 12.2)
|
rake (>= 12.2)
|
||||||
thor (~> 1.0, >= 1.2.2)
|
thor (~> 1.0, >= 1.2.2)
|
||||||
|
@ -760,7 +742,6 @@ GEM
|
||||||
ruby-vips (2.2.2)
|
ruby-vips (2.2.2)
|
||||||
ffi (~> 1.12)
|
ffi (~> 1.12)
|
||||||
logger
|
logger
|
||||||
ruby2_keywords (0.0.5)
|
|
||||||
rubyzip (2.3.2)
|
rubyzip (2.3.2)
|
||||||
rufus-scheduler (3.9.1)
|
rufus-scheduler (3.9.1)
|
||||||
fugit (~> 1.1, >= 1.1.6)
|
fugit (~> 1.1, >= 1.1.6)
|
||||||
|
@ -772,6 +753,7 @@ GEM
|
||||||
scenic (1.8.0)
|
scenic (1.8.0)
|
||||||
activerecord (>= 4.0.0)
|
activerecord (>= 4.0.0)
|
||||||
railties (>= 4.0.0)
|
railties (>= 4.0.0)
|
||||||
|
securerandom (0.3.1)
|
||||||
selenium-webdriver (4.26.0)
|
selenium-webdriver (4.26.0)
|
||||||
base64 (~> 0.2)
|
base64 (~> 0.2)
|
||||||
logger (~> 1.4)
|
logger (~> 1.4)
|
||||||
|
@ -855,6 +837,7 @@ GEM
|
||||||
unf_ext (0.0.9.1)
|
unf_ext (0.0.9.1)
|
||||||
unicode-display_width (2.6.0)
|
unicode-display_width (2.6.0)
|
||||||
uri (0.13.1)
|
uri (0.13.1)
|
||||||
|
useragent (0.16.10)
|
||||||
validate_email (0.1.6)
|
validate_email (0.1.6)
|
||||||
activemodel (>= 3.0)
|
activemodel (>= 3.0)
|
||||||
mail (>= 2.2.5)
|
mail (>= 2.2.5)
|
||||||
|
@ -908,7 +891,7 @@ DEPENDENCIES
|
||||||
blurhash (~> 0.1)
|
blurhash (~> 0.1)
|
||||||
bootsnap (~> 1.18.0)
|
bootsnap (~> 1.18.0)
|
||||||
brakeman (~> 6.0)
|
brakeman (~> 6.0)
|
||||||
browser (< 6)
|
browser
|
||||||
bundler-audit (~> 0.9)
|
bundler-audit (~> 0.9)
|
||||||
capybara (~> 3.39)
|
capybara (~> 3.39)
|
||||||
charlock_holmes (~> 0.7.7)
|
charlock_holmes (~> 0.7.7)
|
||||||
|
@ -930,6 +913,7 @@ DEPENDENCIES
|
||||||
email_spec
|
email_spec
|
||||||
fabrication (~> 2.30)
|
fabrication (~> 2.30)
|
||||||
faker (~> 3.2)
|
faker (~> 3.2)
|
||||||
|
faraday-httpclient
|
||||||
fast_blank (~> 1.0)
|
fast_blank (~> 1.0)
|
||||||
fastimage
|
fastimage
|
||||||
flatware-rspec
|
flatware-rspec
|
||||||
|
@ -962,7 +946,8 @@ DEPENDENCIES
|
||||||
mario-redis-lock (~> 1.2)
|
mario-redis-lock (~> 1.2)
|
||||||
memory_profiler
|
memory_profiler
|
||||||
mime-types (~> 3.6.0)
|
mime-types (~> 3.6.0)
|
||||||
net-http (~> 0.4.0)
|
mutex_m
|
||||||
|
net-http (~> 0.5.0)
|
||||||
net-ldap (~> 0.18)
|
net-ldap (~> 0.18)
|
||||||
nokogiri (~> 1.15)
|
nokogiri (~> 1.15)
|
||||||
oj (~> 3.14)
|
oj (~> 3.14)
|
||||||
|
@ -1000,7 +985,7 @@ DEPENDENCIES
|
||||||
rack-attack (~> 6.6)
|
rack-attack (~> 6.6)
|
||||||
rack-cors (~> 2.0)
|
rack-cors (~> 2.0)
|
||||||
rack-test (~> 2.1)
|
rack-test (~> 2.1)
|
||||||
rails (~> 7.1.1)
|
rails (~> 7.2.0)
|
||||||
rails-controller-testing (~> 1.0)
|
rails-controller-testing (~> 1.0)
|
||||||
rails-i18n (~> 7.0)
|
rails-i18n (~> 7.0)
|
||||||
rdf-normalize (~> 0.5)
|
rdf-normalize (~> 0.5)
|
||||||
|
|
2
Rakefile
|
@ -3,6 +3,6 @@
|
||||||
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
||||||
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
||||||
|
|
||||||
require File.expand_path('config/application', __dir__)
|
require_relative 'config/application'
|
||||||
|
|
||||||
Rails.application.load_tasks
|
Rails.application.load_tasks
|
||||||
|
|
|
@ -5,7 +5,7 @@ module Admin
|
||||||
def index
|
def index
|
||||||
authorize :email_domain_block, :index?
|
authorize :email_domain_block, :index?
|
||||||
|
|
||||||
@email_domain_blocks = EmailDomainBlock.where(parent_id: nil).includes(:children).order(id: :desc).page(params[:page])
|
@email_domain_blocks = EmailDomainBlock.parents.includes(:children).order(id: :desc).page(params[:page])
|
||||||
@form = Form::EmailDomainBlockBatch.new
|
@form = Form::EmailDomainBlockBatch.new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ module Admin
|
||||||
|
|
||||||
def deactivate_all
|
def deactivate_all
|
||||||
authorize :invite, :deactivate_all?
|
authorize :invite, :deactivate_all?
|
||||||
Invite.available.in_batches.update_all(expires_at: Time.now.utc)
|
Invite.available.in_batches.touch_all(:expires_at)
|
||||||
redirect_to admin_invites_path
|
redirect_to admin_invites_path
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,17 @@ class Api::V1::AnnualReportsController < Api::BaseController
|
||||||
relationships: @relationships
|
relationships: @relationships
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def show
|
||||||
|
with_read_replica do
|
||||||
|
@presenter = AnnualReportsPresenter.new([@annual_report])
|
||||||
|
@relationships = StatusRelationshipsPresenter.new(@presenter.statuses, current_account.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
render json: @presenter,
|
||||||
|
serializer: REST::AnnualReportsSerializer,
|
||||||
|
relationships: @relationships
|
||||||
|
end
|
||||||
|
|
||||||
def read
|
def read
|
||||||
@annual_report.view!
|
@annual_report.view!
|
||||||
render_empty
|
render_empty
|
||||||
|
|
|
@ -16,6 +16,6 @@ module RegistrationHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def ip_blocked?(remote_ip)
|
def ip_blocked?(remote_ip)
|
||||||
IpBlock.where(severity: :sign_up_block).exists?(['ip >>= ?', remote_ip.to_s])
|
IpBlock.severity_sign_up_block.containing(remote_ip.to_s).exists?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
BIN
app/javascript/images/archetypes/booster.png
Executable file
After Width: | Height: | Size: 620 KiB |
BIN
app/javascript/images/archetypes/lurker.png
Executable file
After Width: | Height: | Size: 1 MiB |
BIN
app/javascript/images/archetypes/oracle.png
Executable file
After Width: | Height: | Size: 1.2 MiB |
BIN
app/javascript/images/archetypes/pollster.png
Executable file
After Width: | Height: | Size: 710 KiB |
BIN
app/javascript/images/archetypes/replier.png
Executable file
After Width: | Height: | Size: 786 KiB |
|
@ -20,6 +20,7 @@ export const allNotificationTypes = [
|
||||||
'admin.report',
|
'admin.report',
|
||||||
'moderation_warning',
|
'moderation_warning',
|
||||||
'severed_relationships',
|
'severed_relationships',
|
||||||
|
'annual_report',
|
||||||
];
|
];
|
||||||
|
|
||||||
export type NotificationWithStatusType =
|
export type NotificationWithStatusType =
|
||||||
|
@ -37,7 +38,8 @@ export type NotificationType =
|
||||||
| 'moderation_warning'
|
| 'moderation_warning'
|
||||||
| 'severed_relationships'
|
| 'severed_relationships'
|
||||||
| 'admin.sign_up'
|
| 'admin.sign_up'
|
||||||
| 'admin.report';
|
| 'admin.report'
|
||||||
|
| 'annual_report';
|
||||||
|
|
||||||
export interface BaseNotificationJSON {
|
export interface BaseNotificationJSON {
|
||||||
id: string;
|
id: string;
|
||||||
|
@ -130,6 +132,15 @@ interface AccountRelationshipSeveranceNotificationJSON
|
||||||
event: ApiAccountRelationshipSeveranceEventJSON;
|
event: ApiAccountRelationshipSeveranceEventJSON;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ApiAnnualReportEventJSON {
|
||||||
|
year: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AnnualReportNotificationGroupJSON extends BaseNotificationGroupJSON {
|
||||||
|
type: 'annual_report';
|
||||||
|
annual_report: ApiAnnualReportEventJSON;
|
||||||
|
}
|
||||||
|
|
||||||
export type ApiNotificationJSON =
|
export type ApiNotificationJSON =
|
||||||
| SimpleNotificationJSON
|
| SimpleNotificationJSON
|
||||||
| ReportNotificationJSON
|
| ReportNotificationJSON
|
||||||
|
@ -142,7 +153,8 @@ export type ApiNotificationGroupJSON =
|
||||||
| ReportNotificationGroupJSON
|
| ReportNotificationGroupJSON
|
||||||
| AccountRelationshipSeveranceNotificationGroupJSON
|
| AccountRelationshipSeveranceNotificationGroupJSON
|
||||||
| NotificationGroupWithStatusJSON
|
| NotificationGroupWithStatusJSON
|
||||||
| ModerationWarningNotificationGroupJSON;
|
| ModerationWarningNotificationGroupJSON
|
||||||
|
| AnnualReportNotificationGroupJSON;
|
||||||
|
|
||||||
export interface ApiNotificationGroupsResultJSON {
|
export interface ApiNotificationGroupsResultJSON {
|
||||||
accounts: ApiAccountJSON[];
|
accounts: ApiAccountJSON[];
|
||||||
|
|
|
@ -97,12 +97,12 @@ class Item extends PureComponent {
|
||||||
height = 50;
|
height = 50;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attachment.get('description')?.length > 0) {
|
|
||||||
badges.push(<AltTextBadge key='alt' description={attachment.get('description')} />);
|
|
||||||
}
|
|
||||||
|
|
||||||
const description = attachment.getIn(['translation', 'description']) || attachment.get('description');
|
const description = attachment.getIn(['translation', 'description']) || attachment.get('description');
|
||||||
|
|
||||||
|
if (description?.length > 0) {
|
||||||
|
badges.push(<AltTextBadge key='alt' description={description} />);
|
||||||
|
}
|
||||||
|
|
||||||
if (attachment.get('type') === 'unknown') {
|
if (attachment.get('type') === 'unknown') {
|
||||||
return (
|
return (
|
||||||
<div className={classNames('media-gallery__item', { standalone, 'media-gallery__item--tall': height === 100, 'media-gallery__item--wide': width === 100 })} key={attachment.get('id')}>
|
<div className={classNames('media-gallery__item', { standalone, 'media-gallery__item--tall': height === 100, 'media-gallery__item--wide': width === 100 })} key={attachment.get('id')}>
|
||||||
|
|
|
@ -13,11 +13,14 @@ class ModalRoot extends PureComponent {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
children: PropTypes.node,
|
children: PropTypes.node,
|
||||||
onClose: PropTypes.func.isRequired,
|
onClose: PropTypes.func.isRequired,
|
||||||
backgroundColor: PropTypes.shape({
|
backgroundColor: PropTypes.oneOfType([
|
||||||
|
PropTypes.string,
|
||||||
|
PropTypes.shape({
|
||||||
r: PropTypes.number,
|
r: PropTypes.number,
|
||||||
g: PropTypes.number,
|
g: PropTypes.number,
|
||||||
b: PropTypes.number,
|
b: PropTypes.number,
|
||||||
}),
|
}),
|
||||||
|
]),
|
||||||
ignoreFocus: PropTypes.bool,
|
ignoreFocus: PropTypes.bool,
|
||||||
...WithOptionalRouterPropTypes,
|
...WithOptionalRouterPropTypes,
|
||||||
};
|
};
|
||||||
|
@ -141,14 +144,17 @@ class ModalRoot extends PureComponent {
|
||||||
|
|
||||||
let backgroundColor = null;
|
let backgroundColor = null;
|
||||||
|
|
||||||
if (this.props.backgroundColor) {
|
if (this.props.backgroundColor && typeof this.props.backgroundColor === 'string') {
|
||||||
backgroundColor = multiply({ ...this.props.backgroundColor, a: 1 }, { r: 0, g: 0, b: 0, a: 0.7 });
|
backgroundColor = this.props.backgroundColor;
|
||||||
|
} else if (this.props.backgroundColor) {
|
||||||
|
const darkenedColor = multiply({ ...this.props.backgroundColor, a: 1 }, { r: 0, g: 0, b: 0, a: 0.7 });
|
||||||
|
backgroundColor = `rgb(${darkenedColor.r}, ${darkenedColor.g}, ${darkenedColor.b})`;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='modal-root' ref={this.setRef}>
|
<div className='modal-root' ref={this.setRef}>
|
||||||
<div style={{ pointerEvents: visible ? 'auto' : 'none' }}>
|
<div style={{ pointerEvents: visible ? 'auto' : 'none' }}>
|
||||||
<div role='presentation' className='modal-root__overlay' onClick={onClose} style={{ backgroundColor: backgroundColor ? `rgba(${backgroundColor.r}, ${backgroundColor.g}, ${backgroundColor.b}, 0.9)` : null }} />
|
<div role='presentation' className='modal-root__overlay' onClick={onClose} style={{ backgroundColor }} />
|
||||||
<div role='dialog' className='modal-root__container'>{children}</div>
|
<div role='dialog' className='modal-root__container'>{children}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -393,13 +393,16 @@ class Status extends ImmutablePureComponent {
|
||||||
};
|
};
|
||||||
|
|
||||||
let media, statusAvatar, prepend, rebloggedByText;
|
let media, statusAvatar, prepend, rebloggedByText;
|
||||||
|
const matchedFilters = status.get('matched_filters');
|
||||||
|
const expanded = (!matchedFilters || this.state.showDespiteFilter) && (!status.get('hidden') || status.get('spoiler_text').length === 0);
|
||||||
|
|
||||||
if (hidden) {
|
if (hidden) {
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={handlers} tabIndex={unfocusable ? null : -1}>
|
<HotKeys handlers={handlers} tabIndex={unfocusable ? null : -1}>
|
||||||
<div ref={this.handleRef} className={classNames('status__wrapper', { focusable: !this.props.muted })} tabIndex={unfocusable ? null : 0}>
|
<div ref={this.handleRef} className={classNames('status__wrapper', { focusable: !this.props.muted })} tabIndex={unfocusable ? null : 0}>
|
||||||
<span>{status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])}</span>
|
<span>{status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])}</span>
|
||||||
<span>{status.get('content')}</span>
|
{status.get('spoiler_text').length > 0 && (<span>{status.get('spoiler_text')}</span>)}
|
||||||
|
{expanded && <span>{status.get('content')}</span>}
|
||||||
</div>
|
</div>
|
||||||
</HotKeys>
|
</HotKeys>
|
||||||
);
|
);
|
||||||
|
@ -408,7 +411,6 @@ class Status extends ImmutablePureComponent {
|
||||||
const connectUp = previousId && previousId === status.get('in_reply_to_id');
|
const connectUp = previousId && previousId === status.get('in_reply_to_id');
|
||||||
const connectToRoot = rootId && rootId === status.get('in_reply_to_id');
|
const connectToRoot = rootId && rootId === status.get('in_reply_to_id');
|
||||||
const connectReply = nextInReplyToId && nextInReplyToId === status.get('id');
|
const connectReply = nextInReplyToId && nextInReplyToId === status.get('id');
|
||||||
const matchedFilters = status.get('matched_filters');
|
|
||||||
|
|
||||||
if (featured) {
|
if (featured) {
|
||||||
prepend = (
|
prepend = (
|
||||||
|
@ -538,7 +540,6 @@ class Status extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
const {statusContentProps, hashtagBar} = getHashtagBarForStatus(status);
|
const {statusContentProps, hashtagBar} = getHashtagBarForStatus(status);
|
||||||
const expanded = (!matchedFilters || this.state.showDespiteFilter) && (!status.get('hidden') || status.get('spoiler_text').length === 0);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={handlers} tabIndex={unfocusable ? null : -1}>
|
<HotKeys handlers={handlers} tabIndex={unfocusable ? null : -1}>
|
||||||
|
|
69
app/javascript/mastodon/features/annual_report/archetype.tsx
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
import booster from '@/images/archetypes/booster.png';
|
||||||
|
import lurker from '@/images/archetypes/lurker.png';
|
||||||
|
import oracle from '@/images/archetypes/oracle.png';
|
||||||
|
import pollster from '@/images/archetypes/pollster.png';
|
||||||
|
import replier from '@/images/archetypes/replier.png';
|
||||||
|
import type { Archetype as ArchetypeData } from 'mastodon/models/annual_report';
|
||||||
|
|
||||||
|
export const Archetype: React.FC<{
|
||||||
|
data: ArchetypeData;
|
||||||
|
}> = ({ data }) => {
|
||||||
|
let illustration, label;
|
||||||
|
|
||||||
|
switch (data) {
|
||||||
|
case 'booster':
|
||||||
|
illustration = booster;
|
||||||
|
label = (
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.archetype.booster'
|
||||||
|
defaultMessage='The cool-hunter'
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case 'replier':
|
||||||
|
illustration = replier;
|
||||||
|
label = (
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.archetype.replier'
|
||||||
|
defaultMessage='The social butterfly'
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case 'pollster':
|
||||||
|
illustration = pollster;
|
||||||
|
label = (
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.archetype.pollster'
|
||||||
|
defaultMessage='The pollster'
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case 'lurker':
|
||||||
|
illustration = lurker;
|
||||||
|
label = (
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.archetype.lurker'
|
||||||
|
defaultMessage='The lurker'
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case 'oracle':
|
||||||
|
illustration = oracle;
|
||||||
|
label = (
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.archetype.oracle'
|
||||||
|
defaultMessage='The oracle'
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='annual-report__bento__box annual-report__summary__archetype'>
|
||||||
|
<div className='annual-report__summary__archetype__label'>{label}</div>
|
||||||
|
<img src={illustration} alt='' />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
69
app/javascript/mastodon/features/annual_report/followers.tsx
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
import { FormattedMessage, FormattedNumber } from 'react-intl';
|
||||||
|
|
||||||
|
import { Sparklines, SparklinesCurve } from 'react-sparklines';
|
||||||
|
|
||||||
|
import { ShortNumber } from 'mastodon/components/short_number';
|
||||||
|
import type { TimeSeriesMonth } from 'mastodon/models/annual_report';
|
||||||
|
|
||||||
|
export const Followers: React.FC<{
|
||||||
|
data: TimeSeriesMonth[];
|
||||||
|
total?: number;
|
||||||
|
}> = ({ data, total }) => {
|
||||||
|
const change = data.reduce((sum, item) => sum + item.followers, 0);
|
||||||
|
|
||||||
|
const cumulativeGraph = data.reduce(
|
||||||
|
(newData, item) => [
|
||||||
|
...newData,
|
||||||
|
item.followers + (newData[newData.length - 1] ?? 0),
|
||||||
|
],
|
||||||
|
[0],
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='annual-report__bento__box annual-report__summary__followers'>
|
||||||
|
<Sparklines data={cumulativeGraph} margin={0}>
|
||||||
|
<svg>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id='gradient' x1='0%' y1='0%' x2='0%' y2='100%'>
|
||||||
|
<stop
|
||||||
|
offset='0%'
|
||||||
|
stopColor='var(--sparkline-gradient-top)'
|
||||||
|
stopOpacity='1'
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
offset='100%'
|
||||||
|
stopColor='var(--sparkline-gradient-bottom)'
|
||||||
|
stopOpacity='0'
|
||||||
|
/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<SparklinesCurve style={{ fill: 'none' }} />
|
||||||
|
</Sparklines>
|
||||||
|
|
||||||
|
<div className='annual-report__summary__followers__foreground'>
|
||||||
|
<div className='annual-report__summary__followers__number'>
|
||||||
|
{change > -1 ? '+' : '-'}
|
||||||
|
<FormattedNumber value={change} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className='annual-report__summary__followers__label'>
|
||||||
|
<span>
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.followers.followers'
|
||||||
|
defaultMessage='followers'
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
<div className='annual-report__summary__followers__footnote'>
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.followers.total'
|
||||||
|
defaultMessage='{count} total'
|
||||||
|
values={{ count: <ShortNumber value={total ?? 0} /> }}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
|
@ -0,0 +1,105 @@
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-return,
|
||||||
|
@typescript-eslint/no-explicit-any,
|
||||||
|
@typescript-eslint/no-unsafe-assignment */
|
||||||
|
|
||||||
|
import { useCallback } from 'react';
|
||||||
|
|
||||||
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
import { toggleStatusSpoilers } from 'mastodon/actions/statuses';
|
||||||
|
import { DetailedStatus } from 'mastodon/features/status/components/detailed_status';
|
||||||
|
import { me } from 'mastodon/initial_state';
|
||||||
|
import type { TopStatuses } from 'mastodon/models/annual_report';
|
||||||
|
import { makeGetStatus, makeGetPictureInPicture } from 'mastodon/selectors';
|
||||||
|
import { useAppSelector, useAppDispatch } from 'mastodon/store';
|
||||||
|
|
||||||
|
const getStatus = makeGetStatus() as unknown as (arg0: any, arg1: any) => any;
|
||||||
|
const getPictureInPicture = makeGetPictureInPicture() as unknown as (
|
||||||
|
arg0: any,
|
||||||
|
arg1: any,
|
||||||
|
) => any;
|
||||||
|
|
||||||
|
export const HighlightedPost: React.FC<{
|
||||||
|
data: TopStatuses;
|
||||||
|
}> = ({ data }) => {
|
||||||
|
let statusId, label;
|
||||||
|
|
||||||
|
if (data.by_reblogs) {
|
||||||
|
statusId = data.by_reblogs;
|
||||||
|
label = (
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.highlighted_post.by_reblogs'
|
||||||
|
defaultMessage='most boosted post'
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
} else if (data.by_favourites) {
|
||||||
|
statusId = data.by_favourites;
|
||||||
|
label = (
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.highlighted_post.by_favourites'
|
||||||
|
defaultMessage='most favourited post'
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
statusId = data.by_replies;
|
||||||
|
label = (
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.highlighted_post.by_replies'
|
||||||
|
defaultMessage='post with the most replies'
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const dispatch = useAppDispatch();
|
||||||
|
const domain = useAppSelector((state) => state.meta.get('domain'));
|
||||||
|
const status = useAppSelector((state) =>
|
||||||
|
statusId ? getStatus(state, { id: statusId }) : undefined,
|
||||||
|
);
|
||||||
|
const pictureInPicture = useAppSelector((state) =>
|
||||||
|
statusId ? getPictureInPicture(state, { id: statusId }) : undefined,
|
||||||
|
);
|
||||||
|
const account = useAppSelector((state) =>
|
||||||
|
me ? state.accounts.get(me) : undefined,
|
||||||
|
);
|
||||||
|
|
||||||
|
const handleToggleHidden = useCallback(() => {
|
||||||
|
dispatch(toggleStatusSpoilers(statusId));
|
||||||
|
}, [dispatch, statusId]);
|
||||||
|
|
||||||
|
if (!status) {
|
||||||
|
return (
|
||||||
|
<div className='annual-report__bento__box annual-report__summary__most-boosted-post' />
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const displayName = (
|
||||||
|
<span className='display-name'>
|
||||||
|
<strong className='display-name__html'>
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.highlighted_post.possessive'
|
||||||
|
defaultMessage="{name}'s"
|
||||||
|
values={{
|
||||||
|
name: account && (
|
||||||
|
<bdi
|
||||||
|
dangerouslySetInnerHTML={{ __html: account.display_name_html }}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</strong>
|
||||||
|
<span className='display-name__account'>{label}</span>
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='annual-report__bento__box annual-report__summary__most-boosted-post'>
|
||||||
|
<DetailedStatus
|
||||||
|
status={status}
|
||||||
|
pictureInPicture={pictureInPicture}
|
||||||
|
domain={domain}
|
||||||
|
onToggleHidden={handleToggleHidden}
|
||||||
|
overrideDisplayName={displayName}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
99
app/javascript/mastodon/features/annual_report/index.tsx
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
import { useState, useEffect } from 'react';
|
||||||
|
|
||||||
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
import {
|
||||||
|
importFetchedStatuses,
|
||||||
|
importFetchedAccounts,
|
||||||
|
} from 'mastodon/actions/importer';
|
||||||
|
import { apiRequestGet, apiRequestPost } from 'mastodon/api';
|
||||||
|
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
|
||||||
|
import { me } from 'mastodon/initial_state';
|
||||||
|
import type { Account } from 'mastodon/models/account';
|
||||||
|
import type { AnnualReport as AnnualReportData } from 'mastodon/models/annual_report';
|
||||||
|
import type { Status } from 'mastodon/models/status';
|
||||||
|
import { useAppSelector, useAppDispatch } from 'mastodon/store';
|
||||||
|
|
||||||
|
import { Archetype } from './archetype';
|
||||||
|
import { Followers } from './followers';
|
||||||
|
import { HighlightedPost } from './highlighted_post';
|
||||||
|
import { MostUsedHashtag } from './most_used_hashtag';
|
||||||
|
import { NewPosts } from './new_posts';
|
||||||
|
import { Percentile } from './percentile';
|
||||||
|
|
||||||
|
interface AnnualReportResponse {
|
||||||
|
annual_reports: AnnualReportData[];
|
||||||
|
accounts: Account[];
|
||||||
|
statuses: Status[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export const AnnualReport: React.FC<{
|
||||||
|
year: string;
|
||||||
|
}> = ({ year }) => {
|
||||||
|
const [response, setResponse] = useState<AnnualReportResponse | null>(null);
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
const currentAccount = useAppSelector((state) =>
|
||||||
|
me ? state.accounts.get(me) : undefined,
|
||||||
|
);
|
||||||
|
const dispatch = useAppDispatch();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setLoading(true);
|
||||||
|
|
||||||
|
apiRequestGet<AnnualReportResponse>(`v1/annual_reports/${year}`)
|
||||||
|
.then((data) => {
|
||||||
|
dispatch(importFetchedStatuses(data.statuses));
|
||||||
|
dispatch(importFetchedAccounts(data.accounts));
|
||||||
|
|
||||||
|
setResponse(data);
|
||||||
|
setLoading(false);
|
||||||
|
|
||||||
|
return apiRequestPost(`v1/annual_reports/${year}/read`);
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
setLoading(false);
|
||||||
|
});
|
||||||
|
}, [dispatch, year, setResponse, setLoading]);
|
||||||
|
|
||||||
|
if (loading) {
|
||||||
|
return <LoadingIndicator />;
|
||||||
|
}
|
||||||
|
|
||||||
|
const report = response?.annual_reports[0];
|
||||||
|
|
||||||
|
if (!report) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='annual-report'>
|
||||||
|
<div className='annual-report__header'>
|
||||||
|
<h1>
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.thanks'
|
||||||
|
defaultMessage='Thanks for being part of Mastodon!'
|
||||||
|
/>
|
||||||
|
</h1>
|
||||||
|
<p>
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.here_it_is'
|
||||||
|
defaultMessage='Here is your {year} in review:'
|
||||||
|
values={{ year: report.year }}
|
||||||
|
/>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className='annual-report__bento annual-report__summary'>
|
||||||
|
<Archetype data={report.data.archetype} />
|
||||||
|
<HighlightedPost data={report.data.top_statuses} />
|
||||||
|
<Followers
|
||||||
|
data={report.data.time_series}
|
||||||
|
total={currentAccount?.followers_count}
|
||||||
|
/>
|
||||||
|
<MostUsedHashtag data={report.data.top_hashtags} />
|
||||||
|
<Percentile data={report.data.percentiles} />
|
||||||
|
<NewPosts data={report.data.time_series} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
|
@ -0,0 +1,29 @@
|
||||||
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
import type { NameAndCount } from 'mastodon/models/annual_report';
|
||||||
|
|
||||||
|
export const MostUsedApp: React.FC<{
|
||||||
|
data: NameAndCount[];
|
||||||
|
}> = ({ data }) => {
|
||||||
|
const app = data[0];
|
||||||
|
|
||||||
|
if (!app) {
|
||||||
|
return (
|
||||||
|
<div className='annual-report__bento__box annual-report__summary__most-used-app' />
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='annual-report__bento__box annual-report__summary__most-used-app'>
|
||||||
|
<div className='annual-report__summary__most-used-app__icon'>
|
||||||
|
{app.name}
|
||||||
|
</div>
|
||||||
|
<div className='annual-report__summary__most-used-app__label'>
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.most_used_app.most_used_app'
|
||||||
|
defaultMessage='most used app'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
|
@ -0,0 +1,29 @@
|
||||||
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
import type { NameAndCount } from 'mastodon/models/annual_report';
|
||||||
|
|
||||||
|
export const MostUsedHashtag: React.FC<{
|
||||||
|
data: NameAndCount[];
|
||||||
|
}> = ({ data }) => {
|
||||||
|
const hashtag = data[0];
|
||||||
|
|
||||||
|
if (!hashtag) {
|
||||||
|
return (
|
||||||
|
<div className='annual-report__bento__box annual-report__summary__most-used-hashtag' />
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='annual-report__bento__box annual-report__summary__most-used-hashtag'>
|
||||||
|
<div className='annual-report__summary__most-used-hashtag__hashtag'>
|
||||||
|
#{hashtag.name}
|
||||||
|
</div>
|
||||||
|
<div className='annual-report__summary__most-used-hashtag__label'>
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.most_used_hashtag.most_used_hashtag'
|
||||||
|
defaultMessage='most used hashtag'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
53
app/javascript/mastodon/features/annual_report/new_posts.tsx
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
import { FormattedNumber, FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
import ChatBubbleIcon from '@/material-icons/400-24px/chat_bubble.svg?react';
|
||||||
|
import type { TimeSeriesMonth } from 'mastodon/models/annual_report';
|
||||||
|
|
||||||
|
export const NewPosts: React.FC<{
|
||||||
|
data: TimeSeriesMonth[];
|
||||||
|
}> = ({ data }) => {
|
||||||
|
const posts = data.reduce((sum, item) => sum + item.statuses, 0);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='annual-report__bento__box annual-report__summary__new-posts'>
|
||||||
|
<svg width={500} height={500}>
|
||||||
|
<defs>
|
||||||
|
<pattern
|
||||||
|
id='posts'
|
||||||
|
x='0'
|
||||||
|
y='0'
|
||||||
|
width='32'
|
||||||
|
height='35'
|
||||||
|
patternUnits='userSpaceOnUse'
|
||||||
|
>
|
||||||
|
<circle cx='12' cy='12' r='12' fill='var(--lime)' />
|
||||||
|
<ChatBubbleIcon
|
||||||
|
fill='var(--indigo-1)'
|
||||||
|
x='4'
|
||||||
|
y='4'
|
||||||
|
width='16'
|
||||||
|
height='16'
|
||||||
|
/>
|
||||||
|
</pattern>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<rect
|
||||||
|
width={500}
|
||||||
|
height={500}
|
||||||
|
fill='url(#posts)'
|
||||||
|
style={{ opacity: 0.2 }}
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<div className='annual-report__summary__new-posts__number'>
|
||||||
|
<FormattedNumber value={posts} />
|
||||||
|
</div>
|
||||||
|
<div className='annual-report__summary__new-posts__label'>
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.new_posts.new_posts'
|
||||||
|
defaultMessage='new posts'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
|
@ -0,0 +1,53 @@
|
||||||
|
/* eslint-disable react/jsx-no-useless-fragment */
|
||||||
|
import { FormattedMessage, FormattedNumber } from 'react-intl';
|
||||||
|
|
||||||
|
import type { Percentiles } from 'mastodon/models/annual_report';
|
||||||
|
|
||||||
|
export const Percentile: React.FC<{
|
||||||
|
data: Percentiles;
|
||||||
|
}> = ({ data }) => {
|
||||||
|
const percentile = data.statuses;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='annual-report__bento__box annual-report__summary__percentile'>
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.percentile.text'
|
||||||
|
defaultMessage='<topLabel>That puts you in the top</topLabel><percentage></percentage><bottomLabel>of Mastodon users.</bottomLabel>'
|
||||||
|
values={{
|
||||||
|
topLabel: (str) => (
|
||||||
|
<div className='annual-report__summary__percentile__label'>
|
||||||
|
{str}
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
percentage: () => (
|
||||||
|
<div className='annual-report__summary__percentile__number'>
|
||||||
|
<FormattedNumber
|
||||||
|
value={percentile / 100}
|
||||||
|
style='percent'
|
||||||
|
maximumFractionDigits={1}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
bottomLabel: (str) => (
|
||||||
|
<div>
|
||||||
|
<div className='annual-report__summary__percentile__label'>
|
||||||
|
{str}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{percentile < 6 && (
|
||||||
|
<div className='annual-report__summary__percentile__footnote'>
|
||||||
|
<FormattedMessage
|
||||||
|
id='annual_report.summary.percentile.we_wont_tell_bernie'
|
||||||
|
defaultMessage="We won't tell Bernie."
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{(message) => <>{message}</>}
|
||||||
|
</FormattedMessage>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
|
@ -68,7 +68,7 @@ class FollowRequests extends ImmutablePureComponent {
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Column bindToDocument={!multiColumn} icon='user-plus' iconComponent={PersonAddIcon} heading={intl.formatMessage(messages.heading)}>
|
<Column bindToDocument={!multiColumn} icon='user-plus' iconComponent={PersonAddIcon} heading={intl.formatMessage(messages.heading)} alwaysShowBackButton>
|
||||||
<ScrollableList
|
<ScrollableList
|
||||||
scrollKey='follow_requests'
|
scrollKey='follow_requests'
|
||||||
onLoadMore={this.handleLoadMore}
|
onLoadMore={this.handleLoadMore}
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
import { useCallback } from 'react';
|
||||||
|
|
||||||
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
import classNames from 'classnames';
|
||||||
|
|
||||||
|
import CelebrationIcon from '@/material-icons/400-24px/celebration.svg?react';
|
||||||
|
import { openModal } from 'mastodon/actions/modal';
|
||||||
|
import { Icon } from 'mastodon/components/icon';
|
||||||
|
import type { NotificationGroupAnnualReport } from 'mastodon/models/notification_group';
|
||||||
|
import { useAppDispatch } from 'mastodon/store';
|
||||||
|
|
||||||
|
export const NotificationAnnualReport: React.FC<{
|
||||||
|
notification: NotificationGroupAnnualReport;
|
||||||
|
unread: boolean;
|
||||||
|
}> = ({ notification: { annualReport }, unread }) => {
|
||||||
|
const dispatch = useAppDispatch();
|
||||||
|
const year = annualReport.year;
|
||||||
|
|
||||||
|
const handleClick = useCallback(() => {
|
||||||
|
dispatch(
|
||||||
|
openModal({
|
||||||
|
modalType: 'ANNUAL_REPORT',
|
||||||
|
modalProps: { year },
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}, [dispatch, year]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
role='button'
|
||||||
|
className={classNames(
|
||||||
|
'notification-group notification-group--link notification-group--annual-report focusable',
|
||||||
|
{ 'notification-group--unread': unread },
|
||||||
|
)}
|
||||||
|
tabIndex={0}
|
||||||
|
>
|
||||||
|
<div className='notification-group__icon'>
|
||||||
|
<Icon id='celebration' icon={CelebrationIcon} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className='notification-group__main'>
|
||||||
|
<p>
|
||||||
|
<FormattedMessage
|
||||||
|
id='notification.annual_report.message'
|
||||||
|
defaultMessage="Your {year} #Wrapstodon awaits! Unveil your year's highlights and memorable moments on Mastodon!"
|
||||||
|
values={{ year }}
|
||||||
|
/>
|
||||||
|
</p>
|
||||||
|
<button onClick={handleClick} className='link-button'>
|
||||||
|
<FormattedMessage
|
||||||
|
id='notification.annual_report.view'
|
||||||
|
defaultMessage='View #Wrapstodon'
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
|
@ -9,6 +9,7 @@ import { useAppSelector, useAppDispatch } from 'mastodon/store';
|
||||||
|
|
||||||
import { NotificationAdminReport } from './notification_admin_report';
|
import { NotificationAdminReport } from './notification_admin_report';
|
||||||
import { NotificationAdminSignUp } from './notification_admin_sign_up';
|
import { NotificationAdminSignUp } from './notification_admin_sign_up';
|
||||||
|
import { NotificationAnnualReport } from './notification_annual_report';
|
||||||
import { NotificationFavourite } from './notification_favourite';
|
import { NotificationFavourite } from './notification_favourite';
|
||||||
import { NotificationFollow } from './notification_follow';
|
import { NotificationFollow } from './notification_follow';
|
||||||
import { NotificationFollowRequest } from './notification_follow_request';
|
import { NotificationFollowRequest } from './notification_follow_request';
|
||||||
|
@ -143,6 +144,14 @@ export const NotificationGroup: React.FC<{
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
case 'annual_report':
|
||||||
|
content = (
|
||||||
|
<NotificationAnnualReport
|
||||||
|
unread={unread}
|
||||||
|
notification={notificationGroup}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,7 @@ export const DetailedStatus: React.FC<{
|
||||||
domain: string;
|
domain: string;
|
||||||
showMedia?: boolean;
|
showMedia?: boolean;
|
||||||
withLogo?: boolean;
|
withLogo?: boolean;
|
||||||
|
overrideDisplayName?: React.ReactNode;
|
||||||
pictureInPicture: any;
|
pictureInPicture: any;
|
||||||
onToggleHidden?: (status: any) => void;
|
onToggleHidden?: (status: any) => void;
|
||||||
onToggleMediaVisibility?: () => void;
|
onToggleMediaVisibility?: () => void;
|
||||||
|
@ -62,6 +63,7 @@ export const DetailedStatus: React.FC<{
|
||||||
domain,
|
domain,
|
||||||
showMedia,
|
showMedia,
|
||||||
withLogo,
|
withLogo,
|
||||||
|
overrideDisplayName,
|
||||||
pictureInPicture,
|
pictureInPicture,
|
||||||
onToggleMediaVisibility,
|
onToggleMediaVisibility,
|
||||||
onToggleHidden,
|
onToggleHidden,
|
||||||
|
@ -319,7 +321,11 @@ export const DetailedStatus: React.FC<{
|
||||||
<div className='detailed-status__display-avatar'>
|
<div className='detailed-status__display-avatar'>
|
||||||
<Avatar account={status.get('account')} size={46} />
|
<Avatar account={status.get('account')} size={46} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{overrideDisplayName ?? (
|
||||||
<DisplayName account={status.get('account')} localDomain={domain} />
|
<DisplayName account={status.get('account')} localDomain={domain} />
|
||||||
|
)}
|
||||||
|
|
||||||
{withLogo && (
|
{withLogo && (
|
||||||
<>
|
<>
|
||||||
<div className='spacer' />
|
<div className='spacer' />
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
import { useEffect } from 'react';
|
||||||
|
|
||||||
|
import { AnnualReport } from 'mastodon/features/annual_report';
|
||||||
|
|
||||||
|
const AnnualReportModal: React.FC<{
|
||||||
|
year: string;
|
||||||
|
onChangeBackgroundColor: (arg0: string) => void;
|
||||||
|
}> = ({ year, onChangeBackgroundColor }) => {
|
||||||
|
useEffect(() => {
|
||||||
|
onChangeBackgroundColor('var(--indigo-1)');
|
||||||
|
}, [onChangeBackgroundColor]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='modal-root__modal annual-report-modal'>
|
||||||
|
<AnnualReport year={year} />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
// eslint-disable-next-line import/no-default-export
|
||||||
|
export default AnnualReportModal;
|
|
@ -18,6 +18,7 @@ import {
|
||||||
SubscribedLanguagesModal,
|
SubscribedLanguagesModal,
|
||||||
ClosedRegistrationsModal,
|
ClosedRegistrationsModal,
|
||||||
IgnoreNotificationsModal,
|
IgnoreNotificationsModal,
|
||||||
|
AnnualReportModal,
|
||||||
} from 'mastodon/features/ui/util/async-components';
|
} from 'mastodon/features/ui/util/async-components';
|
||||||
import { getScrollbarWidth } from 'mastodon/utils/scrollbar';
|
import { getScrollbarWidth } from 'mastodon/utils/scrollbar';
|
||||||
|
|
||||||
|
@ -72,6 +73,7 @@ export const MODAL_COMPONENTS = {
|
||||||
'INTERACTION': InteractionModal,
|
'INTERACTION': InteractionModal,
|
||||||
'CLOSED_REGISTRATIONS': ClosedRegistrationsModal,
|
'CLOSED_REGISTRATIONS': ClosedRegistrationsModal,
|
||||||
'IGNORE_NOTIFICATIONS': IgnoreNotificationsModal,
|
'IGNORE_NOTIFICATIONS': IgnoreNotificationsModal,
|
||||||
|
'ANNUAL_REPORT': AnnualReportModal,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default class ModalRoot extends PureComponent {
|
export default class ModalRoot extends PureComponent {
|
||||||
|
|
|
@ -217,3 +217,7 @@ export function NotificationRequest () {
|
||||||
export function LinkTimeline () {
|
export function LinkTimeline () {
|
||||||
return import(/*webpackChunkName: "features/link_timeline" */'../../link_timeline');
|
return import(/*webpackChunkName: "features/link_timeline" */'../../link_timeline');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function AnnualReportModal () {
|
||||||
|
return import(/*webpackChunkName: "modals/annual_report_modal" */'../components/annual_report_modal');
|
||||||
|
}
|
||||||
|
|
|
@ -82,6 +82,8 @@
|
||||||
"alert.unexpected.message": "Ur fazi dic'hortozet zo degouezhet.",
|
"alert.unexpected.message": "Ur fazi dic'hortozet zo degouezhet.",
|
||||||
"alert.unexpected.title": "Hopala !",
|
"alert.unexpected.title": "Hopala !",
|
||||||
"announcement.announcement": "Kemennad",
|
"announcement.announcement": "Kemennad",
|
||||||
|
"annual_report.summary.followers.followers": "heulier",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||||
"attachments_list.unprocessed": "(ket meret)",
|
"attachments_list.unprocessed": "(ket meret)",
|
||||||
"audio.hide": "Kuzhat ar c'hleved",
|
"audio.hide": "Kuzhat ar c'hleved",
|
||||||
"block_modal.show_less": "Diskouez nebeutoc'h",
|
"block_modal.show_less": "Diskouez nebeutoc'h",
|
||||||
|
|
|
@ -87,6 +87,18 @@
|
||||||
"alert.unexpected.title": "Vaja!",
|
"alert.unexpected.title": "Vaja!",
|
||||||
"alt_text_badge.title": "Text alternatiu",
|
"alt_text_badge.title": "Text alternatiu",
|
||||||
"announcement.announcement": "Anunci",
|
"announcement.announcement": "Anunci",
|
||||||
|
"annual_report.summary.archetype.oracle": "L'Oracle",
|
||||||
|
"annual_report.summary.followers.followers": "seguidors",
|
||||||
|
"annual_report.summary.followers.total": "{count} en total",
|
||||||
|
"annual_report.summary.here_it_is": "El repàs del vostre {year}:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "la publicació més afavorida",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "la publicació més impulsada",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "la publicació amb més respostes",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "de {name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "l'aplicació més utilitzada",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "l'etiqueta més utilitzada",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "publicacions noves",
|
||||||
|
"annual_report.summary.thanks": "Gràcies per formar part de Mastodon!",
|
||||||
"attachments_list.unprocessed": "(sense processar)",
|
"attachments_list.unprocessed": "(sense processar)",
|
||||||
"audio.hide": "Amaga l'àudio",
|
"audio.hide": "Amaga l'àudio",
|
||||||
"block_modal.remote_users_caveat": "Li demanarem al servidor {domain} que respecti la vostra decisió, tot i que no podem garantir-ho, ja que alguns servidors gestionen de forma diferent els blocatges. És possible que els usuaris no autenticats puguin veure les publicacions públiques.",
|
"block_modal.remote_users_caveat": "Li demanarem al servidor {domain} que respecti la vostra decisió, tot i que no podem garantir-ho, ja que alguns servidors gestionen de forma diferent els blocatges. És possible que els usuaris no autenticats puguin veure les publicacions públiques.",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "Oha!",
|
"alert.unexpected.title": "Oha!",
|
||||||
"alt_text_badge.title": "Bildbeschreibung",
|
"alt_text_badge.title": "Bildbeschreibung",
|
||||||
"announcement.announcement": "Ankündigung",
|
"announcement.announcement": "Ankündigung",
|
||||||
|
"annual_report.summary.archetype.booster": "Trendjäger*in",
|
||||||
|
"annual_report.summary.archetype.lurker": "Beobachter*in",
|
||||||
|
"annual_report.summary.archetype.oracle": "Orakel",
|
||||||
|
"annual_report.summary.archetype.pollster": "Meinungsforscher*in",
|
||||||
|
"annual_report.summary.archetype.replier": "Geselliger Schmetterling",
|
||||||
|
"annual_report.summary.followers.followers": "Follower",
|
||||||
|
"annual_report.summary.followers.total": "{count} insgesamt",
|
||||||
|
"annual_report.summary.here_it_is": "Dein Jahresrückblick für {year}:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "am häufigsten favorisierter Beitrag",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "am häufigsten geteilter Beitrag",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "Beitrag mit den meisten Antworten",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "am häufigsten verwendete App",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "am häufigsten verwendeter Hashtag",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "neue Beiträge",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Damit gehörst du zu den obersten</topLabel><percentage></percentage><bottomLabel>der Mastodon-Nutzer*innen.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Wir werden Bernie nichts verraten.",
|
||||||
|
"annual_report.summary.thanks": "Danke, dass du Teil von Mastodon bist!",
|
||||||
"attachments_list.unprocessed": "(ausstehend)",
|
"attachments_list.unprocessed": "(ausstehend)",
|
||||||
"audio.hide": "Audio ausblenden",
|
"audio.hide": "Audio ausblenden",
|
||||||
"block_modal.remote_users_caveat": "Wir werden den Server {domain} bitten, deine Entscheidung zu respektieren. Allerdings kann nicht garantiert werden, dass sie eingehalten wird, weil einige Server Blockierungen unterschiedlich handhaben können. Öffentliche Beiträge können für nicht angemeldete Nutzer*innen weiterhin sichtbar sein.",
|
"block_modal.remote_users_caveat": "Wir werden den Server {domain} bitten, deine Entscheidung zu respektieren. Allerdings kann nicht garantiert werden, dass sie eingehalten wird, weil einige Server Blockierungen unterschiedlich handhaben können. Öffentliche Beiträge können für nicht angemeldete Nutzer*innen weiterhin sichtbar sein.",
|
||||||
|
@ -508,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} meldete {target}",
|
"notification.admin.report_statuses_other": "{name} meldete {target}",
|
||||||
"notification.admin.sign_up": "{name} registrierte sich",
|
"notification.admin.sign_up": "{name} registrierte sich",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} und {count, plural, one {# weitere Person} other {# weitere Personen}} registrierten sich",
|
"notification.admin.sign_up.name_and_others": "{name} und {count, plural, one {# weitere Person} other {# weitere Personen}} registrierten sich",
|
||||||
|
"notification.annual_report.message": "Dein {year} #Wrapstodon erwartet dich! Lass deine Highlights und unvergesslichen Momente auf Mastodon erneut aufleben!",
|
||||||
|
"notification.annual_report.view": "#Wrapstodon ansehen",
|
||||||
"notification.favourite": "{name} favorisierte deinen Beitrag",
|
"notification.favourite": "{name} favorisierte deinen Beitrag",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} und <a>{count, plural, one {# weitere Person} other {# weitere Personen}}</a> favorisierten deinen Beitrag",
|
"notification.favourite.name_and_others_with_link": "{name} und <a>{count, plural, one {# weitere Person} other {# weitere Personen}}</a> favorisierten deinen Beitrag",
|
||||||
"notification.follow": "{name} folgt dir",
|
"notification.follow": "{name} folgt dir",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "Oops!",
|
"alert.unexpected.title": "Oops!",
|
||||||
"alt_text_badge.title": "Alt text",
|
"alt_text_badge.title": "Alt text",
|
||||||
"announcement.announcement": "Announcement",
|
"announcement.announcement": "Announcement",
|
||||||
|
"annual_report.summary.archetype.booster": "The cool-hunter",
|
||||||
|
"annual_report.summary.archetype.lurker": "The lurker",
|
||||||
|
"annual_report.summary.archetype.oracle": "The oracle",
|
||||||
|
"annual_report.summary.archetype.pollster": "The pollster",
|
||||||
|
"annual_report.summary.archetype.replier": "The social butterfly",
|
||||||
|
"annual_report.summary.followers.followers": "followers",
|
||||||
|
"annual_report.summary.followers.total": "{count} total",
|
||||||
|
"annual_report.summary.here_it_is": "Here is your {year} in review:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "most favourited post",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "most boosted post",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "post with the most replies",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}'s",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "most used app",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "most used hashtag",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "new posts",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>That puts you in the top</topLabel><percentage></percentage><bottomLabel>of Mastodon users.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "We won't tell Bernie.",
|
||||||
|
"annual_report.summary.thanks": "Thanks for being part of Mastodon!",
|
||||||
"attachments_list.unprocessed": "(unprocessed)",
|
"attachments_list.unprocessed": "(unprocessed)",
|
||||||
"audio.hide": "Hide audio",
|
"audio.hide": "Hide audio",
|
||||||
"block_modal.remote_users_caveat": "We will ask the server {domain} to respect your decision. However, compliance is not guaranteed since some servers may handle blocks differently. Public posts may still be visible to non-logged-in users.",
|
"block_modal.remote_users_caveat": "We will ask the server {domain} to respect your decision. However, compliance is not guaranteed since some servers may handle blocks differently. Public posts may still be visible to non-logged-in users.",
|
||||||
|
@ -508,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} reported {target}",
|
"notification.admin.report_statuses_other": "{name} reported {target}",
|
||||||
"notification.admin.sign_up": "{name} signed up",
|
"notification.admin.sign_up": "{name} signed up",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} and {count, plural, one {# other} other {# others}} signed up",
|
"notification.admin.sign_up.name_and_others": "{name} and {count, plural, one {# other} other {# others}} signed up",
|
||||||
|
"notification.annual_report.message": "Your {year} #Wrapstodon awaits! Unveil your year's highlights and memorable moments on Mastodon!",
|
||||||
|
"notification.annual_report.view": "View #Wrapstodon",
|
||||||
"notification.favourite": "{name} favorited your post",
|
"notification.favourite": "{name} favorited your post",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} and <a>{count, plural, one {# other} other {# others}}</a> favorited your post",
|
"notification.favourite.name_and_others_with_link": "{name} and <a>{count, plural, one {# other} other {# others}}</a> favorited your post",
|
||||||
"notification.follow": "{name} followed you",
|
"notification.follow": "{name} followed you",
|
||||||
|
|
|
@ -45,7 +45,7 @@
|
||||||
"account.languages": "Ŝanĝi la abonitajn lingvojn",
|
"account.languages": "Ŝanĝi la abonitajn lingvojn",
|
||||||
"account.link_verified_on": "Propreco de tiu ligilo estis konfirmita je {date}",
|
"account.link_verified_on": "Propreco de tiu ligilo estis konfirmita je {date}",
|
||||||
"account.locked_info": "Tiu konto estas privatigita. La posedanto mane akceptas tiun, kiu povas sekvi rin.",
|
"account.locked_info": "Tiu konto estas privatigita. La posedanto mane akceptas tiun, kiu povas sekvi rin.",
|
||||||
"account.media": "Plurmedioj",
|
"account.media": "Plurmedio",
|
||||||
"account.mention": "Mencii @{name}",
|
"account.mention": "Mencii @{name}",
|
||||||
"account.moved_to": "{name} indikis, ke ria nova konto estas nun:",
|
"account.moved_to": "{name} indikis, ke ria nova konto estas nun:",
|
||||||
"account.mute": "Silentigi @{name}",
|
"account.mute": "Silentigi @{name}",
|
||||||
|
@ -87,6 +87,11 @@
|
||||||
"alert.unexpected.title": "Aj!",
|
"alert.unexpected.title": "Aj!",
|
||||||
"alt_text_badge.title": "Alt-teksto",
|
"alt_text_badge.title": "Alt-teksto",
|
||||||
"announcement.announcement": "Anonco",
|
"announcement.announcement": "Anonco",
|
||||||
|
"annual_report.summary.archetype.replier": "La plej societema",
|
||||||
|
"annual_report.summary.followers.followers": "sekvantoj",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "afiŝo kun la plej multaj respondoj",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "novaj afiŝoj",
|
||||||
|
"annual_report.summary.thanks": "Dankon pro esti parto de Mastodon!",
|
||||||
"attachments_list.unprocessed": "(neprilaborita)",
|
"attachments_list.unprocessed": "(neprilaborita)",
|
||||||
"audio.hide": "Kaŝi aŭdion",
|
"audio.hide": "Kaŝi aŭdion",
|
||||||
"block_modal.remote_users_caveat": "Ni petos al la servilo {domain} respekti vian elekton. Tamen, plenumo ne estas garantiita ĉar iuj serviloj eble manipulas blokojn malsame. Publikaj afiŝoj eble ankoraŭ estas videbla por ne-ensalutintaj uzantoj.",
|
"block_modal.remote_users_caveat": "Ni petos al la servilo {domain} respekti vian elekton. Tamen, plenumo ne estas garantiita ĉar iuj serviloj eble manipulas blokojn malsame. Publikaj afiŝoj eble ankoraŭ estas videbla por ne-ensalutintaj uzantoj.",
|
||||||
|
@ -142,7 +147,7 @@
|
||||||
"column_header.unpin": "Malfiksi",
|
"column_header.unpin": "Malfiksi",
|
||||||
"column_subheading.settings": "Agordoj",
|
"column_subheading.settings": "Agordoj",
|
||||||
"community.column_settings.local_only": "Nur loka",
|
"community.column_settings.local_only": "Nur loka",
|
||||||
"community.column_settings.media_only": "Nur plurmedioj",
|
"community.column_settings.media_only": "Nur plurmedio",
|
||||||
"community.column_settings.remote_only": "Nur fora",
|
"community.column_settings.remote_only": "Nur fora",
|
||||||
"compose.language.change": "Ŝanĝi lingvon",
|
"compose.language.change": "Ŝanĝi lingvon",
|
||||||
"compose.language.search": "Serĉi lingvojn...",
|
"compose.language.search": "Serĉi lingvojn...",
|
||||||
|
@ -508,6 +513,7 @@
|
||||||
"notification.admin.report_statuses_other": "{name} raportis {target}",
|
"notification.admin.report_statuses_other": "{name} raportis {target}",
|
||||||
"notification.admin.sign_up": "{name} kreis konton",
|
"notification.admin.sign_up": "{name} kreis konton",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} kaj {count, plural, one {# alia} other {# aliaj}} kreis konton",
|
"notification.admin.sign_up.name_and_others": "{name} kaj {count, plural, one {# alia} other {# aliaj}} kreis konton",
|
||||||
|
"notification.annual_report.view": "Vidu #Wrapstodon",
|
||||||
"notification.favourite": "{name} stelumis vian afiŝon",
|
"notification.favourite": "{name} stelumis vian afiŝon",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} kaj <a>{count, plural, one {# alia} other {# aliaj}}</a> ŝatis vian afiŝon",
|
"notification.favourite.name_and_others_with_link": "{name} kaj <a>{count, plural, one {# alia} other {# aliaj}}</a> ŝatis vian afiŝon",
|
||||||
"notification.follow": "{name} eksekvis vin",
|
"notification.follow": "{name} eksekvis vin",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "¡Epa!",
|
"alert.unexpected.title": "¡Epa!",
|
||||||
"alt_text_badge.title": "Texto alternativo",
|
"alt_text_badge.title": "Texto alternativo",
|
||||||
"announcement.announcement": "Anuncio",
|
"announcement.announcement": "Anuncio",
|
||||||
|
"annual_report.summary.archetype.booster": "El cazador de tendencias",
|
||||||
|
"annual_report.summary.archetype.lurker": "El acechador",
|
||||||
|
"annual_report.summary.archetype.oracle": "El oráculo",
|
||||||
|
"annual_report.summary.archetype.pollster": "El encuestador",
|
||||||
|
"annual_report.summary.archetype.replier": "El más sociable",
|
||||||
|
"annual_report.summary.followers.followers": "seguidores",
|
||||||
|
"annual_report.summary.followers.total": "{count} en total",
|
||||||
|
"annual_report.summary.here_it_is": "Aquí está tu resumen de {year}:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "publicación con más favoritos",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "publicación más impulsada",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "publicación con más respuestas",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "de {name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "aplicación más usada",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "etiqueta más usada",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "nuevas publicaciones",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Eso te pone en el top</topLabel><percentage></percentage><bottomLabel>de usuarios de Mastodon.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "No se lo diremos a Bernie.",
|
||||||
|
"annual_report.summary.thanks": "¡Gracias por ser parte de Mastodon!",
|
||||||
"attachments_list.unprocessed": "[sin procesar]",
|
"attachments_list.unprocessed": "[sin procesar]",
|
||||||
"audio.hide": "Ocultar audio",
|
"audio.hide": "Ocultar audio",
|
||||||
"block_modal.remote_users_caveat": "Le pediremos al servidor {domain} que respete tu decisión. Sin embargo, el cumplimiento no está garantizado, ya que algunos servidores pueden manejar los bloqueos de forma diferente. Los mensajes públicos todavía podrían estar visibles para los usuarios no conectados.",
|
"block_modal.remote_users_caveat": "Le pediremos al servidor {domain} que respete tu decisión. Sin embargo, el cumplimiento no está garantizado, ya que algunos servidores pueden manejar los bloqueos de forma diferente. Los mensajes públicos todavía podrían estar visibles para los usuarios no conectados.",
|
||||||
|
@ -508,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} denunció a {target}",
|
"notification.admin.report_statuses_other": "{name} denunció a {target}",
|
||||||
"notification.admin.sign_up": "Se registró {name}",
|
"notification.admin.sign_up": "Se registró {name}",
|
||||||
"notification.admin.sign_up.name_and_others": "Se registraron {name} y {count, plural, one {# cuenta más} other {# cuentas más}}",
|
"notification.admin.sign_up.name_and_others": "Se registraron {name} y {count, plural, one {# cuenta más} other {# cuentas más}}",
|
||||||
|
"notification.annual_report.message": "¡Tu #Wrapstodon {year} te espera! ¡Desvela los momentos más destacados y memorables de tu año en Mastodon!",
|
||||||
|
"notification.annual_report.view": "Ver #Wrapstodon",
|
||||||
"notification.favourite": "{name} marcó tu mensaje como favorito",
|
"notification.favourite": "{name} marcó tu mensaje como favorito",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} y <a>{count, plural, one {# cuenta más} other {# cuentas más}}</a> marcaron tu mensaje como favorito",
|
"notification.favourite.name_and_others_with_link": "{name} y <a>{count, plural, one {# cuenta más} other {# cuentas más}}</a> marcaron tu mensaje como favorito",
|
||||||
"notification.follow": "{name} te empezó a seguir",
|
"notification.follow": "{name} te empezó a seguir",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "¡Ups!",
|
"alert.unexpected.title": "¡Ups!",
|
||||||
"alt_text_badge.title": "Texto alternativo",
|
"alt_text_badge.title": "Texto alternativo",
|
||||||
"announcement.announcement": "Anuncio",
|
"announcement.announcement": "Anuncio",
|
||||||
|
"annual_report.summary.archetype.booster": "El cazador de tendencias",
|
||||||
|
"annual_report.summary.archetype.lurker": "El acechador",
|
||||||
|
"annual_report.summary.archetype.oracle": "El oráculo",
|
||||||
|
"annual_report.summary.archetype.pollster": "El encuestador",
|
||||||
|
"annual_report.summary.archetype.replier": "El más sociable",
|
||||||
|
"annual_report.summary.followers.followers": "seguidores",
|
||||||
|
"annual_report.summary.followers.total": "{count} en total",
|
||||||
|
"annual_report.summary.here_it_is": "Aquí está tu resumen de {year}:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "publicación con más favoritos",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "publicación más impulsada",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "publicación con más respuestas",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "de {name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "aplicación más usada",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "etiqueta más usada",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "nuevas publicaciones",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Eso te pone en el top</topLabel><percentage></percentage><bottomLabel>de usuarios de Mastodon.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "No se lo diremos a Bernie.",
|
||||||
|
"annual_report.summary.thanks": "¡Gracias por ser parte de Mastodon!",
|
||||||
"attachments_list.unprocessed": "(sin procesar)",
|
"attachments_list.unprocessed": "(sin procesar)",
|
||||||
"audio.hide": "Ocultar audio",
|
"audio.hide": "Ocultar audio",
|
||||||
"block_modal.remote_users_caveat": "Le pediremos al servidor {domain} que respete tu decisión. Sin embargo, el cumplimiento no está garantizado ya que algunos servidores pueden manejar bloques de forma diferente. Las publicaciones públicas pueden ser todavía visibles para los usuarios no conectados.",
|
"block_modal.remote_users_caveat": "Le pediremos al servidor {domain} que respete tu decisión. Sin embargo, el cumplimiento no está garantizado ya que algunos servidores pueden manejar bloques de forma diferente. Las publicaciones públicas pueden ser todavía visibles para los usuarios no conectados.",
|
||||||
|
@ -508,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} reportó {target}",
|
"notification.admin.report_statuses_other": "{name} reportó {target}",
|
||||||
"notification.admin.sign_up": "{name} se unio",
|
"notification.admin.sign_up": "{name} se unio",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} y {count, plural, one {# otro} other {# otros}} se registraron",
|
"notification.admin.sign_up.name_and_others": "{name} y {count, plural, one {# otro} other {# otros}} se registraron",
|
||||||
|
"notification.annual_report.message": "¡Tu #Wrapstodon {year} te espera! ¡Desvela los momentos más destacados y memorables de tu año en Mastodon!",
|
||||||
|
"notification.annual_report.view": "Ver #Wrapstodon",
|
||||||
"notification.favourite": "{name} marcó como favorita tu publicación",
|
"notification.favourite": "{name} marcó como favorita tu publicación",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} y <a>{count, plural, one {# otro} other {# otros}}</a> marcaron tu publicación como favorita",
|
"notification.favourite.name_and_others_with_link": "{name} y <a>{count, plural, one {# otro} other {# otros}}</a> marcaron tu publicación como favorita",
|
||||||
"notification.follow": "{name} te empezó a seguir",
|
"notification.follow": "{name} te empezó a seguir",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "¡Ups!",
|
"alert.unexpected.title": "¡Ups!",
|
||||||
"alt_text_badge.title": "Texto alternativo",
|
"alt_text_badge.title": "Texto alternativo",
|
||||||
"announcement.announcement": "Anuncio",
|
"announcement.announcement": "Anuncio",
|
||||||
|
"annual_report.summary.archetype.booster": "El cazador de tendencias",
|
||||||
|
"annual_report.summary.archetype.lurker": "El acechador",
|
||||||
|
"annual_report.summary.archetype.oracle": "El oráculo",
|
||||||
|
"annual_report.summary.archetype.pollster": "El encuestador",
|
||||||
|
"annual_report.summary.archetype.replier": "El más sociable",
|
||||||
|
"annual_report.summary.followers.followers": "seguidores",
|
||||||
|
"annual_report.summary.followers.total": "{count} en total",
|
||||||
|
"annual_report.summary.here_it_is": "Aquí está tu resumen de {year}:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "publicación con más favoritos",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "publicación más impulsada",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "publicación con más respuestas",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "de {name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "aplicación más usada",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "etiqueta más usada",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "nuevas publicaciones",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Eso te pone en el top</topLabel><percentage></percentage><bottomLabel>de usuarios de Mastodon.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "No se lo diremos a Bernie.",
|
||||||
|
"annual_report.summary.thanks": "¡Gracias por ser parte de Mastodon!",
|
||||||
"attachments_list.unprocessed": "(sin procesar)",
|
"attachments_list.unprocessed": "(sin procesar)",
|
||||||
"audio.hide": "Ocultar audio",
|
"audio.hide": "Ocultar audio",
|
||||||
"block_modal.remote_users_caveat": "Le pediremos al servidor {domain} que respete tu decisión. Sin embargo, el cumplimiento no está garantizado, ya que algunos servidores pueden manejar bloqueos de forma distinta. Los mensajes públicos pueden ser todavía visibles para los usuarios que no hayan iniciado sesión.",
|
"block_modal.remote_users_caveat": "Le pediremos al servidor {domain} que respete tu decisión. Sin embargo, el cumplimiento no está garantizado, ya que algunos servidores pueden manejar bloqueos de forma distinta. Los mensajes públicos pueden ser todavía visibles para los usuarios que no hayan iniciado sesión.",
|
||||||
|
@ -508,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} informó de {target}",
|
"notification.admin.report_statuses_other": "{name} informó de {target}",
|
||||||
"notification.admin.sign_up": "{name} se registró",
|
"notification.admin.sign_up": "{name} se registró",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} y {count, plural, one {# más} other {# más}} se registraron",
|
"notification.admin.sign_up.name_and_others": "{name} y {count, plural, one {# más} other {# más}} se registraron",
|
||||||
|
"notification.annual_report.message": "¡Tu #Wrapstodon {year} te espera! ¡Desvela los momentos más destacados y memorables de tu año en Mastodon!",
|
||||||
|
"notification.annual_report.view": "Ver #Wrapstodon",
|
||||||
"notification.favourite": "{name} marcó como favorita tu publicación",
|
"notification.favourite": "{name} marcó como favorita tu publicación",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} y <a>{count, plural, one {# más} other {# más}}</a> marcaron tu publicación como favorita",
|
"notification.favourite.name_and_others_with_link": "{name} y <a>{count, plural, one {# más} other {# más}}</a> marcaron tu publicación como favorita",
|
||||||
"notification.follow": "{name} te empezó a seguir",
|
"notification.follow": "{name} te empezó a seguir",
|
||||||
|
|
|
@ -87,6 +87,11 @@
|
||||||
"alert.unexpected.title": "Hups!",
|
"alert.unexpected.title": "Hups!",
|
||||||
"alt_text_badge.title": "Vaihtoehtoinen teksti",
|
"alt_text_badge.title": "Vaihtoehtoinen teksti",
|
||||||
"announcement.announcement": "Tiedote",
|
"announcement.announcement": "Tiedote",
|
||||||
|
"annual_report.summary.archetype.replier": "Sosiaalinen perhonen",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "tehostetuin julkaisu",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "käytetyin sovellus",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "käytetyin aihetunniste",
|
||||||
|
"annual_report.summary.thanks": "Kiitos, että olet osa Mastodonia!",
|
||||||
"attachments_list.unprocessed": "(käsittelemätön)",
|
"attachments_list.unprocessed": "(käsittelemätön)",
|
||||||
"audio.hide": "Piilota ääni",
|
"audio.hide": "Piilota ääni",
|
||||||
"block_modal.remote_users_caveat": "Pyydämme palvelinta {domain} kunnioittamaan päätöstäsi. Myötämielisyyttä ei kuitenkaan taata, koska jotkin palvelimet voivat käsitellä estoja eri tavalla. Julkiset julkaisut voivat silti näkyä kirjautumattomille käyttäjille.",
|
"block_modal.remote_users_caveat": "Pyydämme palvelinta {domain} kunnioittamaan päätöstäsi. Myötämielisyyttä ei kuitenkaan taata, koska jotkin palvelimet voivat käsitellä estoja eri tavalla. Julkiset julkaisut voivat silti näkyä kirjautumattomille käyttäjille.",
|
||||||
|
@ -158,7 +163,7 @@
|
||||||
"compose_form.poll.duration": "Äänestyksen kesto",
|
"compose_form.poll.duration": "Äänestyksen kesto",
|
||||||
"compose_form.poll.multiple": "Monivalinta",
|
"compose_form.poll.multiple": "Monivalinta",
|
||||||
"compose_form.poll.option_placeholder": "Vaihtoehto {number}",
|
"compose_form.poll.option_placeholder": "Vaihtoehto {number}",
|
||||||
"compose_form.poll.single": "Yksi vaihtoehto",
|
"compose_form.poll.single": "Yksittäisvalinta",
|
||||||
"compose_form.poll.switch_to_multiple": "Muuta äänestys monivalinnaksi",
|
"compose_form.poll.switch_to_multiple": "Muuta äänestys monivalinnaksi",
|
||||||
"compose_form.poll.switch_to_single": "Muuta äänestys yksittäisvalinnaksi",
|
"compose_form.poll.switch_to_single": "Muuta äänestys yksittäisvalinnaksi",
|
||||||
"compose_form.poll.type": "Tyyli",
|
"compose_form.poll.type": "Tyyli",
|
||||||
|
@ -386,7 +391,7 @@
|
||||||
"interaction_modal.description.follow": "Mastodon-tilillä voit seurata käyttäjää {name} saadaksesi hänen julkaisunsa kotisyötteeseesi.",
|
"interaction_modal.description.follow": "Mastodon-tilillä voit seurata käyttäjää {name} saadaksesi hänen julkaisunsa kotisyötteeseesi.",
|
||||||
"interaction_modal.description.reblog": "Mastodon-tilillä voit tehostaa tätä julkaisua jakaaksesi sen seuraajiesi kanssa.",
|
"interaction_modal.description.reblog": "Mastodon-tilillä voit tehostaa tätä julkaisua jakaaksesi sen seuraajiesi kanssa.",
|
||||||
"interaction_modal.description.reply": "Mastodon-tilillä voit vastata tähän julkaisuun.",
|
"interaction_modal.description.reply": "Mastodon-tilillä voit vastata tähän julkaisuun.",
|
||||||
"interaction_modal.description.vote": "Osallistuminen äänestykseen onnistuu Mastodon-tilillä.",
|
"interaction_modal.description.vote": "Mastodon-tilillä voit osallistua tähän äänestykseen.",
|
||||||
"interaction_modal.login.action": "Siirry kotiin",
|
"interaction_modal.login.action": "Siirry kotiin",
|
||||||
"interaction_modal.login.prompt": "Kotipalvelimesi verkkotunnus, kuten mastodon.social",
|
"interaction_modal.login.prompt": "Kotipalvelimesi verkkotunnus, kuten mastodon.social",
|
||||||
"interaction_modal.no_account_yet": "Etkö ole vielä Mastodonissa?",
|
"interaction_modal.no_account_yet": "Etkö ole vielä Mastodonissa?",
|
||||||
|
@ -508,6 +513,7 @@
|
||||||
"notification.admin.report_statuses_other": "{name} raportoi käyttäjän {target}",
|
"notification.admin.report_statuses_other": "{name} raportoi käyttäjän {target}",
|
||||||
"notification.admin.sign_up": "{name} rekisteröityi",
|
"notification.admin.sign_up": "{name} rekisteröityi",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} ja {count, plural, one {# muu} other {# muuta}} rekisteröityivät",
|
"notification.admin.sign_up.name_and_others": "{name} ja {count, plural, one {# muu} other {# muuta}} rekisteröityivät",
|
||||||
|
"notification.annual_report.view": "Näytä #Wrapstodon",
|
||||||
"notification.favourite": "{name} lisäsi julkaisusi suosikkeihinsa",
|
"notification.favourite": "{name} lisäsi julkaisusi suosikkeihinsa",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} ja <a>{count, plural, one {# muu} other {# muuta}}</a> lisäsivät julkaisusi suosikkeihinsa",
|
"notification.favourite.name_and_others_with_link": "{name} ja <a>{count, plural, one {# muu} other {# muuta}}</a> lisäsivät julkaisusi suosikkeihinsa",
|
||||||
"notification.follow": "{name} seurasi sinua",
|
"notification.follow": "{name} seurasi sinua",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "Ups!",
|
"alert.unexpected.title": "Ups!",
|
||||||
"alt_text_badge.title": "Annar tekstur",
|
"alt_text_badge.title": "Annar tekstur",
|
||||||
"announcement.announcement": "Kunngerð",
|
"announcement.announcement": "Kunngerð",
|
||||||
|
"annual_report.summary.archetype.booster": "Kuli jagarin",
|
||||||
|
"annual_report.summary.archetype.lurker": "Lúrarin",
|
||||||
|
"annual_report.summary.archetype.oracle": "Oraklið",
|
||||||
|
"annual_report.summary.archetype.pollster": "Spyrjarin",
|
||||||
|
"annual_report.summary.archetype.replier": "Sosiali firvaldurin",
|
||||||
|
"annual_report.summary.followers.followers": "fylgjarar",
|
||||||
|
"annual_report.summary.followers.total": "{count} íalt",
|
||||||
|
"annual_report.summary.here_it_is": "Her er ein samandráttur av {year}:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "mest dámdi postur",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "oftast lyfti postur",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "postur við flestum svarum",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "hjá {name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "mest brúkta app",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "mest brúkta frámerki",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "nýggir postar",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Tað fær teg í topp</topLabel><percentage></percentage><bottomLabel>av Mastodon brúkarum.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Vit fara ikki at fortelja Bernie tað.",
|
||||||
|
"annual_report.summary.thanks": "Takk fyri at tú er partur av Mastodon!",
|
||||||
"attachments_list.unprocessed": "(óviðgjørt)",
|
"attachments_list.unprocessed": "(óviðgjørt)",
|
||||||
"audio.hide": "Fjal ljóð",
|
"audio.hide": "Fjal ljóð",
|
||||||
"block_modal.remote_users_caveat": "Vit biðja ambætaran {domain} virða tína avgerð. Kortini er eingin vissa um samsvar, av tí at fleiri ambætarar handfara blokkar ymiskt. Almennir postar kunnu framvegis vera sjónligir fyri brúkarar, sum ikki eru innritaðir.",
|
"block_modal.remote_users_caveat": "Vit biðja ambætaran {domain} virða tína avgerð. Kortini er eingin vissa um samsvar, av tí at fleiri ambætarar handfara blokkar ymiskt. Almennir postar kunnu framvegis vera sjónligir fyri brúkarar, sum ikki eru innritaðir.",
|
||||||
|
@ -508,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} meldaði {target}",
|
"notification.admin.report_statuses_other": "{name} meldaði {target}",
|
||||||
"notification.admin.sign_up": "{name} meldaði seg til",
|
"notification.admin.sign_up": "{name} meldaði seg til",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# annar/onnur} other {# onnur}} teknaðu seg",
|
"notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# annar/onnur} other {# onnur}} teknaðu seg",
|
||||||
|
"notification.annual_report.message": "Títt {year} #Wrapstodon bíðar! Avdúka hæddarpunktini og minniligu løturnar á Mastodon!",
|
||||||
|
"notification.annual_report.view": "Sí #Wrapstodon",
|
||||||
"notification.favourite": "{name} dámdi postin hjá tær",
|
"notification.favourite": "{name} dámdi postin hjá tær",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} og <a>{count, plural, one {# annar/onnur} other {# onnur}}</a> yndisfrámerktu postin hjá tær",
|
"notification.favourite.name_and_others_with_link": "{name} og <a>{count, plural, one {# annar/onnur} other {# onnur}}</a> yndisfrámerktu postin hjá tær",
|
||||||
"notification.follow": "{name} fylgdi tær",
|
"notification.follow": "{name} fylgdi tær",
|
||||||
|
|
|
@ -158,6 +158,7 @@
|
||||||
"compose_form.poll.duration": "Doer fan de enkête",
|
"compose_form.poll.duration": "Doer fan de enkête",
|
||||||
"compose_form.poll.multiple": "Mearkar",
|
"compose_form.poll.multiple": "Mearkar",
|
||||||
"compose_form.poll.option_placeholder": "Opsje {number}",
|
"compose_form.poll.option_placeholder": "Opsje {number}",
|
||||||
|
"compose_form.poll.single": "Inkelde kar",
|
||||||
"compose_form.poll.switch_to_multiple": "Enkête wizigje om meardere karren ta te stean",
|
"compose_form.poll.switch_to_multiple": "Enkête wizigje om meardere karren ta te stean",
|
||||||
"compose_form.poll.switch_to_single": "Enkête wizigje om in inkelde kar ta te stean",
|
"compose_form.poll.switch_to_single": "Enkête wizigje om in inkelde kar ta te stean",
|
||||||
"compose_form.poll.type": "Styl",
|
"compose_form.poll.type": "Styl",
|
||||||
|
@ -196,6 +197,7 @@
|
||||||
"confirmations.unfollow.title": "Brûker net mear folgje?",
|
"confirmations.unfollow.title": "Brûker net mear folgje?",
|
||||||
"content_warning.hide": "Berjocht ferstopje",
|
"content_warning.hide": "Berjocht ferstopje",
|
||||||
"content_warning.show": "Dochs toane",
|
"content_warning.show": "Dochs toane",
|
||||||
|
"content_warning.show_more": "Mear toane",
|
||||||
"conversation.delete": "Petear fuortsmite",
|
"conversation.delete": "Petear fuortsmite",
|
||||||
"conversation.mark_as_read": "As lêzen markearje",
|
"conversation.mark_as_read": "As lêzen markearje",
|
||||||
"conversation.open": "Petear toane",
|
"conversation.open": "Petear toane",
|
||||||
|
@ -304,6 +306,7 @@
|
||||||
"filter_modal.select_filter.subtitle": "In besteande kategory brûke of in nije oanmeitsje",
|
"filter_modal.select_filter.subtitle": "In besteande kategory brûke of in nije oanmeitsje",
|
||||||
"filter_modal.select_filter.title": "Dit berjocht filterje",
|
"filter_modal.select_filter.title": "Dit berjocht filterje",
|
||||||
"filter_modal.title.status": "In berjocht filterje",
|
"filter_modal.title.status": "In berjocht filterje",
|
||||||
|
"filter_warning.matches_filter": "Komt oerien mei filter ‘<span>{title}</span>’",
|
||||||
"filtered_notifications_banner.pending_requests": "Fan {count, plural, =0 {net ien} one {ien persoan} other {# persoanen}} dy’t jo mooglik kinne",
|
"filtered_notifications_banner.pending_requests": "Fan {count, plural, =0 {net ien} one {ien persoan} other {# persoanen}} dy’t jo mooglik kinne",
|
||||||
"filtered_notifications_banner.title": "Filtere meldingen",
|
"filtered_notifications_banner.title": "Filtere meldingen",
|
||||||
"firehose.all": "Alles",
|
"firehose.all": "Alles",
|
||||||
|
@ -383,6 +386,7 @@
|
||||||
"interaction_modal.description.follow": "Jo kinne mei in Mastodon-account {name} folgje, om sa harren berjochten op jo starttiidline te ûntfangen.",
|
"interaction_modal.description.follow": "Jo kinne mei in Mastodon-account {name} folgje, om sa harren berjochten op jo starttiidline te ûntfangen.",
|
||||||
"interaction_modal.description.reblog": "Jo kinne mei in Mastodon-account dit berjocht booste, om it sa mei jo folgers te dielen.",
|
"interaction_modal.description.reblog": "Jo kinne mei in Mastodon-account dit berjocht booste, om it sa mei jo folgers te dielen.",
|
||||||
"interaction_modal.description.reply": "Jo kinne mei in Mastodon-account op dit berjocht reagearje.",
|
"interaction_modal.description.reply": "Jo kinne mei in Mastodon-account op dit berjocht reagearje.",
|
||||||
|
"interaction_modal.description.vote": "Mei in Mastodon-account kinne jo yn dizze enkête stimme.",
|
||||||
"interaction_modal.login.action": "Gean nei start",
|
"interaction_modal.login.action": "Gean nei start",
|
||||||
"interaction_modal.login.prompt": "Domein fan jo server, byg. mastodon.social",
|
"interaction_modal.login.prompt": "Domein fan jo server, byg. mastodon.social",
|
||||||
"interaction_modal.no_account_yet": "Net op Mastodon?",
|
"interaction_modal.no_account_yet": "Net op Mastodon?",
|
||||||
|
@ -394,6 +398,7 @@
|
||||||
"interaction_modal.title.follow": "{name} folgje",
|
"interaction_modal.title.follow": "{name} folgje",
|
||||||
"interaction_modal.title.reblog": "Berjocht fan {name} booste",
|
"interaction_modal.title.reblog": "Berjocht fan {name} booste",
|
||||||
"interaction_modal.title.reply": "Op it berjocht fan {name} reagearje",
|
"interaction_modal.title.reply": "Op it berjocht fan {name} reagearje",
|
||||||
|
"interaction_modal.title.vote": "Stimme yn {name}’s peiling",
|
||||||
"intervals.full.days": "{number, plural, one {# dei} other {# dagen}} lyn",
|
"intervals.full.days": "{number, plural, one {# dei} other {# dagen}} lyn",
|
||||||
"intervals.full.hours": "{number, plural, one {# oere} other {# oeren}} lyn",
|
"intervals.full.hours": "{number, plural, one {# oere} other {# oeren}} lyn",
|
||||||
"intervals.full.minutes": "{number, plural, one {# minút} other {# minuten}} lyn",
|
"intervals.full.minutes": "{number, plural, one {# minút} other {# minuten}} lyn",
|
||||||
|
@ -506,6 +511,7 @@
|
||||||
"notification.favourite": "{name} hat jo berjocht as favoryt markearre",
|
"notification.favourite": "{name} hat jo berjocht as favoryt markearre",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} en <a>{count, plural, one {# oar} other {# oaren}}</a> hawwe jo berjocht as favoryt markearre",
|
"notification.favourite.name_and_others_with_link": "{name} en <a>{count, plural, one {# oar} other {# oaren}}</a> hawwe jo berjocht as favoryt markearre",
|
||||||
"notification.follow": "{name} folget dy",
|
"notification.follow": "{name} folget dy",
|
||||||
|
"notification.follow.name_and_others": "{name} en <a>{count, plural, one {# oar persoan} other {# oare persoanen}}</a> folgje jo no",
|
||||||
"notification.follow_request": "{name} hat dy in folchfersyk stjoerd",
|
"notification.follow_request": "{name} hat dy in folchfersyk stjoerd",
|
||||||
"notification.follow_request.name_and_others": "{name} en {count, plural, one {# oar} other {# oaren}} hawwe frege om jo te folgjen",
|
"notification.follow_request.name_and_others": "{name} en {count, plural, one {# oar} other {# oaren}} hawwe frege om jo te folgjen",
|
||||||
"notification.label.mention": "Fermelding",
|
"notification.label.mention": "Fermelding",
|
||||||
|
@ -564,6 +570,7 @@
|
||||||
"notifications.column_settings.filter_bar.category": "Flugge filterbalke",
|
"notifications.column_settings.filter_bar.category": "Flugge filterbalke",
|
||||||
"notifications.column_settings.follow": "Nije folgers:",
|
"notifications.column_settings.follow": "Nije folgers:",
|
||||||
"notifications.column_settings.follow_request": "Nij folchfersyk:",
|
"notifications.column_settings.follow_request": "Nij folchfersyk:",
|
||||||
|
"notifications.column_settings.group": "Groepearje",
|
||||||
"notifications.column_settings.mention": "Fermeldingen:",
|
"notifications.column_settings.mention": "Fermeldingen:",
|
||||||
"notifications.column_settings.poll": "Enkêteresultaten:",
|
"notifications.column_settings.poll": "Enkêteresultaten:",
|
||||||
"notifications.column_settings.push": "Pushmeldingen",
|
"notifications.column_settings.push": "Pushmeldingen",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "Hiúps!",
|
"alert.unexpected.title": "Hiúps!",
|
||||||
"alt_text_badge.title": "Téacs alt",
|
"alt_text_badge.title": "Téacs alt",
|
||||||
"announcement.announcement": "Fógra",
|
"announcement.announcement": "Fógra",
|
||||||
|
"annual_report.summary.archetype.booster": "An sealgair fionnuar",
|
||||||
|
"annual_report.summary.archetype.lurker": "An lurker",
|
||||||
|
"annual_report.summary.archetype.oracle": "An oracal",
|
||||||
|
"annual_report.summary.archetype.pollster": "An pollaire",
|
||||||
|
"annual_report.summary.archetype.replier": "An féileacán sóisialta",
|
||||||
|
"annual_report.summary.followers.followers": "leanúna",
|
||||||
|
"annual_report.summary.followers.total": "{count} san iomlán",
|
||||||
|
"annual_report.summary.here_it_is": "Seo do {year} faoi athbhreithniú:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "post is fearr leat",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "post is treisithe",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "post leis an líon is mó freagraí",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}'s",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "aip is mó a úsáidtear",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "hashtag is mó a úsáidtear",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "postanna nua",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Cuireann sé sin i mbarr</topLabel><percentage></percentage><bottomLabel> úsáideoirí Mastodon.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Ní inseoidh muid do Bernie.",
|
||||||
|
"annual_report.summary.thanks": "Go raibh maith agat as a bheith mar chuid de Mastodon!",
|
||||||
"attachments_list.unprocessed": "(neamhphróiseáilte)",
|
"attachments_list.unprocessed": "(neamhphróiseáilte)",
|
||||||
"audio.hide": "Cuir fuaim i bhfolach",
|
"audio.hide": "Cuir fuaim i bhfolach",
|
||||||
"block_modal.remote_users_caveat": "Iarrfaimid ar an bhfreastalaí {domain} meas a bheith agat ar do chinneadh. Mar sin féin, ní ráthaítear comhlíonadh toisc go bhféadfadh roinnt freastalaithe bloic a láimhseáil ar bhealach difriúil. Seans go mbeidh postálacha poiblí fós le feiceáil ag úsáideoirí nach bhfuil logáilte isteach.",
|
"block_modal.remote_users_caveat": "Iarrfaimid ar an bhfreastalaí {domain} meas a bheith agat ar do chinneadh. Mar sin féin, ní ráthaítear comhlíonadh toisc go bhféadfadh roinnt freastalaithe bloic a láimhseáil ar bhealach difriúil. Seans go mbeidh postálacha poiblí fós le feiceáil ag úsáideoirí nach bhfuil logáilte isteach.",
|
||||||
|
@ -386,6 +404,7 @@
|
||||||
"interaction_modal.description.follow": "Le cuntas ar Mastodon, is féidir leat {name} a leanúint chun a gcuid postálacha a fháil i do fhotha baile.",
|
"interaction_modal.description.follow": "Le cuntas ar Mastodon, is féidir leat {name} a leanúint chun a gcuid postálacha a fháil i do fhotha baile.",
|
||||||
"interaction_modal.description.reblog": "Le cuntas ar Mastodon, is féidir leat an postáil seo a threisiú chun é a roinnt le do leantóirí féin.",
|
"interaction_modal.description.reblog": "Le cuntas ar Mastodon, is féidir leat an postáil seo a threisiú chun é a roinnt le do leantóirí féin.",
|
||||||
"interaction_modal.description.reply": "Le cuntas ar Mastodon, is féidir leat freagra a thabhairt ar an bpostáil seo.",
|
"interaction_modal.description.reply": "Le cuntas ar Mastodon, is féidir leat freagra a thabhairt ar an bpostáil seo.",
|
||||||
|
"interaction_modal.description.vote": "Le cuntas ar Mastodon, is féidir leat vótáil sa vótaíocht seo.",
|
||||||
"interaction_modal.login.action": "Thabhairt dom abhaile",
|
"interaction_modal.login.action": "Thabhairt dom abhaile",
|
||||||
"interaction_modal.login.prompt": "Fearann do fhreastalaí baile, e.g. mastodon.sóisialta",
|
"interaction_modal.login.prompt": "Fearann do fhreastalaí baile, e.g. mastodon.sóisialta",
|
||||||
"interaction_modal.no_account_yet": "Ní ar Mastodon?",
|
"interaction_modal.no_account_yet": "Ní ar Mastodon?",
|
||||||
|
@ -397,6 +416,7 @@
|
||||||
"interaction_modal.title.follow": "Lean {name}",
|
"interaction_modal.title.follow": "Lean {name}",
|
||||||
"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}",
|
||||||
"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}}",
|
||||||
|
@ -506,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} tuairiscithe {target}",
|
"notification.admin.report_statuses_other": "{name} tuairiscithe {target}",
|
||||||
"notification.admin.sign_up": "Chláraigh {name}",
|
"notification.admin.sign_up": "Chláraigh {name}",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} agus {count, plural, one {# duine eile} two {# daoine eile} few {# daoine eile} many {# daoine eile} other {# daoine eile}} a chláraigh",
|
"notification.admin.sign_up.name_and_others": "{name} agus {count, plural, one {# duine eile} two {# daoine eile} few {# daoine eile} many {# daoine eile} other {# daoine eile}} a chláraigh",
|
||||||
|
"notification.annual_report.message": "Tá do {year} #Wrapstodon ag fanacht! Nocht buaicphointí na bliana agus chuimhneacháin i gcuimhne ar Mastodon!",
|
||||||
|
"notification.annual_report.view": "Amharc #Wrapstodon",
|
||||||
"notification.favourite": "Is fearr le {name} do phostáil",
|
"notification.favourite": "Is fearr le {name} do phostáil",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} agus <a>{count, plural, one {# duine eile} other {# daoine eile}}</a> thaitin le do phost",
|
"notification.favourite.name_and_others_with_link": "{name} agus <a>{count, plural, one {# duine eile} other {# daoine eile}}</a> thaitin le do phost",
|
||||||
"notification.follow": "Lean {name} thú",
|
"notification.follow": "Lean {name} thú",
|
||||||
|
|
|
@ -87,6 +87,18 @@
|
||||||
"alert.unexpected.title": "Vaites!",
|
"alert.unexpected.title": "Vaites!",
|
||||||
"alt_text_badge.title": "Texto Alt",
|
"alt_text_badge.title": "Texto Alt",
|
||||||
"announcement.announcement": "Anuncio",
|
"announcement.announcement": "Anuncio",
|
||||||
|
"annual_report.summary.followers.followers": "seguidoras",
|
||||||
|
"annual_report.summary.followers.total": "{count} en total",
|
||||||
|
"annual_report.summary.here_it_is": "Este é o resumo do teu {year}:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "a publicación mais favorecida",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "a publicación con mais promocións",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "a publicación con mais respostas",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "de {name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "app que mais usaches",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "o cancelo mais utilizado",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "novas publicacións",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Sitúante no top</topLabel><percentage></percentage><bottomLabel> das usuarias de Mastodon.</bottomLabel>",
|
||||||
|
"annual_report.summary.thanks": "Grazas por ser parte de Mastodon!",
|
||||||
"attachments_list.unprocessed": "(sen procesar)",
|
"attachments_list.unprocessed": "(sen procesar)",
|
||||||
"audio.hide": "Agochar audio",
|
"audio.hide": "Agochar audio",
|
||||||
"block_modal.remote_users_caveat": "Ímoslle pedir ao servidor {domain} que respecte a túa decisión. Emporiso, non hai garantía de que atenda a petición xa que os servidores xestionan os bloqueos de formas diferentes. As publicacións públicas poderían aínda ser visibles para usuarias que non iniciaron sesión.",
|
"block_modal.remote_users_caveat": "Ímoslle pedir ao servidor {domain} que respecte a túa decisión. Emporiso, non hai garantía de que atenda a petición xa que os servidores xestionan os bloqueos de formas diferentes. As publicacións públicas poderían aínda ser visibles para usuarias que non iniciaron sesión.",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "Úbbs!",
|
"alert.unexpected.title": "Úbbs!",
|
||||||
"alt_text_badge.title": "Hjálpartexti mynda",
|
"alt_text_badge.title": "Hjálpartexti mynda",
|
||||||
"announcement.announcement": "Auglýsing",
|
"announcement.announcement": "Auglýsing",
|
||||||
|
"annual_report.summary.archetype.booster": "Svali gaurinn",
|
||||||
|
"annual_report.summary.archetype.lurker": "Lurkurinn",
|
||||||
|
"annual_report.summary.archetype.oracle": "Völvan",
|
||||||
|
"annual_report.summary.archetype.pollster": "Kannanafíkillinn",
|
||||||
|
"annual_report.summary.archetype.replier": "Félagsveran",
|
||||||
|
"annual_report.summary.followers.followers": "fylgjendur",
|
||||||
|
"annual_report.summary.followers.total": "{count} alls",
|
||||||
|
"annual_report.summary.here_it_is": "Hér er yfirlitið þitt fyrir {year}:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "færsla sett oftast í eftirlæti",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "færsla oftast endurbirt",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "færsla með flestum svörum",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "mest notaða forrit",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "mest notaða myllumerki",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "nýjar færslur",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Það setur þig á meðal efstu</topLabel><percentage></percentage><bottomLabel>notenda Mastodon.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Við förum ekkert að raupa um þetta.",
|
||||||
|
"annual_report.summary.thanks": "Takk fyrir að vera hluti af Mastodon-samfélaginu!",
|
||||||
"attachments_list.unprocessed": "(óunnið)",
|
"attachments_list.unprocessed": "(óunnið)",
|
||||||
"audio.hide": "Fela hljóð",
|
"audio.hide": "Fela hljóð",
|
||||||
"block_modal.remote_users_caveat": "Við munum biðja {domain} netþjóninn um að virða ákvörðun þína. Hitt er svo annað mál hvort hann fari eftir þessu, ekki er hægt að tryggja eftirfylgni því sumir netþjónar meðhöndla útilokanir á sinn hátt. Opinberar færslur gætu verið sýnilegar notendum sem ekki eru skráðir inn.",
|
"block_modal.remote_users_caveat": "Við munum biðja {domain} netþjóninn um að virða ákvörðun þína. Hitt er svo annað mál hvort hann fari eftir þessu, ekki er hægt að tryggja eftirfylgni því sumir netþjónar meðhöndla útilokanir á sinn hátt. Opinberar færslur gætu verið sýnilegar notendum sem ekki eru skráðir inn.",
|
||||||
|
@ -508,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} kærði {target}",
|
"notification.admin.report_statuses_other": "{name} kærði {target}",
|
||||||
"notification.admin.sign_up": "{name} skráði sig",
|
"notification.admin.sign_up": "{name} skráði sig",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# í viðbót hefur} other {# í viðbót hafa}} skráð sig",
|
"notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# í viðbót hefur} other {# í viðbót hafa}} skráð sig",
|
||||||
|
"notification.annual_report.message": "{year} á #Wrapstodon bíður! Afhjúpaðu hvað bar hæst á árinu og minnistæðustu augnablikin á Mastodon!",
|
||||||
|
"notification.annual_report.view": "Skoða #Wrapstodon",
|
||||||
"notification.favourite": "{name} setti færsluna þína í eftirlæti",
|
"notification.favourite": "{name} setti færsluna þína í eftirlæti",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} og <a>{count, plural, one {# í viðbót hefur} other {# í viðbót hafa}}</a> sett færsluna þína í eftirlæti",
|
"notification.favourite.name_and_others_with_link": "{name} og <a>{count, plural, one {# í viðbót hefur} other {# í viðbót hafa}}</a> sett færsluna þína í eftirlæti",
|
||||||
"notification.follow": "{name} fylgist með þér",
|
"notification.follow": "{name} fylgist með þér",
|
||||||
|
|
|
@ -87,6 +87,19 @@
|
||||||
"alert.unexpected.title": "Oops!",
|
"alert.unexpected.title": "Oops!",
|
||||||
"alt_text_badge.title": "Testo alternativo",
|
"alt_text_badge.title": "Testo alternativo",
|
||||||
"announcement.announcement": "Annuncio",
|
"announcement.announcement": "Annuncio",
|
||||||
|
"annual_report.summary.archetype.oracle": "L'oracolo",
|
||||||
|
"annual_report.summary.followers.followers": "seguaci",
|
||||||
|
"annual_report.summary.followers.total": "{count} in totale",
|
||||||
|
"annual_report.summary.here_it_is": "Ecco il tuo {year} in sintesi:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "il post più apprezzato",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "il post più condiviso",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "il post con più risposte",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "di {name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "l'app più utilizzata",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "l'hashtag più usato",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "nuovi post",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Questo ti colloca tra il</topLabel><percentage></percentage><bottomLabel>dei migliori utenti Mastodon.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Non lo diremo a Bernie.",
|
||||||
"attachments_list.unprocessed": "(non elaborato)",
|
"attachments_list.unprocessed": "(non elaborato)",
|
||||||
"audio.hide": "Nascondi audio",
|
"audio.hide": "Nascondi audio",
|
||||||
"block_modal.remote_users_caveat": "Chiederemo al server {domain} di rispettare la tua decisione. Tuttavia, la conformità non è garantita poiché alcuni server potrebbero gestire i blocchi in modo diverso. I post pubblici potrebbero essere ancora visibili agli utenti che non hanno effettuato l'accesso.",
|
"block_modal.remote_users_caveat": "Chiederemo al server {domain} di rispettare la tua decisione. Tuttavia, la conformità non è garantita poiché alcuni server potrebbero gestire i blocchi in modo diverso. I post pubblici potrebbero essere ancora visibili agli utenti che non hanno effettuato l'accesso.",
|
||||||
|
@ -508,6 +521,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} ha segnalato {target}",
|
"notification.admin.report_statuses_other": "{name} ha segnalato {target}",
|
||||||
"notification.admin.sign_up": "{name} si è iscritto",
|
"notification.admin.sign_up": "{name} si è iscritto",
|
||||||
"notification.admin.sign_up.name_and_others": "Si sono iscritti: {name} e {count, plural, one {# altro utente} other {altri # utenti}}",
|
"notification.admin.sign_up.name_and_others": "Si sono iscritti: {name} e {count, plural, one {# altro utente} other {altri # utenti}}",
|
||||||
|
"notification.annual_report.message": "Il tuo #Wrapstodon {year} ti aspetta! Scopri i momenti salienti e memorabili del tuo anno su Mastodon!",
|
||||||
|
"notification.annual_report.view": "Visualizza #Wrapstodon",
|
||||||
"notification.favourite": "{name} ha aggiunto il tuo post ai preferiti",
|
"notification.favourite": "{name} ha aggiunto il tuo post ai preferiti",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} e <a>{count, plural, one {# altro} other {altri #}}</a> hanno aggiunto il tuo post ai preferiti",
|
"notification.favourite.name_and_others_with_link": "{name} e <a>{count, plural, one {# altro} other {altri #}}</a> hanno aggiunto il tuo post ai preferiti",
|
||||||
"notification.follow": "{name} ha iniziato a seguirti",
|
"notification.follow": "{name} ha iniziato a seguirti",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "앗!",
|
"alert.unexpected.title": "앗!",
|
||||||
"alt_text_badge.title": "대체 문구",
|
"alt_text_badge.title": "대체 문구",
|
||||||
"announcement.announcement": "공지사항",
|
"announcement.announcement": "공지사항",
|
||||||
|
"annual_report.summary.archetype.booster": "연쇄부스트마",
|
||||||
|
"annual_report.summary.archetype.lurker": "은둔자",
|
||||||
|
"annual_report.summary.archetype.oracle": "예언자",
|
||||||
|
"annual_report.summary.archetype.pollster": "여론조사원",
|
||||||
|
"annual_report.summary.archetype.replier": "인싸",
|
||||||
|
"annual_report.summary.followers.followers": "팔로워",
|
||||||
|
"annual_report.summary.followers.total": "총 {count}",
|
||||||
|
"annual_report.summary.here_it_is": "{year}년 결산입니다:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "가장 많은 좋아요를 받은 게시물",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "가장 많이 부스트된 게시물",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "가장 많은 답글을 받은 게시물",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name} 님의",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "가장 많이 사용한 앱",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "가장 많이 사용한 해시태그",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "새 게시물",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>마스토돈 사용자의 상위</topLabel><percentage></percentage><bottomLabel>입니다.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "엄마한테 말 안 할게요.",
|
||||||
|
"annual_report.summary.thanks": "마스토돈과 함께 해주셔서 감사합니다!",
|
||||||
"attachments_list.unprocessed": "(처리 안 됨)",
|
"attachments_list.unprocessed": "(처리 안 됨)",
|
||||||
"audio.hide": "소리 숨기기",
|
"audio.hide": "소리 숨기기",
|
||||||
"block_modal.remote_users_caveat": "우리는 {domain} 서버가 당신의 결정을 존중해 주길 부탁할 것입니다. 하지만 몇몇 서버는 차단을 다르게 취급할 수 있기 때문에 규정이 준수되는 것을 보장할 수는 없습니다. 공개 게시물은 로그인 하지 않은 사용자들에게 여전히 보여질 수 있습니다.",
|
"block_modal.remote_users_caveat": "우리는 {domain} 서버가 당신의 결정을 존중해 주길 부탁할 것입니다. 하지만 몇몇 서버는 차단을 다르게 취급할 수 있기 때문에 규정이 준수되는 것을 보장할 수는 없습니다. 공개 게시물은 로그인 하지 않은 사용자들에게 여전히 보여질 수 있습니다.",
|
||||||
|
@ -113,7 +131,7 @@
|
||||||
"bundle_modal_error.message": "컴포넌트를 불러오는 중 문제가 발생했습니다.",
|
"bundle_modal_error.message": "컴포넌트를 불러오는 중 문제가 발생했습니다.",
|
||||||
"bundle_modal_error.retry": "다시 시도",
|
"bundle_modal_error.retry": "다시 시도",
|
||||||
"closed_registrations.other_server_instructions": "마스토돈은 분산화 되어 있기 때문에, 다른 서버에서 계정을 만들더라도 이 서버와 상호작용 할 수 있습니다.",
|
"closed_registrations.other_server_instructions": "마스토돈은 분산화 되어 있기 때문에, 다른 서버에서 계정을 만들더라도 이 서버와 상호작용 할 수 있습니다.",
|
||||||
"closed_registrations_modal.description": "{domain}은 현재 가입이 막혀있는 상태입니다, 마스토돈을 이용하기 위해 꼭 {domain}을 사용할 필요는 없다는 사실을 인지해 두세요.",
|
"closed_registrations_modal.description": "{domain}은 현재 가입이 불가능합니다. 하지만 마스토돈을 이용하기 위해 꼭 {domain}을 사용할 필요는 없다는 사실을 인지해 두세요.",
|
||||||
"closed_registrations_modal.find_another_server": "다른 서버 찾기",
|
"closed_registrations_modal.find_another_server": "다른 서버 찾기",
|
||||||
"closed_registrations_modal.preamble": "마스토돈은 분산화 되어 있습니다, 그렇기 때문에 어디에서 계정을 생성하든, 이 서버에 있는 누구와도 팔로우와 상호작용을 할 수 있습니다. 심지어는 스스로 서버를 만드는 것도 가능합니다!",
|
"closed_registrations_modal.preamble": "마스토돈은 분산화 되어 있습니다, 그렇기 때문에 어디에서 계정을 생성하든, 이 서버에 있는 누구와도 팔로우와 상호작용을 할 수 있습니다. 심지어는 스스로 서버를 만드는 것도 가능합니다!",
|
||||||
"closed_registrations_modal.title": "마스토돈에서 가입",
|
"closed_registrations_modal.title": "마스토돈에서 가입",
|
||||||
|
@ -386,6 +404,7 @@
|
||||||
"interaction_modal.description.follow": "마스토돈 계정을 통해, {name} 님을 팔로우 하고 그의 게시물을 홈 피드에서 받아 볼 수 있습니다.",
|
"interaction_modal.description.follow": "마스토돈 계정을 통해, {name} 님을 팔로우 하고 그의 게시물을 홈 피드에서 받아 볼 수 있습니다.",
|
||||||
"interaction_modal.description.reblog": "마스토돈 계정을 통해, 이 게시물을 부스트 하고 자신의 팔로워들에게 공유할 수 있습니다.",
|
"interaction_modal.description.reblog": "마스토돈 계정을 통해, 이 게시물을 부스트 하고 자신의 팔로워들에게 공유할 수 있습니다.",
|
||||||
"interaction_modal.description.reply": "마스토돈 계정을 통해, 이 게시물에 응답할 수 있습니다.",
|
"interaction_modal.description.reply": "마스토돈 계정을 통해, 이 게시물에 응답할 수 있습니다.",
|
||||||
|
"interaction_modal.description.vote": "마스토돈 계정을 통해, 이 투표에 참여할 수 있습니다.",
|
||||||
"interaction_modal.login.action": "홈 서버로 가기",
|
"interaction_modal.login.action": "홈 서버로 가기",
|
||||||
"interaction_modal.login.prompt": "내 홈 서버의 도메인. 예시: mastodon.social",
|
"interaction_modal.login.prompt": "내 홈 서버의 도메인. 예시: mastodon.social",
|
||||||
"interaction_modal.no_account_yet": "Mastodon 계정이 없나요?",
|
"interaction_modal.no_account_yet": "Mastodon 계정이 없나요?",
|
||||||
|
@ -397,6 +416,7 @@
|
||||||
"interaction_modal.title.follow": "{name} 님을 팔로우",
|
"interaction_modal.title.follow": "{name} 님을 팔로우",
|
||||||
"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} 님의 투표에 참여",
|
||||||
"intervals.full.days": "{number} 일",
|
"intervals.full.days": "{number} 일",
|
||||||
"intervals.full.hours": "{number} 시간",
|
"intervals.full.hours": "{number} 시간",
|
||||||
"intervals.full.minutes": "{number} 분",
|
"intervals.full.minutes": "{number} 분",
|
||||||
|
@ -506,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} 님이 {target}을 신고했습니다",
|
"notification.admin.report_statuses_other": "{name} 님이 {target}을 신고했습니다",
|
||||||
"notification.admin.sign_up": "{name} 님이 가입했습니다",
|
"notification.admin.sign_up": "{name} 님이 가입했습니다",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} 외 {count, plural, other {# 명}}이 가입했습니다",
|
"notification.admin.sign_up.name_and_others": "{name} 외 {count, plural, other {# 명}}이 가입했습니다",
|
||||||
|
"notification.annual_report.message": "{year} #Wrapstodon 이 기다리고 있습니다! 올 해 마스토돈에서 있었던 최고의 순간과 기억들을 열어보세요!",
|
||||||
|
"notification.annual_report.view": "#Wrapstodon 보기",
|
||||||
"notification.favourite": "{name} 님이 내 게시물을 좋아합니다",
|
"notification.favourite": "{name} 님이 내 게시물을 좋아합니다",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} 외 <a>{count, plural, other {# 명}}</a>이 내 게시물을 좋아합니다",
|
"notification.favourite.name_and_others_with_link": "{name} 외 <a>{count, plural, other {# 명}}</a>이 내 게시물을 좋아합니다",
|
||||||
"notification.follow": "{name} 님이 나를 팔로우했습니다",
|
"notification.follow": "{name} 님이 나를 팔로우했습니다",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "Ups!",
|
"alert.unexpected.title": "Ups!",
|
||||||
"alt_text_badge.title": "Alternatyvus tekstas",
|
"alt_text_badge.title": "Alternatyvus tekstas",
|
||||||
"announcement.announcement": "Skelbimas",
|
"announcement.announcement": "Skelbimas",
|
||||||
|
"annual_report.summary.archetype.booster": "Šaunus medžiotojas",
|
||||||
|
"annual_report.summary.archetype.lurker": "Stebėtojas",
|
||||||
|
"annual_report.summary.archetype.oracle": "Vydūnas",
|
||||||
|
"annual_report.summary.archetype.pollster": "Apklausos rengėjas",
|
||||||
|
"annual_report.summary.archetype.replier": "Socialinis drugelis",
|
||||||
|
"annual_report.summary.followers.followers": "sekėjai (-ų)",
|
||||||
|
"annual_report.summary.followers.total": "iš viso {count}",
|
||||||
|
"annual_report.summary.here_it_is": "Štai jūsų {year} apžvalga:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "labiausiai pamėgtas įrašas",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "labiausiai pasidalintas įrašas",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "įrašas su daugiausiai atsakymų",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "labiausiai naudota programa",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "labiausiai naudotas saitažodis",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "nauji įrašai",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Tai reiškia, kad esate tarp</topLabel><percentage></percentage><bottomLabel>populiariausių „Mastodon“ naudotojų.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Mes nesakysime Bernie.",
|
||||||
|
"annual_report.summary.thanks": "Dėkojame, kad esate „Mastodon“ dalis!",
|
||||||
"attachments_list.unprocessed": "(neapdorotas)",
|
"attachments_list.unprocessed": "(neapdorotas)",
|
||||||
"audio.hide": "Slėpti garsą",
|
"audio.hide": "Slėpti garsą",
|
||||||
"block_modal.remote_users_caveat": "Paprašysime serverio {domain} gerbti tavo sprendimą. Tačiau atitiktis negarantuojama, nes kai kurie serveriai gali skirtingai tvarkyti blokavimus. Vieši įrašai vis tiek gali būti matomi neprisijungusiems naudotojams.",
|
"block_modal.remote_users_caveat": "Paprašysime serverio {domain} gerbti tavo sprendimą. Tačiau atitiktis negarantuojama, nes kai kurie serveriai gali skirtingai tvarkyti blokavimus. Vieši įrašai vis tiek gali būti matomi neprisijungusiems naudotojams.",
|
||||||
|
@ -507,6 +525,8 @@
|
||||||
"notification.admin.report_statuses": "{name} pranešė {target} kategorijai {category}",
|
"notification.admin.report_statuses": "{name} pranešė {target} kategorijai {category}",
|
||||||
"notification.admin.report_statuses_other": "{name} pranešė {target}",
|
"notification.admin.report_statuses_other": "{name} pranešė {target}",
|
||||||
"notification.admin.sign_up": "{name} užsiregistravo",
|
"notification.admin.sign_up": "{name} užsiregistravo",
|
||||||
|
"notification.annual_report.message": "Jūsų laukia {year} #Wrapstodon! Atskleiskite savo metų svarbiausius įvykius ir įsimintinas akimirkas platformoje „Mastodon“.",
|
||||||
|
"notification.annual_report.view": "Peržiūrėti #Wrapstodon",
|
||||||
"notification.favourite": "{name} pamėgo tavo įrašą",
|
"notification.favourite": "{name} pamėgo tavo įrašą",
|
||||||
"notification.follow": "{name} seka tave",
|
"notification.follow": "{name} seka tave",
|
||||||
"notification.follow.name_and_others": "{name} ir <a>{count, plural, one {# kitas} few {# kiti} many {# kito} other {# kitų}}</a> seka tave",
|
"notification.follow.name_and_others": "{name} ir <a>{count, plural, one {# kitas} few {# kiti} many {# kito} other {# kitų}}</a> seka tave",
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
"account.followers.empty": "Šim lietotājam vēl nav sekotāju.",
|
"account.followers.empty": "Šim lietotājam vēl nav sekotāju.",
|
||||||
"account.followers_counter": "{count, plural, zero {{count} sekotāju} one {{count} sekotājs} other {{count} sekotāji}}",
|
"account.followers_counter": "{count, plural, zero {{count} sekotāju} one {{count} sekotājs} other {{count} sekotāji}}",
|
||||||
"account.following": "Seko",
|
"account.following": "Seko",
|
||||||
|
"account.following_counter": "{count, plural, one {seko {counter}} other {seko {counter}}}",
|
||||||
"account.follows.empty": "Šis lietotājs pagaidām nevienam neseko.",
|
"account.follows.empty": "Šis lietotājs pagaidām nevienam neseko.",
|
||||||
"account.go_to_profile": "Doties uz profilu",
|
"account.go_to_profile": "Doties uz profilu",
|
||||||
"account.hide_reblogs": "Paslēpt @{name} pastiprinātos ierakstus",
|
"account.hide_reblogs": "Paslēpt @{name} pastiprinātos ierakstus",
|
||||||
|
@ -61,6 +62,7 @@
|
||||||
"account.requested_follow": "{name} nosūtīja Tev sekošanas pieprasījumu",
|
"account.requested_follow": "{name} nosūtīja Tev sekošanas pieprasījumu",
|
||||||
"account.share": "Dalīties ar @{name} profilu",
|
"account.share": "Dalīties ar @{name} profilu",
|
||||||
"account.show_reblogs": "Parādīt @{name} pastiprinātos ierakstus",
|
"account.show_reblogs": "Parādīt @{name} pastiprinātos ierakstus",
|
||||||
|
"account.statuses_counter": "{count, plural, zero {{counter} ierakstu} one {{counter} ieraksts} other {{counter} ieraksti}}",
|
||||||
"account.unblock": "Atbloķēt @{name}",
|
"account.unblock": "Atbloķēt @{name}",
|
||||||
"account.unblock_domain": "Atbloķēt domēnu {domain}",
|
"account.unblock_domain": "Atbloķēt domēnu {domain}",
|
||||||
"account.unblock_short": "Atbloķēt",
|
"account.unblock_short": "Atbloķēt",
|
||||||
|
@ -191,6 +193,7 @@
|
||||||
"confirmations.unfollow.title": "Pārtraukt sekošanu lietotājam?",
|
"confirmations.unfollow.title": "Pārtraukt sekošanu lietotājam?",
|
||||||
"content_warning.hide": "Paslēpt ierakstu",
|
"content_warning.hide": "Paslēpt ierakstu",
|
||||||
"content_warning.show": "Tomēr rādīt",
|
"content_warning.show": "Tomēr rādīt",
|
||||||
|
"content_warning.show_more": "Rādīt vairāk",
|
||||||
"conversation.delete": "Dzēst sarunu",
|
"conversation.delete": "Dzēst sarunu",
|
||||||
"conversation.mark_as_read": "Atzīmēt kā izlasītu",
|
"conversation.mark_as_read": "Atzīmēt kā izlasītu",
|
||||||
"conversation.open": "Skatīt sarunu",
|
"conversation.open": "Skatīt sarunu",
|
||||||
|
@ -211,6 +214,7 @@
|
||||||
"dismissable_banner.explore_tags": "Šie ir tēmturi, kas šodien gūst uzmanību sabiedriskajā tīmeklī. Tēmturi, kurus izmanto vairāk dažādu cilvēku, tiek vērtēti augstāk.",
|
"dismissable_banner.explore_tags": "Šie ir tēmturi, kas šodien gūst uzmanību sabiedriskajā tīmeklī. Tēmturi, kurus izmanto vairāk dažādu cilvēku, tiek vērtēti augstāk.",
|
||||||
"dismissable_banner.public_timeline": "Šie ir jaunākie publiskie ieraksti no lietotājiem sociālajā tīmeklī, kuriem {domain} seko cilvēki.",
|
"dismissable_banner.public_timeline": "Šie ir jaunākie publiskie ieraksti no lietotājiem sociālajā tīmeklī, kuriem {domain} seko cilvēki.",
|
||||||
"domain_block_modal.block": "Bloķēt serveri",
|
"domain_block_modal.block": "Bloķēt serveri",
|
||||||
|
"domain_block_modal.block_account_instead": "Tā vietā liegt @{name}",
|
||||||
"domain_block_modal.they_cant_follow": "Neviens šajā serverī nevar Tev sekot.",
|
"domain_block_modal.they_cant_follow": "Neviens šajā serverī nevar Tev sekot.",
|
||||||
"domain_block_modal.they_wont_know": "Viņi nezinās, ka tikuši bloķēti.",
|
"domain_block_modal.they_wont_know": "Viņi nezinās, ka tikuši bloķēti.",
|
||||||
"domain_block_modal.title": "Bloķēt domēnu?",
|
"domain_block_modal.title": "Bloķēt domēnu?",
|
||||||
|
@ -329,6 +333,7 @@
|
||||||
"home.pending_critical_update.link": "Skatīt jauninājumus",
|
"home.pending_critical_update.link": "Skatīt jauninājumus",
|
||||||
"home.pending_critical_update.title": "Ir pieejams būtisks drošības atjauninājums.",
|
"home.pending_critical_update.title": "Ir pieejams būtisks drošības atjauninājums.",
|
||||||
"home.show_announcements": "Rādīt paziņojumus",
|
"home.show_announcements": "Rādīt paziņojumus",
|
||||||
|
"ignore_notifications_modal.ignore": "Neņemt vērā paziņojumus",
|
||||||
"interaction_modal.description.favourite": "Ar Mastodon kontu tu vari pievienot šo ziņu izlasei, lai informētu autoru, ka to novērtē, un saglabātu to vēlākai lasīšanai.",
|
"interaction_modal.description.favourite": "Ar Mastodon kontu tu vari pievienot šo ziņu izlasei, lai informētu autoru, ka to novērtē, un saglabātu to vēlākai lasīšanai.",
|
||||||
"interaction_modal.description.follow": "Ar Mastodon kontu Tu vari sekot {name}, lai saņemtu lietotāja ierakstus savā mājas plūsmā.",
|
"interaction_modal.description.follow": "Ar Mastodon kontu Tu vari sekot {name}, lai saņemtu lietotāja ierakstus savā mājas plūsmā.",
|
||||||
"interaction_modal.description.reblog": "Ar Mastodon kontu Tu vari izvirzīt šo ierakstu, lai kopīgotu to ar saviem sekotājiem.",
|
"interaction_modal.description.reblog": "Ar Mastodon kontu Tu vari izvirzīt šo ierakstu, lai kopīgotu to ar saviem sekotājiem.",
|
||||||
|
@ -505,10 +510,10 @@
|
||||||
"onboarding.action.back": "Aizved mani atpakaļ",
|
"onboarding.action.back": "Aizved mani atpakaļ",
|
||||||
"onboarding.actions.back": "Aizved mani atpakaļ",
|
"onboarding.actions.back": "Aizved mani atpakaļ",
|
||||||
"onboarding.actions.go_to_explore": "Skatīt tendences",
|
"onboarding.actions.go_to_explore": "Skatīt tendences",
|
||||||
"onboarding.actions.go_to_home": "Dodieties uz manu mājas plūsmu",
|
"onboarding.actions.go_to_home": "Doties uz manu sākuma plūsmu",
|
||||||
"onboarding.compose.template": "Sveiki, #Mastodon!",
|
"onboarding.compose.template": "Sveiki, #Mastodon!",
|
||||||
"onboarding.follows.empty": "Diemžēl pašlaik nevar parādīt rezultātus. Vari mēģināt izmantot meklēšanu vai pārlūkot izpētes lapu, lai atrastu cilvēkus, kuriem sekot, vai vēlāk mēģināt vēlreiz.",
|
"onboarding.follows.empty": "Diemžēl pašlaik nevar parādīt rezultātus. Vari mēģināt izmantot meklēšanu vai pārlūkot izpētes lapu, lai atrastu cilvēkus, kuriem sekot, vai vēlāk mēģināt vēlreiz.",
|
||||||
"onboarding.follows.lead": "Tava mājas plūsma ir galvenais veids, kā pieredzēt Mastodon. Jo vairāk cilvēkiem sekosi, jo dzīvīgāka un aizraujošāka tā būs. Lai sāktu, šeit ir daži ieteikumi:",
|
"onboarding.follows.lead": "Tava sākuma plūsma ir galvenais veids, kā pieredzēt Mastodon. Jo vairāk cilvēkiem sekosi, jo dzīvīgāka un aizraujošāka tā būs. Lai sāktu, šeit ir daži ieteikumi:",
|
||||||
"onboarding.follows.title": "Pielāgo savu mājas barotni",
|
"onboarding.follows.title": "Pielāgo savu mājas barotni",
|
||||||
"onboarding.profile.discoverable": "Padarīt manu profilu atklājamu",
|
"onboarding.profile.discoverable": "Padarīt manu profilu atklājamu",
|
||||||
"onboarding.profile.display_name": "Attēlojamais vārds",
|
"onboarding.profile.display_name": "Attēlojamais vārds",
|
||||||
|
@ -526,7 +531,7 @@
|
||||||
"onboarding.start.lead": "Tagad Tu esi daļa no Mastodon — vienreizējas, decentralizētas sociālās mediju platformas, kurā Tu, nevis algoritms, veido Tavu pieredzi. Sāksim darbu šajā jaunajā sociālajā jomā:",
|
"onboarding.start.lead": "Tagad Tu esi daļa no Mastodon — vienreizējas, decentralizētas sociālās mediju platformas, kurā Tu, nevis algoritms, veido Tavu pieredzi. Sāksim darbu šajā jaunajā sociālajā jomā:",
|
||||||
"onboarding.start.skip": "Nav nepieciešama palīdzība darba sākšanai?",
|
"onboarding.start.skip": "Nav nepieciešama palīdzība darba sākšanai?",
|
||||||
"onboarding.start.title": "Tev tas izdevās!",
|
"onboarding.start.title": "Tev tas izdevās!",
|
||||||
"onboarding.steps.follow_people.body": "Tu pats veido savu plūsmu. Piepildīsim to ar interesantiem cilvēkiem.",
|
"onboarding.steps.follow_people.body": "Sekošana aizraujošiem cilvēkiem ir tas, par ko ir Mastodon.",
|
||||||
"onboarding.steps.follow_people.title": "Pielāgo savu mājas barotni",
|
"onboarding.steps.follow_people.title": "Pielāgo savu mājas barotni",
|
||||||
"onboarding.steps.publish_status.body": "Pasveicini pasauli ar tekstu, attēliem, video vai aptaujām {emoji}",
|
"onboarding.steps.publish_status.body": "Pasveicini pasauli ar tekstu, attēliem, video vai aptaujām {emoji}",
|
||||||
"onboarding.steps.publish_status.title": "Izveido savu pirmo ziņu",
|
"onboarding.steps.publish_status.title": "Izveido savu pirmo ziņu",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "Oeps!",
|
"alert.unexpected.title": "Oeps!",
|
||||||
"alt_text_badge.title": "Alt-tekst",
|
"alt_text_badge.title": "Alt-tekst",
|
||||||
"announcement.announcement": "Mededeling",
|
"announcement.announcement": "Mededeling",
|
||||||
|
"annual_report.summary.archetype.booster": "De cool-hunter",
|
||||||
|
"annual_report.summary.archetype.lurker": "De lurker",
|
||||||
|
"annual_report.summary.archetype.oracle": "Het orakel",
|
||||||
|
"annual_report.summary.archetype.pollster": "De opiniepeiler",
|
||||||
|
"annual_report.summary.archetype.replier": "De sociale vlinder",
|
||||||
|
"annual_report.summary.followers.followers": "volgers",
|
||||||
|
"annual_report.summary.followers.total": "totaal {count}",
|
||||||
|
"annual_report.summary.here_it_is": "Hier is jouw terugblik op {year}:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "bericht met de meeste favorieten",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "bericht met de meeste boosts",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "bericht met de meeste reacties",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}'s",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "meest gebruikte app",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "meest gebruikte hashtag",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "nieuwe berichten",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Dat zet je in de top</topLabel><percentage></percentage><bottomLabel>van Mastodon-gebruikers.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "We zullen Bernie niets vertellen.",
|
||||||
|
"annual_report.summary.thanks": "Bedankt dat je deel uitmaakt van Mastodon!",
|
||||||
"attachments_list.unprocessed": "(niet verwerkt)",
|
"attachments_list.unprocessed": "(niet verwerkt)",
|
||||||
"audio.hide": "Audio verbergen",
|
"audio.hide": "Audio verbergen",
|
||||||
"block_modal.remote_users_caveat": "We vragen de server {domain} om je besluit te respecteren. Het naleven hiervan is echter niet gegarandeerd, omdat sommige servers blokkades anders kunnen interpreteren. Openbare berichten zijn mogelijk nog steeds zichtbaar voor niet-ingelogde gebruikers.",
|
"block_modal.remote_users_caveat": "We vragen de server {domain} om je besluit te respecteren. Het naleven hiervan is echter niet gegarandeerd, omdat sommige servers blokkades anders kunnen interpreteren. Openbare berichten zijn mogelijk nog steeds zichtbaar voor niet-ingelogde gebruikers.",
|
||||||
|
@ -508,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} rapporteerde {target}",
|
"notification.admin.report_statuses_other": "{name} rapporteerde {target}",
|
||||||
"notification.admin.sign_up": "{name} heeft zich geregistreerd",
|
"notification.admin.sign_up": "{name} heeft zich geregistreerd",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} en {count, plural, one {# ander persoon} other {# andere personen}} hebben zich geregistreerd",
|
"notification.admin.sign_up.name_and_others": "{name} en {count, plural, one {# ander persoon} other {# andere personen}} hebben zich geregistreerd",
|
||||||
|
"notification.annual_report.message": "Jouw {year} #Wrapstodon staat klaar! Laat de hoogtepunten en memorabele momenten van jouw jaar zien op Mastodon!",
|
||||||
|
"notification.annual_report.view": "#Wrapstodon bekijken",
|
||||||
"notification.favourite": "{name} markeerde jouw bericht als favoriet",
|
"notification.favourite": "{name} markeerde jouw bericht als favoriet",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} en <a>{count, plural, one {# ander persoon} other {# andere personen}}</a> hebben jouw bericht als favoriet gemarkeerd",
|
"notification.favourite.name_and_others_with_link": "{name} en <a>{count, plural, one {# ander persoon} other {# andere personen}}</a> hebben jouw bericht als favoriet gemarkeerd",
|
||||||
"notification.follow": "{name} volgt jou nu",
|
"notification.follow": "{name} volgt jou nu",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "Eita!",
|
"alert.unexpected.title": "Eita!",
|
||||||
"alt_text_badge.title": "Texto alternativo",
|
"alt_text_badge.title": "Texto alternativo",
|
||||||
"announcement.announcement": "Comunicados",
|
"announcement.announcement": "Comunicados",
|
||||||
|
"annual_report.summary.archetype.booster": "Caçador legal",
|
||||||
|
"annual_report.summary.archetype.lurker": "O espreitador",
|
||||||
|
"annual_report.summary.archetype.oracle": "O oráculo",
|
||||||
|
"annual_report.summary.archetype.pollster": "O pesquisador",
|
||||||
|
"annual_report.summary.archetype.replier": "A borboleta social",
|
||||||
|
"annual_report.summary.followers.followers": "seguidores",
|
||||||
|
"annual_report.summary.followers.total": "{count} total",
|
||||||
|
"annual_report.summary.here_it_is": "Aqui está seu {year} em revisão:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "publicação mais favoritada",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "publicação mais impulsionada",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "publicação com mais respostas",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "aplicativo mais usado",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "hashtag mais usada",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "novas publicações",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Isso o coloca no topo</topLabel></percentage><bottomLabel>dos usuários de Mastodon.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Não contaremos à Bernie.",
|
||||||
|
"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 {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.",
|
||||||
|
@ -508,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} denunciou {target}",
|
"notification.admin.report_statuses_other": "{name} denunciou {target}",
|
||||||
"notification.admin.sign_up": "{name} se inscreveu",
|
"notification.admin.sign_up": "{name} se inscreveu",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} e {count, plural, one {# other} other {# outros}}",
|
"notification.admin.sign_up.name_and_others": "{name} e {count, plural, one {# other} other {# outros}}",
|
||||||
|
"notification.annual_report.message": "O #Wrapstodon do seu {year} está esperando! Desvende seus destaques do ano e momentos memoráveis no Mastodon!",
|
||||||
|
"notification.annual_report.view": "Ver #Wrapstodon",
|
||||||
"notification.favourite": "{name} favoritou sua publicação",
|
"notification.favourite": "{name} favoritou sua publicação",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} e <a>{count, plural, one {# outro} other {# others}}</a> favoritaram a publicação",
|
"notification.favourite.name_and_others_with_link": "{name} e <a>{count, plural, one {# outro} other {# others}}</a> favoritaram a publicação",
|
||||||
"notification.follow": "{name} te seguiu",
|
"notification.follow": "{name} te seguiu",
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
"account.follows.empty": "Этот пользователь пока ни на кого не подписался.",
|
"account.follows.empty": "Этот пользователь пока ни на кого не подписался.",
|
||||||
"account.go_to_profile": "Перейти к профилю",
|
"account.go_to_profile": "Перейти к профилю",
|
||||||
"account.hide_reblogs": "Скрыть продвижения от @{name}",
|
"account.hide_reblogs": "Скрыть продвижения от @{name}",
|
||||||
"account.in_memoriam": "В Памяти.",
|
"account.in_memoriam": "Вечная память.",
|
||||||
"account.joined_short": "Присоединился",
|
"account.joined_short": "Присоединился",
|
||||||
"account.languages": "Изменить языки подписки",
|
"account.languages": "Изменить языки подписки",
|
||||||
"account.link_verified_on": "Владение этой ссылкой было проверено {date}",
|
"account.link_verified_on": "Владение этой ссылкой было проверено {date}",
|
||||||
|
@ -62,13 +62,13 @@
|
||||||
"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 {# пост} few {# поста} many {# постов} other {# постов}}",
|
"account.statuses_counter": "{count, plural, one {{counter} пост} few {{counter} поста} other {{counter} постов}}",
|
||||||
"account.unblock": "Разблокировать @{name}",
|
"account.unblock": "Разблокировать @{name}",
|
||||||
"account.unblock_domain": "Разблокировать {domain}",
|
"account.unblock_domain": "Разблокировать {domain}",
|
||||||
"account.unblock_short": "Разблокировать",
|
"account.unblock_short": "Разблокировать",
|
||||||
"account.unendorse": "Не рекомендовать в профиле",
|
"account.unendorse": "Не рекомендовать в профиле",
|
||||||
"account.unfollow": "Отписаться",
|
"account.unfollow": "Отписаться",
|
||||||
"account.unmute": "Убрать {name} из игнорируемых",
|
"account.unmute": "Перестать игнорировать @{name}",
|
||||||
"account.unmute_notifications_short": "Включить уведомления",
|
"account.unmute_notifications_short": "Включить уведомления",
|
||||||
"account.unmute_short": "Не игнорировать",
|
"account.unmute_short": "Не игнорировать",
|
||||||
"account_note.placeholder": "Текст заметки",
|
"account_note.placeholder": "Текст заметки",
|
||||||
|
@ -84,9 +84,23 @@
|
||||||
"alert.rate_limited.message": "Пожалуйста, повторите после {retry_time, time, medium}.",
|
"alert.rate_limited.message": "Пожалуйста, повторите после {retry_time, time, medium}.",
|
||||||
"alert.rate_limited.title": "Ограничение количества запросов",
|
"alert.rate_limited.title": "Ограничение количества запросов",
|
||||||
"alert.unexpected.message": "Произошла непредвиденная ошибка.",
|
"alert.unexpected.message": "Произошла непредвиденная ошибка.",
|
||||||
"alert.unexpected.title": "Упс!",
|
"alert.unexpected.title": "Ой!",
|
||||||
"alt_text_badge.title": "Альтернативный текст",
|
"alt_text_badge.title": "Альтернативный текст",
|
||||||
"announcement.announcement": "Объявление",
|
"announcement.announcement": "Объявление",
|
||||||
|
"annual_report.summary.archetype.booster": "Репостер",
|
||||||
|
"annual_report.summary.archetype.lurker": "Молчун",
|
||||||
|
"annual_report.summary.archetype.pollster": "Опросчик",
|
||||||
|
"annual_report.summary.archetype.replier": "Душа компании",
|
||||||
|
"annual_report.summary.followers.followers": "подписчиков",
|
||||||
|
"annual_report.summary.here_it_is": "Вот ваши итоги {year} года:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "пост с наибольшим количеством звёздочек",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "пост с наибольшим количеством продвижений",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "пост с наибольшим количеством ответов",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "наиболее часто используемое приложение",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "наиболее часто используемый хэштег",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "новых постов",
|
||||||
|
"annual_report.summary.thanks": "Спасибо за то, что были вместе с Mastodon!",
|
||||||
"attachments_list.unprocessed": "(не обработан)",
|
"attachments_list.unprocessed": "(не обработан)",
|
||||||
"audio.hide": "Скрыть аудио",
|
"audio.hide": "Скрыть аудио",
|
||||||
"block_modal.remote_users_caveat": "Мы попросим сервер {domain} уважать ваше решение. Однако, соблюдение требований не гарантировано, поскольку некоторые серверы могут работать с блокировками по-разному. Публичные записи по-прежнему могут быть видны неавторизованным пользователям.",
|
"block_modal.remote_users_caveat": "Мы попросим сервер {domain} уважать ваше решение. Однако, соблюдение требований не гарантировано, поскольку некоторые серверы могут работать с блокировками по-разному. Публичные записи по-прежнему могут быть видны неавторизованным пользователям.",
|
||||||
|
@ -95,11 +109,11 @@
|
||||||
"block_modal.they_cant_mention": "Он не может упоминать или подписываться на вас.",
|
"block_modal.they_cant_mention": "Он не может упоминать или подписываться на вас.",
|
||||||
"block_modal.they_cant_see_posts": "Он не может видеть ваши сообщения, и вы не увидите его.",
|
"block_modal.they_cant_see_posts": "Он не может видеть ваши сообщения, и вы не увидите его.",
|
||||||
"block_modal.they_will_know": "Он может видеть, что он заблокирован.",
|
"block_modal.they_will_know": "Он может видеть, что он заблокирован.",
|
||||||
"block_modal.title": "Заблокировать пользователя?",
|
"block_modal.title": "Заблокируем пользователя?",
|
||||||
"block_modal.you_wont_see_mentions": "Вы не увидите записи, которые упоминают его.",
|
"block_modal.you_wont_see_mentions": "Вы не увидите записи, которые упоминают его.",
|
||||||
"boost_modal.combo": "{combo}, чтобы пропустить это в следующий раз",
|
"boost_modal.combo": "{combo}, чтобы пропустить это в следующий раз",
|
||||||
"boost_modal.reblog": "Повысить пост?",
|
"boost_modal.reblog": "Репостнуть?",
|
||||||
"boost_modal.undo_reblog": "Разгрузить пост?",
|
"boost_modal.undo_reblog": "Убрать репост?",
|
||||||
"bundle_column_error.copy_stacktrace": "Скопировать отчет об ошибке",
|
"bundle_column_error.copy_stacktrace": "Скопировать отчет об ошибке",
|
||||||
"bundle_column_error.error.body": "Запрошенная страница не может быть отображена. Это может быть вызвано ошибкой в нашем коде или проблемой совместимости браузера.",
|
"bundle_column_error.error.body": "Запрошенная страница не может быть отображена. Это может быть вызвано ошибкой в нашем коде или проблемой совместимости браузера.",
|
||||||
"bundle_column_error.error.title": "О нет!",
|
"bundle_column_error.error.title": "О нет!",
|
||||||
|
@ -144,12 +158,12 @@
|
||||||
"community.column_settings.local_only": "Только локальные",
|
"community.column_settings.local_only": "Только локальные",
|
||||||
"community.column_settings.media_only": "Только с медиафайлами",
|
"community.column_settings.media_only": "Только с медиафайлами",
|
||||||
"community.column_settings.remote_only": "Только удалённые",
|
"community.column_settings.remote_only": "Только удалённые",
|
||||||
"compose.language.change": "Изменить язык",
|
"compose.language.change": "Сменить язык",
|
||||||
"compose.language.search": "Поиск языков...",
|
"compose.language.search": "Поиск языков...",
|
||||||
"compose.published.body": "Запись опубликована.",
|
"compose.published.body": "Пост опубликован.",
|
||||||
"compose.published.open": "Открыть",
|
"compose.published.open": "Открыть",
|
||||||
"compose.saved.body": "Запись сохранена.",
|
"compose.saved.body": "Пост отредактирован.",
|
||||||
"compose_form.direct_message_warning_learn_more": "Подробнее",
|
"compose_form.direct_message_warning_learn_more": "Узнать больше",
|
||||||
"compose_form.encryption_warning": "Посты в Mastodon не защищены сквозным шифрованием. Не делитесь конфиденциальной информацией через Mastodon.",
|
"compose_form.encryption_warning": "Посты в Mastodon не защищены сквозным шифрованием. Не делитесь конфиденциальной информацией через Mastodon.",
|
||||||
"compose_form.hashtag_warning": "Этот пост не будет виден ни под одним из хэштегов, так как он не публичный. Только публичные посты можно найти по хэштегу.",
|
"compose_form.hashtag_warning": "Этот пост не будет виден ни под одним из хэштегов, так как он не публичный. Только публичные посты можно найти по хэштегу.",
|
||||||
"compose_form.lock_disclaimer": "Ваша учётная запись {locked}. Любой пользователь сможет подписаться на вас и просматривать посты для подписчиков.",
|
"compose_form.lock_disclaimer": "Ваша учётная запись {locked}. Любой пользователь сможет подписаться на вас и просматривать посты для подписчиков.",
|
||||||
|
@ -158,16 +172,17 @@
|
||||||
"compose_form.poll.duration": "Продолжительность опроса",
|
"compose_form.poll.duration": "Продолжительность опроса",
|
||||||
"compose_form.poll.multiple": "Несколько вариантов ответа",
|
"compose_form.poll.multiple": "Несколько вариантов ответа",
|
||||||
"compose_form.poll.option_placeholder": "Вариант {number}",
|
"compose_form.poll.option_placeholder": "Вариант {number}",
|
||||||
|
"compose_form.poll.single": "Один вариант ответа",
|
||||||
"compose_form.poll.switch_to_multiple": "Разрешить выбор нескольких вариантов",
|
"compose_form.poll.switch_to_multiple": "Разрешить выбор нескольких вариантов",
|
||||||
"compose_form.poll.switch_to_single": "Переключить в режим выбора одного ответа",
|
"compose_form.poll.switch_to_single": "Переключить в режим выбора одного ответа",
|
||||||
"compose_form.poll.type": "Стиль",
|
"compose_form.poll.type": "Тип",
|
||||||
"compose_form.publish": "Опубликовать",
|
"compose_form.publish": "Опубликовать",
|
||||||
"compose_form.publish_form": "Опубликовать",
|
"compose_form.publish_form": "Опубликовать",
|
||||||
"compose_form.reply": "Ответить",
|
"compose_form.reply": "Ответить",
|
||||||
"compose_form.save_changes": "Сохранить",
|
"compose_form.save_changes": "Сохранить",
|
||||||
"compose_form.spoiler.marked": "Текст скрыт за предупреждением",
|
"compose_form.spoiler.marked": "Текст скрыт за предупреждением",
|
||||||
"compose_form.spoiler.unmarked": "Текст не скрыт",
|
"compose_form.spoiler.unmarked": "Текст не скрыт",
|
||||||
"compose_form.spoiler_placeholder": "Предупреждение о контенте (опционально)",
|
"compose_form.spoiler_placeholder": "Предупреждение о содержимом (необязательно)",
|
||||||
"confirmation_modal.cancel": "Отмена",
|
"confirmation_modal.cancel": "Отмена",
|
||||||
"confirmations.block.confirm": "Заблокировать",
|
"confirmations.block.confirm": "Заблокировать",
|
||||||
"confirmations.delete.confirm": "Удалить",
|
"confirmations.delete.confirm": "Удалить",
|
||||||
|
@ -177,17 +192,17 @@
|
||||||
"confirmations.delete_list.message": "Вы действительно хотите навсегда удалить этот список?",
|
"confirmations.delete_list.message": "Вы действительно хотите навсегда удалить этот список?",
|
||||||
"confirmations.delete_list.title": "Удалить список?",
|
"confirmations.delete_list.title": "Удалить список?",
|
||||||
"confirmations.discard_edit_media.confirm": "Отменить",
|
"confirmations.discard_edit_media.confirm": "Отменить",
|
||||||
"confirmations.discard_edit_media.message": "У вас есть несохранённые изменения описания мультимедиа или предпросмотра, отменить их?",
|
"confirmations.discard_edit_media.message": "У вас имеются несохранённые изменения превью и описания медиафайла, отменить их?",
|
||||||
"confirmations.edit.confirm": "Редактировать",
|
"confirmations.edit.confirm": "Редактировать",
|
||||||
"confirmations.edit.message": "В данный момент, редактирование перезапишет составляемое вами сообщение. Вы уверены, что хотите продолжить?",
|
"confirmations.edit.message": "При редактировании, текст набираемого поста будет очищен. Продолжить?",
|
||||||
"confirmations.edit.title": "Переписать сообщение?",
|
"confirmations.edit.title": "Переписать сообщение?",
|
||||||
"confirmations.logout.confirm": "Выйти",
|
"confirmations.logout.confirm": "Выйти",
|
||||||
"confirmations.logout.message": "Вы уверены, что хотите выйти?",
|
"confirmations.logout.message": "Вы уверены, что хотите выйти?",
|
||||||
"confirmations.logout.title": "Выйти?",
|
"confirmations.logout.title": "Выйти?",
|
||||||
"confirmations.mute.confirm": "Игнорировать",
|
"confirmations.mute.confirm": "Игнорировать",
|
||||||
"confirmations.redraft.confirm": "Удалить и исправить",
|
"confirmations.redraft.confirm": "Удалить и исправить",
|
||||||
"confirmations.redraft.message": "Вы уверены, что хотите удалить и переписать этот пост? Отметки «избранного», продвижения и ответы к оригинальному посту будут удалены.",
|
"confirmations.redraft.message": "Вы уверены, что хотите удалить и переписать этот пост? Отметки «избранного», продвижения и ответы к оригинальному посту будут потеряны.",
|
||||||
"confirmations.redraft.title": "Удалим и исправим пост?",
|
"confirmations.redraft.title": "Создать пост заново?",
|
||||||
"confirmations.reply.confirm": "Ответить",
|
"confirmations.reply.confirm": "Ответить",
|
||||||
"confirmations.reply.message": "При ответе, текст набираемого поста будет очищен. Продолжить?",
|
"confirmations.reply.message": "При ответе, текст набираемого поста будет очищен. Продолжить?",
|
||||||
"confirmations.reply.title": "Перепишем пост?",
|
"confirmations.reply.title": "Перепишем пост?",
|
||||||
|
@ -196,6 +211,7 @@
|
||||||
"confirmations.unfollow.title": "Отписаться?",
|
"confirmations.unfollow.title": "Отписаться?",
|
||||||
"content_warning.hide": "Скрыть пост",
|
"content_warning.hide": "Скрыть пост",
|
||||||
"content_warning.show": "Всё равно показать",
|
"content_warning.show": "Всё равно показать",
|
||||||
|
"content_warning.show_more": "Покажи ещё",
|
||||||
"conversation.delete": "Удалить беседу",
|
"conversation.delete": "Удалить беседу",
|
||||||
"conversation.mark_as_read": "Отметить как прочитанное",
|
"conversation.mark_as_read": "Отметить как прочитанное",
|
||||||
"conversation.open": "Просмотр беседы",
|
"conversation.open": "Просмотр беседы",
|
||||||
|
@ -221,6 +237,7 @@
|
||||||
"domain_block_modal.they_cant_follow": "Никто из этого сервера не может подписываться на вас.",
|
"domain_block_modal.they_cant_follow": "Никто из этого сервера не может подписываться на вас.",
|
||||||
"domain_block_modal.they_wont_know": "Он не будет знать, что его заблокировали.",
|
"domain_block_modal.they_wont_know": "Он не будет знать, что его заблокировали.",
|
||||||
"domain_block_modal.title": "Заблокировать домен?",
|
"domain_block_modal.title": "Заблокировать домен?",
|
||||||
|
"domain_block_modal.you_will_lose_num_followers": "Вы потеряете {followersCount, plural, one {{followersCountDisplay} подписчика} other {{followersCountDisplay} подписчиков}} и {followingCount, plural, one {{followingCountDisplay} подписку} other {{followingCountDisplay} подписок}}.",
|
||||||
"domain_block_modal.you_will_lose_relationships": "Вы потеряете всех подписчиков и людей, на которых вы подписаны, на этом сервере.",
|
"domain_block_modal.you_will_lose_relationships": "Вы потеряете всех подписчиков и людей, на которых вы подписаны, на этом сервере.",
|
||||||
"domain_block_modal.you_wont_see_posts": "Вы не будете видеть записи или уведомления от пользователей на этом сервере.",
|
"domain_block_modal.you_wont_see_posts": "Вы не будете видеть записи или уведомления от пользователей на этом сервере.",
|
||||||
"domain_pill.activitypub_lets_connect": "Это позволяет вам общаться и взаимодействовать с людьми не только на Mastodon, но и в различных социальных приложениях.",
|
"domain_pill.activitypub_lets_connect": "Это позволяет вам общаться и взаимодействовать с людьми не только на Mastodon, но и в различных социальных приложениях.",
|
||||||
|
@ -240,7 +257,7 @@
|
||||||
"embed.preview": "Так это будет выглядеть:",
|
"embed.preview": "Так это будет выглядеть:",
|
||||||
"emoji_button.activity": "Занятия",
|
"emoji_button.activity": "Занятия",
|
||||||
"emoji_button.clear": "Очистить",
|
"emoji_button.clear": "Очистить",
|
||||||
"emoji_button.custom": "С этого узла",
|
"emoji_button.custom": "С этого сервера",
|
||||||
"emoji_button.flags": "Флаги",
|
"emoji_button.flags": "Флаги",
|
||||||
"emoji_button.food": "Еда и напитки",
|
"emoji_button.food": "Еда и напитки",
|
||||||
"emoji_button.label": "Вставить эмодзи",
|
"emoji_button.label": "Вставить эмодзи",
|
||||||
|
@ -303,6 +320,7 @@
|
||||||
"filter_modal.select_filter.subtitle": "Используйте существующую категорию или создайте новую",
|
"filter_modal.select_filter.subtitle": "Используйте существующую категорию или создайте новую",
|
||||||
"filter_modal.select_filter.title": "Фильтровать этот пост",
|
"filter_modal.select_filter.title": "Фильтровать этот пост",
|
||||||
"filter_modal.title.status": "Фильтровать пост",
|
"filter_modal.title.status": "Фильтровать пост",
|
||||||
|
"filter_warning.matches_filter": "Соответствует фильтру \"<span>{title}</span>\"",
|
||||||
"filtered_notifications_banner.pending_requests": "Вы можете знать {count, plural, =0 {ни одного человека} one {одного человека} other {# человек}}",
|
"filtered_notifications_banner.pending_requests": "Вы можете знать {count, plural, =0 {ни одного человека} one {одного человека} other {# человек}}",
|
||||||
"filtered_notifications_banner.title": "Отфильтрованные уведомления",
|
"filtered_notifications_banner.title": "Отфильтрованные уведомления",
|
||||||
"firehose.all": "Все",
|
"firehose.all": "Все",
|
||||||
|
@ -346,12 +364,12 @@
|
||||||
"hashtag.column_settings.tag_mode.any": "Любой из списка",
|
"hashtag.column_settings.tag_mode.any": "Любой из списка",
|
||||||
"hashtag.column_settings.tag_mode.none": "Ни один из списка",
|
"hashtag.column_settings.tag_mode.none": "Ни один из списка",
|
||||||
"hashtag.column_settings.tag_toggle": "Включить дополнительные теги для этой колонки",
|
"hashtag.column_settings.tag_toggle": "Включить дополнительные теги для этой колонки",
|
||||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} участник} few {{counter} участников} many {{counter} участников} other {{counter} участников}}",
|
"hashtag.counter_by_accounts": "{count, plural, one {{counter} пользователь} few {{counter} пользователя} other {{counter} пользователей}}",
|
||||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} сообщение} few {{counter} сообщения} many {{counter} сообщения} other {{counter} сообщения}}",
|
"hashtag.counter_by_uses": "{count, plural, one {{counter} пост} few {{counter} поста} other {{counter} постов}}",
|
||||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} сообщение} other {{counter} сообщений}} сегодня",
|
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} пост} few {{counter} поста} other {{counter} постов}} сегодня",
|
||||||
"hashtag.follow": "Подписаться на новые посты",
|
"hashtag.follow": "Подписаться на новые посты",
|
||||||
"hashtag.unfollow": "Отписаться",
|
"hashtag.unfollow": "Отписаться",
|
||||||
"hashtags.and_other": "...и {count, plural, other {# ещё}}",
|
"hashtags.and_other": "…и {count, plural, other {ещё #}}",
|
||||||
"hints.profiles.followers_may_be_missing": "Подписчики у этого профиля могут отсутствовать.",
|
"hints.profiles.followers_may_be_missing": "Подписчики у этого профиля могут отсутствовать.",
|
||||||
"hints.profiles.follows_may_be_missing": "Фолловеры для этого профиля могут отсутствовать.",
|
"hints.profiles.follows_may_be_missing": "Фолловеры для этого профиля могут отсутствовать.",
|
||||||
"hints.profiles.posts_may_be_missing": "Некоторые сообщения из этого профиля могут отсутствовать.",
|
"hints.profiles.posts_may_be_missing": "Некоторые сообщения из этого профиля могут отсутствовать.",
|
||||||
|
@ -382,6 +400,7 @@
|
||||||
"interaction_modal.description.follow": "С учётной записью Mastodon вы можете подписаться на {name}, чтобы получать их посты в своей домашней ленте.",
|
"interaction_modal.description.follow": "С учётной записью Mastodon вы можете подписаться на {name}, чтобы получать их посты в своей домашней ленте.",
|
||||||
"interaction_modal.description.reblog": "С учётной записью Mastodon, вы можете продвинуть этот пост, чтобы поделиться им со своими подписчиками.",
|
"interaction_modal.description.reblog": "С учётной записью Mastodon, вы можете продвинуть этот пост, чтобы поделиться им со своими подписчиками.",
|
||||||
"interaction_modal.description.reply": "Вы можете ответить на этот пост с учётной записью Mastodon.",
|
"interaction_modal.description.reply": "Вы можете ответить на этот пост с учётной записью Mastodon.",
|
||||||
|
"interaction_modal.description.vote": "Вы сможете проголосовать тут имея аккаунт Mastodon.",
|
||||||
"interaction_modal.login.action": "Перейти на домашнюю страницу",
|
"interaction_modal.login.action": "Перейти на домашнюю страницу",
|
||||||
"interaction_modal.login.prompt": "Домен вашего домашнего сервера, например, mastodon.social",
|
"interaction_modal.login.prompt": "Домен вашего домашнего сервера, например, mastodon.social",
|
||||||
"interaction_modal.no_account_yet": "Еще не на Mastodon?",
|
"interaction_modal.no_account_yet": "Еще не на Mastodon?",
|
||||||
|
@ -393,6 +412,7 @@
|
||||||
"interaction_modal.title.follow": "Подписаться на {name}",
|
"interaction_modal.title.follow": "Подписаться на {name}",
|
||||||
"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}",
|
||||||
"intervals.full.days": "{number, plural, one {# день} few {# дня} other {# дней}}",
|
"intervals.full.days": "{number, plural, one {# день} few {# дня} other {# дней}}",
|
||||||
"intervals.full.hours": "{number, plural, one {# час} few {# часа} other {# часов}}",
|
"intervals.full.hours": "{number, plural, one {# час} few {# часа} other {# часов}}",
|
||||||
"intervals.full.minutes": "{number, plural, one {# минута} few {# минуты} other {# минут}}",
|
"intervals.full.minutes": "{number, plural, one {# минута} few {# минуты} other {# минут}}",
|
||||||
|
@ -405,8 +425,8 @@
|
||||||
"keyboard_shortcuts.direct": "чтобы открыть столбец личных упоминаний",
|
"keyboard_shortcuts.direct": "чтобы открыть столбец личных упоминаний",
|
||||||
"keyboard_shortcuts.down": "вниз по списку",
|
"keyboard_shortcuts.down": "вниз по списку",
|
||||||
"keyboard_shortcuts.enter": "открыть пост",
|
"keyboard_shortcuts.enter": "открыть пост",
|
||||||
"keyboard_shortcuts.favourite": "Добавить пост в избранное",
|
"keyboard_shortcuts.favourite": "добавить пост в избранное",
|
||||||
"keyboard_shortcuts.favourites": "Открыть «Избранное»",
|
"keyboard_shortcuts.favourites": "открыть «Избранные»",
|
||||||
"keyboard_shortcuts.federated": "перейти к глобальной ленте",
|
"keyboard_shortcuts.federated": "перейти к глобальной ленте",
|
||||||
"keyboard_shortcuts.heading": "Сочетания клавиш",
|
"keyboard_shortcuts.heading": "Сочетания клавиш",
|
||||||
"keyboard_shortcuts.home": "перейти к домашней ленте",
|
"keyboard_shortcuts.home": "перейти к домашней ленте",
|
||||||
|
@ -414,7 +434,7 @@
|
||||||
"keyboard_shortcuts.legend": "показать это окно",
|
"keyboard_shortcuts.legend": "показать это окно",
|
||||||
"keyboard_shortcuts.local": "перейти к локальной ленте",
|
"keyboard_shortcuts.local": "перейти к локальной ленте",
|
||||||
"keyboard_shortcuts.mention": "упомянуть автора поста",
|
"keyboard_shortcuts.mention": "упомянуть автора поста",
|
||||||
"keyboard_shortcuts.muted": "Открыть список игнорируемых",
|
"keyboard_shortcuts.muted": "открыть список игнорируемых",
|
||||||
"keyboard_shortcuts.my_profile": "перейти к своему профилю",
|
"keyboard_shortcuts.my_profile": "перейти к своему профилю",
|
||||||
"keyboard_shortcuts.notifications": "перейти к уведомлениям",
|
"keyboard_shortcuts.notifications": "перейти к уведомлениям",
|
||||||
"keyboard_shortcuts.open_media": "открыть вложение",
|
"keyboard_shortcuts.open_media": "открыть вложение",
|
||||||
|
@ -426,7 +446,7 @@
|
||||||
"keyboard_shortcuts.spoilers": "показать/скрыть поле предупреждения о содержании",
|
"keyboard_shortcuts.spoilers": "показать/скрыть поле предупреждения о содержании",
|
||||||
"keyboard_shortcuts.start": "Перейти к разделу \"Начать\"",
|
"keyboard_shortcuts.start": "Перейти к разделу \"Начать\"",
|
||||||
"keyboard_shortcuts.toggle_hidden": "показать/скрыть текст за предупреждением",
|
"keyboard_shortcuts.toggle_hidden": "показать/скрыть текст за предупреждением",
|
||||||
"keyboard_shortcuts.toggle_sensitivity": "Показать/скрыть медиафайлы",
|
"keyboard_shortcuts.toggle_sensitivity": "показать/скрыть медиафайлы",
|
||||||
"keyboard_shortcuts.toot": "начать писать новый пост",
|
"keyboard_shortcuts.toot": "начать писать новый пост",
|
||||||
"keyboard_shortcuts.unfocus": "убрать фокус с поля ввода/поиска",
|
"keyboard_shortcuts.unfocus": "убрать фокус с поля ввода/поиска",
|
||||||
"keyboard_shortcuts.up": "вверх по списку",
|
"keyboard_shortcuts.up": "вверх по списку",
|
||||||
|
@ -468,8 +488,8 @@
|
||||||
"mute_modal.you_wont_see_mentions": "Вы не увидите постов, которые их упоминают.",
|
"mute_modal.you_wont_see_mentions": "Вы не увидите постов, которые их упоминают.",
|
||||||
"mute_modal.you_wont_see_posts": "Они по-прежнему смогут видеть ваши посты, но вы не сможете видеть их посты.",
|
"mute_modal.you_wont_see_posts": "Они по-прежнему смогут видеть ваши посты, но вы не сможете видеть их посты.",
|
||||||
"navigation_bar.about": "О проекте",
|
"navigation_bar.about": "О проекте",
|
||||||
"navigation_bar.administration": "Администрация",
|
"navigation_bar.administration": "Администрирование",
|
||||||
"navigation_bar.advanced_interface": "Включить многоколоночный интерфейс",
|
"navigation_bar.advanced_interface": "Открыть в многоколоночном интерфейсе",
|
||||||
"navigation_bar.blocks": "Заблокированные пользователи",
|
"navigation_bar.blocks": "Заблокированные пользователи",
|
||||||
"navigation_bar.bookmarks": "Закладки",
|
"navigation_bar.bookmarks": "Закладки",
|
||||||
"navigation_bar.community_timeline": "Локальная лента",
|
"navigation_bar.community_timeline": "Локальная лента",
|
||||||
|
@ -495,26 +515,29 @@
|
||||||
"navigation_bar.search": "Поиск",
|
"navigation_bar.search": "Поиск",
|
||||||
"navigation_bar.security": "Безопасность",
|
"navigation_bar.security": "Безопасность",
|
||||||
"not_signed_in_indicator.not_signed_in": "Вам нужно войти, чтобы иметь доступ к этому ресурсу.",
|
"not_signed_in_indicator.not_signed_in": "Вам нужно войти, чтобы иметь доступ к этому ресурсу.",
|
||||||
"notification.admin.report": "{name} сообщил о {target}",
|
"notification.admin.report": "{name} пожаловался на {target}",
|
||||||
"notification.admin.report_account": "{name} сообщил {count, plural, one {один пост} other {# постов}} от {target} для {category}",
|
"notification.admin.report_account": "{name} пожаловался на {count, plural, one {# пост} few {# поста} other {# постов}} от пользователя {target} по причине: {category}",
|
||||||
"notification.admin.report_account_other": "{name} сообщил {count, plural, one {одно сообщение} other {# сообщений}} от {target}",
|
"notification.admin.report_account_other": "{name} пожаловался на {count, plural, one {# пост} few {# поста} other {# постов}} от пользователя {target}",
|
||||||
"notification.admin.report_statuses": "{name} сообщил {target} для {category}",
|
"notification.admin.report_statuses": "{name} пожаловался на {target} по причине: {category}",
|
||||||
"notification.admin.report_statuses_other": "{name} сообщает {target}",
|
"notification.admin.report_statuses_other": "{name} пожаловался на {target}",
|
||||||
"notification.admin.sign_up": "{name} зарегистрирован",
|
"notification.admin.sign_up": "{name} зарегистрировался",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} и {count, plural, one {# другой} other {# другие}} подписались",
|
"notification.admin.sign_up.name_and_others": "{name} и ещё {count, plural, one {# пользователь} few {# пользователя} other {# пользователей}} зарегистрировались",
|
||||||
|
"notification.annual_report.message": "#Wrapstodon за {year} год ждёт вас! Откройте для себя итоги и памятные моменты этого года в Mastodon!",
|
||||||
|
"notification.annual_report.view": "Перейти к #Wrapstodon",
|
||||||
"notification.favourite": "{name} добавил(а) ваш пост в избранное",
|
"notification.favourite": "{name} добавил(а) ваш пост в избранное",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} и <a>{count, plural, one {# другие} other {# другие}}</a> отдали предпочтение вашему посту",
|
"notification.favourite.name_and_others_with_link": "{name} и ещё <a>{count, plural, one {# пользователь} few {# пользователя} other {# пользователей}}</a> добавили ваш пост в избранное",
|
||||||
"notification.follow": "{name} подписался (-лась) на вас",
|
"notification.follow": "{name} подписался (-лась) на вас",
|
||||||
|
"notification.follow.name_and_others": "{name} и ещё <a>{count, plural, one {# пользователь} few {# пользователя} other {# пользователей}}</a> подписались на вас",
|
||||||
"notification.follow_request": "{name} отправил запрос на подписку",
|
"notification.follow_request": "{name} отправил запрос на подписку",
|
||||||
"notification.follow_request.name_and_others": "{name} и ещё {count, plural, one {#} other {# других}} подписались на вас",
|
"notification.follow_request.name_and_others": "{name} и ещё {count, plural, one {#} other {# других}} подписались на вас",
|
||||||
"notification.label.mention": "Упоминание",
|
"notification.label.mention": "Упоминание",
|
||||||
"notification.label.private_mention": "Частное упоминание",
|
"notification.label.private_mention": "Личное упоминание",
|
||||||
"notification.label.private_reply": "Частный ответ",
|
"notification.label.private_reply": "Приватный ответ",
|
||||||
"notification.label.reply": "Ответить",
|
"notification.label.reply": "Ответ",
|
||||||
"notification.mention": "Упоминание",
|
"notification.mention": "Упоминание",
|
||||||
"notification.mentioned_you": "{name} упомянул(а) вас",
|
"notification.mentioned_you": "{name} упомянул(а) вас",
|
||||||
"notification.moderation-warning.learn_more": "Узнать больше",
|
"notification.moderation-warning.learn_more": "Узнать больше",
|
||||||
"notification.moderation_warning": "Вы получили предупреждение от модерации",
|
"notification.moderation_warning": "Модераторы вынесли вам предупреждение",
|
||||||
"notification.moderation_warning.action_delete_statuses": "Некоторые из ваших публикаций были удалены.",
|
"notification.moderation_warning.action_delete_statuses": "Некоторые из ваших публикаций были удалены.",
|
||||||
"notification.moderation_warning.action_disable": "Ваша учётная запись была отключена.",
|
"notification.moderation_warning.action_disable": "Ваша учётная запись была отключена.",
|
||||||
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Некоторые из ваших сообщений были отмечены как деликатные.",
|
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Некоторые из ваших сообщений были отмечены как деликатные.",
|
||||||
|
@ -525,7 +548,7 @@
|
||||||
"notification.own_poll": "Ваш опрос закончился",
|
"notification.own_poll": "Ваш опрос закончился",
|
||||||
"notification.poll": "Голосование, в котором вы приняли участие, завершилось",
|
"notification.poll": "Голосование, в котором вы приняли участие, завершилось",
|
||||||
"notification.reblog": "{name} продвинул(а) ваш пост",
|
"notification.reblog": "{name} продвинул(а) ваш пост",
|
||||||
"notification.reblog.name_and_others_with_link": "{name} и <a>{count, plural, one {# other} other {# others}}</a> увеличили ваш пост",
|
"notification.reblog.name_and_others_with_link": "{name} и ещё <a>{count, plural, one {# пользователь} few {# пользователя} other {# пользователей}}</a> продвинули ваш пост",
|
||||||
"notification.relationships_severance_event": "Потеряно соединение с {name}",
|
"notification.relationships_severance_event": "Потеряно соединение с {name}",
|
||||||
"notification.relationships_severance_event.account_suspension": "Администратор {from} заблокировал {target}, что означает, что вы больше не сможете получать обновления от них или взаймодествовать с ними.",
|
"notification.relationships_severance_event.account_suspension": "Администратор {from} заблокировал {target}, что означает, что вы больше не сможете получать обновления от них или взаймодествовать с ними.",
|
||||||
"notification.relationships_severance_event.domain_block": "Администратор {from} заблокировал {target} включая {followersCount} ваших подписчиков и {followingCount, plural, one {# аккаунт} few {# аккаунта} other {# аккаунтов}}, на которые вы подписаны.",
|
"notification.relationships_severance_event.domain_block": "Администратор {from} заблокировал {target} включая {followersCount} ваших подписчиков и {followingCount, plural, one {# аккаунт} few {# аккаунта} other {# аккаунтов}}, на которые вы подписаны.",
|
||||||
|
@ -534,10 +557,15 @@
|
||||||
"notification.status": "{name} только что запостил",
|
"notification.status": "{name} только что запостил",
|
||||||
"notification.update": "{name} изменил(а) пост",
|
"notification.update": "{name} изменил(а) пост",
|
||||||
"notification_requests.accept": "Принять",
|
"notification_requests.accept": "Принять",
|
||||||
|
"notification_requests.accept_multiple": "{count, plural, one {Принять # запрос…} few {Принять # запроса…} other {Принять # запросов…}}",
|
||||||
"notification_requests.confirm_accept_multiple.button": "{count, plural, one {Принять запрос} other {Принять запросы}}",
|
"notification_requests.confirm_accept_multiple.button": "{count, plural, one {Принять запрос} other {Принять запросы}}",
|
||||||
|
"notification_requests.confirm_accept_multiple.message": "Вы собираетесь принять {count, plural, one {# запрос на показ уведомлений} few {# запроса на показ уведомлений} other {# запросов на показ уведомлений}}. Продолжить?",
|
||||||
"notification_requests.confirm_accept_multiple.title": "Принимать запросы на уведомления?",
|
"notification_requests.confirm_accept_multiple.title": "Принимать запросы на уведомления?",
|
||||||
|
"notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Отклонить запрос} other {Отклонить запросы}}",
|
||||||
|
"notification_requests.confirm_dismiss_multiple.message": "Вы собираетесь отклонить {count, plural, one {# запрос на показ уведомлений} few {# запроса на показ уведомлений} other {# запросов на показ уведомлений}}. Вы не сможете просмотреть {count, plural, other {их}} потом. Продолжить?",
|
||||||
"notification_requests.confirm_dismiss_multiple.title": "Отклонять запросы на уведомления?",
|
"notification_requests.confirm_dismiss_multiple.title": "Отклонять запросы на уведомления?",
|
||||||
"notification_requests.dismiss": "Отклонить",
|
"notification_requests.dismiss": "Отклонить",
|
||||||
|
"notification_requests.dismiss_multiple": "{count, plural, one {Отклонить # запрос…} few {Отклонить # запроса…} other {Отклонить # запросов…}}",
|
||||||
"notification_requests.edit_selection": "Редактировать",
|
"notification_requests.edit_selection": "Редактировать",
|
||||||
"notification_requests.exit_selection": "Готово",
|
"notification_requests.exit_selection": "Готово",
|
||||||
"notification_requests.explainer_for_limited_account": "Уведомления от этой учетной записи были отфильтрованы, поскольку учетная запись была ограничена модератором.",
|
"notification_requests.explainer_for_limited_account": "Уведомления от этой учетной записи были отфильтрованы, поскольку учетная запись была ограничена модератором.",
|
||||||
|
@ -549,15 +577,16 @@
|
||||||
"notification_requests.view": "Просмотр уведомлений",
|
"notification_requests.view": "Просмотр уведомлений",
|
||||||
"notifications.clear": "Очистить уведомления",
|
"notifications.clear": "Очистить уведомления",
|
||||||
"notifications.clear_confirmation": "Вы уверены, что хотите очистить все уведомления?",
|
"notifications.clear_confirmation": "Вы уверены, что хотите очистить все уведомления?",
|
||||||
"notifications.clear_title": "Сбросить уведомления?",
|
"notifications.clear_title": "Очистить уведомления?",
|
||||||
"notifications.column_settings.admin.report": "Новые жалобы:",
|
"notifications.column_settings.admin.report": "Новые жалобы:",
|
||||||
"notifications.column_settings.admin.sign_up": "Новые регистрации:",
|
"notifications.column_settings.admin.sign_up": "Новые регистрации:",
|
||||||
"notifications.column_settings.alert": "Уведомления на рабочем столе",
|
"notifications.column_settings.alert": "Уведомления на рабочем столе",
|
||||||
"notifications.column_settings.favourite": "Избранные:",
|
"notifications.column_settings.favourite": "Ваш пост добавили в избранные:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Отображать все категории",
|
"notifications.column_settings.filter_bar.advanced": "Показать все категории",
|
||||||
"notifications.column_settings.filter_bar.category": "Панель сортировки",
|
"notifications.column_settings.filter_bar.category": "Панель сортировки",
|
||||||
"notifications.column_settings.follow": "У вас новый подписчик:",
|
"notifications.column_settings.follow": "У вас новый подписчик:",
|
||||||
"notifications.column_settings.follow_request": "Новые запросы на подписку:",
|
"notifications.column_settings.follow_request": "Новые запросы на подписку:",
|
||||||
|
"notifications.column_settings.group": "Группировать",
|
||||||
"notifications.column_settings.mention": "Вас упомянули в посте:",
|
"notifications.column_settings.mention": "Вас упомянули в посте:",
|
||||||
"notifications.column_settings.poll": "Опрос, в котором вы приняли участие, завершился:",
|
"notifications.column_settings.poll": "Опрос, в котором вы приняли участие, завершился:",
|
||||||
"notifications.column_settings.push": "Пуш-уведомления",
|
"notifications.column_settings.push": "Пуш-уведомления",
|
||||||
|
@ -577,31 +606,32 @@
|
||||||
"notifications.filter.statuses": "Обновления от людей, на которых вы подписаны",
|
"notifications.filter.statuses": "Обновления от людей, на которых вы подписаны",
|
||||||
"notifications.grant_permission": "Предоставить разрешение.",
|
"notifications.grant_permission": "Предоставить разрешение.",
|
||||||
"notifications.group": "{count} уведомл.",
|
"notifications.group": "{count} уведомл.",
|
||||||
"notifications.mark_as_read": "Отмечать все уведомления прочитанными",
|
"notifications.mark_as_read": "Отметить все уведомления прочитанными",
|
||||||
"notifications.permission_denied": "Уведомления на рабочем столе недоступны, так как вы запретили их отправку в браузере. Проверьте настройки для сайта, чтобы включить их обратно.",
|
"notifications.permission_denied": "Уведомления на рабочем столе недоступны, так как вы запретили их отправку в браузере. Проверьте настройки для сайта, чтобы включить их обратно.",
|
||||||
"notifications.permission_denied_alert": "Уведомления на рабочем столе недоступны, так как вы ранее отклонили запрос на их отправку.",
|
"notifications.permission_denied_alert": "Уведомления на рабочем столе недоступны, так как вы ранее отклонили запрос на их отправку.",
|
||||||
"notifications.permission_required": "Чтобы включить уведомления на рабочем столе, необходимо разрешить их в браузере.",
|
"notifications.permission_required": "Чтобы включить уведомления на рабочем столе, необходимо разрешить их в браузере.",
|
||||||
"notifications.policy.accept": "Принять",
|
"notifications.policy.accept": "Принимать",
|
||||||
"notifications.policy.accept_hint": "Показать в уведомлениях",
|
"notifications.policy.accept_hint": "Показывать в уведомлениях",
|
||||||
"notifications.policy.drop": "Игнорируем",
|
"notifications.policy.drop": "Игнорировать",
|
||||||
"notifications.policy.drop_hint": "Отправить в пустоту, чтобы никогда больше не увидеть",
|
"notifications.policy.drop_hint": "Отправлять в пустоту, чтобы никогда больше не увидеть",
|
||||||
"notifications.policy.filter": "Фильтр",
|
"notifications.policy.filter": "Фильтровать",
|
||||||
"notifications.policy.filter_hint": "Отправка в папку фильтрованных уведомлений",
|
"notifications.policy.filter_hint": "Отправлять в раздел отфильтрованных уведомлений",
|
||||||
"notifications.policy.filter_limited_accounts_hint": "Ограничено модераторами сервера",
|
"notifications.policy.filter_limited_accounts_hint": "Ограниченные модераторами сервера",
|
||||||
"notifications.policy.filter_limited_accounts_title": "Модерируемые аккаунты",
|
"notifications.policy.filter_limited_accounts_title": "Модерируемые учётные записи",
|
||||||
"notifications.policy.filter_new_accounts.hint": "Создано в течение последних {days, plural, one {один день} few {# дней} many {# дней} other {# дня}}",
|
"notifications.policy.filter_new_accounts.hint": "Созданные в течение {days, plural, one {последнего # дня} other {последних # дней}}",
|
||||||
"notifications.policy.filter_new_accounts_title": "Новые учётные записи",
|
"notifications.policy.filter_new_accounts_title": "Новые учётные записи",
|
||||||
|
"notifications.policy.filter_not_followers_hint": "Включая людей, которые подписаны на вас меньше чем {days, plural, one {# день} few {# дня} other {# дней}}",
|
||||||
"notifications.policy.filter_not_followers_title": "Люди, не подписанные на вас",
|
"notifications.policy.filter_not_followers_title": "Люди, не подписанные на вас",
|
||||||
"notifications.policy.filter_not_following_hint": "Пока вы не одобрите их вручную",
|
"notifications.policy.filter_not_following_hint": "Пока вы не одобрите их вручную",
|
||||||
"notifications.policy.filter_not_following_title": "Люди, на которых вы не подписаны",
|
"notifications.policy.filter_not_following_title": "Люди, на которых вы не подписаны",
|
||||||
"notifications.policy.filter_private_mentions_hint": "Фильтруется, если только это не ответ на ваше собственное упоминание или если вы подписаны на отправителя",
|
"notifications.policy.filter_private_mentions_hint": "Фильтруются, если только это не ответ на ваше собственное упоминание или если вы подписаны на отправителя",
|
||||||
"notifications.policy.filter_private_mentions_title": "Нежелательные личные упоминания",
|
"notifications.policy.filter_private_mentions_title": "Нежелательные личные упоминания",
|
||||||
"notifications.policy.title": "………Управлять уведомлениями от…",
|
"notifications.policy.title": "Управление уведомлениями",
|
||||||
"notifications_permission_banner.enable": "Включить уведомления",
|
"notifications_permission_banner.enable": "Включить уведомления",
|
||||||
"notifications_permission_banner.how_to_control": "Получайте уведомления даже когда Mastodon закрыт, включив уведомления на рабочем столе. А чтобы лишний шум не отвлекал, вы можете настроить какие уведомления вы хотите получать, нажав на кнопку {icon} выше.",
|
"notifications_permission_banner.how_to_control": "Получайте уведомления даже когда Mastodon закрыт, включив уведомления на рабочем столе. А чтобы лишний шум не отвлекал, вы можете настроить какие уведомления вы хотите получать, нажав на кнопку {icon} выше.",
|
||||||
"notifications_permission_banner.title": "Будьте в курсе происходящего",
|
"notifications_permission_banner.title": "Будьте в курсе происходящего",
|
||||||
"onboarding.action.back": "Вернуть меня",
|
"onboarding.action.back": "Верните меня",
|
||||||
"onboarding.actions.back": "Вернуть меня",
|
"onboarding.actions.back": "Верните меня",
|
||||||
"onboarding.actions.go_to_explore": "Посмотреть, что актуально",
|
"onboarding.actions.go_to_explore": "Посмотреть, что актуально",
|
||||||
"onboarding.actions.go_to_home": "Перейти к домашней ленте новостей",
|
"onboarding.actions.go_to_home": "Перейти к домашней ленте новостей",
|
||||||
"onboarding.compose.template": "Привет, #Mastodon!",
|
"onboarding.compose.template": "Привет, #Mastodon!",
|
||||||
|
@ -619,7 +649,7 @@
|
||||||
"onboarding.profile.title": "Настройка профиля",
|
"onboarding.profile.title": "Настройка профиля",
|
||||||
"onboarding.profile.upload_avatar": "Загрузить фотографию профиля",
|
"onboarding.profile.upload_avatar": "Загрузить фотографию профиля",
|
||||||
"onboarding.profile.upload_header": "Загрузить заголовок профиля",
|
"onboarding.profile.upload_header": "Загрузить заголовок профиля",
|
||||||
"onboarding.share.lead": "Расскажите людям, как они могут найти вас на Mastodon!",
|
"onboarding.share.lead": "Расскажите людям, как найти вас на Mastodon!",
|
||||||
"onboarding.share.message": "Я {username} на #Mastodon! Следуйте за мной по адресу {url}",
|
"onboarding.share.message": "Я {username} на #Mastodon! Следуйте за мной по адресу {url}",
|
||||||
"onboarding.share.next_steps": "Возможные дальнейшие шаги:",
|
"onboarding.share.next_steps": "Возможные дальнейшие шаги:",
|
||||||
"onboarding.share.title": "Поделиться вашим профилем",
|
"onboarding.share.title": "Поделиться вашим профилем",
|
||||||
|
@ -634,7 +664,7 @@
|
||||||
"onboarding.steps.setup_profile.title": "Настройте свой профиль",
|
"onboarding.steps.setup_profile.title": "Настройте свой профиль",
|
||||||
"onboarding.steps.share_profile.body": "Расскажите своим друзьям как найти вас на Mastodon!",
|
"onboarding.steps.share_profile.body": "Расскажите своим друзьям как найти вас на Mastodon!",
|
||||||
"onboarding.steps.share_profile.title": "Поделитесь вашим профилем",
|
"onboarding.steps.share_profile.title": "Поделитесь вашим профилем",
|
||||||
"onboarding.tips.2fa": "<strong>Знаете ли вы? </strong> Вы можете защитить свой аккаунт, настроив двухфакторную аутентификацию в настройках аккаунта. Она работает с любым приложением TOTP по вашему выбору, номер телефона не требуется!",
|
"onboarding.tips.2fa": "<strong>А вы знали? </strong> Можно защитить свой аккаунт, настроив двухфакторную аутентификацию в настройках аккаунта. Она работает с любым приложением TOTP по вашему выбору, номер телефона не нужен!",
|
||||||
"onboarding.tips.accounts_from_other_servers": "<strong>Знали ли вы? </strong> Поскольку Mastodon децентрализован, некоторые профили, с которыми вы столкнетесь, будут размещены на серверах, отличных от вашего. И все же вы можете взаимодействовать с ними без проблем! Их сервер находится во второй половине имени пользователя!",
|
"onboarding.tips.accounts_from_other_servers": "<strong>Знали ли вы? </strong> Поскольку Mastodon децентрализован, некоторые профили, с которыми вы столкнетесь, будут размещены на серверах, отличных от вашего. И все же вы можете взаимодействовать с ними без проблем! Их сервер находится во второй половине имени пользователя!",
|
||||||
"onboarding.tips.migration": "<strong>Знаете ли вы? </strong> Если вы чувствуете, что {domain} не подходит вам в качестве сервера в будущем, вы можете переехать на другой сервер Mastodon без потери своих подписчиков. Вы даже можете разместить свой собственный сервер!",
|
"onboarding.tips.migration": "<strong>Знаете ли вы? </strong> Если вы чувствуете, что {domain} не подходит вам в качестве сервера в будущем, вы можете переехать на другой сервер Mastodon без потери своих подписчиков. Вы даже можете разместить свой собственный сервер!",
|
||||||
"onboarding.tips.verification": "<strong>Знали ли вы? </strong> Вы можете подтвердить свою учетную запись, разместив ссылку на свой профиль Mastodon на собственном сайте и добавив сайт в свой профиль. Никаких сборов или документов не требуется!",
|
"onboarding.tips.verification": "<strong>Знали ли вы? </strong> Вы можете подтвердить свою учетную запись, разместив ссылку на свой профиль Mastodon на собственном сайте и добавив сайт в свой профиль. Никаких сборов или документов не требуется!",
|
||||||
|
@ -678,15 +708,15 @@
|
||||||
"relative_time.minutes": "{number} мин",
|
"relative_time.minutes": "{number} мин",
|
||||||
"relative_time.seconds": "{number} с",
|
"relative_time.seconds": "{number} с",
|
||||||
"relative_time.today": "сегодня",
|
"relative_time.today": "сегодня",
|
||||||
"reply_indicator.attachments": "{count, plural, one {# вложение} other {# вложения}}",
|
"reply_indicator.attachments": "{count, plural, one {# вложение} few {# вложения} other {# вложений}}",
|
||||||
"reply_indicator.cancel": "Отмена",
|
"reply_indicator.cancel": "Отмена",
|
||||||
"reply_indicator.poll": "Опрос",
|
"reply_indicator.poll": "Опрос",
|
||||||
"report.block": "Заблокировать",
|
"report.block": "Заблокировать",
|
||||||
"report.block_explanation": "Вы перестанете видеть посты этого пользователя, и он(а) больше не сможет подписаться на вас и читать ваши посты. Он(а) сможет понять, что вы заблокировали его/её.",
|
"report.block_explanation": "Вы перестанете видеть посты этого пользователя, и он(а) больше не сможет подписаться на вас и читать ваши посты. Он(а) сможет понять, что вы заблокировали его/её.",
|
||||||
"report.categories.legal": "Правовая информация",
|
"report.categories.legal": "Нарушение закона",
|
||||||
"report.categories.other": "Другое",
|
"report.categories.other": "Другое",
|
||||||
"report.categories.spam": "Спам",
|
"report.categories.spam": "Спам",
|
||||||
"report.categories.violation": "Содержимое нарушает одно или несколько правил узла",
|
"report.categories.violation": "Содержимое нарушает одно или несколько правил сервера",
|
||||||
"report.category.subtitle": "Выберите наиболее подходящее",
|
"report.category.subtitle": "Выберите наиболее подходящее",
|
||||||
"report.category.title": "Расскажите нам, что не так с {type}",
|
"report.category.title": "Расскажите нам, что не так с {type}",
|
||||||
"report.category.title_account": "этим профилем",
|
"report.category.title_account": "этим профилем",
|
||||||
|
@ -757,31 +787,32 @@
|
||||||
"server_banner.about_active_users": "Люди, заходившие на этот сервер за последние 30 дней (ежемесячные активные пользователи)",
|
"server_banner.about_active_users": "Люди, заходившие на этот сервер за последние 30 дней (ежемесячные активные пользователи)",
|
||||||
"server_banner.active_users": "активные пользователи",
|
"server_banner.active_users": "активные пользователи",
|
||||||
"server_banner.administered_by": "Управляется:",
|
"server_banner.administered_by": "Управляется:",
|
||||||
"server_banner.is_one_of_many": "{domain} - это один из многих независимых серверов Mastodon, которые вы можете использовать для участия в fediverse.",
|
"server_banner.is_one_of_many": "{domain} — это один из многих независимых серверов Mastodon, которые вы можете использовать для участия в сети Fediverse.",
|
||||||
"server_banner.server_stats": "Статистика сервера:",
|
"server_banner.server_stats": "Статистика сервера:",
|
||||||
"sign_in_banner.create_account": "Зарегистрироваться",
|
"sign_in_banner.create_account": "Зарегистрироваться",
|
||||||
"sign_in_banner.follow_anyone": "Следите за любым человеком в федеральной вселенной и смотрите все в хронологическом порядке. Никаких алгоритмов, рекламы или клик бейта.",
|
"sign_in_banner.follow_anyone": "Подписывайтесь на кого угодно в федивёрсе и смотрите ленту в хронологическом порядке. Никаких алгоритмов, рекламы или кликбейта.",
|
||||||
"sign_in_banner.mastodon_is": "Mastodon - лучший способ быть в курсе всего происходящего.",
|
"sign_in_banner.mastodon_is": "Mastodon — лучший способ быть в курсе всего происходящего.",
|
||||||
"sign_in_banner.sign_in": "Войти",
|
"sign_in_banner.sign_in": "Войти",
|
||||||
"sign_in_banner.sso_redirect": "Войдите или Зарегистрируйтесь",
|
"sign_in_banner.sso_redirect": "Войдите или Зарегистрируйтесь",
|
||||||
"status.admin_account": "Открыть интерфейс модератора для @{name}",
|
"status.admin_account": "Открыть интерфейс модератора для @{name}",
|
||||||
"status.admin_domain": "Открыть интерфейс модерации {domain}",
|
"status.admin_domain": "Открыть интерфейс модератора для {domain}",
|
||||||
"status.admin_status": "Открыть этот пост в интерфейсе модератора",
|
"status.admin_status": "Открыть этот пост в интерфейсе модератора",
|
||||||
"status.block": "Заблокировать @{name}",
|
"status.block": "Заблокировать @{name}",
|
||||||
"status.bookmark": "Сохранить в закладки",
|
"status.bookmark": "Добавить в закладки",
|
||||||
"status.cancel_reblog_private": "Не продвигать",
|
"status.cancel_reblog_private": "Не продвигать",
|
||||||
"status.cannot_reblog": "Этот пост не может быть продвинут",
|
"status.cannot_reblog": "Этот пост не может быть продвинут",
|
||||||
"status.continued_thread": "Продолжение темы",
|
"status.continued_thread": "Продолжение темы",
|
||||||
"status.copy": "Скопировать ссылку на пост",
|
"status.copy": "Скопировать ссылку на пост",
|
||||||
"status.delete": "Удалить",
|
"status.delete": "Удалить",
|
||||||
"status.detailed_status": "Подробный просмотр обсуждения",
|
"status.detailed_status": "Подробный просмотр обсуждения",
|
||||||
"status.direct": "Лично упоминать @{name}",
|
"status.direct": "Упомянуть @{name} лично",
|
||||||
"status.direct_indicator": "Личные упоминания",
|
"status.direct_indicator": "Личное упоминание",
|
||||||
"status.edit": "Изменить",
|
"status.edit": "Изменить",
|
||||||
"status.edited": "Дата последнего изменения: {date}",
|
"status.edited": "Дата последнего изменения: {date}",
|
||||||
"status.edited_x_times": "{count, plural, one {{count} изменение} many {{count} изменений} other {{count} изменения}}",
|
"status.edited_x_times": "{count, plural, one {{count} изменение} many {{count} изменений} other {{count} изменения}}",
|
||||||
"status.embed": "Получить код для встраивания",
|
"status.embed": "Получить код для встраивания",
|
||||||
"status.favourite": "Избранное",
|
"status.favourite": "Добавить в избранное",
|
||||||
|
"status.favourites": "{count, plural, other {в избранном}}",
|
||||||
"status.filter": "Фильтровать этот пост",
|
"status.filter": "Фильтровать этот пост",
|
||||||
"status.history.created": "{name} создал {date}",
|
"status.history.created": "{name} создал {date}",
|
||||||
"status.history.edited": "{name} отредактировал(а) {date}",
|
"status.history.edited": "{name} отредактировал(а) {date}",
|
||||||
|
@ -800,6 +831,7 @@
|
||||||
"status.reblog": "Продвинуть",
|
"status.reblog": "Продвинуть",
|
||||||
"status.reblog_private": "Продвинуть для своей аудитории",
|
"status.reblog_private": "Продвинуть для своей аудитории",
|
||||||
"status.reblogged_by": "{name} продвинул(а)",
|
"status.reblogged_by": "{name} продвинул(а)",
|
||||||
|
"status.reblogs": "{count, plural, one {boost} few {boosts} many {boosts} other {boosts}}",
|
||||||
"status.reblogs.empty": "Никто ещё не продвинул этот пост. Как только кто-то это сделает, они появятся здесь.",
|
"status.reblogs.empty": "Никто ещё не продвинул этот пост. Как только кто-то это сделает, они появятся здесь.",
|
||||||
"status.redraft": "Создать заново",
|
"status.redraft": "Создать заново",
|
||||||
"status.remove_bookmark": "Убрать из закладок",
|
"status.remove_bookmark": "Убрать из закладок",
|
||||||
|
@ -813,13 +845,13 @@
|
||||||
"status.show_less_all": "Свернуть все спойлеры в ветке",
|
"status.show_less_all": "Свернуть все спойлеры в ветке",
|
||||||
"status.show_more_all": "Развернуть все спойлеры в ветке",
|
"status.show_more_all": "Развернуть все спойлеры в ветке",
|
||||||
"status.show_original": "Показать оригинал",
|
"status.show_original": "Показать оригинал",
|
||||||
"status.title.with_attachments": "{user} размещено {attachmentCount, plural, one {вложение} other {{attachmentCount} вложений}}",
|
"status.title.with_attachments": "{user} опубликовал {attachmentCount, plural, one {{attachmentCount} вложение} few {{attachmentCount} вложения} other {{attachmentCount} вложений}}",
|
||||||
"status.translate": "Перевод",
|
"status.translate": "Перевод",
|
||||||
"status.translated_from_with": "Переведено с {lang}, используя {provider}",
|
"status.translated_from_with": "Переведено с {lang} с помощью {provider}",
|
||||||
"status.uncached_media_warning": "Прослушивание недоступно",
|
"status.uncached_media_warning": "Предварительный просмотр недоступен",
|
||||||
"status.unmute_conversation": "Не игнорировать обсуждение",
|
"status.unmute_conversation": "Не игнорировать обсуждение",
|
||||||
"status.unpin": "Открепить от профиля",
|
"status.unpin": "Открепить от профиля",
|
||||||
"subscribed_languages.lead": "Посты только на выбранных языках будут отображаться на вашей домашней странице и в списке лент после изменения. Выберите «Нет», чтобы получать посты на всех языках.",
|
"subscribed_languages.lead": "Посты лишь на выбранных языках будут появляться в вашей домашней ленте и в списках после изменения. Снимите выбор, чтобы получать посты на всех языках.",
|
||||||
"subscribed_languages.save": "Сохранить изменения",
|
"subscribed_languages.save": "Сохранить изменения",
|
||||||
"subscribed_languages.target": "Изменить языки подписки для {target}",
|
"subscribed_languages.target": "Изменить языки подписки для {target}",
|
||||||
"tabs_bar.home": "Главная",
|
"tabs_bar.home": "Главная",
|
||||||
|
@ -829,7 +861,7 @@
|
||||||
"time_remaining.minutes": "{number, plural, one {осталась # минута} few {осталось # минуты} many {осталось # минут} other {осталось # минут}}",
|
"time_remaining.minutes": "{number, plural, one {осталась # минута} few {осталось # минуты} many {осталось # минут} other {осталось # минут}}",
|
||||||
"time_remaining.moments": "остались считанные мгновения",
|
"time_remaining.moments": "остались считанные мгновения",
|
||||||
"time_remaining.seconds": "{number, plural, one {# секунда} many {# секунд} other {# секунды}}",
|
"time_remaining.seconds": "{number, plural, one {# секунда} many {# секунд} other {# секунды}}",
|
||||||
"trends.counter_by_accounts": "{count, plural, few {{counter} человека} other {{counter} человек}} за {days, plural, one {последний день} few {последние {days} дня} other {последние {days} дней}}",
|
"trends.counter_by_accounts": "{count, plural, few {{counter} человека} other {{counter} человек}} за {days, plural, one {последний {days} день} few {последние {days} дня} other {последние {days} дней}}",
|
||||||
"trends.trending_now": "Самое актуальное",
|
"trends.trending_now": "Самое актуальное",
|
||||||
"ui.beforeunload": "Ваш черновик будет утерян, если вы покинете Mastodon.",
|
"ui.beforeunload": "Ваш черновик будет утерян, если вы покинете Mastodon.",
|
||||||
"units.short.billion": "{count} млрд",
|
"units.short.billion": "{count} млрд",
|
||||||
|
@ -856,11 +888,11 @@
|
||||||
"upload_modal.detect_text": "Найти текст на картинке",
|
"upload_modal.detect_text": "Найти текст на картинке",
|
||||||
"upload_modal.edit_media": "Изменить файл",
|
"upload_modal.edit_media": "Изменить файл",
|
||||||
"upload_modal.hint": "Нажмите и перетащите круг в предпросмотре в точку фокуса, которая всегда будет видна на эскизах.",
|
"upload_modal.hint": "Нажмите и перетащите круг в предпросмотре в точку фокуса, которая всегда будет видна на эскизах.",
|
||||||
"upload_modal.preparing_ocr": "Подготовка распознования…",
|
"upload_modal.preparing_ocr": "Подготовка распознавания…",
|
||||||
"upload_modal.preview_label": "Предпросмотр ({ratio})",
|
"upload_modal.preview_label": "Предпросмотр ({ratio})",
|
||||||
"upload_progress.label": "Загрузка...",
|
"upload_progress.label": "Загрузка...",
|
||||||
"upload_progress.processing": "Обработка…",
|
"upload_progress.processing": "Обработка…",
|
||||||
"username.taken": "Данное имя пользователя уже занято. Выберите другое.",
|
"username.taken": "Это имя пользователя уже занято. Выберите другое",
|
||||||
"video.close": "Закрыть видео",
|
"video.close": "Закрыть видео",
|
||||||
"video.download": "Загрузить файл",
|
"video.download": "Загрузить файл",
|
||||||
"video.exit_fullscreen": "Покинуть полноэкранный режим",
|
"video.exit_fullscreen": "Покинуть полноэкранный режим",
|
||||||
|
|
|
@ -87,6 +87,13 @@
|
||||||
"alert.unexpected.title": "Ups!",
|
"alert.unexpected.title": "Ups!",
|
||||||
"alt_text_badge.title": "Alternatívny popis",
|
"alt_text_badge.title": "Alternatívny popis",
|
||||||
"announcement.announcement": "Oznámenie",
|
"announcement.announcement": "Oznámenie",
|
||||||
|
"annual_report.summary.followers.followers": "sledovatelia",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "najviac vyzdvihovaný príspevok",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "príspevok s najviac odpoveďami",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "najviac používaná aplikácia",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "najviac užívaný hashtag",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "nové príspevky",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Nepovieme Berniemu.",
|
||||||
"attachments_list.unprocessed": "(nespracované)",
|
"attachments_list.unprocessed": "(nespracované)",
|
||||||
"audio.hide": "Skryť zvuk",
|
"audio.hide": "Skryť zvuk",
|
||||||
"block_modal.show_less": "Zobraziť menej",
|
"block_modal.show_less": "Zobraziť menej",
|
||||||
|
@ -194,6 +201,7 @@
|
||||||
"confirmations.unfollow.title": "Prestať sledovať užívateľa?",
|
"confirmations.unfollow.title": "Prestať sledovať užívateľa?",
|
||||||
"content_warning.hide": "Skryť príspevok",
|
"content_warning.hide": "Skryť príspevok",
|
||||||
"content_warning.show": "Aj tak zobraziť",
|
"content_warning.show": "Aj tak zobraziť",
|
||||||
|
"content_warning.show_more": "Ukázať viac",
|
||||||
"conversation.delete": "Vymazať konverzáciu",
|
"conversation.delete": "Vymazať konverzáciu",
|
||||||
"conversation.mark_as_read": "Označiť ako prečítanú",
|
"conversation.mark_as_read": "Označiť ako prečítanú",
|
||||||
"conversation.open": "Zobraziť konverzáciu",
|
"conversation.open": "Zobraziť konverzáciu",
|
||||||
|
@ -344,6 +352,9 @@
|
||||||
"home.pending_critical_update.link": "Zobraziť aktualizácie",
|
"home.pending_critical_update.link": "Zobraziť aktualizácie",
|
||||||
"home.pending_critical_update.title": "Je dostupná kritická bezpečnostná aktualizácia.",
|
"home.pending_critical_update.title": "Je dostupná kritická bezpečnostná aktualizácia.",
|
||||||
"home.show_announcements": "Zobraziť oznámenia",
|
"home.show_announcements": "Zobraziť oznámenia",
|
||||||
|
"ignore_notifications_modal.filter_instead": "Radšej triediť",
|
||||||
|
"ignore_notifications_modal.filter_to_act_users": "Stále budeš môcť akceptovať, odmietnuť, alebo nahlásiť užívateľov",
|
||||||
|
"ignore_notifications_modal.filter_to_avoid_confusion": "Triedenie pomáha vyvarovať sa možnému zmäteniu",
|
||||||
"ignore_notifications_modal.ignore": "Ignoruj upozornenia",
|
"ignore_notifications_modal.ignore": "Ignoruj upozornenia",
|
||||||
"interaction_modal.description.favourite": "S účtom na Mastodone môžete tento príspevok ohviezdičkovať, tak dať autorovi vedieť, že sa vám páči, a uložiť si ho na neskôr.",
|
"interaction_modal.description.favourite": "S účtom na Mastodone môžete tento príspevok ohviezdičkovať, tak dať autorovi vedieť, že sa vám páči, a uložiť si ho na neskôr.",
|
||||||
"interaction_modal.description.follow": "S účtom na Mastodone môžete {name} sledovať a vidieť ich príspevky vo svojom domovskom kanáli.",
|
"interaction_modal.description.follow": "S účtom na Mastodone môžete {name} sledovať a vidieť ich príspevky vo svojom domovskom kanáli.",
|
||||||
|
@ -400,6 +411,7 @@
|
||||||
"lightbox.close": "Zatvoriť",
|
"lightbox.close": "Zatvoriť",
|
||||||
"lightbox.next": "Ďalej",
|
"lightbox.next": "Ďalej",
|
||||||
"lightbox.previous": "Späť",
|
"lightbox.previous": "Späť",
|
||||||
|
"lightbox.zoom_out": "Priblížiť na mieru",
|
||||||
"limited_account_hint.action": "Aj tak zobraziť profil",
|
"limited_account_hint.action": "Aj tak zobraziť profil",
|
||||||
"limited_account_hint.title": "Tento profil bol skrytý správcami servera {domain}.",
|
"limited_account_hint.title": "Tento profil bol skrytý správcami servera {domain}.",
|
||||||
"link_preview.author": "Autor: {name}",
|
"link_preview.author": "Autor: {name}",
|
||||||
|
@ -427,7 +439,11 @@
|
||||||
"mute_modal.hide_options": "Skryť možnosti",
|
"mute_modal.hide_options": "Skryť možnosti",
|
||||||
"mute_modal.indefinite": "Pokiaľ ich neodtíšim",
|
"mute_modal.indefinite": "Pokiaľ ich neodtíšim",
|
||||||
"mute_modal.show_options": "Zobraziť možnosti",
|
"mute_modal.show_options": "Zobraziť možnosti",
|
||||||
|
"mute_modal.they_can_mention_and_follow": "Môže ťa spomenúť a nasledovať, ale ty ho/ju neuvidíš.",
|
||||||
|
"mute_modal.they_wont_know": "Nebude vedieť, že bol/a stíšený/á.",
|
||||||
"mute_modal.title": "Stíšiť užívateľa?",
|
"mute_modal.title": "Stíšiť užívateľa?",
|
||||||
|
"mute_modal.you_wont_see_mentions": "Neuvidíš príspevky, ktoré ho/ju spomínajú.",
|
||||||
|
"mute_modal.you_wont_see_posts": "Stále uvidí tvoje príspevky, ale ty neuvidíš jeho/jej.",
|
||||||
"navigation_bar.about": "O tomto serveri",
|
"navigation_bar.about": "O tomto serveri",
|
||||||
"navigation_bar.administration": "Spravovanie",
|
"navigation_bar.administration": "Spravovanie",
|
||||||
"navigation_bar.advanced_interface": "Otvoriť v pokročilom webovom rozhraní",
|
"navigation_bar.advanced_interface": "Otvoriť v pokročilom webovom rozhraní",
|
||||||
|
@ -467,12 +483,15 @@
|
||||||
"notification.label.private_reply": "Súkromná odpoveď",
|
"notification.label.private_reply": "Súkromná odpoveď",
|
||||||
"notification.label.reply": "Odpoveď",
|
"notification.label.reply": "Odpoveď",
|
||||||
"notification.mention": "Zmienka",
|
"notification.mention": "Zmienka",
|
||||||
|
"notification.mentioned_you": "{name} ťa spomenul/a",
|
||||||
"notification.moderation-warning.learn_more": "Zisti viac",
|
"notification.moderation-warning.learn_more": "Zisti viac",
|
||||||
|
"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_silence": "Tvoj účet bol obmedzený.",
|
"notification.moderation_warning.action_silence": "Tvoj účet bol obmedzený.",
|
||||||
"notification.moderation_warning.action_suspend": "Tvoj účet bol pozastavený.",
|
"notification.moderation_warning.action_suspend": "Tvoj účet bol pozastavený.",
|
||||||
"notification.own_poll": "Vaša anketa sa skončila",
|
"notification.own_poll": "Vaša anketa sa skončila",
|
||||||
|
"notification.poll": "Anketa, v ktorej si hlasoval/a, skončila",
|
||||||
"notification.reblog": "{name} zdieľa váš príspevok",
|
"notification.reblog": "{name} zdieľa váš príspevok",
|
||||||
"notification.relationships_severance_event": "Stratené prepojenia s {name}",
|
"notification.relationships_severance_event": "Stratené prepojenia s {name}",
|
||||||
"notification.relationships_severance_event.account_suspension": "Správca z {from} pozastavil/a {target}, čo znamená, že od nich viac nemôžeš dostávať aktualizácie, alebo s nimi interaktovať.",
|
"notification.relationships_severance_event.account_suspension": "Správca z {from} pozastavil/a {target}, čo znamená, že od nich viac nemôžeš dostávať aktualizácie, alebo s nimi interaktovať.",
|
||||||
|
@ -484,7 +503,7 @@
|
||||||
"notification_requests.edit_selection": "Uprav",
|
"notification_requests.edit_selection": "Uprav",
|
||||||
"notification_requests.exit_selection": "Hotovo",
|
"notification_requests.exit_selection": "Hotovo",
|
||||||
"notification_requests.notifications_from": "Oboznámenia od {name}",
|
"notification_requests.notifications_from": "Oboznámenia od {name}",
|
||||||
"notification_requests.title": "Filtrované oboznámenia",
|
"notification_requests.title": "Filtrované oznámenia",
|
||||||
"notification_requests.view": "Zobraz upozornenia",
|
"notification_requests.view": "Zobraz upozornenia",
|
||||||
"notifications.clear": "Vyčistiť upozornenia",
|
"notifications.clear": "Vyčistiť upozornenia",
|
||||||
"notifications.clear_confirmation": "Určite chcete nenávratne odstrániť všetky svoje upozornenia?",
|
"notifications.clear_confirmation": "Určite chcete nenávratne odstrániť všetky svoje upozornenia?",
|
||||||
|
@ -519,6 +538,8 @@
|
||||||
"notifications.permission_denied": "Upozornenia na ploche sú nedostupné pre už skôr zamietnutú požiadavku prehliadača",
|
"notifications.permission_denied": "Upozornenia na ploche sú nedostupné pre už skôr zamietnutú požiadavku prehliadača",
|
||||||
"notifications.permission_denied_alert": "Upozornenia na ploche nemôžu byť zapnuté, pretože požiadavka prehliadača bola už skôr zamietnutá",
|
"notifications.permission_denied_alert": "Upozornenia na ploche nemôžu byť zapnuté, pretože požiadavka prehliadača bola už skôr zamietnutá",
|
||||||
"notifications.permission_required": "Upozornenia na ploche sú nedostupné, pretože neboli udelené potrebné povolenia.",
|
"notifications.permission_required": "Upozornenia na ploche sú nedostupné, pretože neboli udelené potrebné povolenia.",
|
||||||
|
"notifications.policy.accept": "Prijať",
|
||||||
|
"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_title": "Moderované účty",
|
"notifications.policy.filter_limited_accounts_title": "Moderované účty",
|
||||||
|
@ -526,6 +547,7 @@
|
||||||
"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_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_permission_banner.enable": "Povoliť upozornenia na ploche",
|
"notifications_permission_banner.enable": "Povoliť upozornenia na ploche",
|
||||||
"notifications_permission_banner.how_to_control": "Ak chcete dostávať upozornenia, keď Mastodon nie je otvorený, povoľte upozornenia na ploche. Po ich zapnutí môžete presne kontrolovať, ktoré typy interakcií generujú upozornenia na ploche, a to prostredníctvom tlačidla {icon} vyššie.",
|
"notifications_permission_banner.how_to_control": "Ak chcete dostávať upozornenia, keď Mastodon nie je otvorený, povoľte upozornenia na ploche. Po ich zapnutí môžete presne kontrolovať, ktoré typy interakcií generujú upozornenia na ploche, a to prostredníctvom tlačidla {icon} vyššie.",
|
||||||
"notifications_permission_banner.title": "Nenechajte si nič ujsť",
|
"notifications_permission_banner.title": "Nenechajte si nič ujsť",
|
||||||
|
@ -696,6 +718,7 @@
|
||||||
"status.bookmark": "Pridať záložku",
|
"status.bookmark": "Pridať záložku",
|
||||||
"status.cancel_reblog_private": "Zrušiť zdieľanie",
|
"status.cancel_reblog_private": "Zrušiť zdieľanie",
|
||||||
"status.cannot_reblog": "Tento príspevok nie je možné zdieľať",
|
"status.cannot_reblog": "Tento príspevok nie je možné zdieľať",
|
||||||
|
"status.continued_thread": "Pokračujúce vlákno",
|
||||||
"status.copy": "Kopírovať odkaz na príspevok",
|
"status.copy": "Kopírovať odkaz na príspevok",
|
||||||
"status.delete": "Vymazať",
|
"status.delete": "Vymazať",
|
||||||
"status.detailed_status": "Podrobný náhľad celej konverzácie",
|
"status.detailed_status": "Podrobný náhľad celej konverzácie",
|
||||||
|
|
|
@ -87,6 +87,19 @@
|
||||||
"alert.unexpected.title": "Hëm!",
|
"alert.unexpected.title": "Hëm!",
|
||||||
"alt_text_badge.title": "Tekst alternativ",
|
"alt_text_badge.title": "Tekst alternativ",
|
||||||
"announcement.announcement": "Lajmërim",
|
"announcement.announcement": "Lajmërim",
|
||||||
|
"annual_report.summary.followers.followers": "ndjekës",
|
||||||
|
"annual_report.summary.followers.total": "{count} gjithsej",
|
||||||
|
"annual_report.summary.here_it_is": "Ja {year} juaj e shqyrtuar:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "potimi më i parapëlqyer",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "postimi me më shumë përforcime",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "postimi me më tepër përgjigje",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "nga {name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "aplikacioni më i përdorur",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "hashtag-u më i përdorur",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "postime të reja",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Kjo ju vë në krye</topLabel><percentage></percentage><bottomLabel>të përdoruesve të Mastodon-it.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Nuk do t’ia themi Bernit.",
|
||||||
|
"annual_report.summary.thanks": "Faleminderit që jeni pjesë e Mastodon-it!",
|
||||||
"attachments_list.unprocessed": "(e papërpunuar)",
|
"attachments_list.unprocessed": "(e papërpunuar)",
|
||||||
"audio.hide": "Fshihe audion",
|
"audio.hide": "Fshihe audion",
|
||||||
"block_modal.remote_users_caveat": "Do t’i kërkojmë shërbyesit {domain} të respektojë vendimin tuaj. Por, pajtimi s’është i garantuar, ngaqë disa shërbyes mund t’i trajtojnë ndryshe bllokimet. Psotimet publike mundet të jenë ende të dukshme për përdorues pa bërë hyrje në llogari.",
|
"block_modal.remote_users_caveat": "Do t’i kërkojmë shërbyesit {domain} të respektojë vendimin tuaj. Por, pajtimi s’është i garantuar, ngaqë disa shërbyes mund t’i trajtojnë ndryshe bllokimet. Psotimet publike mundet të jenë ende të dukshme për përdorues pa bërë hyrje në llogari.",
|
||||||
|
@ -508,6 +521,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} raportoi {target}",
|
"notification.admin.report_statuses_other": "{name} raportoi {target}",
|
||||||
"notification.admin.sign_up": "{name} u regjistrua",
|
"notification.admin.sign_up": "{name} u regjistrua",
|
||||||
"notification.admin.sign_up.name_and_others": "U regjistrua {name} dhe {count, plural, one {# tjetër} other {# të tjerë}}",
|
"notification.admin.sign_up.name_and_others": "U regjistrua {name} dhe {count, plural, one {# tjetër} other {# të tjerë}}",
|
||||||
|
"notification.annual_report.message": "#Wrapstodon juaj për {year} pret! Zbuloni pikat e theksuara dhe çastet e paharrueshëm të këtij viti për ju në Mastodon!",
|
||||||
|
"notification.annual_report.view": "Shihni #Wrapstodon",
|
||||||
"notification.favourite": "{name} i vuri shenjë postimit tuaj si të parapëlqyer",
|
"notification.favourite": "{name} i vuri shenjë postimit tuaj si të parapëlqyer",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} dhe <a>{count, plural, one {# tjetër} other {# të tjerë}}</a> i vunë shenjë postimit tuaj si të parapëlqyer",
|
"notification.favourite.name_and_others_with_link": "{name} dhe <a>{count, plural, one {# tjetër} other {# të tjerë}}</a> i vunë shenjë postimit tuaj si të parapëlqyer",
|
||||||
"notification.follow": "{name} zuri t’ju ndjekë",
|
"notification.follow": "{name} zuri t’ju ndjekë",
|
||||||
|
|
|
@ -82,11 +82,29 @@
|
||||||
"admin.impact_report.instance_follows": "Följare som deras användare skulle förlora",
|
"admin.impact_report.instance_follows": "Följare som deras användare skulle förlora",
|
||||||
"admin.impact_report.title": "Sammanfattning av påverkan",
|
"admin.impact_report.title": "Sammanfattning av påverkan",
|
||||||
"alert.rate_limited.message": "Vänligen försök igen efter {retry_time, time, medium}.",
|
"alert.rate_limited.message": "Vänligen försök igen efter {retry_time, time, medium}.",
|
||||||
"alert.rate_limited.title": "Mängd begränsad",
|
"alert.rate_limited.title": "Hastighetsbegränsad",
|
||||||
"alert.unexpected.message": "Ett oväntat fel uppstod.",
|
"alert.unexpected.message": "Ett oväntat fel uppstod.",
|
||||||
"alert.unexpected.title": "Hoppsan!",
|
"alert.unexpected.title": "Hoppsan!",
|
||||||
"alt_text_badge.title": "Alt-Text",
|
"alt_text_badge.title": "Alt-Text",
|
||||||
"announcement.announcement": "Meddelande",
|
"announcement.announcement": "Meddelande",
|
||||||
|
"annual_report.summary.archetype.booster": "Häftighetsjägaren",
|
||||||
|
"annual_report.summary.archetype.lurker": "Smygaren",
|
||||||
|
"annual_report.summary.archetype.oracle": "Oraklet",
|
||||||
|
"annual_report.summary.archetype.pollster": "Frågaren",
|
||||||
|
"annual_report.summary.archetype.replier": "Den sociala fjärilen",
|
||||||
|
"annual_report.summary.followers.followers": "följare",
|
||||||
|
"annual_report.summary.followers.total": "{count} totalt",
|
||||||
|
"annual_report.summary.here_it_is": "Här är en tillbakablick på ditt {year}:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "mest favoritmarkerat inlägg",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "mest boostat inlägg",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "inlägg med flest svar",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}s",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "mest använda app",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "mest använda hashtag",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "nya inlägg",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Det placerar dig i topp</topLabel><percentage></percentage><bottomLabel>av Mastodon-användare.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Vi berättar inte för Bernie.",
|
||||||
|
"annual_report.summary.thanks": "Tack för att du är en del av Mastodon!",
|
||||||
"attachments_list.unprocessed": "(obehandlad)",
|
"attachments_list.unprocessed": "(obehandlad)",
|
||||||
"audio.hide": "Dölj audio",
|
"audio.hide": "Dölj audio",
|
||||||
"block_modal.remote_users_caveat": "Vi kommer att be servern {domain} att respektera ditt beslut. Dock garanteras inte efterlevnad eftersom vissa servrar kan hantera blockeringar på olika sätt. Offentliga inlägg kan fortfarande vara synliga för icke-inloggade användare.",
|
"block_modal.remote_users_caveat": "Vi kommer att be servern {domain} att respektera ditt beslut. Dock garanteras inte efterlevnad eftersom vissa servrar kan hantera blockeringar på olika sätt. Offentliga inlägg kan fortfarande vara synliga för icke-inloggade användare.",
|
||||||
|
@ -271,7 +289,7 @@
|
||||||
"empty_column.follow_requests": "Du har inga följarförfrågningar än. När du får en kommer den visas här.",
|
"empty_column.follow_requests": "Du har inga följarförfrågningar än. När du får en kommer den visas här.",
|
||||||
"empty_column.followed_tags": "Du följer inga hashtaggar ännu. När du gör det kommer de att dyka upp här.",
|
"empty_column.followed_tags": "Du följer inga hashtaggar ännu. När du gör det kommer de att dyka upp här.",
|
||||||
"empty_column.hashtag": "Det finns inget i denna hashtag ännu.",
|
"empty_column.hashtag": "Det finns inget i denna hashtag ännu.",
|
||||||
"empty_column.home": "Din hemma-tidslinje är tom! Följ fler användare för att fylla den. {suggestions}",
|
"empty_column.home": "Din hemma-tidslinje är tom! Följ fler användare för att fylla den.",
|
||||||
"empty_column.list": "Det finns inget i denna lista än. När listmedlemmar publicerar nya inlägg kommer de synas här.",
|
"empty_column.list": "Det finns inget i denna lista än. När listmedlemmar publicerar nya inlägg kommer de synas här.",
|
||||||
"empty_column.lists": "Du har inga listor än. När skapar en kommer den dyka upp här.",
|
"empty_column.lists": "Du har inga listor än. När skapar en kommer den dyka upp här.",
|
||||||
"empty_column.mutes": "Du har ännu inte tystat några användare.",
|
"empty_column.mutes": "Du har ännu inte tystat några användare.",
|
||||||
|
@ -383,7 +401,7 @@
|
||||||
"ignore_notifications_modal.not_following_title": "Vill du blockera aviseringar från personer som du inte följer dig?",
|
"ignore_notifications_modal.not_following_title": "Vill du blockera aviseringar från personer som du inte följer dig?",
|
||||||
"ignore_notifications_modal.private_mentions_title": "Vill du ignorera aviseringar från oönskade privata omnämningar?",
|
"ignore_notifications_modal.private_mentions_title": "Vill du ignorera aviseringar från oönskade privata omnämningar?",
|
||||||
"interaction_modal.description.favourite": "Med ett Mastodon-konto kan du favoritmarkera detta inlägg för att visa författaren att du gillar det och för att spara det till senare.",
|
"interaction_modal.description.favourite": "Med ett Mastodon-konto kan du favoritmarkera detta inlägg för att visa författaren att du gillar det och för att spara det till senare.",
|
||||||
"interaction_modal.description.follow": "Med ett Mastodon-konto kan du följa {name} för att se hens inlägg i ditt hemflöde.",
|
"interaction_modal.description.follow": "Med ett Mastodon-konto kan du följa {name} för att se deras inlägg i ditt hemflöde.",
|
||||||
"interaction_modal.description.reblog": "Med ett Mastodon-konto kan du boosta detta inlägg för att dela den med dina egna följare.",
|
"interaction_modal.description.reblog": "Med ett Mastodon-konto kan du boosta detta inlägg för att dela den med dina egna följare.",
|
||||||
"interaction_modal.description.reply": "Med ett Mastodon-konto kan du svara på detta inlägg.",
|
"interaction_modal.description.reply": "Med ett Mastodon-konto kan du svara på detta inlägg.",
|
||||||
"interaction_modal.description.vote": "Med ett konto på Mastodon kan du delta i denna omröstning.",
|
"interaction_modal.description.vote": "Med ett konto på Mastodon kan du delta i denna omröstning.",
|
||||||
|
@ -405,11 +423,11 @@
|
||||||
"keyboard_shortcuts.back": "Gå bakåt",
|
"keyboard_shortcuts.back": "Gå bakåt",
|
||||||
"keyboard_shortcuts.blocked": "Öppna listan över blockerade användare",
|
"keyboard_shortcuts.blocked": "Öppna listan över blockerade användare",
|
||||||
"keyboard_shortcuts.boost": "Boosta inlägg",
|
"keyboard_shortcuts.boost": "Boosta inlägg",
|
||||||
"keyboard_shortcuts.column": "för att fokusera en status i en av kolumnerna",
|
"keyboard_shortcuts.column": "Fokusera kolumn",
|
||||||
"keyboard_shortcuts.compose": "för att fokusera skrivfältet",
|
"keyboard_shortcuts.compose": "för att fokusera skrivfältet",
|
||||||
"keyboard_shortcuts.description": "Beskrivning",
|
"keyboard_shortcuts.description": "Beskrivning",
|
||||||
"keyboard_shortcuts.direct": "för att öppna privata nämningskolumnen",
|
"keyboard_shortcuts.direct": "för att öppna privata nämningskolumnen",
|
||||||
"keyboard_shortcuts.down": "för att flytta nedåt i listan",
|
"keyboard_shortcuts.down": "Flytta ner i listan",
|
||||||
"keyboard_shortcuts.enter": "Öppna inlägg",
|
"keyboard_shortcuts.enter": "Öppna inlägg",
|
||||||
"keyboard_shortcuts.favourite": "Favoritmarkera inlägg",
|
"keyboard_shortcuts.favourite": "Favoritmarkera inlägg",
|
||||||
"keyboard_shortcuts.favourites": "Öppna favoritlistan",
|
"keyboard_shortcuts.favourites": "Öppna favoritlistan",
|
||||||
|
@ -429,13 +447,13 @@
|
||||||
"keyboard_shortcuts.reply": "Svara på inlägg",
|
"keyboard_shortcuts.reply": "Svara på inlägg",
|
||||||
"keyboard_shortcuts.requests": "för att öppna Följförfrågningar",
|
"keyboard_shortcuts.requests": "för att öppna Följförfrågningar",
|
||||||
"keyboard_shortcuts.search": "för att fokusera sökfältet",
|
"keyboard_shortcuts.search": "för att fokusera sökfältet",
|
||||||
"keyboard_shortcuts.spoilers": "visa/dölja CW-fält",
|
"keyboard_shortcuts.spoilers": "Visa/dölja CW-fält",
|
||||||
"keyboard_shortcuts.start": "för att öppna \"Kom igång\"-kolumnen",
|
"keyboard_shortcuts.start": "Öppna \"Kom igång\"-kolumnen",
|
||||||
"keyboard_shortcuts.toggle_hidden": "för att visa/gömma text bakom CW",
|
"keyboard_shortcuts.toggle_hidden": "Visa/gömma text bakom CW",
|
||||||
"keyboard_shortcuts.toggle_sensitivity": "för att visa/gömma media",
|
"keyboard_shortcuts.toggle_sensitivity": "Visa/gömma media",
|
||||||
"keyboard_shortcuts.toot": "Starta nytt inlägg",
|
"keyboard_shortcuts.toot": "Starta nytt inlägg",
|
||||||
"keyboard_shortcuts.unfocus": "för att avfokusera skrivfält/sökfält",
|
"keyboard_shortcuts.unfocus": "Avfokusera skrivfält/sökfält",
|
||||||
"keyboard_shortcuts.up": "för att flytta uppåt i listan",
|
"keyboard_shortcuts.up": "Flytta uppåt i listan",
|
||||||
"lightbox.close": "Stäng",
|
"lightbox.close": "Stäng",
|
||||||
"lightbox.next": "Nästa",
|
"lightbox.next": "Nästa",
|
||||||
"lightbox.previous": "Tidigare",
|
"lightbox.previous": "Tidigare",
|
||||||
|
@ -508,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} rapporterade {target}",
|
"notification.admin.report_statuses_other": "{name} rapporterade {target}",
|
||||||
"notification.admin.sign_up": "{name} registrerade sig",
|
"notification.admin.sign_up": "{name} registrerade sig",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} och {count, plural, one {# en annan} other {# andra}} har registrerat sig",
|
"notification.admin.sign_up.name_and_others": "{name} och {count, plural, one {# en annan} other {# andra}} har registrerat sig",
|
||||||
|
"notification.annual_report.message": "Din {year} #Wrapstodon väntar! Upptäck ditt års höjdpunkter och minnesvärda stunder på Mastodon!",
|
||||||
|
"notification.annual_report.view": "Visa #Wrapstodon",
|
||||||
"notification.favourite": "{name} favoritmarkerade ditt inlägg",
|
"notification.favourite": "{name} favoritmarkerade ditt inlägg",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} och <a>{count, plural, one {# annan} other {# andra}}</a> har favoritmarkerat ditt inlägg",
|
"notification.favourite.name_and_others_with_link": "{name} och <a>{count, plural, one {# annan} other {# andra}}</a> har favoritmarkerat ditt inlägg",
|
||||||
"notification.follow": "{name} följer dig",
|
"notification.follow": "{name} följer dig",
|
||||||
|
@ -617,11 +637,11 @@
|
||||||
"onboarding.action.back": "Ta mig tillbaka",
|
"onboarding.action.back": "Ta mig tillbaka",
|
||||||
"onboarding.actions.back": "Ta mig tillbaka",
|
"onboarding.actions.back": "Ta mig tillbaka",
|
||||||
"onboarding.actions.go_to_explore": "See what's trending",
|
"onboarding.actions.go_to_explore": "See what's trending",
|
||||||
"onboarding.actions.go_to_home": "Go to your home feed",
|
"onboarding.actions.go_to_home": "Ta mig till mitt hemflöde",
|
||||||
"onboarding.compose.template": "Hallå #Mastodon!",
|
"onboarding.compose.template": "Hallå #Mastodon!",
|
||||||
"onboarding.follows.empty": "Tyvärr kan inga resultat visas just nu. Du kan prova att använda sökfunktionen eller utforska sidan för att hitta personer att följa, eller försök igen senare.",
|
"onboarding.follows.empty": "Tyvärr kan inga resultat visas just nu. Du kan prova att använda sökfunktionen eller utforska sidan för att hitta personer att följa, eller försök igen senare.",
|
||||||
"onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!",
|
"onboarding.follows.lead": "Ditt hemflöde är det primära sättet att uppleva Mastodon. Ju fler människor du följer, desto mer aktiv och intressant blir det. För att komma igång, är här några förslag:",
|
||||||
"onboarding.follows.title": "Popular on Mastodon",
|
"onboarding.follows.title": "Anpassa ditt hemflöde",
|
||||||
"onboarding.profile.discoverable": "Gör min profil upptäckbar",
|
"onboarding.profile.discoverable": "Gör min profil upptäckbar",
|
||||||
"onboarding.profile.discoverable_hint": "När du väljer att vara upptäckbar på Mastodon kan dina inlägg visas i sök- och trendresultat, och din profil kan föreslås för personer med liknande intressen som du.",
|
"onboarding.profile.discoverable_hint": "När du väljer att vara upptäckbar på Mastodon kan dina inlägg visas i sök- och trendresultat, och din profil kan föreslås för personer med liknande intressen som du.",
|
||||||
"onboarding.profile.display_name": "Visningsnamn",
|
"onboarding.profile.display_name": "Visningsnamn",
|
||||||
|
@ -642,7 +662,7 @@
|
||||||
"onboarding.start.title": "Du klarade det!",
|
"onboarding.start.title": "Du klarade det!",
|
||||||
"onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.",
|
"onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.",
|
||||||
"onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}",
|
"onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}",
|
||||||
"onboarding.steps.publish_status.body": "Say hello to the world.",
|
"onboarding.steps.publish_status.body": "Säg hej till världen med text, foton, videor eller omröstningar {emoji}",
|
||||||
"onboarding.steps.publish_status.title": "Gör ditt första inlägg",
|
"onboarding.steps.publish_status.title": "Gör ditt första inlägg",
|
||||||
"onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.",
|
"onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.",
|
||||||
"onboarding.steps.setup_profile.title": "Customize your profile",
|
"onboarding.steps.setup_profile.title": "Customize your profile",
|
||||||
|
@ -733,8 +753,8 @@
|
||||||
"report.thanks.take_action_actionable": "Medan vi granskar detta kan du vidta åtgärder mot {name}:",
|
"report.thanks.take_action_actionable": "Medan vi granskar detta kan du vidta åtgärder mot {name}:",
|
||||||
"report.thanks.title": "Vill du inte se det här?",
|
"report.thanks.title": "Vill du inte se det här?",
|
||||||
"report.thanks.title_actionable": "Tack för att du rapporterar, vi kommer att titta på detta.",
|
"report.thanks.title_actionable": "Tack för att du rapporterar, vi kommer att titta på detta.",
|
||||||
"report.unfollow": "Sluta följ @{username}",
|
"report.unfollow": "Sluta följ @{name}",
|
||||||
"report.unfollow_explanation": "Du följer detta konto. Avfölj hen för att inte se hens inlägg i ditt hemflöde.",
|
"report.unfollow_explanation": "Du följer detta konto. Avfölj det för att inte se dess inlägg i ditt hemflöde.",
|
||||||
"report_notification.attached_statuses": "bifogade {count, plural, one {{count} inlägg} other {{count} inlägg}}",
|
"report_notification.attached_statuses": "bifogade {count, plural, one {{count} inlägg} other {{count} inlägg}}",
|
||||||
"report_notification.categories.legal": "Rättsligt",
|
"report_notification.categories.legal": "Rättsligt",
|
||||||
"report_notification.categories.legal_sentence": "olagligt innehåll",
|
"report_notification.categories.legal_sentence": "olagligt innehåll",
|
||||||
|
@ -829,7 +849,7 @@
|
||||||
"status.show_less_all": "Visa mindre för alla",
|
"status.show_less_all": "Visa mindre för alla",
|
||||||
"status.show_more_all": "Visa mer för alla",
|
"status.show_more_all": "Visa mer för alla",
|
||||||
"status.show_original": "Visa original",
|
"status.show_original": "Visa original",
|
||||||
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
|
"status.title.with_attachments": "{user} lade upp {attachmentCount, plural, one {en bilaga} other {{attachmentCount} bilagor}}",
|
||||||
"status.translate": "Översätt",
|
"status.translate": "Översätt",
|
||||||
"status.translated_from_with": "Översatt från {lang} med {provider}",
|
"status.translated_from_with": "Översatt från {lang} med {provider}",
|
||||||
"status.uncached_media_warning": "Förhandsvisning inte tillgänglig",
|
"status.uncached_media_warning": "Förhandsvisning inte tillgänglig",
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
"account.joined_short": "เข้าร่วมเมื่อ",
|
"account.joined_short": "เข้าร่วมเมื่อ",
|
||||||
"account.languages": "เปลี่ยนภาษาที่บอกรับ",
|
"account.languages": "เปลี่ยนภาษาที่บอกรับ",
|
||||||
"account.link_verified_on": "ตรวจสอบความเป็นเจ้าของของลิงก์นี้เมื่อ {date}",
|
"account.link_verified_on": "ตรวจสอบความเป็นเจ้าของของลิงก์นี้เมื่อ {date}",
|
||||||
"account.locked_info": "สถานะความเป็นส่วนตัวของบัญชีนี้ถูกตั้งค่าเป็นล็อค เจ้าของตรวจสอบด้วยตนเองว่าใครสามารถติดตามพวกเขาได้",
|
"account.locked_info": "มีการตั้งสถานะความเป็นส่วนตัวของบัญชีนี้เป็นล็อคอยู่ เจ้าของตรวจทานผู้ที่สามารถติดตามเขาด้วยตนเอง",
|
||||||
"account.media": "สื่อ",
|
"account.media": "สื่อ",
|
||||||
"account.mention": "กล่าวถึง @{name}",
|
"account.mention": "กล่าวถึง @{name}",
|
||||||
"account.moved_to": "{name} ได้ระบุว่าบัญชีใหม่ของเขาในตอนนี้คือ:",
|
"account.moved_to": "{name} ได้ระบุว่าบัญชีใหม่ของเขาในตอนนี้คือ:",
|
||||||
|
@ -97,7 +97,7 @@
|
||||||
"block_modal.they_will_know": "เขาสามารถเห็นว่ามีการปิดกั้นเขา",
|
"block_modal.they_will_know": "เขาสามารถเห็นว่ามีการปิดกั้นเขา",
|
||||||
"block_modal.title": "ปิดกั้นผู้ใช้?",
|
"block_modal.title": "ปิดกั้นผู้ใช้?",
|
||||||
"block_modal.you_wont_see_mentions": "คุณจะไม่เห็นโพสต์ที่กล่าวถึงเขา",
|
"block_modal.you_wont_see_mentions": "คุณจะไม่เห็นโพสต์ที่กล่าวถึงเขา",
|
||||||
"boost_modal.combo": "คุณสามารถกด {combo} เพื่อข้ามสิ่งนี้ในครั้งถัดไป",
|
"boost_modal.combo": "คุณสามารถกดปุ่ม {combo} เพื่อข้ามสิ่งนี้ในครั้งถัดไป",
|
||||||
"boost_modal.reblog": "ดันโพสต์?",
|
"boost_modal.reblog": "ดันโพสต์?",
|
||||||
"boost_modal.undo_reblog": "เลิกดันโพสต์?",
|
"boost_modal.undo_reblog": "เลิกดันโพสต์?",
|
||||||
"bundle_column_error.copy_stacktrace": "คัดลอกรายงานข้อผิดพลาด",
|
"bundle_column_error.copy_stacktrace": "คัดลอกรายงานข้อผิดพลาด",
|
||||||
|
@ -386,6 +386,7 @@
|
||||||
"interaction_modal.description.follow": "ด้วยบัญชีใน Mastodon คุณสามารถติดตาม {name} เพื่อรับโพสต์ของเขาในฟีดหน้าแรกของคุณ",
|
"interaction_modal.description.follow": "ด้วยบัญชีใน Mastodon คุณสามารถติดตาม {name} เพื่อรับโพสต์ของเขาในฟีดหน้าแรกของคุณ",
|
||||||
"interaction_modal.description.reblog": "ด้วยบัญชีใน Mastodon คุณสามารถดันโพสต์นี้เพื่อแชร์โพสต์กับผู้ติดตามของคุณเอง",
|
"interaction_modal.description.reblog": "ด้วยบัญชีใน Mastodon คุณสามารถดันโพสต์นี้เพื่อแชร์โพสต์กับผู้ติดตามของคุณเอง",
|
||||||
"interaction_modal.description.reply": "ด้วยบัญชีใน Mastodon คุณสามารถตอบกลับโพสต์นี้",
|
"interaction_modal.description.reply": "ด้วยบัญชีใน Mastodon คุณสามารถตอบกลับโพสต์นี้",
|
||||||
|
"interaction_modal.description.vote": "ด้วยบัญชีใน Mastodon คุณสามารถลงคะแนนในการสำรวจความคิดเห็นนี้",
|
||||||
"interaction_modal.login.action": "นำฉันกลับบ้าน",
|
"interaction_modal.login.action": "นำฉันกลับบ้าน",
|
||||||
"interaction_modal.login.prompt": "โดเมนของเซิร์ฟเวอร์บ้านของคุณ เช่น mastodon.social",
|
"interaction_modal.login.prompt": "โดเมนของเซิร์ฟเวอร์บ้านของคุณ เช่น mastodon.social",
|
||||||
"interaction_modal.no_account_yet": "ไม่ได้อยู่ใน Mastodon?",
|
"interaction_modal.no_account_yet": "ไม่ได้อยู่ใน Mastodon?",
|
||||||
|
@ -397,6 +398,7 @@
|
||||||
"interaction_modal.title.follow": "ติดตาม {name}",
|
"interaction_modal.title.follow": "ติดตาม {name}",
|
||||||
"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}",
|
||||||
"intervals.full.days": "{number, plural, other {# วัน}}",
|
"intervals.full.days": "{number, plural, other {# วัน}}",
|
||||||
"intervals.full.hours": "{number, plural, other {# ชั่วโมง}}",
|
"intervals.full.hours": "{number, plural, other {# ชั่วโมง}}",
|
||||||
"intervals.full.minutes": "{number, plural, other {# นาที}}",
|
"intervals.full.minutes": "{number, plural, other {# นาที}}",
|
||||||
|
@ -855,11 +857,11 @@
|
||||||
"upload_error.poll": "ไม่อนุญาตการอัปโหลดไฟล์โดยมีการสำรวจความคิดเห็น",
|
"upload_error.poll": "ไม่อนุญาตการอัปโหลดไฟล์โดยมีการสำรวจความคิดเห็น",
|
||||||
"upload_form.audio_description": "อธิบายสำหรับผู้ที่สูญเสียการได้ยิน",
|
"upload_form.audio_description": "อธิบายสำหรับผู้ที่สูญเสียการได้ยิน",
|
||||||
"upload_form.description": "อธิบายสำหรับผู้คนที่พิการทางการมองเห็นหรือมีสายตาเลือนราง",
|
"upload_form.description": "อธิบายสำหรับผู้คนที่พิการทางการมองเห็นหรือมีสายตาเลือนราง",
|
||||||
"upload_form.drag_and_drop.instructions": "หากต้องการเลือกไฟล์สื่อ ให้กดปุ่มที Space หรือ Enter บนแป้นพิมพ์ เมื่อเลือกไฟล์ได้แล้ว ก็สามารถใช้ปุ่มลูกศรเพื่อเลื่อนไฟล์ไปในทิศทางที่ต้องการได้ เมื่อต้องการวางไฟล์ในตำแหน่งใหม่ ให้กดปุ่ม Space หรือ Enter ดูอีกครั้ง หรือหากต้องการยกเลิกการเลือก ให้กดปุ่ม Esc ได้",
|
"upload_form.drag_and_drop.instructions": "เพื่อหยิบไฟล์แนบสื่อ กดปุ่มเว้นวรรคหรือขึ้นบรรทัดใหม่ ขณะลาก ใช้ปุ่มลูกศรเพื่อย้ายไฟล์แนบสื่อในทิศทางใดก็ตามที่กำหนด กดปุ่มเว้นวรรคหรือขึ้นบรรทัดใหม่อีกครั้งเพื่อปล่อยไฟล์แนบสื่อในตำแหน่งใหม่ หรือกดปุ่ม Escape เพื่อยกเลิก",
|
||||||
"upload_form.drag_and_drop.on_drag_cancel": "การลากไฟล์นั้นหยุดชะงัก ไฟล์ที่กำลังแนบมาถูกยกเลิก {item} ได้ถูกลบทิ้งแล้ว",
|
"upload_form.drag_and_drop.on_drag_cancel": "ยกเลิกการลากแล้ว ปล่อยไฟล์แนบสื่อ {item} แล้ว",
|
||||||
"upload_form.drag_and_drop.on_drag_end": "ไฟล์แนบ {item} ได้ถูกยกเลิกแล้ว",
|
"upload_form.drag_and_drop.on_drag_end": "ปล่อยไฟล์แนบสื่อ {item} แล้ว",
|
||||||
"upload_form.drag_and_drop.on_drag_over": "ไฟล์แนบ {item} ได้ถูกย้ายไปแล้ว",
|
"upload_form.drag_and_drop.on_drag_over": "ย้ายไฟล์แนบสื่อ {item} แล้ว",
|
||||||
"upload_form.drag_and_drop.on_drag_start": "ได้รับไฟล์แนบเรียบร้อยแล้ว {item}.",
|
"upload_form.drag_and_drop.on_drag_start": "หยิบไฟล์แนบสื่อ {item} แล้ว",
|
||||||
"upload_form.edit": "แก้ไข",
|
"upload_form.edit": "แก้ไข",
|
||||||
"upload_form.thumbnail": "เปลี่ยนภาพขนาดย่อ",
|
"upload_form.thumbnail": "เปลี่ยนภาพขนาดย่อ",
|
||||||
"upload_form.video_description": "อธิบายสำหรับผู้คนที่พิการทางการได้ยิน ได้ยินไม่ชัด พิการทางการมองเห็น หรือมีสายตาเลือนราง",
|
"upload_form.video_description": "อธิบายสำหรับผู้คนที่พิการทางการได้ยิน ได้ยินไม่ชัด พิการทางการมองเห็น หรือมีสายตาเลือนราง",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "Hay aksi!",
|
"alert.unexpected.title": "Hay aksi!",
|
||||||
"alt_text_badge.title": "Alternatif metin",
|
"alt_text_badge.title": "Alternatif metin",
|
||||||
"announcement.announcement": "Duyuru",
|
"announcement.announcement": "Duyuru",
|
||||||
|
"annual_report.summary.archetype.booster": "Trend takipçisi",
|
||||||
|
"annual_report.summary.archetype.lurker": "Gizli meraklı",
|
||||||
|
"annual_report.summary.archetype.oracle": "Kahin",
|
||||||
|
"annual_report.summary.archetype.pollster": "Anketör",
|
||||||
|
"annual_report.summary.archetype.replier": "Sosyal kelebek",
|
||||||
|
"annual_report.summary.followers.followers": "takipçiler",
|
||||||
|
"annual_report.summary.followers.total": "{count} toplam",
|
||||||
|
"annual_report.summary.here_it_is": "İşte {year} yılı değerlendirmeniz:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "en çok beğenilen gönderi",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "en çok paylaşılan gönderi",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "en çok yanıt alan gönderi",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "en çok kullanılan uygulama",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "en çok kullanılan etiket",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "yeni gönderiler",
|
||||||
|
"annual_report.summary.percentile.text": "<bottomLabel>Mastodon kullanıcılarının</bottomLabel><percentage></percentage><topLabel>üst dilimindesiniz</topLabel>.",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Bernie'ye söylemeyiz.",
|
||||||
|
"annual_report.summary.thanks": "Mastodon'un bir parçası olduğunuz için teşekkürler!",
|
||||||
"attachments_list.unprocessed": "(işlenmemiş)",
|
"attachments_list.unprocessed": "(işlenmemiş)",
|
||||||
"audio.hide": "Sesi gizle",
|
"audio.hide": "Sesi gizle",
|
||||||
"block_modal.remote_users_caveat": "{domain} sunucusundan kararınıza saygı duymasını isteyeceğiz. Ancak, Uymaları garanti değildir çünkü bazı sunucular engellemeyi farklı şekilde yapıyorlar. Herkese açık gönderiler giriş yapmamış kullanıcılara görüntülenmeye devam edebilir.",
|
"block_modal.remote_users_caveat": "{domain} sunucusundan kararınıza saygı duymasını isteyeceğiz. Ancak, Uymaları garanti değildir çünkü bazı sunucular engellemeyi farklı şekilde yapıyorlar. Herkese açık gönderiler giriş yapmamış kullanıcılara görüntülenmeye devam edebilir.",
|
||||||
|
@ -508,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name}, {target} kişisini bildirdi",
|
"notification.admin.report_statuses_other": "{name}, {target} kişisini bildirdi",
|
||||||
"notification.admin.sign_up": "{name} kaydoldu",
|
"notification.admin.sign_up": "{name} kaydoldu",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} ve {count, plural, one {# diğer kişi} other {# diğer kişi}} kaydoldu",
|
"notification.admin.sign_up.name_and_others": "{name} ve {count, plural, one {# diğer kişi} other {# diğer kişi}} kaydoldu",
|
||||||
|
"notification.annual_report.message": "{year} yılı #Wrapstodon'unuz bekliyor! Yılınızın Mastodon'daki öne çıkanlarını ve anılarınızı gösterin!",
|
||||||
|
"notification.annual_report.view": "#Wrapstodon'u Görüntüle",
|
||||||
"notification.favourite": "{name} gönderinizi beğendi",
|
"notification.favourite": "{name} gönderinizi beğendi",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} ve <a>{count, plural, one {# diğer kişi} other {# diğer kişi}}</a> gönderinizi beğendi",
|
"notification.favourite.name_and_others_with_link": "{name} ve <a>{count, plural, one {# diğer kişi} other {# diğer kişi}}</a> gönderinizi beğendi",
|
||||||
"notification.follow": "{name} seni takip etti",
|
"notification.follow": "{name} seni takip etti",
|
||||||
|
|
|
@ -87,6 +87,7 @@
|
||||||
"alert.unexpected.title": "Ой!",
|
"alert.unexpected.title": "Ой!",
|
||||||
"alt_text_badge.title": "Альтернативний текст",
|
"alt_text_badge.title": "Альтернативний текст",
|
||||||
"announcement.announcement": "Оголошення",
|
"announcement.announcement": "Оголошення",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "нові дописи",
|
||||||
"attachments_list.unprocessed": "(не оброблено)",
|
"attachments_list.unprocessed": "(не оброблено)",
|
||||||
"audio.hide": "Сховати аудіо",
|
"audio.hide": "Сховати аудіо",
|
||||||
"block_modal.remote_users_caveat": "Ми попросимо сервер {domain} поважати ваше рішення. Однак дотримання вимог не гарантується, оскільки деякі сервери можуть обробляти блоки по-різному. Загальнодоступні дописи все ще можуть бути видимими для користувачів, які не увійшли в систему.",
|
"block_modal.remote_users_caveat": "Ми попросимо сервер {domain} поважати ваше рішення. Однак дотримання вимог не гарантується, оскільки деякі сервери можуть обробляти блоки по-різному. Загальнодоступні дописи все ще можуть бути видимими для користувачів, які не увійшли в систему.",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "Ốiii!",
|
"alert.unexpected.title": "Ốiii!",
|
||||||
"alt_text_badge.title": "Văn bản thay thế",
|
"alt_text_badge.title": "Văn bản thay thế",
|
||||||
"announcement.announcement": "Có gì mới?",
|
"announcement.announcement": "Có gì mới?",
|
||||||
|
"annual_report.summary.archetype.booster": "Hiệp sĩ ngầu",
|
||||||
|
"annual_report.summary.archetype.lurker": "Kẻ rình mò",
|
||||||
|
"annual_report.summary.archetype.oracle": "Nhà tiên tri",
|
||||||
|
"annual_report.summary.archetype.pollster": "Chuyên gia khảo sát",
|
||||||
|
"annual_report.summary.archetype.replier": "Bướm xã hội",
|
||||||
|
"annual_report.summary.followers.followers": "người theo dõi",
|
||||||
|
"annual_report.summary.followers.total": "tổng {count}",
|
||||||
|
"annual_report.summary.here_it_is": "Nhìn lại năm {year} của bạn:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "tút được thích nhiều nhất",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "tút được đăng lại nhiều nhất",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "tút được trả lời nhiều nhất",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "app dùng nhiều nhất",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "hashtag dùng nhiều nhất",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "tút mới",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Bạn nằm trong top</topLabel><percentage></percentage><bottomLabel>thành viên Mastodon.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Chúng tôi sẽ không kể cho Bernie.",
|
||||||
|
"annual_report.summary.thanks": "Cảm ơn đã trở thành một phần của Mastodon!",
|
||||||
"attachments_list.unprocessed": "(chưa xử lí)",
|
"attachments_list.unprocessed": "(chưa xử lí)",
|
||||||
"audio.hide": "Ẩn âm thanh",
|
"audio.hide": "Ẩn âm thanh",
|
||||||
"block_modal.remote_users_caveat": "Chúng tôi sẽ yêu cầu {domain} tôn trọng quyết định của bạn. Tuy nhiên, việc tuân thủ không được đảm bảo vì một số máy chủ có thể xử lý việc chặn theo cách khác nhau. Các tút công khai vẫn có thể hiển thị đối với người dùng chưa đăng nhập.",
|
"block_modal.remote_users_caveat": "Chúng tôi sẽ yêu cầu {domain} tôn trọng quyết định của bạn. Tuy nhiên, việc tuân thủ không được đảm bảo vì một số máy chủ có thể xử lý việc chặn theo cách khác nhau. Các tút công khai vẫn có thể hiển thị đối với người dùng chưa đăng nhập.",
|
||||||
|
@ -508,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} báo cáo {target}",
|
"notification.admin.report_statuses_other": "{name} báo cáo {target}",
|
||||||
"notification.admin.sign_up": "{name} tham gia máy chủ của bạn",
|
"notification.admin.sign_up": "{name} tham gia máy chủ của bạn",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} và {count, plural, other {# người}} đã đăng ký",
|
"notification.admin.sign_up.name_and_others": "{name} và {count, plural, other {# người}} đã đăng ký",
|
||||||
|
"notification.annual_report.message": "#Wrapstodon {year} của bạn có rồi đây! Hãy chia sẻ những điểm nhấn và khoảnh khắc đáng nhớ trên Mastodon của bạn trong năm qua!",
|
||||||
|
"notification.annual_report.view": "Xem #Wrapstodon",
|
||||||
"notification.favourite": "{name} thích tút của bạn",
|
"notification.favourite": "{name} 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.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.follow": "{name} theo dõi bạn",
|
"notification.follow": "{name} theo dõi bạn",
|
||||||
|
|
|
@ -87,6 +87,24 @@
|
||||||
"alert.unexpected.title": "哎呀!",
|
"alert.unexpected.title": "哎呀!",
|
||||||
"alt_text_badge.title": "替代文本",
|
"alt_text_badge.title": "替代文本",
|
||||||
"announcement.announcement": "公告",
|
"announcement.announcement": "公告",
|
||||||
|
"annual_report.summary.archetype.booster": "潮流捕手",
|
||||||
|
"annual_report.summary.archetype.lurker": "吃瓜群众",
|
||||||
|
"annual_report.summary.archetype.oracle": "预言家",
|
||||||
|
"annual_report.summary.archetype.pollster": "投票狂魔",
|
||||||
|
"annual_report.summary.archetype.replier": "评论区原住民",
|
||||||
|
"annual_report.summary.followers.followers": "关注者",
|
||||||
|
"annual_report.summary.followers.total": "{count} 人",
|
||||||
|
"annual_report.summary.here_it_is": "你的 {year} 年度回顾在此:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "最受欢迎嘟嘟",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "传播最广嘟嘟",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "最热闹嘟嘟",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name} 的",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "最常用的应用",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "最常用的话题",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "新发嘟",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>这使你跻身 Mastodon 用户的前</topLabel><percentage></percentage><bottomLabel></bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "我们打死也不会告诉Bernie。",
|
||||||
|
"annual_report.summary.thanks": "感谢你这一年与 Mastodon 一路同行!",
|
||||||
"attachments_list.unprocessed": "(未处理)",
|
"attachments_list.unprocessed": "(未处理)",
|
||||||
"audio.hide": "隐藏音频",
|
"audio.hide": "隐藏音频",
|
||||||
"block_modal.remote_users_caveat": "我们将要求服务器 {domain} 尊重您的决定。然而,我们无法保证对方一定遵从,因为某些服务器可能会以不同的方案处理屏蔽操作。公开嘟文仍然可能对未登录的用户可见。",
|
"block_modal.remote_users_caveat": "我们将要求服务器 {domain} 尊重您的决定。然而,我们无法保证对方一定遵从,因为某些服务器可能会以不同的方案处理屏蔽操作。公开嘟文仍然可能对未登录的用户可见。",
|
||||||
|
@ -508,6 +526,8 @@
|
||||||
"notification.admin.report_statuses_other": "{name} 举报了 {target}",
|
"notification.admin.report_statuses_other": "{name} 举报了 {target}",
|
||||||
"notification.admin.sign_up": "{name} 注册了",
|
"notification.admin.sign_up": "{name} 注册了",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} 和 {count, plural, other {另外 # 人}}注册了",
|
"notification.admin.sign_up.name_and_others": "{name} 和 {count, plural, other {另外 # 人}}注册了",
|
||||||
|
"notification.annual_report.message": "你的 {year} #Wrapstodon 年度回顾来啦!快来看看这一年你在 Mastodon 上的精彩瞬间!",
|
||||||
|
"notification.annual_report.view": "查看 #Wrapstodon",
|
||||||
"notification.favourite": "{name} 喜欢了你的嘟文",
|
"notification.favourite": "{name} 喜欢了你的嘟文",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} 和 <a>{count, plural, other {另外 # 人}}</a> 喜欢了你的嘟文",
|
"notification.favourite.name_and_others_with_link": "{name} 和 <a>{count, plural, other {另外 # 人}}</a> 喜欢了你的嘟文",
|
||||||
"notification.follow": "{name} 开始关注你",
|
"notification.follow": "{name} 开始关注你",
|
||||||
|
|
|
@ -87,6 +87,23 @@
|
||||||
"alert.unexpected.title": "哎呀!",
|
"alert.unexpected.title": "哎呀!",
|
||||||
"alt_text_badge.title": "ALT 說明文字",
|
"alt_text_badge.title": "ALT 說明文字",
|
||||||
"announcement.announcement": "公告",
|
"announcement.announcement": "公告",
|
||||||
|
"annual_report.summary.archetype.booster": "酷炫的獵人",
|
||||||
|
"annual_report.summary.archetype.lurker": "潛伏者",
|
||||||
|
"annual_report.summary.archetype.oracle": "先知",
|
||||||
|
"annual_report.summary.archetype.pollster": "民調人員",
|
||||||
|
"annual_report.summary.archetype.replier": "社交菁英",
|
||||||
|
"annual_report.summary.followers.followers": "跟隨者",
|
||||||
|
"annual_report.summary.followers.total": "總共 {count}",
|
||||||
|
"annual_report.summary.here_it_is": "以下是您的{year}年度回顧:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "最愛的嘟文",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "最多轉嘟的嘟文",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "最多回覆的嘟文",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name} 的",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "最常使用的應用程式",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "最常使用的主題標籤",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "新嘟文",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>這讓您成為前</topLabel><percentage></percentage><bottomLabel>Mastodon 的使用者。</bottomLabel>",
|
||||||
|
"annual_report.summary.thanks": "感謝您成為 Mastodon 的一員!",
|
||||||
"attachments_list.unprocessed": "(未經處理)",
|
"attachments_list.unprocessed": "(未經處理)",
|
||||||
"audio.hide": "隱藏音訊",
|
"audio.hide": "隱藏音訊",
|
||||||
"block_modal.remote_users_caveat": "我們會要求 {domain} 伺服器尊重您的決定。然而,我們無法保證所有伺服器皆會遵守,某些伺服器可能以不同方式處理封鎖。未登入之使用者仍可能看見您的公開嘟文。",
|
"block_modal.remote_users_caveat": "我們會要求 {domain} 伺服器尊重您的決定。然而,我們無法保證所有伺服器皆會遵守,某些伺服器可能以不同方式處理封鎖。未登入之使用者仍可能看見您的公開嘟文。",
|
||||||
|
|
44
app/javascript/mastodon/models/annual_report.ts
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
export interface Percentiles {
|
||||||
|
followers: number;
|
||||||
|
statuses: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface NameAndCount {
|
||||||
|
name: string;
|
||||||
|
count: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TimeSeriesMonth {
|
||||||
|
month: number;
|
||||||
|
statuses: number;
|
||||||
|
following: number;
|
||||||
|
followers: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TopStatuses {
|
||||||
|
by_reblogs: number;
|
||||||
|
by_favourites: number;
|
||||||
|
by_replies: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type Archetype =
|
||||||
|
| 'lurker'
|
||||||
|
| 'booster'
|
||||||
|
| 'pollster'
|
||||||
|
| 'replier'
|
||||||
|
| 'oracle';
|
||||||
|
|
||||||
|
interface AnnualReportV1 {
|
||||||
|
most_used_apps: NameAndCount[];
|
||||||
|
percentiles: Percentiles;
|
||||||
|
top_hashtags: NameAndCount[];
|
||||||
|
top_statuses: TopStatuses;
|
||||||
|
time_series: TimeSeriesMonth[];
|
||||||
|
archetype: Archetype;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AnnualReport {
|
||||||
|
year: number;
|
||||||
|
schema_version: number;
|
||||||
|
data: AnnualReportV1;
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
import type {
|
import type {
|
||||||
ApiAccountRelationshipSeveranceEventJSON,
|
ApiAccountRelationshipSeveranceEventJSON,
|
||||||
ApiAccountWarningJSON,
|
ApiAccountWarningJSON,
|
||||||
|
ApiAnnualReportEventJSON,
|
||||||
BaseNotificationGroupJSON,
|
BaseNotificationGroupJSON,
|
||||||
ApiNotificationGroupJSON,
|
ApiNotificationGroupJSON,
|
||||||
ApiNotificationJSON,
|
ApiNotificationJSON,
|
||||||
|
@ -65,6 +66,12 @@ export interface NotificationGroupSeveredRelationships
|
||||||
event: AccountRelationshipSeveranceEvent;
|
event: AccountRelationshipSeveranceEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AnnualReportEvent = ApiAnnualReportEventJSON;
|
||||||
|
export interface NotificationGroupAnnualReport
|
||||||
|
extends BaseNotification<'annual_report'> {
|
||||||
|
annualReport: AnnualReportEvent;
|
||||||
|
}
|
||||||
|
|
||||||
interface Report extends Omit<ApiReportJSON, 'target_account'> {
|
interface Report extends Omit<ApiReportJSON, 'target_account'> {
|
||||||
targetAccountId: string;
|
targetAccountId: string;
|
||||||
}
|
}
|
||||||
|
@ -86,7 +93,8 @@ export type NotificationGroup =
|
||||||
| NotificationGroupModerationWarning
|
| NotificationGroupModerationWarning
|
||||||
| NotificationGroupSeveredRelationships
|
| NotificationGroupSeveredRelationships
|
||||||
| NotificationGroupAdminSignUp
|
| NotificationGroupAdminSignUp
|
||||||
| NotificationGroupAdminReport;
|
| NotificationGroupAdminReport
|
||||||
|
| NotificationGroupAnnualReport;
|
||||||
|
|
||||||
function createReportFromJSON(reportJSON: ApiReportJSON): Report {
|
function createReportFromJSON(reportJSON: ApiReportJSON): Report {
|
||||||
const { target_account, ...report } = reportJSON;
|
const { target_account, ...report } = reportJSON;
|
||||||
|
@ -112,6 +120,12 @@ function createAccountRelationshipSeveranceEventFromJSON(
|
||||||
return eventJson;
|
return eventJson;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function createAnnualReportEventFromJSON(
|
||||||
|
eventJson: ApiAnnualReportEventJSON,
|
||||||
|
): AnnualReportEvent {
|
||||||
|
return eventJson;
|
||||||
|
}
|
||||||
|
|
||||||
export function createNotificationGroupFromJSON(
|
export function createNotificationGroupFromJSON(
|
||||||
groupJson: ApiNotificationGroupJSON,
|
groupJson: ApiNotificationGroupJSON,
|
||||||
): NotificationGroup {
|
): NotificationGroup {
|
||||||
|
@ -145,7 +159,6 @@ export function createNotificationGroupFromJSON(
|
||||||
event: createAccountRelationshipSeveranceEventFromJSON(group.event),
|
event: createAccountRelationshipSeveranceEventFromJSON(group.event),
|
||||||
sampleAccountIds,
|
sampleAccountIds,
|
||||||
};
|
};
|
||||||
|
|
||||||
case 'moderation_warning': {
|
case 'moderation_warning': {
|
||||||
const { moderation_warning, ...groupWithoutModerationWarning } = group;
|
const { moderation_warning, ...groupWithoutModerationWarning } = group;
|
||||||
return {
|
return {
|
||||||
|
@ -154,6 +167,14 @@ export function createNotificationGroupFromJSON(
|
||||||
sampleAccountIds,
|
sampleAccountIds,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
case 'annual_report': {
|
||||||
|
const { annual_report, ...groupWithoutAnnualReport } = group;
|
||||||
|
return {
|
||||||
|
...groupWithoutAnnualReport,
|
||||||
|
annualReport: createAnnualReportEventFromJSON(annual_report),
|
||||||
|
sampleAccountIds,
|
||||||
|
};
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return {
|
return {
|
||||||
sampleAccountIds,
|
sampleAccountIds,
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m80-80 200-560 360 360L80-80Zm502-378-42-42 224-224q32-32 77-32t77 32l24 24-42 42-24-24q-14-14-35-14t-35 14L582-458ZM422-618l-42-42 24-24q14-14 14-34t-14-34l-26-26 42-42 26 26q32 32 32 76t-32 76l-24 24Zm80 80-42-42 144-144q14-14 14-35t-14-35l-64-64 42-42 64 64q32 32 32 77t-32 77L502-538Zm160 160-42-42 64-64q32-32 77-32t77 32l64 64-42 42-64-64q-14-14-35-14t-35 14l-64 64Z"/></svg>
|
After Width: | Height: | Size: 478 B |
1
app/javascript/material-icons/400-24px/celebration.svg
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m80-80 200-560 360 360L80-80Zm132-132 282-100-182-182-100 282Zm370-246-42-42 224-224q32-32 77-32t77 32l24 24-42 42-24-24q-14-14-35-14t-35 14L582-458ZM422-618l-42-42 24-24q14-14 14-34t-14-34l-26-26 42-42 26 26q32 32 32 76t-32 76l-24 24Zm80 80-42-42 144-144q14-14 14-35t-14-35l-64-64 42-42 64 64q32 32 32 77t-32 77L502-538Zm160 160-42-42 64-64q32-32 77-32t77 32l64 64-42 42-64-64q-14-14-35-14t-35 14l-64 64ZM212-212Z"/></svg>
|
After Width: | Height: | Size: 520 B |
|
@ -1 +1 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m260-260 300-140 140-300-300 140-140 300Zm220-180q-17 0-28.5-11.5T440-480q0-17 11.5-28.5T480-520q17 0 28.5 11.5T520-480q0 17-11.5 28.5T480-440Zm0 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m300-300 280-80 80-280-280 80-80 280Zm180-120q-25 0-42.5-17.5T420-480q0-25 17.5-42.5T480-540q25 0 42.5 17.5T540-480q0 25-17.5 42.5T480-420Zm0 340q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Z"/></svg>
|
Before Width: | Height: | Size: 437 B After Width: | Height: | Size: 433 B |
|
@ -1 +1 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m260-260 300-140 140-300-300 140-140 300Zm220-180q-17 0-28.5-11.5T440-480q0-17 11.5-28.5T480-520q17 0 28.5 11.5T520-480q0 17-11.5 28.5T480-440Zm0 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m300-300 280-80 80-280-280 80-80 280Zm180-120q-25 0-42.5-17.5T420-480q0-25 17.5-42.5T480-540q25 0 42.5 17.5T540-480q0 25-17.5 42.5T480-420Zm0 340q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q133 0 226.5-93.5T800-480q0-133-93.5-226.5T480-800q-133 0-226.5 93.5T160-480q0 133 93.5 226.5T480-160Zm0-320Z"/></svg>
|
Before Width: | Height: | Size: 533 B After Width: | Height: | Size: 547 B |
|
@ -15,6 +15,7 @@
|
||||||
@import 'mastodon/polls';
|
@import 'mastodon/polls';
|
||||||
@import 'mastodon/modal';
|
@import 'mastodon/modal';
|
||||||
@import 'mastodon/emoji_picker';
|
@import 'mastodon/emoji_picker';
|
||||||
|
@import 'mastodon/annual_reports';
|
||||||
@import 'mastodon/about';
|
@import 'mastodon/about';
|
||||||
@import 'mastodon/tables';
|
@import 'mastodon/tables';
|
||||||
@import 'mastodon/admin';
|
@import 'mastodon/admin';
|
||||||
|
|
335
app/javascript/styles/mastodon/annual_reports.scss
Normal file
|
@ -0,0 +1,335 @@
|
||||||
|
:root {
|
||||||
|
--indigo-1: #17063b;
|
||||||
|
--indigo-2: #2f0c7a;
|
||||||
|
--indigo-3: #562cfc;
|
||||||
|
--indigo-5: #858afa;
|
||||||
|
--indigo-6: #cccfff;
|
||||||
|
--lime: #baff3b;
|
||||||
|
--goldenrod-2: #ffc954;
|
||||||
|
}
|
||||||
|
|
||||||
|
.annual-report {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
background: var(--indigo-1);
|
||||||
|
padding: 24px;
|
||||||
|
|
||||||
|
&__header {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 25px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 30px;
|
||||||
|
color: var(--lime);
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 20px;
|
||||||
|
color: var(--indigo-6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__bento {
|
||||||
|
display: grid;
|
||||||
|
gap: 8px;
|
||||||
|
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
|
||||||
|
grid-template-rows: minmax(0, auto) minmax(0, 1fr) minmax(0, auto) minmax(
|
||||||
|
0,
|
||||||
|
auto
|
||||||
|
);
|
||||||
|
|
||||||
|
&__box {
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 8px;
|
||||||
|
background: var(--indigo-2);
|
||||||
|
color: var(--indigo-5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__summary {
|
||||||
|
&__most-boosted-post {
|
||||||
|
grid-column: span 2;
|
||||||
|
grid-row: span 2;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
.status__content,
|
||||||
|
.content-warning {
|
||||||
|
color: var(--indigo-6);
|
||||||
|
}
|
||||||
|
|
||||||
|
.detailed-status {
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-warning {
|
||||||
|
border: 0;
|
||||||
|
background: var(--indigo-1);
|
||||||
|
|
||||||
|
.link-button {
|
||||||
|
color: var(--indigo-5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.detailed-status__meta__line {
|
||||||
|
border-bottom-color: var(--indigo-3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.detailed-status__meta {
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detailed-status__meta,
|
||||||
|
.poll__footer,
|
||||||
|
.poll__link,
|
||||||
|
.detailed-status .logo,
|
||||||
|
.detailed-status__display-name {
|
||||||
|
color: var(--indigo-5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.detailed-status__meta .animated-number,
|
||||||
|
.detailed-status__display-name strong {
|
||||||
|
color: var(--indigo-6);
|
||||||
|
}
|
||||||
|
|
||||||
|
.poll__chart {
|
||||||
|
background-color: var(--indigo-3);
|
||||||
|
|
||||||
|
&.leading {
|
||||||
|
background-color: var(--goldenrod-2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__followers {
|
||||||
|
grid-column: span 1;
|
||||||
|
text-align: center;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
padding-block-start: 24px;
|
||||||
|
padding-block-end: 24px;
|
||||||
|
|
||||||
|
--sparkline-gradient-top: rgba(86, 44, 252, 50%);
|
||||||
|
--sparkline-gradient-bottom: rgba(86, 44, 252, 0%);
|
||||||
|
|
||||||
|
&__foreground {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 8px;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__number {
|
||||||
|
font-size: 31px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 37px;
|
||||||
|
color: var(--lime);
|
||||||
|
}
|
||||||
|
|
||||||
|
&__label {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 17px;
|
||||||
|
color: var(--indigo-6);
|
||||||
|
}
|
||||||
|
|
||||||
|
&__footnote {
|
||||||
|
display: block;
|
||||||
|
font-weight: 400;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
inset-inline-end: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 0;
|
||||||
|
height: 70%;
|
||||||
|
width: auto;
|
||||||
|
|
||||||
|
path:first-child {
|
||||||
|
fill: url('#gradient') !important;
|
||||||
|
fill-opacity: 1 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
path:last-child {
|
||||||
|
stroke: var(--indigo-3) !important;
|
||||||
|
fill: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__archetype {
|
||||||
|
grid-column: span 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__label {
|
||||||
|
padding: 16px;
|
||||||
|
padding-bottom: 8px;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 17px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--lime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__most-used-app {
|
||||||
|
grid-column: span 1;
|
||||||
|
text-align: center;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 8px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
&__label {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 17px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--indigo-6);
|
||||||
|
}
|
||||||
|
|
||||||
|
&__icon {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 17px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--goldenrod-2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__percentile {
|
||||||
|
grid-row: span 2;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
text-align: center;
|
||||||
|
text-wrap: balance;
|
||||||
|
padding: 16px 8px;
|
||||||
|
|
||||||
|
&__label {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 17px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__number {
|
||||||
|
font-size: 61px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 73px;
|
||||||
|
color: var(--goldenrod-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
&__footnote {
|
||||||
|
font-size: 11px;
|
||||||
|
line-height: 14px;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__new-posts {
|
||||||
|
grid-column: span 2;
|
||||||
|
text-align: center;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&__label {
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 24px;
|
||||||
|
color: var(--indigo-6);
|
||||||
|
z-index: 1;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__number {
|
||||||
|
font-size: 76px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 91px;
|
||||||
|
color: var(--goldenrod-2);
|
||||||
|
z-index: 1;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg {
|
||||||
|
position: absolute;
|
||||||
|
inset-inline-start: -7px;
|
||||||
|
top: -4px;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__most-used-hashtag {
|
||||||
|
grid-column: span 2;
|
||||||
|
text-align: center;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&__hashtag {
|
||||||
|
font-size: 42px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 58px;
|
||||||
|
color: var(--indigo-6);
|
||||||
|
margin-inline-start: -100%;
|
||||||
|
margin-inline-end: -100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__label {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 17px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.annual-report-modal {
|
||||||
|
max-width: 480px;
|
||||||
|
background: var(--indigo-1);
|
||||||
|
border-radius: 16px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
|
.loading-indicator .circular-progress {
|
||||||
|
color: var(--lime);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: $no-columns-breakpoint) {
|
||||||
|
border-bottom: 0;
|
||||||
|
border-radius: 16px 16px 0 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification-group--annual-report {
|
||||||
|
.notification-group__icon {
|
||||||
|
color: var(--lime);
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification-group__main .link-button {
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--lime);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1686,7 +1686,8 @@ body > [data-popper-placement] {
|
||||||
|
|
||||||
.status__wrapper-direct,
|
.status__wrapper-direct,
|
||||||
.notification-ungrouped--direct,
|
.notification-ungrouped--direct,
|
||||||
.notification-group--direct {
|
.notification-group--direct,
|
||||||
|
.notification-group--annual-report {
|
||||||
background: rgba($ui-highlight-color, 0.05);
|
background: rgba($ui-highlight-color, 0.05);
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
|
@ -5784,7 +5785,8 @@ a.status-card {
|
||||||
inset-inline-start: 0;
|
inset-inline-start: 0;
|
||||||
inset-inline-end: 0;
|
inset-inline-end: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
background: rgba($base-overlay-background, 0.7);
|
opacity: 0.9;
|
||||||
|
background: $base-overlay-background;
|
||||||
transition: background 0.5s;
|
transition: background 0.5s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ class Admin::SystemCheck::DatabaseSchemaCheck < Admin::SystemCheck::BaseCheck
|
||||||
end
|
end
|
||||||
|
|
||||||
def pass?
|
def pass?
|
||||||
!ActiveRecord::Base.connection.migration_context.needs_migration?
|
!ActiveRecord::Base.connection_pool.migration_context.needs_migration?
|
||||||
end
|
end
|
||||||
|
|
||||||
def message
|
def message
|
||||||
|
|
|
@ -17,11 +17,21 @@ class AnnualReport
|
||||||
|
|
||||||
SCHEMA = 1
|
SCHEMA = 1
|
||||||
|
|
||||||
|
def self.table_name_prefix
|
||||||
|
'annual_report_'
|
||||||
|
end
|
||||||
|
|
||||||
def initialize(account, year)
|
def initialize(account, year)
|
||||||
@account = account
|
@account = account
|
||||||
@year = year
|
@year = year
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.prepare(year)
|
||||||
|
SOURCES.each do |klass|
|
||||||
|
klass.prepare(year)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def generate
|
def generate
|
||||||
return if GeneratedAnnualReport.exists?(account: @account, year: @year)
|
return if GeneratedAnnualReport.exists?(account: @account, year: @year)
|
||||||
|
|
||||||
|
|
|
@ -1,62 +1,37 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class AnnualReport::Percentiles < AnnualReport::Source
|
class AnnualReport::Percentiles < AnnualReport::Source
|
||||||
|
def self.prepare(year)
|
||||||
|
AnnualReport::StatusesPerAccountCount.connection.exec_query(<<~SQL.squish, nil, [year, Mastodon::Snowflake.id_at(DateTime.new(year).beginning_of_year), Mastodon::Snowflake.id_at(DateTime.new(year).end_of_year)])
|
||||||
|
INSERT INTO annual_report_statuses_per_account_counts (year, account_id, statuses_count)
|
||||||
|
SELECT $1, account_id, count(*)
|
||||||
|
FROM statuses
|
||||||
|
WHERE id BETWEEN $2 AND $3
|
||||||
|
AND (local OR uri IS NULL)
|
||||||
|
GROUP BY account_id
|
||||||
|
ON CONFLICT (year, account_id) DO NOTHING
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
|
||||||
def generate
|
def generate
|
||||||
{
|
{
|
||||||
percentiles: {
|
percentiles: {
|
||||||
followers: (total_with_fewer_followers / (total_with_any_followers + 1.0)) * 100,
|
statuses: 100.0 - ((total_with_fewer_statuses / (total_with_any_statuses + 1.0)) * 100),
|
||||||
statuses: (total_with_fewer_statuses / (total_with_any_statuses + 1.0)) * 100,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def followers_gained
|
|
||||||
@followers_gained ||= @account.passive_relationships.where("date_part('year', follows.created_at) = ?", @year).count
|
|
||||||
end
|
|
||||||
|
|
||||||
def statuses_created
|
def statuses_created
|
||||||
@statuses_created ||= report_statuses.count
|
@statuses_created ||= report_statuses.count
|
||||||
end
|
end
|
||||||
|
|
||||||
def total_with_fewer_followers
|
|
||||||
@total_with_fewer_followers ||= Follow.find_by_sql([<<~SQL.squish, { year: @year, comparison: followers_gained }]).first.total
|
|
||||||
WITH tmp0 AS (
|
|
||||||
SELECT follows.target_account_id
|
|
||||||
FROM follows
|
|
||||||
INNER JOIN accounts ON accounts.id = follows.target_account_id
|
|
||||||
WHERE date_part('year', follows.created_at) = :year
|
|
||||||
AND accounts.domain IS NULL
|
|
||||||
GROUP BY follows.target_account_id
|
|
||||||
HAVING COUNT(*) < :comparison
|
|
||||||
)
|
|
||||||
SELECT count(*) AS total
|
|
||||||
FROM tmp0
|
|
||||||
SQL
|
|
||||||
end
|
|
||||||
|
|
||||||
def total_with_fewer_statuses
|
def total_with_fewer_statuses
|
||||||
@total_with_fewer_statuses ||= Status.find_by_sql([<<~SQL.squish, { comparison: statuses_created, min_id: year_as_snowflake_range.first, max_id: year_as_snowflake_range.last }]).first.total
|
@total_with_fewer_statuses ||= AnnualReport::StatusesPerAccountCount.where(year: year).where(statuses_count: ...statuses_created).count
|
||||||
WITH tmp0 AS (
|
|
||||||
SELECT statuses.account_id
|
|
||||||
FROM statuses
|
|
||||||
INNER JOIN accounts ON accounts.id = statuses.account_id
|
|
||||||
WHERE statuses.id BETWEEN :min_id AND :max_id
|
|
||||||
AND accounts.domain IS NULL
|
|
||||||
GROUP BY statuses.account_id
|
|
||||||
HAVING count(*) < :comparison
|
|
||||||
)
|
|
||||||
SELECT count(*) AS total
|
|
||||||
FROM tmp0
|
|
||||||
SQL
|
|
||||||
end
|
|
||||||
|
|
||||||
def total_with_any_followers
|
|
||||||
@total_with_any_followers ||= Follow.where("date_part('year', follows.created_at) = ?", @year).joins(:target_account).merge(Account.local).count('distinct follows.target_account_id')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def total_with_any_statuses
|
def total_with_any_statuses
|
||||||
@total_with_any_statuses ||= Status.where(id: year_as_snowflake_range).joins(:account).merge(Account.local).count('distinct statuses.account_id')
|
@total_with_any_statuses ||= AnnualReport::StatusesPerAccountCount.where(year: year).count
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,6 +8,14 @@ class AnnualReport::Source
|
||||||
@year = year
|
@year = year
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.prepare(_year)
|
||||||
|
# Use this method if any pre-calculations must be made before individual annual reports are generated
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def report_statuses
|
def report_statuses
|
||||||
|
|
|
@ -19,7 +19,7 @@ class SuspiciousSignInDetector
|
||||||
end
|
end
|
||||||
|
|
||||||
def previously_seen_ip?(request)
|
def previously_seen_ip?(request)
|
||||||
@user.ips.exists?(['ip <<= ?', masked_ip(request)])
|
@user.ips.contained_by(masked_ip(request)).exists?
|
||||||
end
|
end
|
||||||
|
|
||||||
def freshly_signed_up?
|
def freshly_signed_up?
|
||||||
|
|
|
@ -130,7 +130,7 @@ class AccountStatusesCleanupPolicy < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def without_direct_scope
|
def without_direct_scope
|
||||||
Status.where.not(visibility: :direct)
|
Status.not_direct_visibility
|
||||||
end
|
end
|
||||||
|
|
||||||
def old_enough_scope(max_id = nil)
|
def old_enough_scope(max_id = nil)
|
||||||
|
|
|
@ -32,7 +32,7 @@ class Admin::StatusFilter
|
||||||
def scope_for(key, _value)
|
def scope_for(key, _value)
|
||||||
case key.to_s
|
case key.to_s
|
||||||
when 'media'
|
when 'media'
|
||||||
Status.joins(:media_attachments).merge(@account.media_attachments).group(:id).reorder('statuses.id desc')
|
Status.joins(:media_attachments).merge(@account.media_attachments).group(:id).recent
|
||||||
else
|
else
|
||||||
raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
|
raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
|
||||||
end
|
end
|
||||||
|
|
15
app/models/annual_report/statuses_per_account_count.rb
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: annual_report_statuses_per_account_counts
|
||||||
|
#
|
||||||
|
# id :bigint(8) not null, primary key
|
||||||
|
# year :integer not null
|
||||||
|
# account_id :bigint(8) not null
|
||||||
|
# statuses_count :bigint(8) not null
|
||||||
|
#
|
||||||
|
|
||||||
|
class AnnualReport::StatusesPerAccountCount < ApplicationRecord
|
||||||
|
# This table facilitates percentile calculations
|
||||||
|
end
|
10
app/models/concerns/inet_container.rb
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module InetContainer
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
scope :containing, ->(value) { where('ip >>= ?', value) }
|
||||||
|
scope :contained_by, ->(value) { where('ip <<= ?', value) }
|
||||||
|
end
|
||||||
|
end
|
|
@ -15,7 +15,9 @@ module Status::SafeReblogInsert
|
||||||
#
|
#
|
||||||
# The code is kept similar to ActiveRecord::Persistence code and calls it
|
# The code is kept similar to ActiveRecord::Persistence code and calls it
|
||||||
# directly when we are not handling a reblog.
|
# directly when we are not handling a reblog.
|
||||||
def _insert_record(values, returning)
|
#
|
||||||
|
# https://github.com/rails/rails/blob/v7.2.1.1/activerecord/lib/active_record/persistence.rb#L238-L263
|
||||||
|
def _insert_record(connection, values, returning)
|
||||||
return super unless values.is_a?(Hash) && values['reblog_of_id']&.value.present?
|
return super unless values.is_a?(Hash) && values['reblog_of_id']&.value.present?
|
||||||
|
|
||||||
primary_key = self.primary_key
|
primary_key = self.primary_key
|
||||||
|
@ -30,16 +32,21 @@ module Status::SafeReblogInsert
|
||||||
|
|
||||||
# The following line departs from stock ActiveRecord
|
# The following line departs from stock ActiveRecord
|
||||||
# Original code was:
|
# Original code was:
|
||||||
# im.insert(values.transform_keys { |name| arel_table[name] })
|
# im = Arel::InsertManager.new(arel_table)
|
||||||
# Instead, we use a custom builder when a reblog is happening:
|
# Instead, we use a custom builder when a reblog is happening:
|
||||||
im = _compile_reblog_insert(values)
|
im = _compile_reblog_insert(values)
|
||||||
|
|
||||||
connection.insert(im, "#{self} Create", primary_key || false, primary_key_value, returning: returning).tap do |result|
|
with_connection do |_c|
|
||||||
|
connection.insert(
|
||||||
|
im, "#{self} Create", primary_key || false, primary_key_value,
|
||||||
|
returning: returning
|
||||||
|
).tap do |result|
|
||||||
# Since we are using SELECT instead of VALUES, a non-error `nil` return is possible.
|
# Since we are using SELECT instead of VALUES, a non-error `nil` return is possible.
|
||||||
# For our purposes, it's equivalent to a foreign key constraint violation
|
# For our purposes, it's equivalent to a foreign key constraint violation
|
||||||
raise ActiveRecord::InvalidForeignKey, "(reblog_of_id)=(#{values['reblog_of_id'].value}) is not present in table \"statuses\"" if result.nil?
|
raise ActiveRecord::InvalidForeignKey, "(reblog_of_id)=(#{values['reblog_of_id'].value}) is not present in table \"statuses\"" if result.nil?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def _compile_reblog_insert(values)
|
def _compile_reblog_insert(values)
|
||||||
# This is somewhat equivalent to the following code of ActiveRecord::Persistence:
|
# This is somewhat equivalent to the following code of ActiveRecord::Persistence:
|
||||||
|
|
|
@ -28,6 +28,8 @@ class EmailDomainBlock < ApplicationRecord
|
||||||
|
|
||||||
validates :domain, presence: true, uniqueness: true, domain: true
|
validates :domain, presence: true, uniqueness: true, domain: true
|
||||||
|
|
||||||
|
scope :parents, -> { where(parent_id: nil) }
|
||||||
|
|
||||||
# Used for adding multiple blocks at once
|
# Used for adding multiple blocks at once
|
||||||
attr_accessor :other_domains
|
attr_accessor :other_domains
|
||||||
|
|
||||||
|
|
|
@ -44,8 +44,16 @@ class FeaturedTag < ApplicationRecord
|
||||||
update(statuses_count: statuses_count + 1, last_status_at: timestamp)
|
update(statuses_count: statuses_count + 1, last_status_at: timestamp)
|
||||||
end
|
end
|
||||||
|
|
||||||
def decrement(deleted_status_id)
|
def decrement(deleted_status)
|
||||||
update(statuses_count: [0, statuses_count - 1].max, last_status_at: visible_tagged_account_statuses.where.not(id: deleted_status_id).pick(:created_at))
|
if statuses_count <= 1
|
||||||
|
update(statuses_count: 0, last_status_at: nil)
|
||||||
|
elsif last_status_at > deleted_status.created_at
|
||||||
|
update(statuses_count: statuses_count - 1)
|
||||||
|
else
|
||||||
|
# Fetching the latest status creation time can be expensive, so only perform it
|
||||||
|
# if we know we are deleting the latest status using this tag
|
||||||
|
update(statuses_count: statuses_count - 1, last_status_at: visible_tagged_account_statuses.where(id: ...deleted_status.id).pick(:created_at))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -17,6 +17,7 @@ class IpBlock < ApplicationRecord
|
||||||
CACHE_KEY = 'blocked_ips'
|
CACHE_KEY = 'blocked_ips'
|
||||||
|
|
||||||
include Expireable
|
include Expireable
|
||||||
|
include InetContainer
|
||||||
include Paginable
|
include Paginable
|
||||||
|
|
||||||
enum :severity, {
|
enum :severity, {
|
||||||
|
|
|
@ -67,6 +67,9 @@ class Notification < ApplicationRecord
|
||||||
moderation_warning: {
|
moderation_warning: {
|
||||||
filterable: false,
|
filterable: false,
|
||||||
}.freeze,
|
}.freeze,
|
||||||
|
annual_report: {
|
||||||
|
filterable: false,
|
||||||
|
}.freeze,
|
||||||
'admin.sign_up': {
|
'admin.sign_up': {
|
||||||
filterable: false,
|
filterable: false,
|
||||||
}.freeze,
|
}.freeze,
|
||||||
|
@ -101,6 +104,7 @@ class Notification < ApplicationRecord
|
||||||
belongs_to :report, inverse_of: false
|
belongs_to :report, inverse_of: false
|
||||||
belongs_to :account_relationship_severance_event, inverse_of: false
|
belongs_to :account_relationship_severance_event, inverse_of: false
|
||||||
belongs_to :account_warning, inverse_of: false
|
belongs_to :account_warning, inverse_of: false
|
||||||
|
belongs_to :generated_annual_report, inverse_of: false
|
||||||
end
|
end
|
||||||
|
|
||||||
validates :type, inclusion: { in: TYPES }
|
validates :type, inclusion: { in: TYPES }
|
||||||
|
@ -309,7 +313,7 @@ class Notification < ApplicationRecord
|
||||||
self.from_account_id = activity&.status&.account_id
|
self.from_account_id = activity&.status&.account_id
|
||||||
when 'Account'
|
when 'Account'
|
||||||
self.from_account_id = activity&.id
|
self.from_account_id = activity&.id
|
||||||
when 'AccountRelationshipSeveranceEvent', 'AccountWarning'
|
when 'AccountRelationshipSeveranceEvent', 'AccountWarning', 'GeneratedAnnualReport'
|
||||||
# These do not really have an originating account, but this is mandatory
|
# These do not really have an originating account, but this is mandatory
|
||||||
# in the data model, and the recipient's account will by definition
|
# in the data model, and the recipient's account will by definition
|
||||||
# always exist
|
# always exist
|
||||||
|
|
|
@ -51,6 +51,7 @@ class NotificationGroup < ActiveModelSerializers::Model
|
||||||
:report,
|
:report,
|
||||||
:account_relationship_severance_event,
|
:account_relationship_severance_event,
|
||||||
:account_warning,
|
:account_warning,
|
||||||
|
:generated_annual_report,
|
||||||
to: :notification, prefix: false
|
to: :notification, prefix: false
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
|
|
|
@ -15,6 +15,7 @@ class ScheduledStatus < ApplicationRecord
|
||||||
|
|
||||||
TOTAL_LIMIT = 300
|
TOTAL_LIMIT = 300
|
||||||
DAILY_LIMIT = 25
|
DAILY_LIMIT = 25
|
||||||
|
MINIMUM_OFFSET = 5.minutes.freeze
|
||||||
|
|
||||||
belongs_to :account, inverse_of: :scheduled_statuses
|
belongs_to :account, inverse_of: :scheduled_statuses
|
||||||
has_many :media_attachments, inverse_of: :scheduled_status, dependent: :nullify
|
has_many :media_attachments, inverse_of: :scheduled_status, dependent: :nullify
|
||||||
|
@ -26,7 +27,7 @@ class ScheduledStatus < ApplicationRecord
|
||||||
private
|
private
|
||||||
|
|
||||||
def validate_future_date
|
def validate_future_date
|
||||||
errors.add(:scheduled_at, I18n.t('scheduled_statuses.too_soon')) if scheduled_at.present? && scheduled_at <= Time.now.utc + PostStatusService::MIN_SCHEDULE_OFFSET
|
errors.add(:scheduled_at, I18n.t('scheduled_statuses.too_soon')) if scheduled_at.present? && scheduled_at <= Time.now.utc + MINIMUM_OFFSET
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate_total_limit
|
def validate_total_limit
|
||||||
|
|
|
@ -30,6 +30,8 @@ class SessionActivation < ApplicationRecord
|
||||||
|
|
||||||
DEFAULT_SCOPES = %w(read write follow).freeze
|
DEFAULT_SCOPES = %w(read write follow).freeze
|
||||||
|
|
||||||
|
scope :latest, -> { order(id: :desc) }
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
def active?(id)
|
def active?(id)
|
||||||
id && exists?(session_id: id)
|
id && exists?(session_id: id)
|
||||||
|
@ -48,7 +50,7 @@ class SessionActivation < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def purge_old
|
def purge_old
|
||||||
order('created_at desc').offset(Rails.configuration.x.max_session_activations).destroy_all
|
latest.offset(Rails.configuration.x.max_session_activations).destroy_all
|
||||||
end
|
end
|
||||||
|
|
||||||
def exclusive(id)
|
def exclusive(id)
|
||||||
|
|
|
@ -130,6 +130,7 @@ class Status < ApplicationRecord
|
||||||
}
|
}
|
||||||
scope :distributable_visibility, -> { where(visibility: %i(public unlisted)) }
|
scope :distributable_visibility, -> { where(visibility: %i(public unlisted)) }
|
||||||
scope :list_eligible_visibility, -> { where(visibility: %i(public unlisted private)) }
|
scope :list_eligible_visibility, -> { where(visibility: %i(public unlisted private)) }
|
||||||
|
scope :not_direct_visibility, -> { where.not(visibility: :direct) }
|
||||||
|
|
||||||
scope :not_local_only, -> { where(local_only: [false, nil]) }
|
scope :not_local_only, -> { where(local_only: [false, nil]) }
|
||||||
|
|
||||||
|
|
|
@ -125,7 +125,7 @@ class User < ApplicationRecord
|
||||||
scope :signed_in_recently, -> { where(current_sign_in_at: ACTIVE_DURATION.ago..) }
|
scope :signed_in_recently, -> { where(current_sign_in_at: ACTIVE_DURATION.ago..) }
|
||||||
scope :not_signed_in_recently, -> { where(current_sign_in_at: ...ACTIVE_DURATION.ago) }
|
scope :not_signed_in_recently, -> { where(current_sign_in_at: ...ACTIVE_DURATION.ago) }
|
||||||
scope :matches_email, ->(value) { where(arel_table[:email].matches("#{value}%")) }
|
scope :matches_email, ->(value) { where(arel_table[:email].matches("#{value}%")) }
|
||||||
scope :matches_ip, ->(value) { left_joins(:ips).where('user_ips.ip <<= ?', value).group('users.id') }
|
scope :matches_ip, ->(value) { left_joins(:ips).merge(IpBlock.contained_by(value)).group('users.id') }
|
||||||
|
|
||||||
before_validation :sanitize_role
|
before_validation :sanitize_role
|
||||||
before_create :set_approved
|
before_create :set_approved
|
||||||
|
@ -340,7 +340,7 @@ class User < ApplicationRecord
|
||||||
Doorkeeper::AccessGrant.by_resource_owner(self).update_all(revoked_at: Time.now.utc)
|
Doorkeeper::AccessGrant.by_resource_owner(self).update_all(revoked_at: Time.now.utc)
|
||||||
|
|
||||||
Doorkeeper::AccessToken.by_resource_owner(self).in_batches do |batch|
|
Doorkeeper::AccessToken.by_resource_owner(self).in_batches do |batch|
|
||||||
batch.update_all(revoked_at: Time.now.utc)
|
batch.touch_all(:revoked_at)
|
||||||
Web::PushSubscription.where(access_token_id: batch).delete_all
|
Web::PushSubscription.where(access_token_id: batch).delete_all
|
||||||
|
|
||||||
# Revoke each access token for the Streaming API, since `update_all``
|
# Revoke each access token for the Streaming API, since `update_all``
|
||||||
|
@ -444,7 +444,7 @@ class User < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def sign_up_from_ip_requires_approval?
|
def sign_up_from_ip_requires_approval?
|
||||||
sign_up_ip.present? && IpBlock.severity_sign_up_requires_approval.exists?(['ip >>= ?', sign_up_ip.to_s])
|
sign_up_ip.present? && IpBlock.severity_sign_up_requires_approval.containing(sign_up_ip.to_s).exists?
|
||||||
end
|
end
|
||||||
|
|
||||||
def sign_up_email_requires_approval?
|
def sign_up_email_requires_approval?
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
class UserIp < ApplicationRecord
|
class UserIp < ApplicationRecord
|
||||||
include DatabaseViewRecord
|
include DatabaseViewRecord
|
||||||
|
include InetContainer
|
||||||
|
|
||||||
self.primary_key = :user_id
|
self.primary_key = :user_id
|
||||||
|
|
||||||
|
|
9
app/serializers/rest/annual_report_event_serializer.rb
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class REST::AnnualReportEventSerializer < ActiveModel::Serializer
|
||||||
|
attributes :year
|
||||||
|
|
||||||
|
def year
|
||||||
|
object.year.to_s
|
||||||
|
end
|
||||||
|
end
|
|
@ -13,6 +13,7 @@ class REST::NotificationGroupSerializer < ActiveModel::Serializer
|
||||||
belongs_to :report, if: :report_type?, serializer: REST::ReportSerializer
|
belongs_to :report, if: :report_type?, serializer: REST::ReportSerializer
|
||||||
belongs_to :account_relationship_severance_event, key: :event, if: :relationship_severance_event?, serializer: REST::AccountRelationshipSeveranceEventSerializer
|
belongs_to :account_relationship_severance_event, key: :event, if: :relationship_severance_event?, serializer: REST::AccountRelationshipSeveranceEventSerializer
|
||||||
belongs_to :account_warning, key: :moderation_warning, if: :moderation_warning_event?, serializer: REST::AccountWarningSerializer
|
belongs_to :account_warning, key: :moderation_warning, if: :moderation_warning_event?, serializer: REST::AccountWarningSerializer
|
||||||
|
belongs_to :generated_annual_report, key: :annual_report, if: :annual_report_event?, serializer: REST::AnnualReportEventSerializer
|
||||||
|
|
||||||
def sample_account_ids
|
def sample_account_ids
|
||||||
object.sample_accounts.pluck(:id).map(&:to_s)
|
object.sample_accounts.pluck(:id).map(&:to_s)
|
||||||
|
@ -38,6 +39,10 @@ class REST::NotificationGroupSerializer < ActiveModel::Serializer
|
||||||
object.type == :moderation_warning
|
object.type == :moderation_warning
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def annual_report_event?
|
||||||
|
object.type == :annual_report
|
||||||
|
end
|
||||||
|
|
||||||
def page_min_id
|
def page_min_id
|
||||||
object.pagination_data[:min_id].to_s
|
object.pagination_data[:min_id].to_s
|
||||||
end
|
end
|
||||||
|
|
|
@ -61,14 +61,6 @@ class REST::V1::InstanceSerializer < ActiveModel::Serializer
|
||||||
{ streaming_api: Rails.configuration.x.streaming_api_base_url }
|
{ streaming_api: Rails.configuration.x.streaming_api_base_url }
|
||||||
end
|
end
|
||||||
|
|
||||||
def usage
|
|
||||||
{
|
|
||||||
users: {
|
|
||||||
active_month: instance_presenter.active_user_count(4),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def configuration
|
def configuration
|
||||||
{
|
{
|
||||||
accounts: {
|
accounts: {
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
class NotifyService < BaseService
|
class NotifyService < BaseService
|
||||||
include Redisable
|
include Redisable
|
||||||
|
|
||||||
# TODO: the severed_relationships type probably warrants email notifications
|
# TODO: the severed_relationships and annual_report types probably warrants email notifications
|
||||||
NON_EMAIL_TYPES = %i(
|
NON_EMAIL_TYPES = %i(
|
||||||
admin.report
|
admin.report
|
||||||
admin.sign_up
|
admin.sign_up
|
||||||
|
@ -12,6 +12,7 @@ class NotifyService < BaseService
|
||||||
status
|
status
|
||||||
moderation_warning
|
moderation_warning
|
||||||
severed_relationships
|
severed_relationships
|
||||||
|
annual_report
|
||||||
).freeze
|
).freeze
|
||||||
|
|
||||||
class BaseCondition
|
class BaseCondition
|
||||||
|
@ -25,6 +26,7 @@ class NotifyService < BaseService
|
||||||
poll
|
poll
|
||||||
update
|
update
|
||||||
account_warning
|
account_warning
|
||||||
|
annual_report
|
||||||
).freeze
|
).freeze
|
||||||
|
|
||||||
def initialize(notification)
|
def initialize(notification)
|
||||||
|
@ -100,7 +102,7 @@ class NotifyService < BaseService
|
||||||
class DropCondition < BaseCondition
|
class DropCondition < BaseCondition
|
||||||
def drop?
|
def drop?
|
||||||
blocked = @recipient.unavailable?
|
blocked = @recipient.unavailable?
|
||||||
blocked ||= from_self? && %i(poll severed_relationships moderation_warning).exclude?(@notification.type)
|
blocked ||= from_self? && %i(poll severed_relationships moderation_warning annual_report).exclude?(@notification.type)
|
||||||
|
|
||||||
return blocked if message? && from_staff?
|
return blocked if message? && from_staff?
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,6 @@ class PostStatusService < BaseService
|
||||||
include Redisable
|
include Redisable
|
||||||
include LanguagesHelper
|
include LanguagesHelper
|
||||||
|
|
||||||
MIN_SCHEDULE_OFFSET = 5.minutes.freeze
|
|
||||||
|
|
||||||
class UnexpectedMentionsError < StandardError
|
class UnexpectedMentionsError < StandardError
|
||||||
attr_reader :accounts
|
attr_reader :accounts
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ class ProcessHashtagsService < BaseService
|
||||||
|
|
||||||
unless removed_tags.empty?
|
unless removed_tags.empty?
|
||||||
@account.featured_tags.where(tag_id: removed_tags.map(&:id)).find_each do |featured_tag|
|
@account.featured_tags.where(tag_id: removed_tags.map(&:id)).find_each do |featured_tag|
|
||||||
featured_tag.decrement(@status.id)
|
featured_tag.decrement(@status)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -117,7 +117,7 @@ class RemoveStatusService < BaseService
|
||||||
|
|
||||||
def remove_from_hashtags
|
def remove_from_hashtags
|
||||||
@account.featured_tags.where(tag_id: @status.tags.map(&:id)).find_each do |featured_tag|
|
@account.featured_tags.where(tag_id: @status.tags.map(&:id)).find_each do |featured_tag|
|
||||||
featured_tag.decrement(@status.id)
|
featured_tag.decrement(@status)
|
||||||
end
|
end
|
||||||
|
|
||||||
return unless @status.public_visibility?
|
return unless @status.public_visibility?
|
||||||
|
|
|
@ -12,7 +12,7 @@ class UnallowDomainService < BaseService
|
||||||
private
|
private
|
||||||
|
|
||||||
def suspend_accounts!(domain)
|
def suspend_accounts!(domain)
|
||||||
Account.where(domain: domain).in_batches.update_all(suspended_at: Time.now.utc)
|
Account.where(domain: domain).in_batches.touch_all(:suspended_at)
|
||||||
AfterUnallowDomainWorker.perform_async(domain)
|
AfterUnallowDomainWorker.perform_async(domain)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|